diff --git a/gidubba.asm b/gidubba.asm index eb0c6f7..d9f2fc2 100644 --- a/gidubba.asm +++ b/gidubba.asm @@ -34,11 +34,7 @@ cmdp: load r0, prompt store arg2, r0 store arg2 + 1, r0 - ;Temporary - load r0, const1 - store count, r0 - - ;Parse the command and its argument if any + ;Parse the command and its first argument ;Command load r0, buffer store cmd, r0 @@ -53,24 +49,48 @@ cmdp: load r0, prompt load r3, const1 store argf1, r3 breq r0, r2, hsharg + load r3, arg1d2 + 1 + store arg2d1 + 1, r3 + load r3, arg1d2 + 2 + store arg2d1 + 2, r3 + load r3, comma + breq r0, r3, 2ndarg store arg1 + 3, r0 ;Second digit - load r0, buffer + 2 +arg1d2: load r0, buffer + 2 breq r0, r1, getarg + load r3, arg1d3 + 1 + store arg2d1 + 1, r3 + load r3, arg1d3 + 2 + store arg2d1 + 2, r3 + load r3, comma + breq r0, r3, 2ndarg load r2, arg1 + 3 store arg1 + 2, r2 store arg1 + 3, r0 ;Third digit - load r0, buffer + 3 +arg1d3: load r0, buffer + 3 breq r0, r1, getarg + load r3, arg1d4 + 1 + store arg2d1 + 1, r3 + load r3, arg1d4 + 2 + store arg2d1 + 2, r3 + load r3, comma + breq r0, r3, 2ndarg load r2, arg1 + 2 store arg1 + 1, r2 load r2, arg1 + 3 store arg1 + 2, r2 store arg1 + 3, r0 ;Fourth digit - load r0, buffer + 4 +arg1d4: load r0, buffer + 4 breq r0, r1, getarg + load r3, arg1d5 + 1 + store arg2d1 + 1, r3 + load r3, arg1d5 + 2 + store arg2d1 + 2, r3 + load r3, comma + breq r0, r3, 2ndarg load r2, arg1 + 1 store arg1, r2 load r2, arg1 + 2 @@ -79,7 +99,44 @@ cmdp: load r0, prompt store arg1 + 2, r2 store arg1 + 3, r0 ;Check for command end - load r0, buffer + 5 + load r0, arg1d5 + 1 + load r1, arg1d5 + 2 + cleq r0, r0, incdw + store arg2d1 + 1, r0 + store arg2d1 + 2, r1 + load r1, cr +arg1d5: load r0, buffer + 5 + breq r0, r1, getarg + load r3, comma + breq r0, r3, 2ndarg + breq r0, r0, cmderr + + ;Parse the second argument + ;Set the addresses +2ndarg: load r0, arg2d1 + 1 + load r1, arg2d1 + 2 + cleq r0, r0, incdw + store arg2d2 + 1, r0 + store arg2d2 + 2, r1 + cleq r0, r0, incdw + store arg2d3 + 1, r0 + store arg2d3 + 2, r1 + ;Load carriage return + load r1, cr + ;First digit +arg2d1: load r0, 0 + breq r0, r1, chkcmd + load r3, const1 + store argf2, r3 + store arg2 + 1, r0 + ;Second digit +arg2d2: load r0, 0 + breq r0, r1, getarg + load r2, arg2 + 1 + store arg2, r2 + store arg2 + 1, r0 + ;Check for command end +arg2d3: load r0, 0 breq r0, r1, getarg breq r0, r0, cmderr @@ -134,6 +191,27 @@ getarg: load r0, arg1 or r0, r2 store line + 1, r0 + ;Get the value of the second argument + ;First digit + load r0, arg2 + cleq r0, r0, hex2n + load r1, qmark + breq r0, r1, cmderr + xor r2, r2 + xor r2, r0 + shl r2 + shl r2 + shl r2 + shl r2 + ;Second digit + load r0, arg2 + 1 + cleq r0, r0, hex2n + load r1, qmark + breq r0, r1, cmderr + ;Combine and store the first and second digits + or r0, r2 + store count, r0 + ;Check for commands ;Load the command chkcmd: load r0, cmd @@ -141,11 +219,10 @@ chkcmd: load r0, cmd load r2, argf1 xor r3, r3 breq r2, r3, cnarg - ;Insert - load r1, uci - breq r0, r1, insln - load r1, lci - breq r0, r1, insln + ;Check for single argument + load r2, argf2 + xor r3, r3 + breq r2, r3, onearg ;Delete load r1, ucd breq r0, r1, delete @@ -158,6 +235,13 @@ chkcmd: load r0, cmd breq r0, r1, list ;Branch to error breq r0, r0, cmderr + ;Insert +onearg: load r1, uci + breq r0, r1, insln + load r1, lci + breq r0, r1, insln + ;Branch to error + breq r0, r0, cmderr ;Print cnarg: load r1, ucp breq r0, r1, print @@ -368,16 +452,16 @@ delete: xor r0, r0 ;High byte load r0, sublod + 1 store stomov + 1, r0 - store chsend + 1, r0 + store dchend + 1, r0 ;Low byte load r0, sublod + 2 store stomov + 2, r0 - store chsend + 2, r0 + store dchend + 2, r0 ;Check for the save end -chsend: load r0, 0 +dchend: load r0, 0 load r1, sub - breq r0, r1, delend + breq r0, r1, cmdp ;Increment the line number ;Load the number @@ -458,16 +542,23 @@ list: xor r0, r0 ;Find the argument line in the save and store its number cleq r0, r0, fend - ;Print a line number prompt - cleq r0, r0, prnln - ;Get the save address of the line ;High byte load r0, sublod + 1 store chlist + 1, r0 + store lchend + 1, r0 ;Low byte load r0, sublod + 2 store chlist + 2, r0 + store lchend + 2, r0 + + ;Check for the save end +lchend: load r0, 0 + load r1, sub + breq r0, r1, cmdp + + ;Print a line number prompt + cleq r0, r0, prnln ;Load a character from the save chlist: load r1, 0 diff --git a/readme.md b/readme.md index d24bbd3..57fda36 100644 --- a/readme.md +++ b/readme.md @@ -17,14 +17,17 @@ differs from this you may have to modify the code yourself. Usage ----- -The commands are individual letters that depending on the command can be -followed by an argument. The argument can be either a hexadecimal line -number between 0 and FFFF or a hash (#), a shortcut for line FFFF. An -argument to a non-existent line will be interpreted as referring to the -line number after the last line. +The commands are individual letters that can be followed by one or two +arguments separated by a comma. The first argument is a target line +number between 0 and FFFF and the second the range of lines between 0 +and FF the command affects. Inserting lines to a target that does not +exist or the shortcut hash (#) appends them to the text; otherwise +targets or parts of ranges that do not exist are ignored. -Commands with an argument: +Commands with a single argument: * I: Insert a line or lines + +Commands with two arguments: * D: Delete a line * L: List a line