diff options
author | Jacques Comeaux <jacquesrcomeaux@protonmail.com> | 2024-05-20 01:48:22 -0500 |
---|---|---|
committer | Jacques Comeaux <jacquesrcomeaux@protonmail.com> | 2024-05-20 01:48:22 -0500 |
commit | ede3b86fd1cb89f17ed99a275c731f6a58b23cfd (patch) | |
tree | b45aaf47b8c14f5f9e645c119fe6613b338672db | |
parent | c96ba2b2678e4b92e7969c683d4cb3f1648af813 (diff) |
Finish and integrate opcode parser
-rw-r--r-- | assembler/assemble.s | 25 | ||||
-rw-r--r-- | assembler/instructions | 2 | ||||
-rw-r--r-- | assembler/opcode.s | 404 |
3 files changed, 214 insertions, 217 deletions
diff --git a/assembler/assemble.s b/assembler/assemble.s index ef3893d..61d4f40 100644 --- a/assembler/assemble.s +++ b/assembler/assemble.s @@ -6,31 +6,30 @@ .global assemble // TODO: -// - implement opcode parser -// - test each instruction (do this later -- much easier) -// - test 4-bit reg instructions -// - test BEQ overlaps +// - test each instruction // - decide on additional push or pops +// - add data literal "instructions" +// - redo_line is problematic assemble: - // LDR R3, [SP, 20] + PUSH {LR} MOVS R6, 0 - LDR R7, =0x00C8E893 - // LDR R7, =0xE0E3A588 MOVS R0, ' MOV R8, R0 + BL opcode + MOV R0, R8 + BL uart_send + MOVS R7, R4 main_loop: LSRS R0, R7, 8 // just peek BNE skip // if more stuff then skip MOVS R0, '\r MOV R8, R0 //set end char to carriage return skip: - // MOVS R0, 0xFF // lsb mask - // ANDS R0, R7 // store in R0 UXTB R0, R7 // store lsb in R0 LSRS R1, R0, 4 // upper nibble CMP R1, 0xC // if 0xxxxxxx or 10xxxxxx - BLO opcode + BLO handle_opcode CMP R1, 0xE // if 110xyyyy BLO handle_imm handle_reg: // if 111xyyyy @@ -43,7 +42,7 @@ handle_reg: // if 111xyyyy LSLS R4, R0 // shift the result by the shift amount ORRS R6, R4 // OR the register code into the word under construction B done_stuff -opcode: +handle_opcode: MOVS R2, 9 // shift amount for 7-bit opcode MOVS R1, (1<<7) // bit 7 mask TST R0, R1 // check bit 7 @@ -78,9 +77,7 @@ here: done: MOVS R0, '\n // send newline BL uart_send - MOVS R0, R6 - BL send_hex - B assemble + POP {PC} .type get_char, %function .global get_char diff --git a/assembler/instructions b/assembler/instructions index 88ebd23..ebe31b8 100644 --- a/assembler/instructions +++ b/assembler/instructions @@ -26,7 +26,7 @@ start with all 0 1100yyyy // octal immediate with shift amount 0 and bit-width yyyy 1101yyyy // octal immediate with shift amount 6 and bit-width yyyy 1110yyyy // 3-bit reg with shift amount yyyy -1111yyyy // 4-bit reg with shift amount yyyy (excluding yyyy=1111=15) +1111yyyy // 4-bit reg with shift amount yyyy ADCS (register) T1 01000 00101 Rm Rdn E3 E0 A5 88 ADDSI3 (immediate) T1 0001110 imm3 Rn Rd D3 E3 E0 0E diff --git a/assembler/opcode.s b/assembler/opcode.s index f6e93c4..5e72660 100644 --- a/assembler/opcode.s +++ b/assembler/opcode.s @@ -47,29 +47,32 @@ first_time: LDRB R1, [R5, 1] // load parse instruction vs offset byte TST R1, R1 // check if zero BNE get_match // non-zero means it's an address +get_end_char: + BL get_char + BNE get_end_char POP {PC} // zero means it's a parse instruction .align 4 start: .byte 'A, 0x01 ; .hword 0x0000 ; .word A - // .byte 'B, 0x00 ; .hword 0x0000 ; .word 0xE3E0AE88 // BICS (register) T1 01000 01110 Rm Rdn - // .byte 'C, 0x00 ; .hword 0x0000 ; .word 0xE3E0AB88 // CMN (register) T1 01000 01011 Rm Rn - // .byte 'D, 0x00 ; .hword 0x0000 ; .word 0x00C8E884 // MOVSI (immediate) T1 00100 Rd imm8 - // .byte 'J, 0x00 ; .hword 0x0000 ; .word 0x00C8A09A // BEQ T1 11010 000 imm8 - // .byte 'L, 0x00 ; .hword 0x0000 ; .word 0xD5E3E08D // LDRI5 (immediate) T1 01101 imm5 Rn Rt - // .byte 'P, 0x00 ; .hword 0x0000 ; .word 0x0000B496 // PUSHLR T1 10110 10100 000000 - // .byte 'R, 0x00 ; .hword 0x0000 ; .word 0xE3E0A788 // RORS (register) T1 01000 00111 Rm Rdn - // .byte 'S, 0x00 ; .hword 0x0000 ; .word 0xD5E3E08C // STRI5 (immediate) T1 01100 imm5 Rn Rt - // .byte 'T, 0x00 ; .hword 0x0000 ; .word 0xD5E3E080 // LSLSI (immediate) T1 00000 imm5 Rm Rd + .byte 'B, 0x01 ; .hword 0x0000 ; .word B + .byte 'C, 0x01 ; .hword 0x0000 ; .word C + .byte 'D, 0x01 ; .hword 0x0000 ; .word D + .byte 'J, 0x01 ; .hword 0x0000 ; .word J + .byte 'L, 0x01 ; .hword 0x0000 ; .word L + .byte 'P, 0x01 ; .hword 0x0000 ; .word P + .byte 'R, 0x01 ; .hword 0x0000 ; .word R + .byte 'S, 0x01 ; .hword 0x0000 ; .word S + .byte 'T, 0x01 ; .hword 0x0000 ; .word T .word 0x00000000, 0x00000000 A: .byte 'A, 0x01 ; .hword 0x0000 ; .word AA - // .byte 'H, 0x01 ; .hword 0x0000 ; .word AH + .byte 'H, 0x01 ; .hword 0x0000 ; .word AH .byte 'M, 0x00 ; .hword 0x0000 ; .word 0xE3E0AD88 // MULS T1 01000 01101 Rn Rdm .byte 'N, 0x00 ; .hword 0x0000 ; .word 0xE3E0A988 // NEG (immediate) T1 01000 01001 Rn Rd - // .byte 'S, 0x01 ; .hword 0x0000 ; .word AS + .byte 'S, 0x01 ; .hword 0x0000 ; .word AS .word 0x00000000, 0x00000000 AA: @@ -90,194 +93,191 @@ AAR: .byte 'L, 0x00 ; .hword 0x0000 ; .word 0xF3E0B088 // ADDRLO (register) T2 010001000 Rm4 Rdn .word 0x00000000, 0x00000000 -// ASC SBCS (register) T1 01000 00110 Rm Rdn E3 E0 A6 88 -// ASI3 SUBSI3 (immediate) T1 0001111 imm3 Rn Rd D3 E3 E0 0F -// ASI8 SUBSI8 (immediate) T2 00111 Rdn imm8 00 C8 E8 87 -// ASR SUBSR (register) T1 0001101 Rm Rn Rd E6 E3 E0 0D - -// AHI SRSI (immediate) T1 00010 imm5 Rm Rd D5 E3 E0 82 -// AHR SRSR (register) T1 01000 00100 Rm Rdn E3 E0 A4 88 - -// Choice 2 -// AH -// --I -// --R - -// Choice 3 -// AS -// --C -// --I -// --R - -// Choice 6 -// B -// -A -// -C -// -I -// -O -// -T -// -X - -// Choice 3 -// C -// -I -// -N -// -R - -// Choice 2 -// CR -// --3 -// --4 - -// Choice 2 -// CR4 -// ---H -// ---L - -// Choice 4 -// D -// -I -// -R -// -S -// -U - -// Choice 3 -// DR -// --F -// --H -// --L - -// Choice 2 -// DS -// --B -// --H - -// Choice 2 -// DU -// --B -// --H - -// Choice 12 -// J -// -A -// -E -// -G -// -H -// -I -// -L -// -M -// -N -// -P -// -R -// -S -// -V - -// Choice 2 -// JG -// --E -// --T - -// Choice 2 -// JH -// --I -// --S - -// Choice 2 -// JI -// --H -// --L - -// Choice 5 -// JL -// --E -// --O -// --R -// --S -// --T - -// Choice 2 -// JV -// --C -// --S - -// Choice 6 -// L -// -B -// -H -// -I -// -L -// -R -// -S - -// Choice 2 -// LB -// --I -// --R - -// Choice 2 -// LH -// --I -// --R - -// Choice 2 -// LI -// --5 -// --8 - -// Choice 2 -// LS -// --B -// --H - -// Choice 2 -// P -// -L -// -P - -// Choice 2 -// R -// -B -// -R - -// Choice 3 -// RB -// --H -// --S -// --W - -// Choice 4 -// S -// -B -// -H -// -I -// -R - -// Choice 2 -// SB -// --I -// --R - -// Choice 2 -// SH -// --I -// --R - -// Choice 2 -// SI -// --5 -// --8 - -// Choice 2 -// T -// -L -// -R - -// Choice 2 -// TL -// --I -// --R - -// Choice 2 -// TR -// --I -// --R +AH: + .byte 'I, 0x00 ; .hword 0x0000 ; .word 0xD5E3E082 // ASRSI (immediate) T1 00010 imm5 Rm Rd + .byte 'R, 0x00 ; .hword 0x0000 ; .word 0xE3E0A488 // ASRSR (register) T1 01000 00100 Rm Rdn + .word 0x00000000, 0x00000000 + +AS: + .byte 'C, 0x00 ; .hword 0x0000 ; .word 0xE3E0A688 // SBCS (register) T1 01000 00110 Rm Rdn + .byte 'I, 0x01 ; .hword 0x0000 ; .word ASI + .byte 'R, 0x00 ; .hword 0x0000 ; .word 0xE6E3E00D // SUBSR (register) T1 0001101 Rm Rn Rd + .word 0x00000000, 0x00000000 + +ASI: + .byte '3, 0x00 ; .hword 0x0000 ; .word 0xD3E3E00F // SUBSI3 (immediate) T1 0001111 imm3 Rn Rd + .byte '8, 0x00 ; .hword 0x0000 ; .word 0x00C8E887 // SUBSI8 (immediate) T2 00111 Rdn imm8 + .word 0x00000000, 0x00000000 + +B: + .byte 'A, 0x00 ; .hword 0x0000 ; .word 0xE3E0A088 // ANDS (register) T1 01000 00000 Rm Rdn + .byte 'C, 0x00 ; .hword 0x0000 ; .word 0xE3E0AE88 // BICS (register) T1 01000 01110 Rm Rdn + .byte 'I, 0x00 ; .hword 0x0000 ; .word 0xE3E0AF88 // MVNS (register) T1 01000 01111 Rm Rd + .byte 'O, 0x00 ; .hword 0x0000 ; .word 0xE3E0AC88 // ORRS (register) T1 01000 01100 Rm Rdn + .byte 'T, 0x00 ; .hword 0x0000 ; .word 0xE3E0A888 // TST (register) T1 01000 01000 Rm Rd + .byte 'X, 0x00 ; .hword 0x0000 ; .word 0xE3E0A188 // EORS (register) T1 01000 00001 Rm Rdn + .word 0x00000000, 0x00000000 + +C: + .byte 'I, 0x00 ; .hword 0x0000 ; .word 0x00C8E885 // CMPI (immediate) T1 00101 Rn imm8 + .byte 'N, 0x00 ; .hword 0x0000 ; .word 0xE3E0AB88 // CMN (register) T1 01000 01011 Rm Rn + .byte 'R, 0x01 ; .hword 0x0000 ; .word CR + .word 0x00000000, 0x00000000 + +CR: + .byte '3, 0x00 ; .hword 0x0000 ; .word 0xE3E0AA88 // CMPR (register) T1 01000 01010 Rm Rn + .byte '4, 0x01 ; .hword 0x0000 ; .word CR4 + .word 0x00000000, 0x00000000 + +CR4: + .byte 'H, 0x00 ; .hword 0x0000 ; .word 0xF3E0B688 // CMPRHI (register) T2 010001011 Rm4 Rd + .byte 'L, 0x00 ; .hword 0x0000 ; .word 0xF3E0B488 // CMPRLO (register) T2 010001010 Rm4 Rd + .word 0x00000000, 0x00000000 + +D: + .byte 'I, 0x00 ; .hword 0x0000 ; .word 0x00C8E884 // MOVSI (immediate) T1 00100 Rd imm8 + .byte 'R, 0x01 ; .hword 0x0000 ; .word DR + .byte 'S, 0x01 ; .hword 0x0000 ; .word DS + .byte 'U, 0x01 ; .hword 0x0000 ; .word DU + .word 0x00000000, 0x00000000 + +DR: + .byte 'F, 0x00 ; .hword 0x0000 ; .word 0xE3E0A080 // MOVSR (register) T2 00000 00000 Rm + .byte 'H, 0x00 ; .hword 0x0000 ; .word 0xF3E0BA88 // MOVRHI (register) T1 010001101 Rm4 + .byte 'L, 0x00 ; .hword 0x0000 ; .word 0xF3E0B888 // MOVRLO (register) T1 010001100 Rm4 + .word 0x00000000, 0x00000000 + +DS: + .byte 'B, 0x00 ; .hword 0x0000 ; .word 0xE3E0A996 // SXTB T1 10110 01001 Rm + .byte 'H, 0x00 ; .hword 0x0000 ; .word 0xE3E0A896 // SXTH T1 10110 01000 Rm + .word 0x00000000, 0x00000000 + +DU: + .byte 'B, 0x00 ; .hword 0x0000 ; .word 0xE3E0AB96 // UXTB T1 10110 01011 Rm + .byte 'H, 0x00 ; .hword 0x0000 ; .word 0xE3E0AA96 // UXTH T1 10110 01010 Rm + .word 0x00000000, 0x00000000 + +J: + .byte 'A, 0x00 ; .hword 0x0000 ; .word 0x0000CB9C // B T2 11100 imm11 + .byte 'E, 0x00 ; .hword 0x0000 ; .word 0x00C8A09A // BEQ T1 11010 000 imm8 + .byte 'G, 0x01 ; .hword 0x0000 ; .word JG + .byte 'H, 0x01 ; .hword 0x0000 ; .word JH + .byte 'I, 0x01 ; .hword 0x0000 ; .word JI + .byte 'L, 0x01 ; .hword 0x0000 ; .word JL + .byte 'M, 0x00 ; .hword 0x0000 ; .word 0x00C8B09A // BMI T1 11010 100 imm8 + .byte 'N, 0x00 ; .hword 0x0000 ; .word 0x00C8A49A // BNE T1 11010 001 imm8 + .byte 'P, 0x00 ; .hword 0x0000 ; .word 0x00C8B49A // BPL T1 11010 101 imm8 + .byte 'R, 0x00 ; .hword 0x0000 ; .word 0x00E3BC88 // BX T1 01000 1110 Rm 000 + .byte 'S, 0x00 ; .hword 0x0000 ; .word 0x00C8BC9B // SVC T1 11011 111 imm8 + .byte 'V, 0x01 ; .hword 0x0000 ; .word JV + .word 0x00000000, 0x00000000 + +JG: + .byte 'E, 0x00 ; .hword 0x0000 ; .word 0x00C8A89B // BGE T1 11011 010 imm8 + .byte 'T, 0x00 ; .hword 0x0000 ; .word 0x00C8B09B // BGT T1 11011 100 imm8 + .word 0x00000000, 0x00000000 + +JH: + .byte 'I, 0x00 ; .hword 0x0000 ; .word 0x00C8A09B // BHI T1 11011 000 imm8 + .byte 'S, 0x00 ; .hword 0x0000 ; .word 0x00C8A89A // BHS T1 11010 010 imm8 + .word 0x00000000, 0x00000000 + +JI: + .byte 'H, 0x00 ; .hword 0x0000 ; .word 0x0000CB9E // BLHI T1 11110 imm11 + .byte 'L, 0x00 ; .hword 0x0000 ; .word 0x0000CB9F // BLLO T1 11111 imm11 + .word 0x00000000, 0x00000000 + +JL: + .byte 'E, 0x00 ; .hword 0x0000 ; .word 0x00C8B49B // BLE T1 11011 101 imm8 + .byte 'O, 0x00 ; .hword 0x0000 ; .word 0x00C8AC9A // BLO T1 11010 011 imm8 + .byte 'R, 0x00 ; .hword 0x0000 ; .word 0x00E3BE88 // BLX T1 01000 1111 Rm 000 + .byte 'S, 0x00 ; .hword 0x0000 ; .word 0x00C8A49B // BLS T1 11011 001 imm8 + .byte 'T, 0x00 ; .hword 0x0000 ; .word 0x00C8AC9B // BLT T1 11011 011 imm8 + .word 0x00000000, 0x00000000 + +JV: + .byte 'C, 0x00 ; .hword 0x0000 ; .word 0x00C8BC9A // BVC T1 11010 111 imm8 + .byte 'S, 0x00 ; .hword 0x0000 ; .word 0x00C8B89A // BVS T1 11010 110 imm8 + .word 0x00000000, 0x00000000 + +L: + .byte 'B, 0x01 ; .hword 0x0000 ; .word LB + .byte 'H, 0x01 ; .hword 0x0000 ; .word LH + .byte 'I, 0x01 ; .hword 0x0000 ; .word LI + .byte 'L, 0x00 ; .hword 0x0000 ; .word 0x00C8E889 // LDRL (literal) T1 01001 Rt imm8 + .byte 'R, 0x00 ; .hword 0x0000 ; .word 0xE6E3E02C // LDRR (register) T1 0101100 Rm Rn Rt + .byte 'S, 0x01 ; .hword 0x0000 ; .word LS + .word 0x00000000, 0x00000000 + +LB: + .byte 'I, 0x00 ; .hword 0x0000 ; .word 0xD5E3E08F // LDRBI (immediate) T1 01111 imm5 Rn Rt + .byte 'R, 0x00 ; .hword 0x0000 ; .word 0xE6E3E02E // LDRBR (register) T1 0101110 Rm Rn Rt + .word 0x00000000, 0x00000000 + +LH: + .byte 'I, 0x00 ; .hword 0x0000 ; .word 0xD5E3E091 // LDRHI (immediate) T1 10001 imm5 Rn Rt + .byte 'R, 0x00 ; .hword 0x0000 ; .word 0xE6E3E02D // LDRHR (register) T1 0101101 Rm Rn Rt + .word 0x00000000, 0x00000000 + +LI: + .byte '5, 0x00 ; .hword 0x0000 ; .word 0xD5E3E08D // LDRI5 (immediate) T1 01101 imm5 Rn Rt + .byte '8, 0x00 ; .hword 0x0000 ; .word 0x00C8E893 // LDRI8 (immediate) T2 10011 Rt imm8 + .word 0x00000000, 0x00000000 + +LS: + .byte 'B, 0x00 ; .hword 0x0000 ; .word 0xE6E3E02B // LDRSB (register) T1 0101011 Rm Rn Rt + .byte 'H, 0x00 ; .hword 0x0000 ; .word 0xE6E3E02F // LDRSH (register) T1 0101111 Rm Rn Rt + .word 0x00000000, 0x00000000 + +P: + .byte 'L, 0x00 ; .hword 0x0000 ; .word 0x0000B496 // PUSHLR T1 10110 10100 000000 + .byte 'P, 0x00 ; .hword 0x0000 ; .word 0x0000B497 // POPPC T1 10111 10100 000000 + .word 0x00000000, 0x00000000 + +R: + .byte 'B, 0x01 ; .hword 0x0000 ; .word RB + .byte 'R, 0x00 ; .hword 0x0000 ; .word 0xE3E0A788 // RORS (register) T1 01000 00111 Rm Rdn + .word 0x00000000, 0x00000000 + +RB: + .byte 'H, 0x00 ; .hword 0x0000 ; .word 0xE3E0A997 // REV16 T1 10111 01001 Rm Rd + .byte 'S, 0x00 ; .hword 0x0000 ; .word 0xE3E0AB97 // REVSH T1 10111 01011 Rm Rd + .byte 'W, 0x00 ; .hword 0x0000 ; .word 0xE3E0A897 // REV T1 10111 01000 Rm Rd + .word 0x00000000, 0x00000000 + +S: + .byte 'B, 0x01 ; .hword 0x0000 ; .word SB + .byte 'H, 0x01 ; .hword 0x0000 ; .word SH + .byte 'I, 0x01 ; .hword 0x0000 ; .word SI + .byte 'R, 0x00 ; .hword 0x0000 ; .word 0xE6E3E028 // STRR (register) T1 0101000 Rm Rn Rt + .word 0x00000000, 0x00000000 + +SB: + .byte 'I, 0x00 ; .hword 0x0000 ; .word 0xD5E3E08E // STRBI (immediate) T1 01110 imm5 Rn Rt + .byte 'R, 0x00 ; .hword 0x0000 ; .word 0xE6E3E02A // STRBR (register) T1 0101010 Rm Rn Rt + .word 0x00000000, 0x00000000 + +SH: + .byte 'I, 0x00 ; .hword 0x0000 ; .word 0xD5E3E090 // STRHI (immediate) T1 10000 imm5 Rn Rt + .byte 'R, 0x00 ; .hword 0x0000 ; .word 0xE6E3E029 // STRHR (register) T1 0101001 Rm Rn R + .word 0x00000000, 0x00000000 + +SI: + .byte '5, 0x00 ; .hword 0x0000 ; .word 0xD5E3E08C // STRI5 (immediate) T1 01100 imm5 Rn Rt + .byte '8, 0x00 ; .hword 0x0000 ; .word 0x00C8E892 // STRI8 (immediate) T2 10010 Rt imm8 + .word 0x00000000, 0x00000000 + +T: + .byte 'L, 0x01 ; .hword 0x0000 ; .word TL + .byte 'R, 0x01 ; .hword 0x0000 ; .word TR + .word 0x00000000, 0x00000000 + +TL: + .byte 'I, 0x00 ; .hword 0x0000 ; .word 0xD5E3E080 // LSLSI (immediate) T1 00000 imm5 Rm Rd + .byte 'R, 0x00 ; .hword 0x0000 ; .word 0xE3E0A288 // LSLSR (register) T1 01000 00010 Rm Rdn + .word 0x00000000, 0x00000000 + +TR: + .byte 'I, 0x00 ; .hword 0x0000 ; .word 0xD5E3E081 // LSRSI (immediate) T1 00001 imm5 Rm Rd + .byte 'R, 0x00 ; .hword 0x0000 ; .word 0xE3E0A388 // LSRSR (register) T1 01000 00011 Rm Rdn + .word 0x00000000, 0x00000000 |