Add an adder example and modify the ascii code viewer to make it more legible
This commit is contained in:
parent
c4c41274f9
commit
49942ac88d
2 changed files with 326 additions and 1 deletions
321
examples/adder.asm
Normal file
321
examples/adder.asm
Normal 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
|
|
@ -6,10 +6,12 @@
|
||||||
|
|
||||||
;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
|
||||||
cleq r0, r0, newln
|
|
||||||
xor r2, r2
|
xor r2, r2
|
||||||
xor r2, r0
|
xor r2, r0
|
||||||
|
|
||||||
|
;Print a newline
|
||||||
|
cleq r0, r0, newln
|
||||||
|
|
||||||
;Get the hexadecimal digit of the high nibble
|
;Get the hexadecimal digit of the high nibble
|
||||||
ror r0
|
ror r0
|
||||||
ror r0
|
ror r0
|
||||||
|
@ -29,6 +31,8 @@
|
||||||
|
|
||||||
;Print the digit
|
;Print the digit
|
||||||
store ffff, r0
|
store ffff, r0
|
||||||
|
|
||||||
|
;Print a newline
|
||||||
cleq r0, r0, newln
|
cleq r0, r0, newln
|
||||||
|
|
||||||
;Halt
|
;Halt
|
||||||
|
|
Loading…
Reference in a new issue