diff --git a/gidubba.asm b/gidubba.asm index 4afe182..1c18f4b 100644 --- a/gidubba.asm +++ b/gidubba.asm @@ -147,8 +147,8 @@ hsharg: load r0, buffer + 2 ;Save FFFF xor r0, r0 nand r0, r0 - store line, r0 - store line + 1, r0 + store target, r0 + store target + 1, r0 breq r0, r0, chkcmd ;Get the value of the first argument @@ -170,7 +170,7 @@ getarg: load r0, arg1 breq r0, r1, cmderr ;Combine and store the first and second digits or r0, r2 - store line, r0 + store target, r0 ;Third digit load r0, arg1 + 2 cleq r0, r0, hex2n @@ -189,7 +189,7 @@ getarg: load r0, arg1 breq r0, r1, cmderr ;Combine and store the third and fourth digits or r0, r2 - store line + 1, r0 + store target + 1, r0 ;Get the value of the second argument ;First digit @@ -223,6 +223,11 @@ chkcmd: load r0, cmd load r2, argf2 xor r3, r3 breq r2, r3, onearg + ;Copy to mark + load r1, ucc + breq r0, r1, copy + load r1, lcc + breq r0, r1, copy ;Delete load r1, ucd breq r0, r1, delete @@ -240,6 +245,11 @@ onearg: load r1, uci breq r0, r1, insln load r1, lci breq r0, r1, insln + ;Set a mark + load r1, ucs + breq r0, r1, setmrk + load r1, lcs + breq r0, r1, setmrk ;Branch to error breq r0, r0, cmderr ;Print @@ -295,12 +305,8 @@ instrt: cleq r0, r0, prnln ;Increment cleq r0, r0, incdw ;Store the number - store line, r0 - store line + 1, r1 - - ;*** - - ;Make room for the line + store target, r0 + store target + 1, r1 ;Store the save address ;High byte @@ -312,139 +318,27 @@ instrt: cleq r0, r0, prnln store subchk + 2, r0 store cmpadr + 1, r0 - ;Find the end of the save address - ;Check for a substitute -subchk: load r0, 0 - load r1, sub - breq r0, r1, endfnd - ;Load the address - load r0, subchk + 1 - load r1, subchk + 2 - ;Increment - cleq r0, r0, incdw - ;Store the address - store subchk + 1, r0 - store subchk + 2, r1 - ;Check the next character - breq r0, r0, subchk + ;Save the line + cleq r0, r0, subchk - ;Store the end of the save address - ;High byte -endfnd: load r3, subchk + 1 - store movlod + 1, r3 - ;Low byte - load r0, subchk + 2 - store movlod + 2, r0 - - ;Calculate the new end of the save - ;Increment the low byte - load r2, strsz - cleq r0, r0, sum - ;Move the high byte to r2 - xor r2, r2 - xor r2, r3 - ;Store the low byte to r3 - xor r3, r3 - xor r3, r0 - ;Load the high byte to r0 - xor r0, r0 - xor r0, r2 - ;Add the overflow to the high byte - xor r2, r2 - xor r2, r1 - cleq r0, r0, sum - ;Store the new end of the save - store movsto + 1, r0 - store movsto + 2, r3 - - ;Move the substitute -movlod: load r0, 0 -movsto: store 0, r0 - - ;Check for the address of the new line - load r0, cmpadr - load r1, movlod + 1 - brneq r0, r1, decsav - load r0, cmpadr + 1 - load r1, movlod + 2 - brneq r0, r1, decsav - breq r0, r1, save - - ;Decrement the old save address - ;load the address -decsav: load r0, movlod + 1 - load r1, movlod + 2 - ;Decrement - cleq r0, r0, decdw - ;Store the address - store movlod + 1, r0 - store movlod + 2, r1 - - ;Decrement the new save address - ;load the address - load r0, movsto + 1 - load r1, movsto + 2 - ;Decrement - cleq r0, r0, decdw - ;Store the address - store movsto + 1, r0 - store movsto + 2, r1 - - ;Move the next character - breq r0, r0, movlod + ;Insert the next line + breq r0, r0, insln ;*** - ;Save the line + ;Set a mark for copying +setmrk: load r0, target + store mark, r0 + load r0, target + 1 + store mark + 1, r0 + breq r0, r0, cmdp - ;Restore the buffer start address - ;High byte -save: load r0, bfstrt - store chload + 1, r0 - ;Low byte - load r0, bfstrt + 1 - store chload + 2, r0 + ;*** - ;Store the save address - ;High byte - load r0, sublod + 1 - store chsave + 1, r0 - ;Low byte - load r0, sublod + 2 - store chsave + 2, r0 + ;Copy to mark - ;Load and save a character from the buffer - ;Load -chload: load r1, buffer - ;Save -chsave: store buffer + 100, r1 - - ;Check for line end - load r2, lf - breq r1, r2, insln - - ;Increment the buffer address - ;Load the address - load r0, chload + 1 - load r1, chload + 2 - ;Increment - cleq r0, r0, incdw - ;Store the address - store chload + 1, r0 - store chload + 2, r1 - - ;Increment the save address - ;Load the address - load r0, chsave + 1 - load r1, chsave + 2 - ;Increment - cleq r0, r0, incdw - ;Store the address - store chsave + 1, r0 - store chsave + 2, r1 - - ;Load and save the next character - breq r0, r0, chload + ;Placeholder +copy: breq r0, r0, cmdp ;*** @@ -475,13 +369,13 @@ dchend: load r0, 0 ;Increment the line number ;Load the number - load r0, line - load r1, line + 1 + load r0, target + load r1, target + 1 ;Increment cleq r0, r0, incdw ;Store the number - store line, r0 - store line + 1, r1 + store target, r0 + store target + 1, r1 ;Find the next line in the save and store its number cleq r0, r0, fend @@ -532,11 +426,11 @@ delend: load r0, count cleq r0, r0, sum store count, r0 ;Decrement the line number - load r0, line - load r1, line + 1 + load r0, target + load r1, target + 1 cleq r0, r0, decdw - store line, r0 - store line + 1, r1 + store target, r0 + store target + 1, r1 ;Loop breq r0, r0, delete @@ -607,11 +501,11 @@ lstend: load r0, count cleq r0, r0, sum store count, r0 ;Increment the line number - load r0, line - load r1, line + 1 + load r0, target + load r1, target + 1 cleq r0, r0, incdw - store line, r0 - store line + 1, r1 + store target, r0 + store target + 1, r1 ;Loop breq r0, r0, list @@ -637,7 +531,7 @@ print: load r0, cstff ;Write the text to tape - ;Get the keypunch address + ;Get the tape punch address ;High byte write: load r0, cstff store prwrch + 1, r0 @@ -1176,6 +1070,147 @@ inend: ret ;*** + ;Make room for the line + + ;Find the end of the save address + ;Check for a substitute +subchk: load r0, 0 + load r1, sub + breq r0, r1, endfnd + ;Load the address + load r0, subchk + 1 + load r1, subchk + 2 + ;Increment + cleq r0, r0, incdw + ;Store the address + store subchk + 1, r0 + store subchk + 2, r1 + ;Check the next character + breq r0, r0, subchk + + ;Store the end of the save address + ;High byte +endfnd: load r3, subchk + 1 + store movlod + 1, r3 + ;Low byte + load r0, subchk + 2 + store movlod + 2, r0 + + ;Calculate the new end of the save + ;Increment the low byte + load r2, strsz + cleq r0, r0, sum + ;Move the high byte to r2 + xor r2, r2 + xor r2, r3 + ;Store the low byte to r3 + xor r3, r3 + xor r3, r0 + ;Load the high byte to r0 + xor r0, r0 + xor r0, r2 + ;Add the overflow to the high byte + xor r2, r2 + xor r2, r1 + cleq r0, r0, sum + ;Store the new end of the save + store movsto + 1, r0 + store movsto + 2, r3 + + ;Move the substitute +movlod: load r0, 0 +movsto: store 0, r0 + + ;Check for the address of the new line + load r0, cmpadr + load r1, movlod + 1 + brneq r0, r1, decsav + load r0, cmpadr + 1 + load r1, movlod + 2 + brneq r0, r1, decsav + breq r0, r1, save + + ;Decrement the old save address + ;load the address +decsav: load r0, movlod + 1 + load r1, movlod + 2 + ;Decrement + cleq r0, r0, decdw + ;Store the address + store movlod + 1, r0 + store movlod + 2, r1 + + ;Decrement the new save address + ;load the address + load r0, movsto + 1 + load r1, movsto + 2 + ;Decrement + cleq r0, r0, decdw + ;Store the address + store movsto + 1, r0 + store movsto + 2, r1 + + ;Move the next character + breq r0, r0, movlod + + ;*** + + ;Save the line + + ;Restore the buffer start address + ;High byte +save: load r0, bfstrt + store chload + 1, r0 + ;Low byte + load r0, bfstrt + 1 + store chload + 2, r0 + + ;Store the save address + ;High byte + load r0, sublod + 1 + store chsave + 1, r0 + ;Low byte + load r0, sublod + 2 + store chsave + 2, r0 + + ;Load and save a character from the buffer + ;Load +chload: load r1, buffer + ;Save +chsave: store buffer + 100, r1 + + ;Check for line end + load r2, lf + breq r1, r2, savend + + ;Increment the buffer address + ;Load the address + load r0, chload + 1 + load r1, chload + 2 + ;Increment + cleq r0, r0, incdw + ;Store the address + store chload + 1, r0 + store chload + 2, r1 + + ;Increment the save address + ;Load the address + load r0, chsave + 1 + load r1, chsave + 2 + ;Increment + cleq r0, r0, incdw + ;Store the address + store chsave + 1, r0 + store chsave + 2, r1 + + ;Load and save the next character + breq r0, r0, chload + + ;Return +savend: ret + + ;*** + ;Find the argument line in the save and store its number ;Reset the line number @@ -1192,10 +1227,10 @@ fend: xor r0, r0 store sublod + 2, r0 ;Check for the argument -charg: load r0, line +charg: load r0, target load r1, lnnum brneq r0, r1, fsub - load r0, line + 1 + load r0, target + 1 load r1, lnnum + 1 breq r0, r1, fendnd @@ -1381,6 +1416,7 @@ uci: data 49 ucl: data 4c ucp: data 50 ucr: data 52 +ucs: data 53 ucw: data 57 bslash: data 5c lca: data 61 @@ -1394,6 +1430,7 @@ lci: data 69 lcl: data 6c lcp: data 70 lcr: data 72 +lcs: data 73 lcw: data 77 ;Variables @@ -1412,11 +1449,17 @@ argf1: data 0 arg2: data 30 data 30 argf2: data 0 -line: data 0 +target: data 0 data 0 count: data 0 +mark: data 0 + data 0 +mrkadr: data 0 + data 0 cmpadr: data 0 data 0 +tmp: data 0 + data 0 ;Buffer and save bfstrt: addr buffer diff --git a/readme.md b/readme.md index 638af19..5259205 100644 --- a/readme.md +++ b/readme.md @@ -11,7 +11,7 @@ System requirements Gidubba requires a terminal with local echo at address FFFF and optionally a line printer at address FFFE and a punched tape reader and -keypunch at FFFD. If your setup differs from this you may have to modify +punch at FFFD. If your setup differs from this you may have to modify the code yourself. Usage @@ -33,7 +33,7 @@ Commands with two arguments: Commands with no argument: * P: Print (requires a printer) - * W: Writes to tape (requires a keypunch) + * W: Writes to tape (requires a tape punch) * R: Reads from tape (requires a tape reader) * H: Halt