diff options
author | Camil Staps | 2019-12-30 22:44:25 +0100 |
---|---|---|
committer | Camil Staps | 2019-12-30 22:44:25 +0100 |
commit | 6b2f4a6f0e87147a46de16066ff756aa4f9d9274 (patch) | |
tree | 9a40a64d22a13b5c264c93430ca28d3e07176861 /main.s |
Initial committests
Diffstat (limited to 'main.s')
-rw-r--r-- | main.s | 159 |
1 files changed, 159 insertions, 0 deletions
@@ -0,0 +1,159 @@ + # SEQ0 + .section .config_BFC0FFFC, code, keep, address(0xBFC0FFFC) + .type __config_BFC0FFFC, @object + .size __config_BFC0FFFC, 4 +__config_BFC0FFFC: + .word 0xFFFFFFFF + # DEVCP0 + .section .config_BFC0FFDC, code, keep, address(0xBFC0FFDC) + .type __config_BFC0FFDC, @object + .size __config_BFC0FFDC, 4 +__config_BFC0FFDC: + .word 0xFFFFFFFF + # DEVCFG0 + .section .config_BFC0FFCC, code, keep, address(0xBFC0FFCC) + .type __config_BFC0FFCC, @object + .size __config_BFC0FFCC, 4 +__config_BFC0FFCC: + .word 0xFFFFFFDB + # DEVCFG1 + .section .config_BFC0FFC8, code, keep, address(0xBFC0FFC8) + .type __config_BFC0FFC8, @object + .size __config_BFC0FFC8, 4 +__config_BFC0FFC8: + .word 0x5F74FF39 + # DEVCFG2 + .section .config_BFC0FFC4, code, keep, address(0xBFC0FFC4) + .type __config_BFC0FFC4, @object + .size __config_BFC0FFC4, 4 +__config_BFC0FFC4: + .word 0x7FF9B198 # SPLL is 8MHz (FRC) / 1 * 50 / 2 = 200MHz + # DEVCFG3 + .section .config_BFC0FFC0, code, keep, address(0xBFC0FFC0) + .type __config_BFC0FFC0, @object + .size __config_BFC0FFC0, 4 +__config_BFC0FFC0: + .word 0xBFFFFFFF + + .section .sdata,data + .type string, @object +string: + .ascii "Hello, world!\0" + .size string, .-string + + .section .text,code + .align 2 + + .set nomips16 + .set nomicromips + .set noreorder + .set nomacro + + .globl main + .ent main + .type main, @function +main: + # Unlock + di $2 + ehb + lui $2,%hi(SYSKEY) + sw $0,%lo(SYSKEY)($2) + lui $3,0xaa99 + ori $3,0x6655 + sw $3,%lo(SYSKEY)($2) + lui $3,0x5566 + ori $3,0x99aa + sw $3,%lo(SYSKEY)($2) + # PB7DIV := 0x00008800 (CPU clock: enable; SPLL / 1 = 200MHz) + lui $2,%hi(PB7DIV) + xor $3,$3 + ori $3,0x8800 + sw $3,%lo(PB7DIV)($2) + # PB2DIV := 0x00008818 (UART clock: enable; SPLL / 25 = 8MHz) + lui $2,%hi(PB2DIV) + xor $3,$3 + ori $3,0x8818 + sw $3,%lo(PB2DIV)($2) + # Lock + lui $2,%hi(SYSKEY) + sw $0,%lo(SYSKEY)($2) + ei $2 + ehb + + # TRISB := 0 + lui $2,%hi(TRISB) + sw $0,%lo(TRISB)($2) + + # Remappable pins + # RPG7 is U1TX + xor $3,$3 + ori $3,1 + lui $2,%hi(RPG7R) + sw $3,%lo(RPG7R)($2) + # RPG8 is U1RX + lui $2,%hi(U1RXR) + sw $3,%lo(U1RXR)($2) + # TRISG + xor $3,$3 + ori $3,0xfff7 + lui $2,%hi(TRISG) + sw $3,%lo(TRISG)($2) + + # UART + xor $3,$3 + ori $3,0x1400 + lui $2,%hi(U1STA) + sw $3,%lo(U1STA)($2) + # BRG := 0; with 8MHz peripheral clock gives baud rate 500000 + xor $3,$3 + lui $2,%hi(U1BRG) + sw $3,%lo(U1BRG)($2) + xor $3,$3 + ori $3,0x8000 + lui $2,%hi(U1MODE) + sw $3,%lo(U1MODE)($2) + + # Prepare main loop + lui $10,%hi(LATB) + lui $11,%hi(U1STA) + lui $12,%hi(U1TXREG) + lui $13,%hi(string) + ori $13,%lo(string) + # Main loop +main_loop: + # Toggle LED at LATB.B15 + lw $4,%lo(LATB)($10) + andi $6,$4,0x8000 + andi $4,$4,0x7fff + xori $6,0x8000 + or $4,$4,$6 + sh $4,%lo(LATB)($10) + + # Wait for UART buffer to empty + lw $4,%lo(U1STA)($11) +main_loop_tx_buffer_full: + andi $4,$4,0x200 # UTXBF + bne $4,$0,main_loop_tx_buffer_full + lw $4,%lo(U1STA)($11) + + # Write one character of the string to U1TXREG + lb $4,($13) + bne $4,$0,main_loop_no_end_of_string + addi $13,1 + lui $13,%hi(string) + ori $13,%lo(string) + li $4,10 # \n +main_loop_no_end_of_string: + sw $4,%lo(U1TXREG)($12) + + # Busy wait delay loop + lui $2,0xff + ori $5,0xffff +main_loop_delay: + bne $2,$0,main_loop_delay + addiu $2,-1 + j main_loop + nop + + .end main + .size main, .-main |