\->ASC 80000: 02D9D ! Program 80005: 1592D ; Set last RPL token to <0h> and verify DEPTH >= 1 8000A: 03188 ; Internal DUP 8000F: 05944 ; Internal BYTES (non-ROM objects) -> (2:System Binary,1:Binary Integer) 80014: 03223 ; Internal SWAP 80019: 055DF ; "" 8001E: 032C2 ; Internal OVER 80023: 6257A ; Internal add 4 (1:System Binary) 80028: 03188 ; Internal DUP 8002D: 64BDA ; <40h> 80032: 03EF7 ; Internal / (2:System Binary,1:System Binary) -> (2:rem,1:div) 80037: 03223 ; Internal SWAP 8003C: 03CA6 ; if TOS = 0 (System Binary) -> True/False 80041: 619BC ; if pop TOS != True, then skip next token 80046: 03E0E ; Internal subtract one (1:System Binary) 8004B: 03DBC ; Internal + (2:System Binary,1:System Binary) 80050: 03E6F ; Internal multiply by 2 (1:System Binary) 80055: 61C1C ; allocate nibbles (2:sized object,1:System Binary) 8005A: 03223 ; Internal SWAP ; *** (4:orig object,3:checksum,2:alloc str,1:size) *** 8005F: 02DCC ! Code 80064: 000CD ! 205 nibbles (next RPL at 80131) 80069: 8F14660 GOSBVL 06641 ; MC: pop TOS (System Binary) -> A.A 80070: CC A=A-1 A ; A.A = size-1 80072: 8FB9760 GOSBVL 0679B ; MC: save D0,D1,B,D (uses C,D0), clear carry 80079: 840 ST=0 0 ; start object phase 8007C: 3104 LCHEX 40 ! "@" 80080: AE7 D=C B ; D (characters per line) = 64 80083: D8 B=A A ; B.A = size-1 80085: 143 A=DAT1 A ; A.A = adr of alloc str 80088: 130 D0=A ; D0 = adr of alloc str 8008B: 169 D0=D0+ 10 ; D0 = adr of alloc str data 8008E: 174 D1=D1+ 5 ; point to checksum on stack 80091: 147 C=DAT1 A ; C.A = adr of checksum 80094: 06 RSTK=C ; save adr of checksum 80096: 174 D1=D1+ 5 ; point to orig object 80099: 143 A=DAT1 A ; A.A = adr of orig object 8009C: 131 D1=A ; D1 = adr of orig object ; *** Verify RAM object *** 8009F: 1534 A=DAT1 S ; A.S = first nibble of object 800A3: AC6 C=A S ; C.S = first nibble of object 800A6: B44 A=A+1 S ; modify A.A's copy of data 800A9: 1514 DAT1=A S ; and try to update memory 800AD: 1534 A=DAT1 S ; fetch nibble back 800B1: 94690 ?A#C S ; go if RAM (changed) GOYES 800BD 800B6: 8D9B026 GOVLNG 620B9 ; MC: restore regs and push True 800BD: 1554 DAT1=C S ; fix RAM (replace orig nibble) 800C1: A6F D=D-1 B ; count character in line 800C4: 531 GONC 800D8 ; go if not EOL 800C7: 31F3 LCHEX 3F ! "?" ; reset D for new line (D=63) 800CB: AE7 D=C B ; ... 800CE: 31A0 LCHEX 0A ! "." 800D2: 14C DAT0=C B ; append line feed 800D5: 161 D0=D0+ 2 ; ... 800D8: AE2 C=0 B ; convert nibble to character 800DB: 15F0 C=DAT1 1 800DF: 8082103 LAHEX 30 ! "0" 800E6: A62 C=C+A B 800E9: 8082193 LAHEX 39 ! "9" 800F0: 9EEC0 ?A>=C B GOYES 800FF 800F5: 8082170 LAHEX 07 ! "." 800FC: A62 C=C+A B 800FF: 14C DAT0=C B ; store character into string 80102: 161 D0=D0+ 2 ; next character 80105: 170 D1=D1+ 1 ; next nibble 80108: CD B=B-1 A ; decr nibbles remaining 8010A: 56B GONC 800C1 ; go if more 8010D: 870A1 ?ST=1 0 ; exit if checksum in progress GOYES 8012A 80112: 850 ST=1 0 ; start checksum phase 80115: 3430000 LCHEX 00003 ; B.A = 3 (size of checksum - 1) 8011C: D5 B=C A ; ... 8011E: 07 C=RSTK ; C = adr of checksum 80120: 135 D1=C ; D1 = adr of checksum 80123: 179 D1=D1+ 10 ; D1 = adr of checksum data 80126: 6A9F GOTO 800C1 ; go process checksum 8012A: 8D2D026 GOVLNG 620D2 ; MC: restore regs and push False . . . . . . ! End of Code ; *** (4:orig object,3:checksum,2:new string,1:True/False) *** 80131: 61993 ; if pop TOS = True, then do next/return, else skip next 80136: 02D9D ! Program 8013B: 03258 ; Internal DROP2 80140: [...] ! "ROM Object" 8015E: 1A339 ; DOERR (XLIB 2 42) 80163: 0312B ! End Marker 80168: 6112A ; drop level two and three objects 8016D: 0312B ! End Marker