Add the copy ability
This commit is contained in:
parent
807e67c800
commit
b91f86f1b6
2 changed files with 153 additions and 44 deletions
185
gidubba.asm
185
gidubba.asm
|
@ -250,9 +250,9 @@ onearg: load r1, uci
|
||||||
load r1, lci
|
load r1, lci
|
||||||
breq r0, r1, insln
|
breq r0, r1, insln
|
||||||
;Set a mark
|
;Set a mark
|
||||||
load r1, ucs
|
load r1, ucm
|
||||||
breq r0, r1, setmrk
|
breq r0, r1, setmrk
|
||||||
load r1, lcs
|
load r1, lcm
|
||||||
breq r0, r1, setmrk
|
breq r0, r1, setmrk
|
||||||
;Branch to error
|
;Branch to error
|
||||||
breq r0, r0, cmderr
|
breq r0, r0, cmderr
|
||||||
|
@ -334,55 +334,60 @@ setmrk: load r0, target
|
||||||
|
|
||||||
;***
|
;***
|
||||||
|
|
||||||
;Copy to mark (under construction)
|
;Copy to mark
|
||||||
|
|
||||||
|
;Check the counter
|
||||||
|
copy: xor r0, r0
|
||||||
|
load r1, count
|
||||||
|
breq r0, r1, cmdp
|
||||||
|
|
||||||
;Find the argument line in the save and store its number
|
;Find the argument line in the save and store its number
|
||||||
copy: cleq r0, r0, fend
|
cleq r0, r0, fend
|
||||||
|
|
||||||
;Get the save address of the line
|
;Get the save address of the line
|
||||||
;High byte
|
;High byte
|
||||||
load r0, eoflod + 1
|
load r0, eoflod + 1
|
||||||
store test1 + 1, r0
|
store readch + 1, r0
|
||||||
store testa + 1, r0
|
store chsend + 1, r0
|
||||||
;Low byte
|
;Low byte
|
||||||
load r0, eoflod + 2
|
load r0, eoflod + 2
|
||||||
store test1 + 2, r0
|
store readch + 2, r0
|
||||||
store testa + 2, r0
|
store chsend + 2, r0
|
||||||
|
|
||||||
;Check for the save end
|
;Check for the save end
|
||||||
testa: load r0, 0
|
chsend: load r0, 0
|
||||||
load r1, eof
|
load r1, eof
|
||||||
breq r0, r1, cmdp
|
breq r0, r1, cmdp
|
||||||
|
|
||||||
;Restore the buffer start address
|
;Restore the buffer start address
|
||||||
;High byte
|
;High byte
|
||||||
load r0, bfstrt
|
load r0, bfstrt
|
||||||
store test2 + 1, r0
|
store stoch + 1, r0
|
||||||
;Low byte
|
;Low byte
|
||||||
load r0, bfstrt + 1
|
load r0, bfstrt + 1
|
||||||
store test2 + 2, r0
|
store stoch + 2, r0
|
||||||
|
|
||||||
;Initialise the character counter
|
;Initialise the character counter
|
||||||
xor r0, r0
|
xor r0, r0
|
||||||
|
|
||||||
;Read a character
|
;Read a character
|
||||||
test1: load r1, 0
|
readch: load r1, 0
|
||||||
|
|
||||||
;Check for save and buffer ends
|
;Check for save and buffer ends
|
||||||
;Save end
|
;Save end
|
||||||
load r2, eof
|
load r2, eof
|
||||||
breq r1, r2, test3
|
breq r1, r2, feol
|
||||||
;Buffer end
|
;Buffer end
|
||||||
load r2, bfsize
|
load r2, bfsize
|
||||||
breq r0, r2, test3
|
breq r0, r2, feol
|
||||||
|
|
||||||
;Store the character in the buffer
|
;Store the character in the buffer
|
||||||
test2: store 0, r1
|
stoch: store 0, r1
|
||||||
|
|
||||||
;Check for line and save ends
|
;Check for line and save ends
|
||||||
;Line end
|
;Line end
|
||||||
load r2, lf
|
load r2, lf
|
||||||
breq r1, r2, test4
|
breq r1, r2, incsz
|
||||||
|
|
||||||
;Increment the character counter and store it in r3
|
;Increment the character counter and store it in r3
|
||||||
;Increment
|
;Increment
|
||||||
|
@ -394,63 +399,165 @@ test2: store 0, r1
|
||||||
|
|
||||||
;Increment the save address
|
;Increment the save address
|
||||||
;Low byte
|
;Low byte
|
||||||
load r0, test1 + 2
|
load r0, readch + 2
|
||||||
load r2, const1
|
load r2, const1
|
||||||
cleq r0, r0, sum
|
cleq r0, r0, sum
|
||||||
store test1 + 2, r0
|
store readch + 2, r0
|
||||||
;Add the overflow to the high byte
|
;Add the overflow to the high byte
|
||||||
load r0, test1 + 1
|
load r0, readch + 1
|
||||||
xor r2, r2
|
xor r2, r2
|
||||||
xor r2, r1
|
xor r2, r1
|
||||||
cleq r0, r0, sum
|
cleq r0, r0, sum
|
||||||
store test1 + 1, r0
|
store readch + 1, r0
|
||||||
|
|
||||||
;Increment the buffer address
|
;Increment the buffer address
|
||||||
;Low byte
|
;Low byte
|
||||||
load r0, test2 + 2
|
load r0, stoch + 2
|
||||||
load r2, const1
|
load r2, const1
|
||||||
cleq r0, r0, sum
|
cleq r0, r0, sum
|
||||||
store test2 + 2, r0
|
store stoch + 2, r0
|
||||||
;Add the overflow to the high byte
|
;Add the overflow to the high byte
|
||||||
load r0, test2 + 1
|
load r0, stoch + 1
|
||||||
xor r2, r2
|
xor r2, r2
|
||||||
xor r2, r1
|
xor r2, r1
|
||||||
cleq r0, r0, sum
|
cleq r0, r0, sum
|
||||||
store test2 + 1, r0
|
store stoch + 1, r0
|
||||||
|
|
||||||
;Reload the character counter to r0
|
;Reload the character counter to r0
|
||||||
xor r0, r0
|
xor r0, r0
|
||||||
xor r0, r3
|
xor r0, r3
|
||||||
|
|
||||||
;Read the next character
|
;Read the next character
|
||||||
breq r0, r0, test1
|
breq r0, r0, readch
|
||||||
|
|
||||||
|
;Increment and store the string size
|
||||||
|
feol: load r2, const2
|
||||||
|
cleq r0, r0, sum
|
||||||
|
store strsz, r0
|
||||||
|
|
||||||
;Force line end
|
;Force line end
|
||||||
test3: load r1, test2 + 1
|
load r1, stoch + 1
|
||||||
store test5 + 1 ,r1
|
store stocr + 1 ,r1
|
||||||
load r1, test2 + 2
|
load r1, stoch + 2
|
||||||
store test5 + 2 ,r1
|
store stocr + 2 ,r1
|
||||||
|
|
||||||
;Store the CR of a newline in the buffer
|
;Store the CR of a newline in the buffer
|
||||||
load r0, cr
|
load r0, cr
|
||||||
test5: store 0, r0
|
stocr: store 0, r0
|
||||||
|
|
||||||
;Increment the buffer address
|
;Increment the buffer address
|
||||||
;Load the address
|
;Load the address
|
||||||
load r0, test2 + 1
|
load r0, stoch + 1
|
||||||
load r1, test2 + 2
|
load r1, stoch + 2
|
||||||
;Increment
|
;Increment
|
||||||
cleq r0, r0, incdw
|
cleq r0, r0, incdw
|
||||||
;Store the address
|
;Store the address
|
||||||
store test6 + 1, r0
|
store stolf + 1, r0
|
||||||
store test6 + 2, r1
|
store stolf + 2, r1
|
||||||
|
|
||||||
;Store the LF of a newline in the buffer
|
;Store the LF of a newline in the buffer
|
||||||
load r0, lf
|
load r0, lf
|
||||||
test6: store 0, r0
|
stolf: store 0, r0
|
||||||
|
|
||||||
;Return to the command prompt
|
;Jump to saving
|
||||||
test4: breq r0, r0, cmdp
|
breq r0, r0, svtarg
|
||||||
|
|
||||||
|
;Increment and store the string size
|
||||||
|
incsz: load r2, const1
|
||||||
|
cleq r0, r0, sum
|
||||||
|
store strsz, r0
|
||||||
|
|
||||||
|
;Save the target at tmp
|
||||||
|
svtarg: load r0, target
|
||||||
|
store tmp, r0
|
||||||
|
load r0, target + 1
|
||||||
|
store tmp + 1, r0
|
||||||
|
|
||||||
|
;Load the mark to target
|
||||||
|
load r0, mark
|
||||||
|
store target, r0
|
||||||
|
load r0, mark + 1
|
||||||
|
store target + 1, r0
|
||||||
|
|
||||||
|
;Find the marked line in the save and store its number
|
||||||
|
cleq r0, r0, fend
|
||||||
|
|
||||||
|
;Store the save address
|
||||||
|
;High byte
|
||||||
|
load r3, eoflod + 1
|
||||||
|
store eofchk + 1, r3
|
||||||
|
store cmpadr, r3
|
||||||
|
;Low byte
|
||||||
|
load r0, eoflod + 2
|
||||||
|
store eofchk + 2, r0
|
||||||
|
store cmpadr + 1, r0
|
||||||
|
|
||||||
|
;Save the marked line
|
||||||
|
cleq r0, r0, eofchk
|
||||||
|
|
||||||
|
;Loop
|
||||||
|
;Decrement the counter
|
||||||
|
load r0, count
|
||||||
|
load r2, cstff
|
||||||
|
cleq r0, r0, sum
|
||||||
|
store count, r0
|
||||||
|
;Check if the mark is a hash
|
||||||
|
load r2, cstff
|
||||||
|
load r0, target
|
||||||
|
brneq r0, r2, incmrk
|
||||||
|
load r1, target + 1
|
||||||
|
breq r1, r2, incln
|
||||||
|
;Increment the mark
|
||||||
|
incmrk: load r1, target + 1
|
||||||
|
cleq r0, r0, incdw
|
||||||
|
store mark, r0
|
||||||
|
store mark + 1, r1
|
||||||
|
;Increment the line number
|
||||||
|
incln: load r0, tmp
|
||||||
|
load r1, tmp + 1
|
||||||
|
cleq r0, r0, incdw
|
||||||
|
store target, r0
|
||||||
|
store target + 1, r1
|
||||||
|
|
||||||
|
;Check if the mark is less than the line number
|
||||||
|
;Negate the mark and store in tmp
|
||||||
|
load r0, mark
|
||||||
|
nand r0, r0
|
||||||
|
load r1, mark + 1
|
||||||
|
nand r1, r1
|
||||||
|
cleq r0, r0, incdw
|
||||||
|
store tmp, r0
|
||||||
|
store tmp + 1, r1
|
||||||
|
;Add the high bytes
|
||||||
|
load r0, target
|
||||||
|
load r2, tmp
|
||||||
|
cleq r0, r0, sum
|
||||||
|
store tmp, r0
|
||||||
|
;Store the overflow in r3
|
||||||
|
xor r3, r3
|
||||||
|
xor r3, r1
|
||||||
|
;Add the low bytes
|
||||||
|
load r0, target + 1
|
||||||
|
load r2, tmp + 1
|
||||||
|
cleq r0, r0, sum
|
||||||
|
;Add the overflow to the high byte
|
||||||
|
load r0, tmp
|
||||||
|
xor r2, r2
|
||||||
|
xor r2, r1
|
||||||
|
cleq r0, r0, sum
|
||||||
|
;Check
|
||||||
|
xor r1, r3
|
||||||
|
xor r3, r3
|
||||||
|
breq r1, r3, cpend
|
||||||
|
;Re-increment the mark
|
||||||
|
load r0, target
|
||||||
|
load r1, target + 1
|
||||||
|
cleq r0, r0, incdw
|
||||||
|
store target, r0
|
||||||
|
store target + 1, r1
|
||||||
|
|
||||||
|
;Loop
|
||||||
|
cpend: breq r0, r0, copy
|
||||||
|
|
||||||
;***
|
;***
|
||||||
|
|
||||||
|
@ -1586,9 +1693,9 @@ ucf: data 46
|
||||||
uch: data 48
|
uch: data 48
|
||||||
uci: data 49
|
uci: data 49
|
||||||
ucl: data 4c
|
ucl: data 4c
|
||||||
|
ucm: data 4d
|
||||||
ucp: data 50
|
ucp: data 50
|
||||||
ucr: data 52
|
ucr: data 52
|
||||||
ucs: data 53
|
|
||||||
ucw: data 57
|
ucw: data 57
|
||||||
bslash: data 5c
|
bslash: data 5c
|
||||||
uscore: data 5f
|
uscore: data 5f
|
||||||
|
@ -1601,9 +1708,9 @@ lcf: data 66
|
||||||
lch: data 68
|
lch: data 68
|
||||||
lci: data 69
|
lci: data 69
|
||||||
lcl: data 6c
|
lcl: data 6c
|
||||||
|
lcm: data 6d
|
||||||
lcp: data 70
|
lcp: data 70
|
||||||
lcr: data 72
|
lcr: data 72
|
||||||
lcs: data 73
|
|
||||||
lcw: data 77
|
lcw: data 77
|
||||||
del: data 7f
|
del: data 7f
|
||||||
|
|
||||||
|
|
12
readme.md
12
readme.md
|
@ -20,20 +20,22 @@ Usage
|
||||||
The commands are individual letters that can be followed by one or two
|
The commands are individual letters that can be followed by one or two
|
||||||
arguments separated by a comma, all case-insensitive. The first argument
|
arguments separated by a comma, all case-insensitive. The first argument
|
||||||
is a line number between 0 and FFFF and the second a range of lines
|
is a line number between 0 and FFFF and the second a range of lines
|
||||||
between 0 and FF. To append lines, insert them to any line number after
|
between 0 and FF. To append lines, insert or copy them to any line
|
||||||
the text or to the shortcut hash (#); in other commands line numbers or
|
number after the text or to the shortcut hash (#); in other commands
|
||||||
parts of a range after the text are ignored. Instead of a predetermined
|
line numbers or parts of a range after the text are ignored. Instead of
|
||||||
range a prompt to insert the next line appears automatically after the
|
a predetermined range a prompt to insert the next line appears
|
||||||
previous one has been committed.
|
automatically after the previous one has been committed.
|
||||||
|
|
||||||
Commands with a single argument:
|
Commands with a single argument:
|
||||||
* I: Insert lines
|
* I: Insert lines
|
||||||
|
|
||||||
Commands with two arguments:
|
Commands with two arguments:
|
||||||
|
* C: Copy to the mark
|
||||||
* D: Delete lines
|
* D: Delete lines
|
||||||
* L: List lines
|
* L: List lines
|
||||||
|
|
||||||
Commands with no arguments:
|
Commands with no arguments:
|
||||||
|
* M: Set a mark
|
||||||
* P: Print
|
* P: Print
|
||||||
* R: Read from the tape reader or casette drive
|
* R: Read from the tape reader or casette drive
|
||||||
* W: Write to the tape punch or casette drive
|
* W: Write to the tape punch or casette drive
|
||||||
|
|
Loading…
Reference in a new issue