aboutsummaryrefslogtreecommitdiff
path: root/newasm/main.s
blob: f1d3c0d5340127cdf56d73bc94a5910c129d1f37 (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
.syntax unified
.cpu cortex-m0plus
.thumb

.type main, %function
.global main, strbuf

main:     LDR     R5, =0x20002000
          BL      uart_recv           // wait for keypress
loop:     BL      prompt              // display address and data
          LDR     R0, inpbuf          // get a line of input
          BL      getline
          LDR     R4, inpbuf          // prepare input buffer
          LDR     R2, strbuf          // prepare output buffer
          MOVS    R0, 0               // clear output buffer
          STRB    R0, [R2]
          BL      statement           // call statement parser
          BNE     bad                 // print message if failure
          MOVS    R0, R1              // show assembled instruction
          BL      send_hex
          LDR     R0, =crlf
          BL      putstr
          B       loop                // repeat
bad:      PUSH    {R0}
          ADR     R0, fail
          BL      putstr
          POP    {R0}
          BL      send_hex
          LDR     R0, =crlf
          BL      putstr
          MOVS     R0, R4
          BL      putstrln
          B       loop

prompt:   PUSH    {LR}
          MOVS    R0, R5
          BL      send_hex
          MOVS    R0, ' 
          BL      uart_send
          LDR     R0, [R5]
          BL      send_hex
          MOVS    R0, ' 
          BL      uart_send
          POP     {PC}

          .align  4
inpbuf:   .word   0x20001F00        // TODO getline buffer overflow
strbuf:   .word   0x20001F80

          .align  4
success:  .asciz  "The parser suceeded"
          .align  4
fail:     .asciz  "The parser failed: "