Add an adder example and modify the ascii code viewer to make it more legible

This commit is contained in:
CrazyEttin 2022-07-31 19:16:26 +03:00
parent c4c41274f9
commit 49942ac88d
2 changed files with 326 additions and 1 deletions

321
examples/adder.asm Normal file
View File

@ -0,0 +1,321 @@
;Two-digit hexadecimal adder
;Print a prompt
load r0, prompt
store ffff, r0
;Read and convert the first argument and load it to r2
;First digit
load r0, ffff
cleq r0, r0, hex2n
xor r2, r2
xor r2, r0
shl r2
shl r2
shl r2
shl r2
;Second digit
load r0, ffff
cleq r0, r0, hex2n
or r2, r0
;Print a newline
cleq r0, r0, newln
;Print a plus sign
load r0, plus
store ffff, r0
;Read and convert the second argument and load it to r0
;First digit
load r0, ffff
cleq r0, r0, hex2n
xor r3, r3
xor r3, r0
shl r3
shl r3
shl r3
shl r3
;Second digit
load r0, ffff
cleq r0, r0, hex2n
or r0, r3
;Print a newline
cleq r0, r0, newln
;Add the arguments and load the result to r3
cleq r0, r0, adder
xor r3, r3
xor r3, r0
;Print an equals sign
load r0, equals
store ffff, r0
;Convert and print the result
;Restore the result back to r0
xor r0, r0
xor r0, r3
;High nibble
shr r0
shr r0
shr r0
shr r0
cleq r0, r0, n2hex
store ffff, r0
;Restore the result to r0
xor r0, r0
xor r0, r3
;Low nibble
cleq r0, r0, n2hex
store ffff, r0
;Print a newline
cleq r0, r0, newln
;Halt
halt
;Print a newline
newln: load r1, cr
store ffff, r1
load r1, lf
store ffff, r1
ret
;Get the value of a hexadecimal digit
;Locate the hexadecimal digit in the table
hex2n: load r1, tbl01
breq r0, r1, val0
load r1, tbl03
breq r0, r1, val1
load r1, tbl05
breq r0, r1, val2
load r1, tbl07
breq r0, r1, val3
load r1, tbl09
breq r0, r1, val4
load r1, tbl0b
breq r0, r1, val5
load r1, tbl0d
breq r0, r1, val6
load r1, tbl0f
breq r0, r1, val7
load r1, tbl11
breq r0, r1, val8
load r1, tbl13
breq r0, r1, val9
load r1, tbl15
breq r0, r1, vala
load r1, tbl17
breq r0, r1, valb
load r1, tbl19
breq r0, r1, valc
load r1, tbl1b
breq r0, r1, vald
load r1, tbl1d
breq r0, r1, vale
load r1, tbl1f
breq r0, r1, valf
load r1, tbl21
breq r0, r1, vala
load r1, tbl23
breq r0, r1, valb
load r1, tbl25
breq r0, r1, valc
load r1, tbl27
breq r0, r1, vald
load r1, tbl29
breq r0, r1, vale
load r1, tbl2b
breq r0, r1, valf
;Print a question mark and halt if the character is not a digit
load r0, qmark
store ffff, r0
cleq r0, r0, newln
halt
;Load the value of the hexadecimal digit
val0: load r0, tbl00
breq r0, r0, h2nend
val1: load r0, tbl02
breq r0, r0, h2nend
val2: load r0, tbl04
breq r0, r0, h2nend
val3: load r0, tbl06
breq r0, r0, h2nend
val4: load r0, tbl08
breq r0, r0, h2nend
val5: load r0, tbl0a
breq r0, r0, h2nend
val6: load r0, tbl0c
breq r0, r0, h2nend
val7: load r0, tbl0e
breq r0, r0, h2nend
val8: load r0, tbl10
breq r0, r0, h2nend
val9: load r0, tbl12
breq r0, r0, h2nend
vala: load r0, tbl14
breq r0, r0, h2nend
valb: load r0, tbl16
breq r0, r0, h2nend
valc: load r0, tbl18
breq r0, r0, h2nend
vald: load r0, tbl1a
breq r0, r0, h2nend
vale: load r0, tbl1c
breq r0, r0, h2nend
valf: load r0, tbl1e
breq r0, r0, h2nend
;Return
h2nend: ret
;Add r2 to r0
;Copy the first argument to r1
adder: xor r1, r1
xor r1, r0
;Calculate the sum and carry
xor r0, r2
and r2, r1
shl r2
;Check for no carry
xor r3, r3
breq r2, r3, addend
;Loop
breq r0, r0, adder
;Return
addend: ret
;Get the hexadecimal digit of a nibble
;Extract the low nibble
n2hex: load r1, mask
and r0, r1
;Locate the nibble in the table
load r1, tbl00
breq r0, r1, dgt0
load r1, tbl02
breq r0, r1, dgt1
load r1, tbl04
breq r0, r1, dgt2
load r1, tbl06
breq r0, r1, dgt3
load r1, tbl08
breq r0, r1, dgt4
load r1, tbl0a
breq r0, r1, dgt5
load r1, tbl0c
breq r0, r1, dgt6
load r1, tbl0e
breq r0, r1, dgt7
load r1, tbl10
breq r0, r1, dgt8
load r1, tbl12
breq r0, r1, dgt9
load r1, tbl14
breq r0, r1, dgta
load r1, tbl16
breq r0, r1, dgtb
load r1, tbl18
breq r0, r1, dgtc
load r1, tbl1a
breq r0, r1, dgtd
load r1, tbl1c
breq r0, r1, dgte
load r1, tbl1e
breq r0, r1, dgtf
;Load the hexadecimal digit of the nibble
dgt0: load r0, tbl01
breq r0, r0, n2hend
dgt1: load r0, tbl03
breq r0, r0, n2hend
dgt2: load r0, tbl05
breq r0, r0, n2hend
dgt3: load r0, tbl07
breq r0, r0, n2hend
dgt4: load r0, tbl09
breq r0, r0, n2hend
dgt5: load r0, tbl0b
breq r0, r0, n2hend
dgt6: load r0, tbl0d
breq r0, r0, n2hend
dgt7: load r0, tbl0f
breq r0, r0, n2hend
dgt8: load r0, tbl11
breq r0, r0, n2hend
dgt9: load r0, tbl13
breq r0, r0, n2hend
dgta: load r0, tbl15
breq r0, r0, n2hend
dgtb: load r0, tbl17
breq r0, r0, n2hend
dgtc: load r0, tbl19
breq r0, r0, n2hend
dgtd: load r0, tbl1b
breq r0, r0, n2hend
dgte: load r0, tbl1d
breq r0, r0, n2hend
dgtf: load r0, tbl1f
breq r0, r0, n2hend
;Return
n2hend: ret
;Characters
prompt: data 3e
plus: data 2b
equals: data 3d
qmark: data 3f
cr: data d
lf: data a
;Mask
mask: data f
;Hexadecimal table
;Numeric digits
tbl00: data 0
tbl01: data 30
tbl02: data 1
tbl03: data 31
tbl04: data 2
tbl05: data 32
tbl06: data 3
tbl07: data 33
tbl08: data 4
tbl09: data 34
tbl0a: data 5
tbl0b: data 35
tbl0c: data 6
tbl0d: data 36
tbl0e: data 7
tbl0f: data 37
tbl10: data 8
tbl11: data 38
tbl12: data 9
tbl13: data 39
;Upper case letter digits
tbl14: data a
tbl15: data 41
tbl16: data b
tbl17: data 42
tbl18: data c
tbl19: data 43
tbl1a: data d
tbl1b: data 44
tbl1c: data e
tbl1d: data 45
tbl1e: data f
tbl1f: data 46
;Lower case letter digits
tbl20: data a
tbl21: data 61
tbl22: data b
tbl23: data 62
tbl24: data c
tbl25: data 63
tbl26: data d
tbl27: data 64
tbl28: data e
tbl29: data 65
tbl2a: data f
tbl2b: data 66

View File

@ -6,10 +6,12 @@
;Read a character to r0 and load it to r2
load r0, ffff
cleq r0, r0, newln
xor r2, r2
xor r2, r0
;Print a newline
cleq r0, r0, newln
;Get the hexadecimal digit of the high nibble
ror r0
ror r0
@ -29,6 +31,8 @@
;Print the digit
store ffff, r0
;Print a newline
cleq r0, r0, newln
;Halt