aboutsummaryrefslogtreecommitdiff
path: root/assembler/uart.s
blob: e1f5e8b27c90fe8682abd5f9a97b9e130780d979 (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
.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

.global uart_send
.global uart_recv
.global get_char
.global send_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, R8                  // 0x0022 0x4540
            POP     {PC}                    // 0x0024 0xBD00
send_hex:   PUSH    {LR}                    // 0x0026 0xB500
            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, 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
            ANDS    R0, R4                  // 0x003E 0x4020
            CMP     R0, 0x9                 // 0x0040 0x0000 ; NUMBER OR LETTER?
            BHI     1f                      // 0x0042 0xD801
            ADDS    R0, '0                  // 0x0044 0x3030
            B       2f                      // 0x0046 0xE000
1:          ADDS    R0, ('A - 0xA)          // 0x0048 0x3037
2:          BL      uart_send               // 0x004A 0xF7FF
                                            // 0x004C 0xFFD9
            SUBS    R5, 1                   // 0x004E 0x3D01
            BNE     0b                      // 0x0050 0xD1F2
            POP     {PC}                    // 0x0052 0xBD00
                                            // 0x0054 0x4000 ; UART0_BASE
                                            // 0x0056 0x4003