Implement the infrastructure for multiple arguments and improve argument checking

This commit is contained in:
CrazyEttin 2022-08-13 17:23:25 +03:00
parent e0c4c6bbcf
commit d78deb4616
1 changed files with 103 additions and 50 deletions

View File

@ -24,14 +24,19 @@ cmdp: load r0, prompt
;Initialise the command and argument
xor r0, r0
store cmd, r0
store argf1, r0
store argf2, r0
load r0, zero
store arg, r0
store arg + 1, r0
store arg + 2, r0
store arg + 3, r0
load r0, qmark
store argval, r0
store argval + 1, r0
store arg1, r0
store arg1 + 1, r0
store arg1 + 2, r0
store arg1 + 3, r0
store arg2, r0
store arg2 + 1, r0
;Temporary
load r0, const1
store count, r0
;Parse the command and its argument if any
;Command
@ -45,32 +50,34 @@ cmdp: load r0, prompt
;First digit
load r0, buffer + 1
breq r0, r1, chkcmd
load r3, const1
store argf1, r3
breq r0, r2, hsharg
store arg + 3, r0
store arg1 + 3, r0
;Second digit
load r0, buffer + 2
breq r0, r1, getarg
load r2, arg + 3
store arg + 2, r2
store arg + 3, r0
load r2, arg1 + 3
store arg1 + 2, r2
store arg1 + 3, r0
;Third digit
load r0, buffer + 3
breq r0, r1, getarg
load r2, arg + 2
store arg + 1, r2
load r2, arg + 3
store arg + 2, r2
store arg + 3, r0
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
breq r0, r1, getarg
load r2, arg + 1
store arg, r2
load r2, arg + 2
store arg + 1, r2
load r2, arg + 3
store arg + 2, r2
store arg + 3, r0
load r2, arg1 + 1
store arg1, r2
load r2, arg1 + 2
store arg1 + 1, r2
load r2, arg1 + 3
store arg1 + 2, r2
store arg1 + 3, r0
;Check for command end
load r0, buffer + 5
breq r0, r1, getarg
@ -83,13 +90,13 @@ hsharg: load r0, buffer + 2
;Save FFFF
xor r0, r0
nand r0, r0
store argval, r0
store argval + 1, r0
store line, r0
store line + 1, r0
breq r0, r0, chkcmd
;Get the value of the argument
;Get the value of the first argument
;First digit
getarg: load r0, arg
getarg: load r0, arg1
cleq r0, r0, hex2n
load r1, qmark
breq r0, r1, cmderr
@ -100,15 +107,15 @@ getarg: load r0, arg
shl r2
shl r2
;Second digit
load r0, arg + 1
load r0, arg1 + 1
cleq r0, r0, hex2n
load r1, qmark
breq r0, r1, cmderr
;Combine and store the first and second digits
or r0, r2
store argval, r0
store line, r0
;Third digit
load r0, arg + 2
load r0, arg1 + 2
cleq r0, r0, hex2n
load r1, qmark
breq r0, r1, cmderr
@ -119,20 +126,20 @@ getarg: load r0, arg
shl r2
shl r2
;Fourth digit
load r0, arg + 3
load r0, arg1 + 3
cleq r0, r0, hex2n
load r1, qmark
breq r0, r1, cmderr
;Combine and store the third and fourth digits
or r0, r2
store argval + 1, r0
store line + 1, r0
;Check for commands
;Load the command
chkcmd: load r0, cmd
;Check for no argument
load r2, argval
load r3, qmark
load r2, argf1
xor r3, r3
breq r2, r3, cnarg
;Insert
load r1, uci
@ -194,8 +201,8 @@ instrt: cleq r0, r0, prnln
;Increment
cleq r0, r0, incdw
;Store the number
store argval, r0
store argval + 1, r1
store line, r0
store line + 1, r1
;***
@ -349,8 +356,13 @@ chsave: store buffer + 100, r1
;Delete a line
;Check the counter
delete: xor r0, r0
load r1, count
breq r0, r1, cmdp
;Find the argument line in the save and store its number
delete: cleq r0, r0, fend
cleq r0, r0, fend
;Get the save address of the line
;High byte
@ -369,13 +381,13 @@ chsend: load r0, 0
;Increment the line number
;Load the number
load r0, argval
load r1, argval + 1
load r0, line
load r1, line + 1
;Increment
cleq r0, r0, incdw
;Store the number
store argval, r0
store argval + 1, r1
store line, r0
store line + 1, r1
;Find the next line in the save and store its number
cleq r0, r0, fend
@ -419,15 +431,32 @@ stomov: store 0, r0
;Move the next character
breq r0, r0, lodmov
;Return to the command prompt
delend: breq r0, r0, cmdp
;Loop
;Decrement the counter
delend: load r0, count
load r2, cstff
cleq r0, r0, sum
store count, r0
;Decrement the line number
load r0, line
load r1, line + 1
cleq r0, r0, decdw
store line, r0
store line + 1, r1
;Loop
breq r0, r0, delete
;***
;List a line
;Check the counter
list: xor r0, r0
load r1, count
breq r0, r1, cmdp
;Find the argument line in the save and store its number
list: cleq r0, r0, fend
cleq r0, r0, fend
;Print a line number prompt
cleq r0, r0, prnln
@ -470,8 +499,20 @@ chlist: load r1, 0
;Print a newline
prnwln: cleq r0, r0, newln
;Return to the command prompt
lstend: breq r0, r0, cmdp
;Loop
;Decrement the counter
lstend: load r0, count
load r2, cstff
cleq r0, r0, sum
store count, r0
;Increment the line number
load r0, line
load r1, line + 1
cleq r0, r0, incdw
store line, r0
store line + 1, r1
;Loop
breq r0, r0, list
;***
@ -1012,10 +1053,10 @@ fend: xor r0, r0
store sublod + 2, r0
;Check for the argument
charg: load r0, argval
charg: load r0, line
load r1, lnnum
brneq r0, r1, fsub
load r0, argval + 1
load r0, line + 1
load r1, lnnum + 1
breq r0, r1, fendnd
@ -1136,6 +1177,7 @@ sub: data 1a
esc: data 1b
space: data 20
hash: data 23
comma: data 2c
zero: data 30
one: data 31
two: data 32
@ -1176,16 +1218,27 @@ ovrflw: data 0
lnnum: data 0
data 0
strsz: data 0
dgtcnt: data 0
dgtadr: addr buffer + 2
cmd: data 0
arg: data 30
arg1: data 30
data 30
data 30
data 30
argval: data 0
argf1: data 0
arg2: data 30
data 30
argf2: data 0
line: data 0
data 0
count: data 0
cmpadr: data 0
data 0
;Buffer and save
bfstrt: addr buffer
bfsize: data fe