Clarify the readme, add the echo example program, and prettyfy the ascii example program
This commit is contained in:
parent
394137950f
commit
38080674f5
|
@ -3,14 +3,19 @@
|
||||||
;Print a prompt
|
;Print a prompt
|
||||||
load r0, prompt
|
load r0, prompt
|
||||||
store ffff, r0
|
store ffff, r0
|
||||||
|
load r0, space
|
||||||
|
store ffff, r0
|
||||||
|
|
||||||
;Read a character to r0 and load it to r2
|
;Read a character to r0 and load it to r2
|
||||||
load r0, ffff
|
load r0, ffff
|
||||||
xor r2, r2
|
xor r2, r2
|
||||||
xor r2, r0
|
xor r2, r0
|
||||||
|
|
||||||
;Print a newline
|
;Print a newline and align
|
||||||
cleq r0, r0, newln
|
cleq r0, r0, newln
|
||||||
|
load r1, space
|
||||||
|
store ffff, r1
|
||||||
|
store ffff, r1
|
||||||
|
|
||||||
;Get the hexadecimal digit of the high nibble
|
;Get the hexadecimal digit of the high nibble
|
||||||
ror r0
|
ror r0
|
||||||
|
@ -119,9 +124,10 @@ dgtf: load r0, tbl1f
|
||||||
n2hend: ret
|
n2hend: ret
|
||||||
|
|
||||||
;Characters
|
;Characters
|
||||||
prompt: data 3e
|
|
||||||
cr: data d
|
cr: data d
|
||||||
lf: data a
|
lf: data a
|
||||||
|
space: data 20
|
||||||
|
prompt: data 3e
|
||||||
|
|
||||||
;Mask
|
;Mask
|
||||||
mask: data f
|
mask: data f
|
||||||
|
|
|
@ -0,0 +1,197 @@
|
||||||
|
;String echo
|
||||||
|
|
||||||
|
;Store the buffer start address in buffst
|
||||||
|
;High byte
|
||||||
|
load r0, chstor + 1
|
||||||
|
store buffst, r0
|
||||||
|
;Low byte
|
||||||
|
load r0, chstor + 2
|
||||||
|
store buffst + 1, r0
|
||||||
|
|
||||||
|
;Print a prompt
|
||||||
|
start: 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 an escape
|
||||||
|
load r2, esc
|
||||||
|
breq r1, r2, escbr
|
||||||
|
|
||||||
|
;Check for a return
|
||||||
|
load r2, cr
|
||||||
|
breq r1, r2, inend
|
||||||
|
|
||||||
|
;Check for end of the buffer
|
||||||
|
load r2, buffsz
|
||||||
|
brneq r0, r2, chstor
|
||||||
|
|
||||||
|
;Backtrack if end of the buffer
|
||||||
|
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 load it in r3
|
||||||
|
load r2, one
|
||||||
|
cleq r0, r0, sum
|
||||||
|
xor r3, r3
|
||||||
|
xor r3, r0
|
||||||
|
|
||||||
|
;Increment the buffer address
|
||||||
|
;High byte
|
||||||
|
load r0, chstor + 1
|
||||||
|
load r2, one
|
||||||
|
cleq r0, r0, sum
|
||||||
|
store chstor + 1, r0
|
||||||
|
;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
|
||||||
|
escbr: load r0, space
|
||||||
|
store ffff, r0
|
||||||
|
load r0, bslash
|
||||||
|
store ffff, r0
|
||||||
|
load r0, cr
|
||||||
|
store ffff, r0
|
||||||
|
load r0, lf
|
||||||
|
store ffff, r0
|
||||||
|
|
||||||
|
;Restore the buffer address to its start
|
||||||
|
;High byte
|
||||||
|
load r0, buffst
|
||||||
|
store chstor + 1, r0
|
||||||
|
;Low byte
|
||||||
|
load r0, buffst + 1
|
||||||
|
store chstor + 2, r0
|
||||||
|
|
||||||
|
;Start a new input line
|
||||||
|
breq r0, r0, start
|
||||||
|
|
||||||
|
;Store a string-terminating zero in the buffer
|
||||||
|
inend: xor r0, r0
|
||||||
|
load r1, chstor + 1
|
||||||
|
store endsto + 1, r1
|
||||||
|
load r1, chstor + 2
|
||||||
|
store endsto + 2, r1
|
||||||
|
endsto: store 0000, r0
|
||||||
|
|
||||||
|
;Print a line feed and align with the input
|
||||||
|
load r0, lf
|
||||||
|
store ffff, r0
|
||||||
|
load r0, space
|
||||||
|
store ffff, r0
|
||||||
|
store ffff, r0
|
||||||
|
|
||||||
|
;Load a character from the buffer
|
||||||
|
outlop: load r1, buffer
|
||||||
|
|
||||||
|
;Check for string end
|
||||||
|
xor r2, r2
|
||||||
|
breq r1, r2, outend
|
||||||
|
|
||||||
|
;Print the character
|
||||||
|
store ffff, r1
|
||||||
|
|
||||||
|
;Increment the buffer address
|
||||||
|
;High byte
|
||||||
|
load r0, outlop + 1
|
||||||
|
load r2, one
|
||||||
|
cleq r0, r0, sum
|
||||||
|
store outlop + 1, r0
|
||||||
|
;Low byte
|
||||||
|
load r0, outlop + 2
|
||||||
|
load r2, one
|
||||||
|
cleq r0, r0, sum
|
||||||
|
store outlop + 2, r0
|
||||||
|
;Add the overflow to the high byte
|
||||||
|
load r0, outlop + 1
|
||||||
|
xor r2, r2
|
||||||
|
xor r2, r1
|
||||||
|
cleq r0, r0, sum
|
||||||
|
store outlop + 1, r0
|
||||||
|
|
||||||
|
;Print the next character
|
||||||
|
breq r0, r0, outlop
|
||||||
|
|
||||||
|
;Print a newline
|
||||||
|
outend: 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
|
||||||
|
xor r0, r2
|
||||||
|
and r2, r1
|
||||||
|
xor r1, r1
|
||||||
|
xor r1, r2
|
||||||
|
shl r2
|
||||||
|
;Check for overflow
|
||||||
|
rol r1
|
||||||
|
breq r1, r2, nvrflw
|
||||||
|
;Store overflow
|
||||||
|
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
|
||||||
|
|
||||||
|
;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
|
||||||
|
buffst: data 0
|
||||||
|
data 0
|
||||||
|
buffsz: data f
|
||||||
|
buffer:
|
|
@ -11,7 +11,7 @@ Registers and Memory
|
||||||
* 24-bit instruction register IR
|
* 24-bit instruction register IR
|
||||||
* 16-bit instruction and return pointers IP and RP
|
* 16-bit instruction and return pointers IP and RP
|
||||||
* 8-bit general-purpose registers R0-R3
|
* 8-bit general-purpose registers R0-R3
|
||||||
* 8-bit memory addresses 0-FFFF
|
* 8-bit memory locations 0-FFFF
|
||||||
|
|
||||||
Multi-byte values are big-endian. Memory addresses FFF0-FFFF are
|
Multi-byte values are big-endian. Memory addresses FFF0-FFFF are
|
||||||
reserved for memory mapped devices; the instruction and return pointers
|
reserved for memory mapped devices; the instruction and return pointers
|
||||||
|
|
Loading…
Reference in New Issue