aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Comeaux <jacquesrcomeaux@protonmail.com>2024-07-07 17:13:53 -0500
committerJacques Comeaux <jacquesrcomeaux@protonmail.com>2024-07-07 17:13:53 -0500
commit17d59ac15b87588de2228aa768e99b5bbca4561c (patch)
treec0e1f52fed4e77620fd3f8599b6ba9870e310143
parent420bc15ae16b736fbce1a4846126cd983dd3b75b (diff)
Add assembler (stage 2) top-level
-rw-r--r--assembler/assemble.s7
-rw-r--r--assembler/main.s39
-rw-r--r--assembler/uart.s20
3 files changed, 41 insertions, 25 deletions
diff --git a/assembler/assemble.s b/assembler/assemble.s
index 9517864..9f5c022 100644
--- a/assembler/assemble.s
+++ b/assembler/assemble.s
@@ -14,15 +14,12 @@
assemble: PUSH {LR}
LDR R0, =uart_send
LDR R1, =get_char
- // ADDS R0, 1
- // ADDS R1, 1
MOV R9, R0
MOV R10, R1
MOVS R6, 0
MOVS R0, '
MOV R8, R0
LDR R1, =opcode
- // ADDS R1, 1
BLX R1
MOV R0, R8
BLX R9
@@ -41,7 +38,6 @@ handle_reg: MOVS R1, (1<<4) // bit 4 mask // if 111xyyyy
ANDS R0, R1 // get bit 4
ADDS R0, 3 // add 3 to it (now 3 or 4)
LDR R1, =register
- // ADDS R1, 1
BLX R1
MOVS R0, 0x0F // lower nibble mask
ANDS R0, R7 // store shift amount in R0
@@ -65,7 +61,6 @@ fin: LSLS R0, R2
handle_imm: MOVS R1, 0x0F // lower nibble mask
ANDS R0, R1 // store immediate width in R0
LDR R1, =octal
- // ADDS R1, 1
BLX R1 // result is put in R4
LSLS R0, R7, 27
LSRS R0, 31
@@ -77,6 +72,4 @@ done_stuff: MOV R0, R8 // copy the end_char into R0
BLX R9 // echo the space (or carriage return)
here: LSRS R7, 0x8 // get next parse instruction
BNE main_loop // if it's nonzero there are more things to parse
-done: MOVS R0, '\n // send newline
- BLX R9
POP {PC}
diff --git a/assembler/main.s b/assembler/main.s
index 9a7fd89..1795823 100644
--- a/assembler/main.s
+++ b/assembler/main.s
@@ -10,8 +10,37 @@ main:
bl setup_clocks
bl setup_gpio
bl setup_uart
-1:
- bl assemble
- movs r0, r6
- bl send_hex
- b 1b
+ b assembler
+
+assembler: LDR R0, =0x20001000 // SRAM_BASE
+ MOV R11, R0
+ ADDS R1, R0, 1 // JUMP ADDRESS
+ MOV R12, R1
+1: BL PROMPT // SHOW PROMPT
+ BL assemble
+ B 2f // TODO condition
+ BX R12
+2: MOV R7, R11 // STORE INSTRUCTION WORD
+ STRH R6, [R7]
+ MOVS R0, '\r // NEW LINE
+ BL uart_send
+ BL PROMPT // REWRITE PROMPT
+ ADDS R7, 2 // INCREMENT POINTER
+ MOV R11, R7
+ MOVS R0, '\r
+ BL uart_send
+ MOVS R0, '\n
+ BL uart_send
+ B 1b
+
+PROMPT: PUSH {LR}
+ MOV R0, R11 // CURRENT ADDRESS
+ BL send_hex
+ MOVS R0, ' // SPACE
+ BL uart_send
+ MOV R1, R11 // CURRENT CONTENTS
+ LDRH R0, [R1]
+ BL send_hex
+ MOVS R0, ' // SPACE
+ BL uart_send
+ POP {PC} // RETURN
diff --git a/assembler/uart.s b/assembler/uart.s
index 8dd6a68..e1f5e8b 100644
--- a/assembler/uart.s
+++ b/assembler/uart.s
@@ -27,7 +27,7 @@ uart_recv: LDR R1, =UART0_BASE // 0x000E 0x4914
MOVS R3, 0b1 << 4 // 0x0010 0x2310 ; RX FIFO EMPTY
1: LDR R2, [R1, UARTFR_OFST] // 0x0012 0x670A
TST R2, R3 // 0x0014 0x421A
- BNE 1b // 0x0016 0xF1FC
+ BNE 1b // 0x0016 0xD1FC
LDRB R0, [R1, UARTDR_OFST] // 0x0018 0x7808
BX LR // 0x001A 0x4770
get_char: PUSH {LR} // 0x001C 0xB500
@@ -36,14 +36,14 @@ get_char: PUSH {LR} // 0x001C 0xB500
CMP R0, R8 // 0x0022 0x4540
POP {PC} // 0x0024 0xBD00
send_hex: PUSH {LR} // 0x0026 0xB500
- MOVS R4, R0 // 0x0028 0x0004
+ LSLS R4, R0, 16 // 0x0028 0x
MOVS R0, '0 // 0x002A 0x2030
BL uart_send // 0x002C 0xF7FF
// 0x002E 0xFFE8
MOVS R0, 'x // 0x0030 0x2078
BL uart_send // 0x0032 0xF7FF
// 0x0034 0xFFE5
- MOVS R5, 8 // 0x0036 0x2508 ; EIGHT NIBBLES IN A WORD
+ MOVS R5, 4 // 0x0036 0x2504 ; FOUR NIBBLES TO PRINT
0: MOVS R0, 28 // 0x0038 0x201C ; ROTATE LEFT 4
RORS R4, R0 // 0x003A 0x41C4
MOVS R0, 0xF // 0x003C 0x200F ; LOWEST NIBBLE MASK
@@ -56,13 +56,7 @@ send_hex: PUSH {LR} // 0x0026 0xB500
2: BL uart_send // 0x004A 0xF7FF
// 0x004C 0xFFD9
SUBS R5, 1 // 0x004E 0x3D01
- BNE 0b // 0x0050 0xD1F9
- MOVS R0, '\r // 0x0052 0x200D
- BL uart_send // 0x0054 0xF7FF
- // 0x0056 0xFFD4
- MOVS R0, '\n // 0x0058 0x200A
- BL uart_send // 0x005A 0xF7FF
- // 0x005C 0xFFD1
- POP {PC} // 0x005E 0xBD00
- // 0x0060 0x4000 ; UART0_BASE
- // 0x0062 0x4003
+ BNE 0b // 0x0050 0xD1F2
+ POP {PC} // 0x0052 0xBD00
+ // 0x0054 0x4000 ; UART0_BASE
+ // 0x0056 0x4003