aboutsummaryrefslogtreecommitdiff
path: root/assembler/uart.s
blob: 571226845d195aed695c3f2ec75a58ff7c70cf83 (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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
.syntax unified
.cpu cortex-m0plus
.thumb

.equ UART0_BASE, 0x40034000
.equ UARTDR_OFST,     0x00
.equ UARTFR_OFST,     0x18

.type uart_send, %function
.type uart_recv, %function
.type get_char, %function
.type send_hex, %function
.type get_hex, %function

.global uart_send
.global uart_recv
.global get_char
.global send_hex
.global get_hex

uart_send:  LDR     R1, =UART0_BASE         // 0x0000 0x4917
            MOVS    R3, 0b1 << 5            // 0x0002 0x2320  ; TX FIFO FULL
1:          LDR     R2, [R1, UARTFR_OFST]   // 0x0004 0x670A
            TST     R2, R3                  // 0x0006 0x421A
            BNE     1b                      // 0x0008 0xD1FC
            STRB    R0, [R1, UARTDR_OFST]   // 0x000A 0x7008
            BX      LR                      // 0x000C 0x4770
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 0xD1FC
            LDRB    R0, [R1, UARTDR_OFST]   // 0x0018 0x7808
            BX      LR                      // 0x001A 0x4770
get_char:   PUSH    {LR}                    // 0x001C 0xB500
            BL      uart_recv               // 0x001E 0xF7FF
                                            // 0x0020 0xFFF6
            CMP     R0, '<
            BNE     1f
            MOVS    R0, 1
            B       2f
1:          CMP     R0, '>
            BNE     3f
            MOVS    R0, 2
2:          POP     {R1}
            POP     {R1}
3:          CMP     R0, R8                  // 0x0022 0x4540
            POP     {PC}                    // 0x0024 0xBD00
send_hex:   PUSH    {LR}          // 000350 132400 B500
            MOVS    R4, R0        // 000352 000004 0004
            MOVS    R5, R1        // 000354 000015 000D
            LSLS    R1, 0x2       // 000356 000211 0049
            RORS    R4, R1        // 000360 040714 41CC
            MOVS    R0, 0x30      // 000362 020060 2030 ASCII 0
            BL      uart_send     // 000364 043710  UARTTX
            MOVS    R0, 0x78      // 000366 020170  ASCII x
            BL      uart_send     // 000370 043710  UARTTX
0:          MOVS    R0, 0x1C      // 000372 020034
            RORS    R4, R0        // 000374 040704
            MOVS    R0, 0x0F      // 000376 020017
            ANDS    R0, R4        // 000400 040040
            CMP     R0, 0x9       // 000402 024011
            BHI     1f            // 000404 154001
            ADDS    R0, 0x30      // 000406 030060  ASCII 0
            B       2f            // 000410 160000
1:          ADDS    R0, 0x37      // 000412 030067  ASCII A MINUS 10
2:          BL      uart_send     // 000414 043710  UARTTX
            SUBS    R5, 1         // 000416 036401
            BNE     0b            // 000420 150763
            POP     {PC}          // 000422 136400
get_hex:    PUSH    {LR}          // 000224 132400
            MOVS    R4, 0x0       // 000226 022000
            MOVS    R5, 0x4       // 000230 022404
10:         BL      uart_recv     // 000232 043700  HEX LOOP, UARTRX
            CMP     R0, 0x30      // 000234 024060  ASCII 0
            BLO     10b           // 000236 151774
            CMP     R0, 0x39      // 000240 024071  ASCII 9
            BLS     20f           // 000242 154406
            CMP     R0, 0x41      // 000244 024101  ASCII A
            BLO     10b           // 000246 151770
            CMP     R0, 0x46      // 000250 024106  ASCII F
            BHI     10b           // 000252 154366
            BL      uart_send     // 000254 043710  UARTTX
            SUBS    R0, 0x37      // 000256 034067  ASCII A MINUS 10
            B       30f           // 000260 160001
20:         BL      uart_send     // 000262 043710  UARTTX
            SUBS    R0, 0x30      // 000264 034060  ASCII 0
30:         LSLS    R4, 0x4       // 000266 000444
            ADDS    R4, R0        // 000270 014044
            SUBS    R5, 0x1       // 000272 036401
            BNE     10b           // 000274 150755
40:         BL      uart_recv     // 000276 043700  UARTRX
            CMP     R0, '\r       // 000300 024015  CARRIAGE RETURN
            BNE     40b           // 000302 150774
            BL      uart_send     // 000304 043710  UARTTX
            POP     {PC}          // 000306 136400