From 49942ac88d8181d061e09a43f6d61613a2c2ad5c Mon Sep 17 00:00:00 2001 From: CrazyEttin <> Date: Sun, 31 Jul 2022 19:16:26 +0300 Subject: [PATCH] Add an adder example and modify the ascii code viewer to make it more legible --- examples/adder.asm | 321 +++++++++++++++++++++++++++++++++++++++++++++ examples/ascii.asm | 6 +- 2 files changed, 326 insertions(+), 1 deletion(-) create mode 100644 examples/adder.asm diff --git a/examples/adder.asm b/examples/adder.asm new file mode 100644 index 0000000..05aac70 --- /dev/null +++ b/examples/adder.asm @@ -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 diff --git a/examples/ascii.asm b/examples/ascii.asm index 57a7d79..451eb15 100644 --- a/examples/ascii.asm +++ b/examples/ascii.asm @@ -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