Implement infrastructure for copying and correct some terminology
This commit is contained in:
parent
c6c1c5567f
commit
ec3cf94c06
347
gidubba.asm
347
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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue