1# Copyright (c) 2013-2014 Jeffrey Pfau 2# 3# This Source Code Form is subject to the terms of the Mozilla Public 4# License, v. 2.0. If a copy of the MPL was not distributed with this 5# file, You can obtain one at http://mozilla.org/MPL/2.0/. 6#define nop andeq r0, r0 7 8.text 9 10b resetBase 11b undefBase 12b swiBase 13b pabtBase 14b dabtBase 15nop 16b irqBase 17b fiqBase 18 19resetBase: 20mov r0, #0x8000000 21ldrb r1, [r0, #3] 22cmp r1, #0xEA 23ldrne r0, =0x20000C0 24bx r0 25.word 0 26.word 0xE129F000 27 28swiBase: 29cmp sp, #0 30moveq sp, #0x04000000 31subeq sp, #0x20 32stmfd sp!, {r11-r12, lr} 33ldrb r11, [lr, #-2] 34mov r12, #swiTable 35ldr r11, [r12, r11, lsl #2] 36cmp r11, #0 37mrs r12, spsr 38stmfd sp!, {r12} 39and r12, #0x80 40orr r12, #0x1F 41msr cpsr, r12 42stmfd sp!, {lr} 43mov lr, pc 44bxne r11 45ldmfd sp!, {lr} 46msr cpsr, #0x93 47ldmfd sp!, {r12} 48msr spsr, r12 49ldmfd sp!, {r11-r12, lr} 50movs pc, lr 51.word 0 52.word 0xE3A02004 53 54swiTable: 55.word SoftReset 56.word RegisterRamReset 57.word Halt 58.word Stop 59.word IntrWait 60.word VBlankIntrWait 61.word Div 62.word DivArm 63.word Sqrt 64.word ArcTan 65.word ArcTan2 66.word CpuSet 67.word CpuFastSet 68@ ... The rest of this table isn't needed if the rest aren't implemented 69 70irqBase: 71stmfd sp!, {r0-r3, r12, lr} 72mov r0, #0x04000000 73add lr, pc, #0 74ldr pc, [r0, #-4] 75ldmfd sp!, {r0-r3, r12, lr} 76subs pc, lr, #4 77.word 0 78.word 0xE55EC002 79 80VBlankIntrWait: 81mov r0, #1 82mov r1, #1 83IntrWait: 84stmfd sp!, {r2-r3, lr} 85mov r12, #0x04000000 86@ See if we want to return immediately 87cmp r0, #0 88mov r0, #0 89mov r2, #1 90beq 1f 91ldrh r3, [r12, #-8] 92bic r3, r1 93strh r3, [r12, #-8] 94@ Halt 950: 96strb r0, [r12, #0x301] 971: 98@ Check which interrupts were acknowledged 99strb r0, [r12, #0x208] 100ldrh r3, [r12, #-8] 101ands r3, r1 102eorne r3, r1 103strneh r3, [r12, #-8] 104strb r2, [r12, #0x208] 105beq 0b 106ldmfd sp!, {r2-r3, pc} 107 108CpuSet: 109stmfd sp!, {r4, r5, lr} 110mov r4, r2, lsl #12 111mov r12, r0 112mov r5, r1 113tst r2, #0x01000000 114beq 0f 115@ Fill 116tst r2, #0x04000000 117beq 1f 118@ Word 119add r4, r5, r4, lsr #10 120ldmia r12!, {r3} 1212: 122cmp r5, r4 123stmltia r5!, {r3} 124blt 2b 125b 3f 126@ Halfword 1271: 128bic r12, #1 129bic r5, #1 130add r4, r5, r4, lsr #11 131ldrh r3, [r12] 1322: 133cmp r5, r4 134strlth r3, [r5], #2 135blt 2b 136b 3f 137@ Copy 1380: 139tst r2, #0x04000000 140beq 1f 141@ Word 142add r4, r5, r4, lsr #10 1432: 144cmp r5, r4 145ldmltia r12!, {r3} 146stmltia r5!, {r3} 147blt 2b 148b 3f 149@ Halfword 1501: 151add r4, r5, r4, lsr #11 1522: 153cmp r5, r4 154ldrlth r3, [r12], #2 155strlth r3, [r5], #2 156blt 2b 1573: 158mov r3, #0x170 @ Match official BIOS's clobbered r3 159ldmfd sp!, {r4, r5, pc} 160 161CpuFastSet: 162stmfd sp!, {r4-r10, lr} 163tst r2, #0x01000000 164mov r3, r2, lsl #12 165add r2, r1, r3, lsr #10 166beq 0f 167@ Fill 168ldr r3, [r0] 169mov r4, r3 170mov r5, r3 171mov r6, r3 172mov r7, r3 173mov r8, r3 174mov r9, r3 175mov r10, r3 1761: 177cmp r1, r2 178stmltia r1!, {r3-r10} 179blt 1b 180b 2f 181@ Copy 1820: 183cmp r1, r2 184ldmltia r0!, {r3-r10} 185stmltia r1!, {r3-r10} 186blt 0b 1872: 188ldmfd sp!, {r4-r10, pc} 189 190undefBase: 191subs pc, lr, #4 192.word 0 193.word 0x03A0E004 194 195.ltorg 196