Add multiple argument support and make list ignore non-existent lines

This commit is contained in:
CrazyEttin 2022-08-14 15:06:59 +03:00
parent d78deb4616
commit 1c2c501d09
2 changed files with 121 additions and 27 deletions

View File

@ -34,11 +34,7 @@ cmdp: load r0, prompt
store arg2, r0 store arg2, r0
store arg2 + 1, r0 store arg2 + 1, r0
;Temporary ;Parse the command and its first argument
load r0, const1
store count, r0
;Parse the command and its argument if any
;Command ;Command
load r0, buffer load r0, buffer
store cmd, r0 store cmd, r0
@ -53,24 +49,48 @@ cmdp: load r0, prompt
load r3, const1 load r3, const1
store argf1, r3 store argf1, r3
breq r0, r2, hsharg 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 store arg1 + 3, r0
;Second digit ;Second digit
load r0, buffer + 2 arg1d2: load r0, buffer + 2
breq r0, r1, getarg 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 load r2, arg1 + 3
store arg1 + 2, r2 store arg1 + 2, r2
store arg1 + 3, r0 store arg1 + 3, r0
;Third digit ;Third digit
load r0, buffer + 3 arg1d3: load r0, buffer + 3
breq r0, r1, getarg 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 load r2, arg1 + 2
store arg1 + 1, r2 store arg1 + 1, r2
load r2, arg1 + 3 load r2, arg1 + 3
store arg1 + 2, r2 store arg1 + 2, r2
store arg1 + 3, r0 store arg1 + 3, r0
;Fourth digit ;Fourth digit
load r0, buffer + 4 arg1d4: load r0, buffer + 4
breq r0, r1, getarg 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 load r2, arg1 + 1
store arg1, r2 store arg1, r2
load r2, arg1 + 2 load r2, arg1 + 2
@ -79,7 +99,44 @@ cmdp: load r0, prompt
store arg1 + 2, r2 store arg1 + 2, r2
store arg1 + 3, r0 store arg1 + 3, r0
;Check for command end ;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, r1, getarg
breq r0, r0, cmderr breq r0, r0, cmderr
@ -134,6 +191,27 @@ getarg: load r0, arg1
or r0, r2 or r0, r2
store line + 1, r0 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 ;Check for commands
;Load the command ;Load the command
chkcmd: load r0, cmd chkcmd: load r0, cmd
@ -141,11 +219,10 @@ chkcmd: load r0, cmd
load r2, argf1 load r2, argf1
xor r3, r3 xor r3, r3
breq r2, r3, cnarg breq r2, r3, cnarg
;Insert ;Check for single argument
load r1, uci load r2, argf2
breq r0, r1, insln xor r3, r3
load r1, lci breq r2, r3, onearg
breq r0, r1, insln
;Delete ;Delete
load r1, ucd load r1, ucd
breq r0, r1, delete breq r0, r1, delete
@ -158,6 +235,13 @@ chkcmd: load r0, cmd
breq r0, r1, list breq r0, r1, list
;Branch to error ;Branch to error
breq r0, r0, cmderr 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 ;Print
cnarg: load r1, ucp cnarg: load r1, ucp
breq r0, r1, print breq r0, r1, print
@ -368,16 +452,16 @@ delete: xor r0, r0
;High byte ;High byte
load r0, sublod + 1 load r0, sublod + 1
store stomov + 1, r0 store stomov + 1, r0
store chsend + 1, r0 store dchend + 1, r0
;Low byte ;Low byte
load r0, sublod + 2 load r0, sublod + 2
store stomov + 2, r0 store stomov + 2, r0
store chsend + 2, r0 store dchend + 2, r0
;Check for the save end ;Check for the save end
chsend: load r0, 0 dchend: load r0, 0
load r1, sub load r1, sub
breq r0, r1, delend breq r0, r1, cmdp
;Increment the line number ;Increment the line number
;Load the number ;Load the number
@ -458,16 +542,23 @@ list: xor r0, r0
;Find the argument line in the save and store its number ;Find the argument line in the save and store its number
cleq r0, r0, fend cleq r0, r0, fend
;Print a line number prompt
cleq r0, r0, prnln
;Get the save address of the line ;Get the save address of the line
;High byte ;High byte
load r0, sublod + 1 load r0, sublod + 1
store chlist + 1, r0 store chlist + 1, r0
store lchend + 1, r0
;Low byte ;Low byte
load r0, sublod + 2 load r0, sublod + 2
store chlist + 2, r0 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 ;Load a character from the save
chlist: load r1, 0 chlist: load r1, 0

View File

@ -17,14 +17,17 @@ differs from this you may have to modify the code yourself.
Usage Usage
----- -----
The commands are individual letters that depending on the command can be The commands are individual letters that can be followed by one or two
followed by an argument. The argument can be either a hexadecimal line arguments separated by a comma. The first argument is a target line
number between 0 and FFFF or a hash (#), a shortcut for line FFFF. An number between 0 and FFFF and the second the range of lines between 0
argument to a non-existent line will be interpreted as referring to the and FF the command affects. Inserting lines to a target that does not
line number after the last line. 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 * I: Insert a line or lines
Commands with two arguments:
* D: Delete a line * D: Delete a line
* L: List a line * L: List a line