diff options
Diffstat (limited to 'newasm/parsers/register.s')
-rw-r--r-- | newasm/parsers/register.s | 13 |
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" |