partially comment GameCube multi-boot library
This commit is contained in:
+315
-224
@@ -1,22 +1,34 @@
|
||||
thumb_func_start sub_82DED70
|
||||
sub_82DED70: ; 82DED70
|
||||
; This library can be used to download and execute a multi-boot image from
|
||||
; a GameCube using the JOY Bus protocol over the link cable.
|
||||
|
||||
.set GCMB_STRUCT_BASE_DEST_PTR, 0x20
|
||||
.set GCMB_STRUCT_CUR_DEST_PTR, 0x24
|
||||
.set GCMB_STRUCT_SERIAL_INTR_HANDLER, 0x28
|
||||
|
||||
thumb_func_start GameCubeMultiBoot_Hash
|
||||
GameCubeMultiBoot_Hash: ; 82DED70
|
||||
push {r4,lr}
|
||||
ldr r4, _082DEE78
|
||||
ldr r4, pool_HashVal
|
||||
eors r3, r1
|
||||
movs r2, 0x20
|
||||
_082DED78:
|
||||
lsrs r3, 1
|
||||
bcc _082DED7E
|
||||
eors r3, r4
|
||||
_082DED7E:
|
||||
subs r2, 0x1
|
||||
bne _082DED78
|
||||
pop {r4,pc}
|
||||
thumb_func_end sub_82DED70
|
||||
|
||||
thumb_func_start sub_82DED84
|
||||
sub_82DED84: ; 82DED84
|
||||
ldr r1, [r0, 0x28]
|
||||
@loop:
|
||||
lsrs r3, 1
|
||||
bcc @skipExclusiveOr
|
||||
|
||||
eors r3, r4
|
||||
|
||||
@skipExclusiveOr:
|
||||
subs r2, 0x1
|
||||
bne @loop
|
||||
|
||||
pop {r4,pc}
|
||||
thumb_func_end GameCubeMultiBoot_Hash
|
||||
|
||||
thumb_func_start GameCubeMultiBoot_Main
|
||||
; void GameCubeMultiBoot_Main(struct GameCubeMultiBoot *mb);
|
||||
GameCubeMultiBoot_Main: ; 82DED84
|
||||
ldr r1, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]
|
||||
cmp r1, 0
|
||||
beq _082DEDAA
|
||||
ldrb r1, [r0, 0x1]
|
||||
@@ -25,32 +37,32 @@ sub_82DED84: ; 82DED84
|
||||
ldrb r1, [r0, 0x2]
|
||||
cmp r1, 0x2
|
||||
beq _082DEDF4
|
||||
ldr r3, _082DF038
|
||||
ldrh r2, [r3, 0x8]
|
||||
ldr r3, pool_InterruptRegs
|
||||
ldrh r2, [r3, OFFSET_REG_IME - 0x200]
|
||||
movs r1, 0
|
||||
strh r1, [r3, 0x8]
|
||||
strh r1, [r3, OFFSET_REG_IME - 0x200]
|
||||
ldrb r1, [r0]
|
||||
cmp r1, 0xA
|
||||
bgt _082DEDA8
|
||||
adds r1, 0x1
|
||||
strb r1, [r0]
|
||||
_082DEDA8:
|
||||
strh r2, [r3, 0x8]
|
||||
strh r2, [r3, OFFSET_REG_IME - 0x200]
|
||||
_082DEDAA:
|
||||
bcs sub_82DEE98
|
||||
bcs GameCubeMultiBoot_Init
|
||||
ldrb r1, [r0, 0x2]
|
||||
cmp r1, 0
|
||||
bne _082DEDF6
|
||||
ldr r1, [r0, 0x24]
|
||||
ldr r2, [r0, 0x20]
|
||||
ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
|
||||
ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR]
|
||||
subs r1, r2
|
||||
beq _082DEE76
|
||||
cmp r1, 0xA0
|
||||
bcc _082DEE76
|
||||
push {r4-r6}
|
||||
movs r1, 0x98
|
||||
adds r2, 0x4
|
||||
ldr r4, _082DEE80
|
||||
adds r2, RomHeaderNintendoLogo - RomBase
|
||||
ldr r4, pool_NintendoLogo
|
||||
_082DEDC6:
|
||||
ldm r2!, {r5}
|
||||
ldm r4!, {r6}
|
||||
@@ -62,31 +74,31 @@ _082DEDC6:
|
||||
ldm r4!, {r6}
|
||||
eors r5, r6
|
||||
lsrs r5, 8
|
||||
str r2, [r0, 0x20]
|
||||
str r2, [r0, GCMB_STRUCT_BASE_DEST_PTR]
|
||||
_082DEDDC:
|
||||
pop {r4-r6}
|
||||
bne sub_82DEE98
|
||||
bne GameCubeMultiBoot_Init
|
||||
movs r1, 0x1
|
||||
strb r1, [r0, 0x2]
|
||||
ldr r1, [r0, 0x4]
|
||||
ldr r2, [r0, 0x8]
|
||||
eors r1, r2
|
||||
str r1, [r0, 0x18]
|
||||
ldr r2, _082DEE7C
|
||||
ldr r2, pool_Kawa
|
||||
muls r1, r2
|
||||
adds r1, 0x1
|
||||
str r1, [r0, 0x14]
|
||||
_082DEDF4:
|
||||
bx lr
|
||||
_082DEDF6:
|
||||
ldr r1, [r0, 0x24]
|
||||
ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
|
||||
mov r12, r1
|
||||
ldr r3, [r0, 0x18]
|
||||
push {r4-r7}
|
||||
ldr r4, [r0, 0x20]
|
||||
ldr r5, _082DEE7C
|
||||
ldr r4, [r0, GCMB_STRUCT_BASE_DEST_PTR]
|
||||
ldr r5, pool_Kawa
|
||||
ldr r6, [r0, 0x14]
|
||||
ldr r7, _082DEE78
|
||||
ldr r7, pool_HashVal
|
||||
_082DEE06:
|
||||
cmp r4, r12
|
||||
bcs _082DEE26
|
||||
@@ -107,15 +119,15 @@ _082DEE1C:
|
||||
adds r6, 0x1
|
||||
b _082DEE06
|
||||
_082DEE26:
|
||||
str r4, [r0, 0x20]
|
||||
str r4, [r0, GCMB_STRUCT_BASE_DEST_PTR]
|
||||
str r6, [r0, 0x14]
|
||||
pop {r4-r7}
|
||||
str r3, [r0, 0x18]
|
||||
ldrh r1, [r0, 0x12]
|
||||
cmp r1, 0
|
||||
bne _082DEE76
|
||||
ldr r1, [r0, 0x24]
|
||||
ldr r2, [r0, 0x20]
|
||||
ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
|
||||
ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR]
|
||||
cmp r1, r2
|
||||
bne _082DEE76
|
||||
ldr r1, [r0, 0xC]
|
||||
@@ -127,11 +139,11 @@ _082DEE26:
|
||||
mov r12, lr
|
||||
movs r1, 0xBB
|
||||
ldr r3, [r0, 0xC]
|
||||
bl sub_82DED70
|
||||
bl GameCubeMultiBoot_Hash
|
||||
ldrh r1, [r0, 0x10]
|
||||
mov lr, r12
|
||||
subs r1, r3
|
||||
bne sub_82DEE98
|
||||
bne GameCubeMultiBoot_Init
|
||||
movs r1, 0x2
|
||||
strb r1, [r0, 0x2]
|
||||
bx lr
|
||||
@@ -141,153 +153,205 @@ _082DEE60:
|
||||
lsls r1, 24
|
||||
subs r1, 0x1
|
||||
str r1, [r0, 0xC]
|
||||
bl sub_82DED70
|
||||
bl GameCubeMultiBoot_Hash
|
||||
lsls r3, 8
|
||||
adds r3, 0xFF
|
||||
str r3, [r0, 0x1C]
|
||||
bx r12
|
||||
_082DEE76:
|
||||
bx lr
|
||||
.align 2, 0
|
||||
_082DEE78: .4byte 0x0000a1c1
|
||||
_082DEE7C: .4byte 0x6177614b
|
||||
_082DEE80: .4byte RomHeaderNintendoLogo
|
||||
thumb_func_end sub_82DED84
|
||||
thumb_func_end GameCubeMultiBoot_Main
|
||||
|
||||
thumb_func_start sub_82DEE84
|
||||
sub_82DEE84: ; 82DEE84
|
||||
.align 2, 0
|
||||
|
||||
pool_HashVal: .4byte 0xa1c1
|
||||
|
||||
pool_Kawa: .ascii "Kawa" ; name of BIOS developer
|
||||
|
||||
pool_NintendoLogo: .4byte RomHeaderNintendoLogo
|
||||
|
||||
thumb_func_start GameCubeMultiBoot_ExecuteProgram
|
||||
; void GameCubeMultiBoot_ExecuteProgram(struct GameCubeMultiBoot *mb);
|
||||
GameCubeMultiBoot_ExecuteProgram: ; 82DEE84
|
||||
ldrb r1, [r0, 0x2]
|
||||
cmp r1, 0x2
|
||||
bne _082DEE96
|
||||
ldr r3, _082DF038
|
||||
bne @unableToExecute
|
||||
ldr r3, pool_InterruptRegs
|
||||
movs r1, 0
|
||||
strh r1, [r3, 0x8]
|
||||
ldr r1, _082DF048
|
||||
strh r1, [r3, OFFSET_REG_IME - 0x200]
|
||||
ldr r1, pool_MultiBootLoadAddr
|
||||
adds r1, 0xC0
|
||||
bx r1
|
||||
_082DEE96:
|
||||
@unableToExecute:
|
||||
bx lr
|
||||
thumb_func_end sub_82DEE84
|
||||
thumb_func_end GameCubeMultiBoot_ExecuteProgram
|
||||
|
||||
thumb_func_start sub_82DEE98
|
||||
sub_82DEE98: ; 82DEE98
|
||||
ldr r3, _082DF038
|
||||
ldrh r2, [r3, 0x8]
|
||||
thumb_func_start GameCubeMultiBoot_Init
|
||||
; void GameCubeMultiBoot_Init(struct GameCubeMultiBoot *mb);
|
||||
GameCubeMultiBoot_Init: ; 82DEE98
|
||||
ldr r3, pool_InterruptRegs
|
||||
|
||||
; Save IME register.
|
||||
ldrh r2, [r3, OFFSET_REG_IME - 0x200]
|
||||
|
||||
; Disable interrupts.
|
||||
movs r1, 0
|
||||
strh r1, [r3, 0x8]
|
||||
adr r3, _082DEEF8
|
||||
str r3, [r0, 0x28]
|
||||
strh r1, [r3, OFFSET_REG_IME - 0x200]
|
||||
|
||||
; Set the handler to the "Stop" routine.
|
||||
; Unless the first command that is received is a device reset command, the
|
||||
; "Stop" routine will be executed and no further commands will be processed.
|
||||
adr r3, GcMbIntrHandler_Stop
|
||||
str r3, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]
|
||||
|
||||
ldrb r3, [r0, 0x3]
|
||||
push {r3}
|
||||
ldrb r3, [r0, 0x1]
|
||||
push {r0,r3}
|
||||
|
||||
adds r3, r0, 0
|
||||
adds r3, 0x20
|
||||
_082DEEB0:
|
||||
adds r3, GCMB_STRUCT_BASE_DEST_PTR
|
||||
|
||||
; clear all but the last 3 fields of the struct
|
||||
@clearStructLoop:
|
||||
stm r0!, {r1}
|
||||
cmp r0, r3
|
||||
bcc _082DEEB0
|
||||
blo @clearStructLoop
|
||||
|
||||
pop {r0,r3}
|
||||
lsrs r3, 1
|
||||
strb r3, [r0, 0x3]
|
||||
pop {r3}
|
||||
strb r3, [r0, 0x1]
|
||||
ldr r3, _082DF03C
|
||||
|
||||
ldr r3, pool_SerialRegs
|
||||
|
||||
; Turn off JOY Bus mode.
|
||||
lsls r0, r3, 10
|
||||
strh r0, [r3, 0x14]
|
||||
strh r0, [r3, OFFSET_REG_RCNT - 0x120]
|
||||
|
||||
; Turn on JOY Bus mode.
|
||||
movs r0, 0xC0
|
||||
lsls r0, 8
|
||||
strh r0, [r3, 0x14]
|
||||
movs r0, 0x47
|
||||
strh r0, [r3, 0x20]
|
||||
strh r1, [r3, 0x38]
|
||||
ldr r3, _082DF038
|
||||
movs r0, 0x80
|
||||
strh r0, [r3, 0x2]
|
||||
ldrh r1, [r3]
|
||||
orrs r1, r0
|
||||
strh r1, [r3]
|
||||
strh r2, [r3, 0x8]
|
||||
bx lr
|
||||
thumb_func_end sub_82DEE98
|
||||
strh r0, [r3, OFFSET_REG_RCNT - 0x120]
|
||||
|
||||
; Init JOY Bus registers.
|
||||
movs r0, 0x47
|
||||
strh r0, [r3, OFFSET_REG_JOYCNT - 0x120]
|
||||
strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120]
|
||||
|
||||
ldr r3, pool_InterruptRegs
|
||||
|
||||
; Acknowledge serial interrupt.
|
||||
movs r0, INTR_FLAG_SERIAL
|
||||
strh r0, [r3, OFFSET_REG_IF - 0x200]
|
||||
|
||||
; Enable serial interrupt.
|
||||
ldrh r1, [r3, OFFSET_REG_IE - 0x200]
|
||||
orrs r1, r0
|
||||
strh r1, [r3, OFFSET_REG_IE - 0x200]
|
||||
|
||||
; Restore IME register.
|
||||
strh r2, [r3, OFFSET_REG_IME - 0x200]
|
||||
|
||||
bx lr
|
||||
thumb_func_end GameCubeMultiBoot_Init
|
||||
|
||||
non_word_aligned_thumb_func_start GameCubeMultiBoot_HandleSerialInterrupt
|
||||
; void GameCubeMultiBoot_HandleSerialInterrupt(struct GameCubeMultiBoot *mb);
|
||||
GameCubeMultiBoot_HandleSerialInterrupt: ; 82DEEE2
|
||||
ldr r3, pool_SerialRegs
|
||||
|
||||
; Acknowledge reset/receive/send flags.
|
||||
ldrh r1, [r3, OFFSET_REG_JOYCNT - 0x120]
|
||||
strh r1, [r3, OFFSET_REG_JOYCNT - 0x120]
|
||||
|
||||
non_word_aligned_thumb_func_start sub_82DEEE2
|
||||
sub_82DEEE2: ; 82DEEE2
|
||||
ldr r3, _082DF03C
|
||||
ldrh r1, [r3, 0x20]
|
||||
strh r1, [r3, 0x20]
|
||||
movs r2, 0
|
||||
strb r2, [r0]
|
||||
ldr r2, [r0, 0x28]
|
||||
|
||||
ldr r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]
|
||||
cmp r2, 0
|
||||
beq _082DEF04
|
||||
lsrs r1, 1
|
||||
bcs _082DEF06
|
||||
beq GameCubeMultiBoot_HandleSerialInterruptDone
|
||||
|
||||
lsrs r1, 1 ; was a device reset command received?
|
||||
bcs GameCubeMultiBoot_BeginHandshake ; branch if so
|
||||
|
||||
mov pc, r2
|
||||
_082DEEF8:
|
||||
|
||||
.align 2, 0
|
||||
|
||||
; Zero the status and the interrupt handler pointer.
|
||||
; Commands from the GameCube will not be processed after this is executed
|
||||
; unless GameCubeMultiBoot_Init() is called again.
|
||||
GcMbIntrHandler_Stop:
|
||||
movs r2, 0
|
||||
strh r2, [r3, 0x38]
|
||||
_082DEEFC:
|
||||
str r2, [r0, 0x28]
|
||||
_082DEEFE:
|
||||
ldr r3, _082DF040
|
||||
ldrh r1, [r3, 0x2]
|
||||
strh r2, [r3, OFFSET_REG_JOYSTAT - 0x120]
|
||||
|
||||
GameCubeMultiBoot_SetInterruptHandler:
|
||||
str r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]
|
||||
|
||||
GameCubeMultiBoot_ReadVCount:
|
||||
ldr r3, pool_RegDispstat
|
||||
ldrh r1, [r3, OFFSET_REG_VCOUNT - OFFSET_REG_DISPSTAT]
|
||||
strb r1, [r0, 0x3]
|
||||
_082DEF04:
|
||||
|
||||
GameCubeMultiBoot_HandleSerialInterruptDone:
|
||||
bx lr
|
||||
_082DEF06:
|
||||
ldr r1, [r3, 0x30]
|
||||
ldr r1, _082DF044
|
||||
str r1, [r3, 0x34]
|
||||
|
||||
GameCubeMultiBoot_BeginHandshake:
|
||||
ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
|
||||
ldr r1, pool_RubyUSAGameCode
|
||||
str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120]
|
||||
movs r1, 0x10
|
||||
strh r1, [r3, 0x38]
|
||||
strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120]
|
||||
ldrb r1, [r0, 0x3]
|
||||
strb r1, [r0, 0x9]
|
||||
ldrb r1, [r0, 0x2]
|
||||
cmp r1, 0
|
||||
bne _082DEEF8
|
||||
ldr r1, _082DF048
|
||||
str r1, [r0, 0x20]
|
||||
str r1, [r0, 0x24]
|
||||
adr r2, .L082DEF24
|
||||
b _082DEEFC
|
||||
thumb_func_end sub_82DEEE2
|
||||
bne GcMbIntrHandler_Stop
|
||||
ldr r1, pool_MultiBootLoadAddr
|
||||
str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR]
|
||||
str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
|
||||
adr r2, GcMbIntrHandler_CheckGameCodeSent
|
||||
b GameCubeMultiBoot_SetInterruptHandler
|
||||
|
||||
thumb_func_start sub_82DEF24
|
||||
.L082DEF24:
|
||||
sub_82DEF24: ; 82DEF24
|
||||
.align 2, 0
|
||||
|
||||
GcMbIntrHandler_CheckGameCodeSent: ; 82DEF24
|
||||
lsls r1, 31
|
||||
bcc _082DEEF8
|
||||
bmi _082DEF34
|
||||
adr r2, .L082DEF30
|
||||
b _082DEEFC
|
||||
thumb_func_end sub_82DEF24
|
||||
bcc GcMbIntrHandler_Stop ; stop if send failed
|
||||
bmi GameCubeMultiBoot_CheckHandshakeResponse ; branch if receive is complete
|
||||
|
||||
thumb_func_start sub_82DEF30
|
||||
.L082DEF30:
|
||||
sub_82DEF30: ; 82DEF30
|
||||
lsrs r1, 1
|
||||
bcc _082DEEF8
|
||||
_082DEF34:
|
||||
ldr r1, [r3, 0x30]
|
||||
ldr r2, _082DF044
|
||||
; If the response hasn't been fully received yet,
|
||||
; check again upon the next interrupt.
|
||||
adr r2, GcMbIntrHandler_CheckHandshakeResponse
|
||||
b GameCubeMultiBoot_SetInterruptHandler
|
||||
|
||||
.align 2, 0
|
||||
|
||||
GcMbIntrHandler_CheckHandshakeResponse: ; 82DEF30
|
||||
lsrs r1, 1 ; is receive complete?
|
||||
bcc GcMbIntrHandler_Stop ; stop if not
|
||||
|
||||
GameCubeMultiBoot_CheckHandshakeResponse:
|
||||
ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
|
||||
ldr r2, pool_RubyUSAGameCode
|
||||
cmp r1, r2
|
||||
bne _082DEEF8
|
||||
bne GcMbIntrHandler_Stop ; stop if the GameCube didn't reply with the same game code
|
||||
ldrb r1, [r0, 0x3]
|
||||
strb r1, [r0, 0xB]
|
||||
adr r2, .L082DEF44
|
||||
b _082DEEFC
|
||||
thumb_func_end sub_82DEF30
|
||||
adr r2, GcMbIntrHandler_82DEF44
|
||||
b GameCubeMultiBoot_SetInterruptHandler
|
||||
|
||||
thumb_func_start sub_82DEF44
|
||||
.L082DEF44:
|
||||
sub_82DEF44: ; 82DEF44
|
||||
lsrs r1, 1
|
||||
bcc _082DEEF8
|
||||
ldr r1, [r3, 0x30]
|
||||
.align 2, 0
|
||||
|
||||
GcMbIntrHandler_82DEF44: ; 82DEF44
|
||||
lsrs r1, 1 ; is receive complete?
|
||||
bcc GcMbIntrHandler_Stop ; branch if not
|
||||
ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
|
||||
lsrs r2, r1, 24
|
||||
cmp r2, 0xDD
|
||||
bne _082DEEF8
|
||||
bne GcMbIntrHandler_Stop
|
||||
str r1, [r0, 0x4]
|
||||
ldrb r1, [r0, 0x1]
|
||||
strb r1, [r0, 0xA]
|
||||
@@ -310,139 +374,166 @@ _082DEF70:
|
||||
_082DEF72:
|
||||
ldr r1, [r0, 0x8]
|
||||
adds r1, 0xEE
|
||||
ldr r3, _082DF03C
|
||||
str r1, [r3, 0x34]
|
||||
ldr r3, pool_SerialRegs
|
||||
str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120]
|
||||
movs r1, 0x30
|
||||
strh r1, [r3, 0x38]
|
||||
adr r2, .L082DEF84
|
||||
b _082DEEFC
|
||||
thumb_func_end sub_82DEF44
|
||||
strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120]
|
||||
adr r2, GcMbIntrHandler_82DEF84
|
||||
b GameCubeMultiBoot_SetInterruptHandler
|
||||
|
||||
thumb_func_start sub_82DEF84
|
||||
.L082DEF84:
|
||||
sub_82DEF84: ; 82DEF84
|
||||
.align 2, 0
|
||||
|
||||
GcMbIntrHandler_82DEF84: ; 82DEF84
|
||||
lsls r1, 31
|
||||
bcc _082DEEF8
|
||||
bmi _082DEF94
|
||||
adr r2, .L082DEF90
|
||||
b _082DEEFC
|
||||
thumb_func_end sub_82DEF84
|
||||
bcc GcMbIntrHandler_Stop ; stop if send failed
|
||||
bmi _082DEF94 ; branch if receive is complete
|
||||
adr r2, GcMbIntrHandler_82DEF90
|
||||
b GameCubeMultiBoot_SetInterruptHandler
|
||||
|
||||
thumb_func_start sub_82DEF90
|
||||
.L082DEF90:
|
||||
sub_82DEF90: ; 82DEF90
|
||||
lsrs r1, 1
|
||||
bcc _082DEEF8
|
||||
.align 2, 0
|
||||
|
||||
GcMbIntrHandler_82DEF90: ; 82DEF90
|
||||
lsrs r1, 1 ; is receive complete?
|
||||
bcc GcMbIntrHandler_Stop ; branch if not
|
||||
_082DEF94:
|
||||
ldr r1, [r3, 0x30]
|
||||
ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
|
||||
ldr r2, _082DF034
|
||||
cmp r1, r2
|
||||
bcs _082DEEF8
|
||||
bhs GcMbIntrHandler_Stop
|
||||
adds r1, 0x1
|
||||
adds r1, r1
|
||||
strh r1, [r0, 0x12]
|
||||
ldrb r1, [r0, 0x2]
|
||||
cmp r1, 0
|
||||
_082DEFA6:
|
||||
bne _082DEEF8
|
||||
ldr r1, _082DF048
|
||||
str r1, [r0, 0x20]
|
||||
str r1, [r0, 0x24]
|
||||
adr r2, .L082DEFB4
|
||||
b _082DEEFC
|
||||
thumb_func_end sub_82DEF90
|
||||
bne GcMbIntrHandler_Stop
|
||||
ldr r1, pool_MultiBootLoadAddr
|
||||
str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR]
|
||||
str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
|
||||
adr r2, GcMbIntrHandler_82DEFB4
|
||||
b GameCubeMultiBoot_SetInterruptHandler
|
||||
|
||||
thumb_func_start sub_82DEFB4
|
||||
.L082DEFB4:
|
||||
sub_82DEFB4: ; 82DEFB4
|
||||
lsrs r1, 1
|
||||
bcc _082DEEF8
|
||||
ldr r2, [r0, 0x24]
|
||||
.align 2, 0
|
||||
|
||||
GcMbIntrHandler_82DEFB4: ; 82DEFB4
|
||||
lsrs r1, 1 ; is receive complete?
|
||||
bcc GcMbIntrHandler_Stop ; branch if not
|
||||
ldr r2, [r0, GCMB_STRUCT_CUR_DEST_PTR]
|
||||
movs r1, 0x4
|
||||
ands r1, r2
|
||||
adds r1, 0x8
|
||||
lsls r1, 2
|
||||
strh r1, [r3, 0x38]
|
||||
ldr r1, [r3, 0x30]
|
||||
strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120]
|
||||
ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
|
||||
stm r2!, {r1}
|
||||
str r2, [r0, 0x24]
|
||||
str r2, [r0, GCMB_STRUCT_CUR_DEST_PTR]
|
||||
ldrh r1, [r0, 0x12]
|
||||
subs r1, 0x1
|
||||
strh r1, [r0, 0x12]
|
||||
bne _082DEEFE
|
||||
bne GameCubeMultiBoot_ReadVCount
|
||||
|
||||
_082DEFD2:
|
||||
ldrb r1, [r0, 0x1]
|
||||
lsls r1, 8
|
||||
adds r1, 0xCC
|
||||
str r1, [r3, 0x34]
|
||||
str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120]
|
||||
adr r2, _082DEFE0
|
||||
b _082DEEFC
|
||||
b GameCubeMultiBoot_SetInterruptHandler
|
||||
|
||||
.align 2, 0
|
||||
|
||||
_082DEFE0:
|
||||
lsls r1, 31
|
||||
|
||||
_082DEFE2:
|
||||
bcc _082DEEF8
|
||||
bcc GcMbIntrHandler_Stop
|
||||
ldr r1, [r0, 0x1C]
|
||||
cmp r1, 0
|
||||
beq _082DEFD2
|
||||
str r1, [r3, 0x34]
|
||||
adr r2, .L082DEFF0
|
||||
b _082DEEFC
|
||||
thumb_func_end sub_82DEFB4
|
||||
str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120]
|
||||
adr r2, GcMbIntrHandler_82DEFF0
|
||||
b GameCubeMultiBoot_SetInterruptHandler
|
||||
|
||||
thumb_func_start sub_82DEFF0
|
||||
.L082DEFF0:
|
||||
sub_82DEFF0: ; 82DEFF0
|
||||
lsls r1, 31
|
||||
bcc _082DEFE2
|
||||
bmi _082DF000
|
||||
adr r2, .L082DEFFC
|
||||
b _082DEEFC
|
||||
.align 2, 0
|
||||
.L082DEFFC:
|
||||
_082DEFFC:
|
||||
lsrs r1, 1
|
||||
bcc _082DEFE2
|
||||
|
||||
GcMbIntrHandler_82DEFF0: ; 82DEFF0
|
||||
lsls r1, 31
|
||||
bcc _082DEFE2 ; branch if send failed
|
||||
bmi _082DF000 ; branch if receive is complete
|
||||
adr r2, GcMbIntrHandler_82DEFFC
|
||||
b GameCubeMultiBoot_SetInterruptHandler
|
||||
|
||||
.align 2, 0
|
||||
|
||||
GcMbIntrHandler_82DEFFC: ; 82DEFFC
|
||||
lsrs r1, 1 ; is receive complete?
|
||||
bcc _082DEFE2 ; branch if not
|
||||
|
||||
_082DF000:
|
||||
ldr r1, [r3, 0x30]
|
||||
ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
|
||||
lsrs r2, r1, 24
|
||||
cmp r2, 0xBB
|
||||
bne _082DEFA6
|
||||
strh r1, [r0, 0x10]
|
||||
adr r2, .L082DF010
|
||||
b _082DEEFC
|
||||
thumb_func_end sub_82DEFF0
|
||||
adr r2, GcMbIntrHandler_82DF010
|
||||
b GameCubeMultiBoot_SetInterruptHandler
|
||||
|
||||
thumb_func_start sub_82DF010
|
||||
.L082DF010:
|
||||
sub_82DF010: ; 82DF010
|
||||
b _082DEEF8
|
||||
thumb_func_end sub_82DF010
|
||||
|
||||
non_word_aligned_thumb_func_start sub_82DF012
|
||||
sub_82DF012: ; 82DF012
|
||||
ldr r3, _082DF038
|
||||
ldrh r2, [r3, 0x8]
|
||||
movs r1, 0
|
||||
strh r1, [r3, 0x8]
|
||||
ldr r3, _082DF03C
|
||||
movs r0, 0x7
|
||||
strh r0, [r3, 0x20]
|
||||
lsls r0, r3, 10
|
||||
strh r0, [r3, 0x14]
|
||||
ldr r3, _082DF038
|
||||
movs r0, 0x80
|
||||
strh r0, [r3, 0x2]
|
||||
ldrh r1, [r3]
|
||||
bics r1, r0
|
||||
strh r1, [r3]
|
||||
strh r2, [r3, 0x8]
|
||||
bx lr
|
||||
.align 2, 0
|
||||
_082DF034: .4byte 0x00004000
|
||||
_082DF038: .4byte 0x04000200
|
||||
_082DF03C: .4byte 0x04000120
|
||||
_082DF040: .4byte 0x04000004
|
||||
_082DF044: .4byte 0x45565841
|
||||
_082DF048: .4byte 0x02000000
|
||||
thumb_func_end sub_82DF012
|
||||
|
||||
GcMbIntrHandler_82DF010: ; 82DF010
|
||||
b GcMbIntrHandler_Stop
|
||||
|
||||
thumb_func_end GameCubeMultiBoot_HandleSerialInterrupt
|
||||
|
||||
non_word_aligned_thumb_func_start GameCubeMultiBoot_Quit
|
||||
; void GameCubeMultiBoot_Quit();
|
||||
GameCubeMultiBoot_Quit: ; 82DF012
|
||||
ldr r3, pool_InterruptRegs
|
||||
|
||||
; Save IME register.
|
||||
ldrh r2, [r3, OFFSET_REG_IME - 0x200]
|
||||
|
||||
; Disable interrupts.
|
||||
movs r1, 0
|
||||
strh r1, [r3, OFFSET_REG_IME - 0x200]
|
||||
|
||||
ldr r3, pool_SerialRegs
|
||||
|
||||
; Acknowledge all JOYCNT flags.
|
||||
movs r0, 0x7
|
||||
strh r0, [r3, OFFSET_REG_JOYCNT - 0x120]
|
||||
|
||||
; Turn off JOY Bus mode.
|
||||
lsls r0, r3, 10
|
||||
strh r0, [r3, OFFSET_REG_RCNT - 0x120] ; store 0x8000
|
||||
|
||||
ldr r3, pool_InterruptRegs
|
||||
|
||||
; Acknowledge serial interrupt.
|
||||
movs r0, INTR_FLAG_SERIAL
|
||||
strh r0, [r3, OFFSET_REG_IF - 0x200]
|
||||
|
||||
; Disable serial interrupt.
|
||||
ldrh r1, [r3, OFFSET_REG_IE - 0x200]
|
||||
bics r1, r0
|
||||
strh r1, [r3, OFFSET_REG_IE - 0x200]
|
||||
|
||||
; Restore IME register.
|
||||
strh r2, [r3, OFFSET_REG_IME - 0x200]
|
||||
|
||||
bx lr
|
||||
thumb_func_end GameCubeMultiBoot_Quit
|
||||
|
||||
.align 2, 0
|
||||
|
||||
_082DF034: .4byte 0x4000
|
||||
|
||||
pool_InterruptRegs: .4byte REG_BASE + 0x200
|
||||
|
||||
pool_SerialRegs: .4byte REG_BASE + 0x120
|
||||
|
||||
pool_RegDispstat: .4byte REG_DISPSTAT
|
||||
|
||||
pool_RubyUSAGameCode: .ascii "AXVE"
|
||||
|
||||
pool_MultiBootLoadAddr: .4byte EWRAM_START
|
||||
|
||||
Reference in New Issue
Block a user