2022-08-18 21:14:06 +00:00
|
|
|
|
;String echo
|
|
|
|
|
|
|
|
|
|
;***
|
|
|
|
|
|
|
|
|
|
;Input
|
|
|
|
|
|
|
|
|
|
;Restore the buffer start address
|
|
|
|
|
;High byte
|
|
|
|
|
input: load r0, bfstrt
|
|
|
|
|
store chstor + 1, r0
|
|
|
|
|
;Low byte
|
|
|
|
|
load r0, bfstrt + 1
|
|
|
|
|
store chstor + 2, r0
|
|
|
|
|
|
|
|
|
|
;Print a prompt
|
|
|
|
|
load r0, prompt
|
|
|
|
|
store ffff, r0
|
|
|
|
|
load r0, space
|
|
|
|
|
store ffff, r0
|
|
|
|
|
|
|
|
|
|
;Initialise the character counter
|
|
|
|
|
xor r0, r0
|
|
|
|
|
|
|
|
|
|
;Read a character
|
|
|
|
|
inloop: load r1, ffff
|
|
|
|
|
|
|
|
|
|
;Check for control characters and the buffer end
|
|
|
|
|
;Escape
|
|
|
|
|
load r2, esc
|
|
|
|
|
breq r1, r2, escbr
|
|
|
|
|
;Carriage return
|
|
|
|
|
load r2, cr
|
|
|
|
|
breq r1, r2, crbr
|
|
|
|
|
;Buffer end
|
|
|
|
|
load r2, bfsize
|
|
|
|
|
brneq r0, r2, chstor
|
|
|
|
|
|
|
|
|
|
;Backtrack if at the buffer end
|
|
|
|
|
load r2, bs
|
|
|
|
|
store ffff, r2
|
|
|
|
|
breq r0, r0, inloop
|
|
|
|
|
|
|
|
|
|
;Store the character in the buffer
|
|
|
|
|
chstor: store buffer, r1
|
|
|
|
|
|
|
|
|
|
;Increment the character counter and store it in r3
|
|
|
|
|
;Increment
|
|
|
|
|
load r2, one
|
|
|
|
|
cleq r0, r0, sum
|
|
|
|
|
;Store
|
|
|
|
|
xor r3, r3
|
|
|
|
|
xor r3, r0
|
|
|
|
|
|
|
|
|
|
;Increment the buffer address
|
|
|
|
|
;Low byte
|
|
|
|
|
load r0, chstor + 2
|
|
|
|
|
load r2, one
|
|
|
|
|
cleq r0, r0, sum
|
|
|
|
|
store chstor + 2, r0
|
|
|
|
|
;Add the overflow to the high byte
|
|
|
|
|
load r0, chstor + 1
|
|
|
|
|
xor r2, r2
|
|
|
|
|
xor r2, r1
|
|
|
|
|
cleq r0, r0, sum
|
|
|
|
|
store chstor + 1, r0
|
|
|
|
|
|
|
|
|
|
;Reload the character counter to r0
|
|
|
|
|
xor r0, r0
|
|
|
|
|
xor r0, r3
|
|
|
|
|
|
|
|
|
|
;Read the next character
|
|
|
|
|
breq r0, r0, inloop
|
|
|
|
|
|
|
|
|
|
;Print a backslash and a newline
|
|
|
|
|
;Backslash
|
|
|
|
|
escbr: load r0, space
|
|
|
|
|
store ffff, r0
|
|
|
|
|
load r0, bslash
|
|
|
|
|
store ffff, r0
|
|
|
|
|
;Newline
|
|
|
|
|
load r0, cr
|
|
|
|
|
store ffff, r0
|
|
|
|
|
load r0, lf
|
|
|
|
|
store ffff, r0
|
|
|
|
|
|
|
|
|
|
;Start a new input line
|
|
|
|
|
breq r0, r0, input
|
|
|
|
|
|
|
|
|
|
;Store a string-terminating zero in the buffer
|
|
|
|
|
;Get the buffer address
|
|
|
|
|
crbr: load r1, chstor + 1
|
|
|
|
|
store endsto + 1, r1
|
|
|
|
|
load r1, chstor + 2
|
|
|
|
|
store endsto + 2, r1
|
|
|
|
|
;Store
|
|
|
|
|
xor r0, r0
|
|
|
|
|
endsto: store 0000, r0
|
|
|
|
|
|
|
|
|
|
;***
|
|
|
|
|
|
|
|
|
|
;Print
|
|
|
|
|
|
|
|
|
|
;Print a line feed and align with the input
|
|
|
|
|
;Line feed
|
|
|
|
|
load r0, lf
|
|
|
|
|
store ffff, r0
|
|
|
|
|
;Align
|
|
|
|
|
load r0, space
|
|
|
|
|
store ffff, r0
|
|
|
|
|
store ffff, r0
|
|
|
|
|
|
|
|
|
|
;Load a character from the buffer
|
|
|
|
|
chprnt: load r1, buffer
|
|
|
|
|
|
|
|
|
|
;Check for string end
|
|
|
|
|
xor r2, r2
|
|
|
|
|
breq r1, r2, end
|
|
|
|
|
|
|
|
|
|
;Print the character
|
|
|
|
|
store ffff, r1
|
|
|
|
|
|
|
|
|
|
;Increment the buffer address
|
|
|
|
|
;Low byte
|
|
|
|
|
load r0, chprnt + 2
|
|
|
|
|
load r2, one
|
|
|
|
|
cleq r0, r0, sum
|
|
|
|
|
store chprnt + 2, r0
|
|
|
|
|
;Add the overflow to the high byte
|
|
|
|
|
load r0, chprnt + 1
|
|
|
|
|
xor r2, r2
|
|
|
|
|
xor r2, r1
|
|
|
|
|
cleq r0, r0, sum
|
|
|
|
|
store chprnt + 1, r0
|
|
|
|
|
|
|
|
|
|
;Print the next character
|
|
|
|
|
breq r0, r0, chprnt
|
|
|
|
|
|
|
|
|
|
;Print a newline
|
|
|
|
|
end: load r0, cr
|
|
|
|
|
store ffff, r0
|
|
|
|
|
load r0, lf
|
|
|
|
|
store ffff, r0
|
|
|
|
|
|
|
|
|
|
;Halt
|
|
|
|
|
halt
|
|
|
|
|
|
|
|
|
|
;***
|
|
|
|
|
|
|
|
|
|
;Add r2 to r0 with the overflow stored in r1
|
|
|
|
|
|
|
|
|
|
;Reset overflow
|
|
|
|
|
sum: xor r1, r1
|
|
|
|
|
store ovrflw, r1
|
|
|
|
|
|
|
|
|
|
;Copy the first argument to r1
|
|
|
|
|
sumlop: xor r1, r1
|
|
|
|
|
xor r1, r0
|
|
|
|
|
|
|
|
|
|
;Calculate the sum and carry and copy the pre-shift carry to r1
|
|
|
|
|
;Sum
|
|
|
|
|
xor r0, r2
|
|
|
|
|
;Carry
|
|
|
|
|
and r2, r1
|
|
|
|
|
;Copy the pre-shift carry
|
|
|
|
|
xor r1, r1
|
|
|
|
|
xor r1, r2
|
|
|
|
|
;Shift the carry
|
|
|
|
|
shl r2
|
|
|
|
|
|
|
|
|
|
;Check for and store overflow if any
|
|
|
|
|
;Check
|
|
|
|
|
rol r1
|
|
|
|
|
breq r1, r2, nvrflw
|
|
|
|
|
;Store
|
|
|
|
|
load r1, one
|
|
|
|
|
store ovrflw, r1
|
|
|
|
|
|
|
|
|
|
;Check for no carry
|
|
|
|
|
nvrflw: xor r1, r1
|
|
|
|
|
breq r1, r2, sumend
|
|
|
|
|
|
|
|
|
|
;Loop
|
|
|
|
|
breq r0, r0, sumlop
|
|
|
|
|
|
|
|
|
|
;Load overflow and return
|
|
|
|
|
sumend: load r1, ovrflw
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
;***
|
|
|
|
|
|
|
|
|
|
;Data
|
|
|
|
|
|
|
|
|
|
;Constants
|
|
|
|
|
one: data 1
|
|
|
|
|
|
|
|
|
|
;Characters
|
|
|
|
|
bs: data 8
|
|
|
|
|
lf: data a
|
|
|
|
|
cr: data d
|
|
|
|
|
esc: data 1b
|
|
|
|
|
space: data 20
|
|
|
|
|
prompt: data 3e
|
|
|
|
|
bslash: data 5c
|
|
|
|
|
|
|
|
|
|
;Variables
|
|
|
|
|
ovrflw: data 0
|
|
|
|
|
|
|
|
|
|
;Buffer
|
|
|
|
|
bfstrt: addr buffer
|
|
|
|
|
bfsize: data ff
|
|
|
|
|
|
|
|
|
|
buffer:
|
|
|
|
|
|