-
Notifications
You must be signed in to change notification settings - Fork 60
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' into feature/dsp-audio
- Loading branch information
Showing
14 changed files
with
1,879 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,140 @@ | ||
.section .vram | ||
|
||
.global gGbaBios | ||
gGbaBios: | ||
|
||
@ SWI calling convention: | ||
@ Parameters are passed in via r0 - r3 | ||
@ Called SWI can modify r0 - r3 (and return things here), r12, and r14. | ||
@ They can't modify anything else. | ||
@--------------------------------------------------------------------------------- | ||
swi_vector: | ||
@--------------------------------------------------------------------------------- | ||
@ Save these as temporaries | ||
stmdb sp!, { r11, r12, lr } | ||
|
||
@ Load comment from SWI instruction, which indicates which SWI | ||
@ to use. | ||
ldrb r12, [lr,#-2] | ||
adr r11, swi_branch_table | ||
ldr r12, [r11,r12,lsl#2] | ||
|
||
@ get SPSR and enter system mode, interrupts on | ||
MRS R11, SPSR | ||
@ This must be stacked and not just saved, because otherwise SWI won't | ||
@ be reentrant, which can happen if you're waiting for interrupts and the | ||
@ interrupt handler triggers the SWI. | ||
stmfd sp!, {r11} | ||
|
||
@ Set up new CPSR value | ||
and r11, r11, #0x80 | ||
orr r11, r11, #0x1f | ||
msr cpsr_cf, r11 | ||
|
||
@ We have to now save system-mode lr register as well | ||
stmfd sp!, {r2, lr} | ||
|
||
@ Set return address | ||
adr lr, swi_complete | ||
@ Branch to SWI handler | ||
bx r12 | ||
|
||
swi_complete: | ||
@ Restore system mode lr | ||
ldmfd sp!, {r2, lr} | ||
|
||
@ Go back to supervisor mode to get back to that stack | ||
mov r12, #0xD3 | ||
msr cpsr_cf, r12 | ||
|
||
@ SPSR has to be restored because the transition to system mode broke it | ||
ldmfd sp!, {r11} | ||
msr spsr_cf, r11 | ||
|
||
//set the right protected bios opcode | ||
ldr r11,= gBiosOp | ||
ldr r12,= 0xE3A02004 | ||
str r12, [r11] | ||
|
||
@ Restore stuff we saved | ||
ldmfd sp!, {r11,r12,lr} | ||
|
||
@ Return from exception handler | ||
movs pc, lr | ||
|
||
@--------------------------------------------------------------------------------- | ||
swi_branch_table: | ||
@--------------------------------------------------------------------------------- | ||
.word swi_SoftReset @ 0x00_SoftReset | ||
.word swi_RegisterRamReset @ 0x01_RegisterRAMReset | ||
.word swi_Halt @ 0x02_Halt | ||
.word swi_Stop @ 0x03_Stop | ||
.word swi_IntrWait @ 0x04_IntrWait | ||
.word swi_VBlankIntrWait @ 0x05_VBlankIntrWait | ||
.word swi_Div @ 0x06_Div | ||
.word swi_DivARM @ 0x07_DivARM | ||
.word swi_Sqrt @ 0x08_Sqrt | ||
.word swi_ArcTan @ 0x09_ArcTan | ||
.word swi_ArcTan2 @ 0x0A_ArcTan2 | ||
.word swi_CpuSet @ 0x0B_CPUSet | ||
.word swi_CpuFastSet @ 0x0C_CPUFastSet | ||
.word swi_GetBiosChecksum @ 0x0D_GetBiosChecksum | ||
.word swi_BgAffineSet @ 0x0E_BgAffineSet | ||
.word swi_ObjAffineSet @ 0x0F_ObjAffineSet | ||
.word swi_BitUnPack @ 0x10_BitUnPack | ||
.word swi_LZ77UnCompWram @ 0x11_LZ77UnCompWram | ||
.word swi_LZ77UnCompVram @ 0x12_LZ77UnCompVram | ||
.word swi_HuffUnComp @ 0x13_HuffUnComp | ||
.word swi_RLUnCompWram @ 0x14_RLUnCompWram | ||
.word swi_RLUnCompVram @ 0x15_RLUnCompVram | ||
.word swi_Diff8bitUnFilterWram @ 0x16_Diff8bitUnFilterWram | ||
.word swi_Diff8bitUnFilterVram @ 0x17_Diff8bitUnFilterVram | ||
.word swi_Diff16bitUnFilter @ 0x18_Diff16bitUnFilter | ||
.word swi_Invalid @ 0x19_SoundBiasChange | ||
.word swi_Invalid @ 0x1A_SoundDriverInit | ||
.word swi_Invalid @ 0x1B_SoundDriverMode | ||
.word swi_Invalid @ 0x1C_SoundDriverMain | ||
@ .word swi_SoundDriverMain @ 0x1C_SoundDriverMain | ||
.word swi_Invalid @ 0x1D_SoundDriverVSync | ||
.word swi_Invalid @ 0x1E_SoundChannelClear | ||
.word swi_MidiKey2Freq @ 0x1F_MidiKey2Freq | ||
.word swi_Invalid @ 0x20_MusicPlayerOpen | ||
.word swi_Invalid @ 0x21_MusicPlayerStart | ||
.word swi_Invalid @ 0x22_MusicPlayerStop | ||
.word swi_MusicPlayerContinue @ 0x23_MusicPlayerContinue | ||
.word swi_MusicPlayerFadeOut @ 0x24_MusicPlayerFadeOut | ||
.word swi_Invalid @ 0x25_MultiBoot | ||
.word reset_vector @ 0x26_HardReset | ||
.word swi_CustomHalt @ 0x27_CustomHalt | ||
.word swi_Invalid @ 0x28_SoundDriverVSyncOff | ||
.word swi_Invalid @ 0x29_SoundDriverVSyncOn | ||
.word swi_SoundGetJumpList @ 0x2A_SoundGetJumpList | ||
|
||
@--------------------------------------------------------------------------------- | ||
.global swi_Invalid | ||
.type swi_Invalid STT_FUNC | ||
swi_Invalid: | ||
@--------------------------------------------------------------------------------- | ||
bx lr | ||
@--------------------------------------------------------------------------------- | ||
|
||
@--------------------------------------------------------------------------------- | ||
reset_vector: @This isn't required if not booting from bios | ||
@--------------------------------------------------------------------------------- | ||
mov r0, #0xDF | ||
msr cpsr_cf, r0 | ||
|
||
@Disable Interrupts IME=0 | ||
mov r3, #0x04000000 | ||
strb r3, [r3,#0x208] | ||
|
||
@Setup stacks | ||
bl bios_init | ||
|
||
mov r2, #1 | ||
strb r2, [r3,#0x208] | ||
|
||
b swi_SoftReset | ||
@ ldr r0, =DrawLogo | ||
@ ldr lr, =swi_SoftReset | ||
@ bx r0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
.section .vram | ||
|
||
@--------------------------------------------------------------------------------- | ||
@ Setup some nicer names | ||
@--------------------------------------------------------------------------------- | ||
numerator .req r0 | ||
denominator .req r1 | ||
accumulator .req r2 | ||
current_bit .req r3 | ||
|
||
numerator_signed .req r12 | ||
denominator_signed .req r3 | ||
|
||
sign_flip .req r12 | ||
|
||
result .req r0 | ||
remainder .req r1 | ||
result_abs .req r3 | ||
|
||
temp .req r3 | ||
|
||
@--------------------------------------------------------------------------------- | ||
.global swi_DivARM | ||
.type swi_DivARM STT_FUNC | ||
swi_DivARM: | ||
@--------------------------------------------------------------------------------- | ||
mov temp, numerator | ||
mov numerator, denominator | ||
mov denominator, temp | ||
b swi_Div | ||
|
||
@--------------------------------------------------------------------------------- | ||
.global swi_Div | ||
.type swi_Div STT_FUNC | ||
swi_Div: | ||
@ See http://www.tofla.iconbar.com/tofla/arm/arm02/index.htm for more information | ||
@--------------------------------------------------------------------------------- | ||
@ Set if numerator is signed, and abs numerator | ||
ands numerator_signed, numerator, #0x80000000 | ||
rsbmi numerator, numerator, #0 | ||
|
||
// Same with denominator | ||
ands denominator_signed, denominator, #0x80000000 | ||
rsbmi denominator, denominator, #0 | ||
|
||
// Gets set if sign(numerator) != sign(denominator) | ||
eor sign_flip, numerator_signed, denominator_signed | ||
|
||
mov accumulator, #0 | ||
mov current_bit, #1 | ||
|
||
// This moves out the current bit to the MSB of the denominator, | ||
// and aligns the denominator up to the same bit-length as the | ||
// numerator | ||
0: | ||
cmp denominator, numerator | ||
movls denominator, denominator, lsl #1 | ||
movls current_bit, current_bit, lsl #1 | ||
bls 0b | ||
|
||
// Basically the grade-school algorithm, for unsigned integers in binary | ||
1: | ||
cmp numerator, denominator | ||
subcs numerator, numerator, denominator | ||
orrcs accumulator, accumulator, current_bit | ||
movs current_bit, current_bit, lsr #1 | ||
movcc denominator, denominator, lsr #1 | ||
bcc 1b | ||
|
||
mov remainder, numerator | ||
mov result_abs, accumulator | ||
mov result, accumulator | ||
|
||
tst sign_flip, #0x80000000 | ||
rsbmi result, result, #0 | ||
|
||
bx lr |
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
.section .vram | ||
|
||
.arm | ||
@--------------------------------------------------------------------------------- | ||
.global swi_SoftReset | ||
.type swi_SoftReset STT_FUNC | ||
swi_SoftReset: | ||
@--------------------------------------------------------------------------------- | ||
mov r3, #0x04000000 | ||
@ Read flag from 0x3007FFA | ||
@ 00h=8000000h (ROM), or 01h-FFh=2000000h (RAM) | ||
@ This must be done before init because it gets cleared in init | ||
ldrb r2, [r3,#-6] | ||
bl bios_init | ||
cmp r2, #0 | ||
ldmdb r3, {r0-r12} | ||
movne lr, #0x02000000 | ||
moveq lr, #0x08000000 | ||
mov r0, #0x1F | ||
msr cpsr_cf, r0 | ||
|
||
//set the right protected bios opcode | ||
ldr r0,= gBiosOp | ||
ldr r1,= 0xE129F000 | ||
str r1, [r0] | ||
mov r0, #0 | ||
mov r1, #0 | ||
|
||
bx lr | ||
|
||
@--------------------------------------------------------------------------------- | ||
.global bios_init | ||
bios_init: | ||
@ Requires r3 to be set to 0x04000000 already. | ||
@--------------------------------------------------------------------------------- | ||
@ Reset the stack locations | ||
mov r0, #0xD3 | ||
msr cpsr_cf, r0 | ||
ldr sp, Cpu_Stack_SVC | ||
mov lr, #0 | ||
msr spsr_cf, lr | ||
mov r0, #0xD2 | ||
msr cpsr_cf, r0 | ||
ldr sp, Cpu_Stack_IRQ | ||
mov lr, #0 | ||
msr spsr_cf, lr | ||
mov r0, #0x5F | ||
msr cpsr_cf, r0 | ||
ldr sp, Cpu_Stack_USR | ||
|
||
movs r0, #0 | ||
subs r1, r0, #0x200 | ||
|
||
@ Clear top 0x200 bytes of IWRAM 03007E00 -> 03008000 | ||
|
||
init_loop: | ||
str r0, [r3,r1] | ||
adds r1, r1, #4 | ||
blt init_loop | ||
|
||
bx lr | ||
|
||
@--------------------------------------------------------------------------------- | ||
@--------------------------------------------------------------------------------- | ||
|
||
Cpu_Stack_USR: .word 0x03007F00 | ||
Cpu_Stack_IRQ: .word 0x03007FA0 | ||
Cpu_Stack_SVC: .word 0x03007FE0 | ||
|
||
@--------------------------------------------------------------------------------- |
Oops, something went wrong.