aboutsummaryrefslogtreecommitdiff
path: root/newasm/parsers/register.s
diff options
context:
space:
mode:
Diffstat (limited to 'newasm/parsers/register.s')
-rw-r--r--newasm/parsers/register.s13
1 files changed, 7 insertions, 6 deletions
diff --git a/newasm/parsers/register.s b/newasm/parsers/register.s
index 48ebf7a..9334aa3 100644
--- a/newasm/parsers/register.s
+++ b/newasm/parsers/register.s
@@ -5,9 +5,6 @@
.type register, %function
.global register
-// 1 unexpected char
-// 2 invalid general-purpose register number
-
// R4 input buffer
// R2 output buffer
@@ -21,9 +18,12 @@ r_test: CMP R0, 'R
POP {PC} // error code already in R0
validate: CMP R2, #12 // general purpose registers 0-12
BLS success
- MOVS R0, #2 // invalid register number error code
+ MOVS R0, #7 // invalid register number error code
POP {PC}
-special: LDRH R0, [R4] // get two bytes from input stream
+special: LDRB R0, [R4] // get two bytes from input stream
+ LDRB R1, [R4, 1]
+ LSLS R1, 8
+ ORRS R0, R1
ADR R2, table // get address of table
MOVS R3, 0 // set table offset to 0
loop: LDRH R1, [R2, R3] // get two bytes from table at current offset
@@ -32,7 +32,7 @@ loop: LDRH R1, [R2, R3] // get two bytes from table at current offset
ADDS R3, 2 // increment table offset
CMP R3, 6 // compare offset to table size
BLO loop // loop until end of table
- MOVS R0, #1 // return code 1 (unexpected char)
+ MOVS R0, #6 // return code 6 (expected register)
POP {PC}
done: ADDS R4, 2 // consume two chars
LSRS R3, 1 // divide table offset by two to row
@@ -41,6 +41,7 @@ done: ADDS R4, 2 // consume two chars
success: MOVS R0, #0 // return code 0 (success)
POP {PC}
+ .align 4
table: .ascii "SP"
.ascii "LR"
.ascii "PC"