aboutsummaryrefslogtreecommitdiff
path: root/assembler/main.s
blob: a9fd10904d598cd6d174dcb64af870092d739387 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
.syntax unified
.cpu cortex-m0plus
.thumb

.type main, %function
.global main

main:       LDR     R0, =0x20000000         // SRAM_BASE
0:          MOV     R11, R0
            ADDS    R1, R0, 1               // JUMP ADDRESS
            MOV     R12, R1
1:          BL      PROMPT                  // SHOW PROMPT
            BL      assemble
            CMP     R0, 1                   // SET NEW ADDRESS
            BNE     2f
            MOVS    R0, '\r                 // SEND CR
            BL      uart_send
            MOV     R1, R11                 // GET ADDRESS
            LSRS    R1, 16                  // SHIFT OUT LOWER HALFWORD
            MOVS    R0, R1                  // SAVE IN R0
            LSLS    R1, 16                  // SHIFT BACK
            MOV     R11, R1                 // SAVE ALTERRED ADDRESS
            MOVS    R1, 4                   // SEND HEX WITH WIDTH 4
            BL      send_hex
            BL      get_hex                 // GET HEX INPUT FOR OFFSET
            MOV     R0, R11                 // ADD OFFSET TO ADDRESS
            ADDS    R0, R4
            B       0b
2:          CMP     R0, 2                   // JUMP TO NEW CODE
            BNE     3f
            BX      R12
3:          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
            MOVS    R1, 8
            BL      send_hex
            MOVS    R0, '                   // SPACE
            BL      uart_send
            MOV     R1, R11                 // CURRENT CONTENTS
            LDRH    R0, [R1]
            MOVS    R1, 4
            BL      send_hex
            MOVS    R0, '                   // SPACE
            BL      uart_send
            POP     {PC}                    // RETURN