start decompiling multi_sio

This commit is contained in:
Oliver Bell committed 2022-04-06 10:25:16 +08:00
1 parent 5aecbf282f
commit 37cc81e813
18 files changed
+1009 -798

No files matched your search

+1 -1
View File
@@ -1,5 +1,5 @@
.include "asm/macros.inc"
.include "include/gba.inc"
.include "constants/constants.inc"
.syntax unified
.arm
+1 -1
View File
@@ -1,5 +1,5 @@
.include "asm/macros.inc"
.include "include/gba.inc"
.include "constants/constants.inc"
.syntax unified
.arm
+1 -1
View File
@@ -1,5 +1,5 @@
.include "asm/macros.inc"
.include "include/gba.inc"
.include "constants/constants.inc"
.syntax unified
.arm
+1 -1
View File
@@ -1,5 +1,5 @@
.include "asm/macros.inc"
.include "include/gba.inc"
.include "constants/constants.inc"
.syntax unified
.arm
+1 -1
View File
@@ -1,5 +1,5 @@
.include "asm/macros.inc"
.include "include/gba.inc"
.include "constants/constants.inc"
.syntax unified
.arm
+17 -230
View File
@@ -1,222 +1,9 @@
.include "asm/macros.inc"
.include "include/gba.inc"
.include "constants/constants.inc"
.syntax unified
.arm
arm_func_start sub_80001CC
sub_80001CC: @ 0x080001CC
push {r4, r5, r6, r7, r8, sb, sl, fp}
mov ip, #0x4000000
ldr fp, _08000208 @ =gUnknown_03000560
add sl, fp, #0x40
mov sb, #1
mov r8, #0
strb r8, [ip, #0x208]
ldm sl, {r0, r1, r2, r3, r4, r5, r6, r7}
stm sl!, {r4, r5, r6, r7}
stm sl!, {r0, r1, r2, r3}
ldr r0, [fp, #4]
str r8, [fp, #4]
strb sb, [ip, #0x208]
pop {r4, r5, r6, r7, r8, sb, sl, fp}
bx lr
.align 2, 0
_08000208: .4byte gUnknown_03000560
arm_func_start sub_800020C
sub_800020C: @ 0x0800020C
mov ip, #0x4000000
add ip, ip, #0x120
ldm ip, {r0, r1}
push {r7, r8, sb, sl, fp}
ldr fp, _08000324 @ =gUnknown_03000560
mov sb, #0xfe
add sb, sb, #0xfe00
ldrh r3, [ip, #8]
and r3, r3, #0x40
strb r3, [fp, #9]
ldr sl, [fp, #0x14]
adds r3, sl, #1
blt _08000268
bne _0800025C
strh sb, [ip, #0xa]
add r8, fp, #0x28
ldm r8, {r2, r3}
mov r7, r2
stm r8, {r3, r7}
b _08000268
_0800025C:
ldr r3, [fp, #0x2c]
ldr r2, [r3, sl, lsl #1]
strh r2, [ip, #0xa]
_08000268:
cmp sl, #0xd
addlt sl, sl, #1
strlt sl, [fp, #0x14]
push {r0, r1, r5, r6}
mov r6, #3
_0800027C:
add r8, fp, #0x18
add r8, r8, r6, lsl #2
ldr sl, [r8]
lsl r3, r6, #1
ldrh r5, [sp, r3]
cmp r5, sb
bne _080002AC
cmp sl, #0xb
ble _080002AC
mov r0, #1
sub sl, r0, #2
b _080002D8
_080002AC:
ldr r0, [r8, #0x18]
lsl r3, sl, #1
strh r5, [r0, r3]
cmp sl, #0xb
bne _080002D8
ldr r1, [r8, #0x28]
str r0, [r8, #0x28]
str r1, [r8, #0x18]
add r3, fp, #4
mov r0, #1
strb r0, [r3, r6]
_080002D8:
cmp sl, #0xd
addlt sl, sl, #1
str sl, [r8]
subs r6, r6, #1
bge _0800027C
ldrb r0, [fp]
cmp r0, #0
beq _08000318
ldr r7, _08000328 @ =0x0400010E
mov r0, #0
strh r0, [r7]
ldrh r0, [ip, #8]
orr r0, r0, #0x80
strh r0, [ip, #8]
mov r0, #0xc0
strh r0, [r7]
_08000318:
add sp, sp, #8
pop {r5, r6, r7, r8, sb, sl, fp}
bx lr
.align 2, 0
_08000324: .4byte gUnknown_03000560
_08000328: .4byte 0x0400010E
thumb_func_start MultiSioInit
MultiSioInit: @ 0x0800032C
push {r4, r5, r6, r7, lr}
sub sp, #4
adds r5, r0, #0
ldr r3, _080003EC @ =0x04000208
movs r4, #0
strh r4, [r3]
ldr r2, _080003F0 @ =0x04000200
ldrh r1, [r2]
ldr r0, _080003F4 @ =0x0000FF3F
ands r0, r1
strh r0, [r2]
movs r0, #1
strh r0, [r3]
ldr r0, _080003F8 @ =0x04000134
strh r4, [r0]
subs r2, #0xd8
movs r0, #0x80
lsls r0, r0, #6
str r0, [r2]
ldrh r0, [r2]
ldr r3, _080003FC @ =0x00004003
adds r1, r3, #0
orrs r0, r1
strh r0, [r2]
movs r0, #0
str r0, [sp]
ldr r4, _08000400 @ =gUnknown_03000560
ldr r2, _08000404 @ =0x0500007A
mov r0, sp
adds r1, r4, #0
bl CpuSet
ldr r0, _08000408 @ =sub_80001CC
ldr r1, _0800040C @ =gUnknown_03000750
ldr r2, _08000410 @ =0x04000010
bl CpuSet
ldr r0, _08000414 @ =sub_800020C
ldr r1, _08000418 @ =gMultiSioIntrFuncBuf
ldr r2, _0800041C @ =0x04000048
bl CpuSet
strb r5, [r4, #2]
movs r0, #0xd
str r0, [r4, #0x14]
adds r0, r4, #0
adds r0, #0x60
str r0, [r4, #0x28]
adds r0, #0x1c
str r0, [r4, #0x2c]
movs r3, #0
adds r2, r4, #0
movs r0, #0x30
adds r0, r0, r2
mov ip, r0
adds r6, r2, #0
adds r6, #0xd0
adds r7, r2, #0
adds r7, #0x40
adds r5, r2, #0
adds r5, #0x98
movs r4, #0
_080003A8:
lsls r0, r3, #2
mov r1, ip
adds r1, #4
mov ip, r1
subs r1, #4
stm r1!, {r5}
adds r1, r2, #0
adds r1, #0xb4
adds r1, r4, r1
stm r7!, {r1}
adds r1, r2, #0
adds r1, #0x50
adds r0, r0, r1
str r6, [r0]
adds r6, #0x54
adds r5, #0x54
adds r4, #0x54
adds r3, #1
cmp r3, #3
ble _080003A8
ldr r3, _080003EC @ =0x04000208
movs r0, #0
strh r0, [r3]
ldr r2, _080003F0 @ =0x04000200
ldrh r0, [r2]
movs r1, #0x80
orrs r0, r1
strh r0, [r2]
movs r0, #1
strh r0, [r3]
add sp, #4
pop {r4, r5, r6, r7}
pop {r0}
bx r0
.align 2, 0
_080003EC: .4byte 0x04000208
_080003F0: .4byte 0x04000200
_080003F4: .4byte 0x0000FF3F
_080003F8: .4byte 0x04000134
_080003FC: .4byte 0x00004003
_08000400: .4byte gUnknown_03000560
_08000404: .4byte 0x0500007A
_08000408: .4byte sub_80001CC
_0800040C: .4byte gUnknown_03000750
_08000410: .4byte 0x04000010
_08000414: .4byte sub_800020C
_08000418: .4byte gMultiSioIntrFuncBuf
_0800041C: .4byte 0x04000048
thumb_func_start MultiSioMain
MultiSioMain: @ 0x08000420
push {r4, r5, r6, r7, lr}
@@ -228,7 +15,7 @@ MultiSioMain: @ 0x08000420
mov r8, r2
ldr r5, _08000440 @ =0x04000128
ldr r6, [r5]
ldr r7, _08000444 @ =gUnknown_03000560
ldr r7, _08000444 @ =gMultiSioArea
ldrb r0, [r7, #1]
cmp r0, #0
beq _08000448
@@ -237,7 +24,7 @@ MultiSioMain: @ 0x08000420
b _080004BE
.align 2, 0
_08000440: .4byte 0x04000128
_08000444: .4byte gUnknown_03000560
_08000444: .4byte gMultiSioArea
_08000448:
movs r1, #0x30
adds r0, r6, #0
@@ -289,7 +76,7 @@ _08000448:
orrs r0, r1
strb r0, [r5]
_080004AA:
ldr r1, _08000504 @ =gUnknown_03000560
ldr r1, _08000504 @ =gMultiSioArea
movs r0, #1
strb r0, [r1, #1]
_080004B0:
@@ -299,7 +86,7 @@ _080004B0:
mov r1, r8
bl sub_8000538
_080004BE:
ldr r1, _08000504 @ =gUnknown_03000560
ldr r1, _08000504 @ =gMultiSioArea
ldrb r0, [r1, #0xb]
adds r0, #1
strb r0, [r1, #0xb]
@@ -329,7 +116,7 @@ _080004F4: .4byte 0x04000200
_080004F8: .4byte 0x0000FF7F
_080004FC: .4byte 0x04000202
_08000500: .4byte 0x0000BBBC
_08000504: .4byte gUnknown_03000560
_08000504: .4byte gMultiSioArea
_08000508:
adds r0, r3, #0
orrs r0, r2
@@ -363,7 +150,7 @@ _0800052A:
sub_8000538: @ 0x08000538
push {r4, r5, r6, r7, lr}
movs r7, #0
ldr r5, _080005F8 @ =gUnknown_03000560
ldr r5, _080005F8 @ =gMultiSioArea
ldr r4, [r5, #0x28]
movs r2, #1
ands r1, r2
@@ -459,7 +246,7 @@ _080005F0:
pop {r0}
bx r0
.align 2, 0
_080005F8: .4byte gUnknown_03000560
_080005F8: .4byte gMultiSioArea
_080005FC: .4byte gUnknown_03000790
_08000600: .4byte 0x04000005
_08000604: .4byte 0x0400010E
@@ -473,12 +260,12 @@ sub_8000608: @ 0x08000608
push {r5, r6, r7}
sub sp, #0x14
str r0, [sp, #0xc]
ldr r0, _08000714 @ =gUnknown_03000750
ldr r0, _08000714 @ =gMultiSioRecvFuncBuf
movs r4, #0
str r4, [sp]
bl _call_via_r0
str r0, [sp, #4]
ldr r0, _08000718 @ =gUnknown_03000560
ldr r0, _08000718 @ =gMultiSioArea
strb r4, [r0, #3]
add r1, sp, #4
mov sl, r1
@@ -560,7 +347,7 @@ _080006AA:
ldr r4, [sp, #0x10]
cmp r4, #3
ble _08000638
ldr r0, _08000718 @ =gUnknown_03000560
ldr r0, _08000718 @ =gMultiSioArea
ldrb r1, [r0, #2]
ldrb r2, [r0, #3]
adds r3, r1, #0
@@ -601,8 +388,8 @@ _080006F8:
orrs r0, r4
b _08000742
.align 2, 0
_08000714: .4byte gUnknown_03000750
_08000718: .4byte gUnknown_03000560
_08000714: .4byte gMultiSioRecvFuncBuf
_08000718: .4byte gMultiSioArea
_0800071C: .4byte 0x04000005
_08000720: .4byte 0x05000005
_08000724:
@@ -653,7 +440,7 @@ _08000760:
thumb_func_start sub_8000774
sub_8000774: @ 0x08000774
push {lr}
ldr r2, _0800078C @ =gUnknown_03000560
ldr r2, _0800078C @ =gMultiSioArea
ldrb r0, [r2]
cmp r0, #0
beq _08000786
@@ -665,7 +452,7 @@ _08000786:
pop {r0}
bx r0
.align 2, 0
_0800078C: .4byte gUnknown_03000560
_0800078C: .4byte gMultiSioArea
thumb_func_start sub_8000790
sub_8000790: @ 0x08000790
@@ -689,7 +476,7 @@ sub_8000790: @ 0x08000790
adds r1, #0xf6
movs r0, #0xc0
strh r0, [r1]
ldr r2, _080007DC @ =gUnknown_03000560
ldr r2, _080007DC @ =gMultiSioArea
ldrb r1, [r2, #8]
movs r0, #0x7f
ands r0, r1
@@ -702,7 +489,7 @@ _080007CC: .4byte 0x0000FF3F
_080007D0: .4byte 0x04000128
_080007D4: .4byte 0x00002003
_080007D8: .4byte 0x0000BBBC
_080007DC: .4byte gUnknown_03000560
_080007DC: .4byte gMultiSioArea
thumb_func_start sub_80007E0
sub_80007E0: @ 0x080007E0
+1 -1
View File
@@ -1,5 +1,5 @@
.include "asm/macros.inc"
.include "include/gba.inc"
.include "constants/constants.inc"
.syntax unified
.arm
+222
View File
@@ -0,0 +1,222 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
.ifdef MULTI_SIO_DI_FUNC_FAST
@--------------------------------------------------------------------
@- Update Receive Data/Check Buffer Routine -
@--------------------------------------------------------------------
arm_func_start MultiSioRecvBufChange
MultiSioRecvBufChange: @ 0x08158F14
stmfd sp!, {r4-r11}
mov r12, #REG_BASE @ r12: REG_BASE
ldr r11, =gMultiSioArea @ r11: &gMultiSioArea
add r10, r11, #OFS_MS_LAST_RECV_BUF_P @ r10: &gMultiSioArea.lastRecvBufp[0]
mov r9, #1 @ r9: 1
mov r8, #0 @ r8: 0
@ *(vu8 *)REG_ADDR_IME = 0 Disable Interrupt (29 Clocks)
strb r8, [r12, #OFFSET_REG_IME]
@ gMultiSioArea.recvCheckBufp[i] <--> gMultiSioArea.lastRecvBufp[i] Update Receive Buffer
ldmia r10, {r0-r7}
stmia r10!, {r4-r7}
stmia r10!, {r0-r3}
@ syncRecvFlagBak[i] = gMultiSioArea.syncRecvFlag[i]
@ gMultiSioArea.syncRecvFlag[i] = 0
ldr r0, [r11, #OFS_MS_SYNC_RECV_FLAG]
str r8, [r11, #OFS_MS_SYNC_RECV_FLAG]
@ *(vu8 *)REG_IME = 1 Enable Interrupt
strb r9, [r12, #OFFSET_REG_IME]
@ return gMultiSioArea.syncRecvFlag[i]
ldmfd sp!, {r4-r11}
bx lr
.ltorg
arm_func_end MultiSioRecvBufChange
@--------------------------------------------------------------------
@- Multi-play Interrupt Routine -
@--------------------------------------------------------------------
arm_func_start MultiSioIntr
MultiSioIntr: @ 0x08158F54
@ Save Receive Data
@ *(u64 *)recvTmp = *(u64 *)REG_ADDR_SIOMLT_RECV
mov r12, #REG_BASE @ r12: REG_SIOMLT_RECV
add r12, r12, #OFFSET_REG_SIOMLT_RECV
ldmia r12, {r0-r1}
@ Save Register to Stack
stmfd sp!, {r7-r11}
ldr r11, =gMultiSioArea @ r11: &gMultiSioArea
mov r9, #MULTI_SIO_SYNC_DATA & 0x00ff @ r9: MULTI_SIO_SYNC_DATA
add r9, r9, #MULTI_SIO_SYNC_DATA & 0xff00
@ Detect hard error
@ gMultiSioArea.error = REG_SIOCNT->Error
ldrh r3, [r12, #REG_SIOCNT - REG_SIOMLT_RECV]
and r3, r3, #SIO_ERROR
strb r3, [r11, #OFS_MS_HARD_ERROR]
@ Send Data Processing
@ if (gMultiSioArea.sendBufCounter == -1) {
ldr r10, [r11, #OFS_MS_SEND_BUF_COUNTER] @ r10: gMultiSioArea.sendBufCounter
adds r3, r10, #1
blt 3f
bne 2f
@ REG_SIOCNT->data = MULTI_SIO_SYNC_DATA Set Synchronization Data
strh r9, [r12, #REG_SIOMLT_SEND - REG_SIOMLT_RECV]
@ gMultiSioArea.currentSendBufp <--> gMultiSioArea.nextSendBufp Change Send Buffer
add r8, r11, #OFS_MS_NEXT_SEND_BUF_P
ldmia r8, {r2,r3}
mov r7, r2
stmia r8, {r3,r7}
b 3f
2:
@ } else if (gMultiSioArea.sendBufCounter >= 0) {
@ REG_SIOCNT->data = gMultiSioArea.currentSendBufp[gMultiSioArea.sendBufCounter]
@ Set Send Data
ldr r3, [r11, #OFS_MS_CURRENT_SEND_BUF_P]
ldr r2, [r3, r10, lsl #1]
strh r2, [r12, #REG_SIOMLT_SEND - REG_SIOMLT_RECV]
3:
@ }
@ if (gMultiSioArea.sendBufCounter < sizeof(struct MultiSioPacket) / 2 - 1)
@ gMultiSioArea.sendBufCounter++;
cmp r10, #MULTI_SIO_PACKET_SIZE / 2 - 1
addlt r10, r10, #1
strlt r10, [r11, #OFS_MS_SEND_BUF_COUNTER]
@ Save Receive Data & Register to Stack
stmfd sp!, {r0-r1, r5-r6}
@ Receive Data Processing (Max. Approx. 160 Clocks/Included in Wait Period)
@ for (i = 0; i < MULTI_SIO_PLAYERS_MAX; i++) {
mov r6, #MULTI_SIO_PLAYERS_MAX - 1 @ r6: i
4:
add r8, r11, #OFS_MS_RECV_BUF_COUNTER @ r8: &gMultiSioArea.recvBufCounter[i]
add r8, r8, r6, lsl #2
ldr r10, [r8, #0] @ r10: gMultiSioArea.recvBufCounter[i]
mov r3, r6, lsl #1 @ r5: RecvTmp[i]
ldrh r5, [sp, r3]
@ if ( recvTmp[i] == MULTI_SIO_SYNC_DATA
@ && gMultiSioArea.recvBufCounter[i] > sizeof(struct MultiSioPacket) / 2 - 3) {
cmp r5, r9
bne 6f
cmp r10, #MULTI_SIO_PACKET_SIZE / 2 - 3
ble 6f
@ gMultiSioArea.recvBufCounter[i] = -1
mov r0, #1
sub r10, r0, #2
b 7f
6:
@ } else {
@ gMultiSioArea.currentRecvBufp[i][gMultiSioArea.recvBufCounter[i]] = recvTmp[i]
@ Store Receive Data
ldr r0, [r8, #OFS_MS_CURRENT_RECV_BUF_P - OFS_MS_RECV_BUF_COUNTER]
mov r3, r10, lsl #1
strh r5, [r0, r3]
@ if (gMultiSioArea.recvBufCounter[i] == sizeof(struct MultiSioPacket) / 2 - 3)
cmp r10, #MULTI_SIO_PACKET_SIZE / 2 - 3
bne 7f
@ gMultiSioArea.currentRecvBufp[i] <--> gMultiSioArea.lastRecvBufp[i] Change Receive Buffer
ldr r1, [r8, #OFS_MS_LAST_RECV_BUF_P - OFS_MS_RECV_BUF_COUNTER]
str r0, [r8, #OFS_MS_LAST_RECV_BUF_P - OFS_MS_RECV_BUF_COUNTER]
str r1, [r8, #OFS_MS_CURRENT_RECV_BUF_P - OFS_MS_RECV_BUF_COUNTER]
@ gMultiSioArea.syncRecvFlag[i] = 1; Receive Completion Flag
add r3, r11, #OFS_MS_SYNC_RECV_FLAG
mov r0, #1
strb r0, [r3, r6]
7:
@ }
@ if (gMultiSioArea.recvBufCounter[i] < sizeof(struct MultiSioPacket) / 2 - 1)
@ gMultiSioArea.recvBufCounter[i]++;
cmp r10, #MULTI_SIO_PACKET_SIZE / 2 - 1
addlt r10, r10, #1
str r10, [r8, #0]
subs r6, r6, #1
bge 4b
@ }
@ Start Master Send
@ if (gMultiSioArea.type == SIO_MULTI_PARENT)
ldrb r0, [r11,#OFS_MS_TYPE]
cmp r0, #0
beq 11f
@ *(vu16 *)REG_ADDR_MULTI_SIO_TIMER_H = 0; Stop Timer
ldr r7, =REG_MULTI_SIO_TIMER_H @ r7: REG_MULTI_SIO_TIMER_H
mov r0, #0
strh r0, [r7, #0]
@ REG_SIOCNT |= SIO_ENABLE; Restart Send
ldrh r0, [r12, #REG_SIOCNT - REG_SIOMLT_RECV]
orr r0, r0, #SIO_ENABLE
strh r0, [r12, #REG_SIOCNT - REG_SIOMLT_RECV]
@ *(vu16 *)REG_ADDR_MULTI_SIO_TIMER_H Restart Timer
@ = (TIMER_1CLK | TIMER_INTR_ENABLE | TIMER_ENABLE);
mov r0, #0xC0
strh r0, [r7, #0]
11:
add sp, sp, #8
ldmfd sp!, {r5-r11}
bx lr
arm_func_end MultiSioIntr
.endif
+3
View File
@@ -0,0 +1,3 @@
.include "constants/gba_constants.inc"
.include "constants/misc_constants.inc"
.include "constants/multi_sio_constants.inc"
+495
View File
@@ -0,0 +1,495 @@
.set PSR_USR_MODE, 0x00000010
.set PSR_FIQ_MODE, 0x00000011
.set PSR_IRQ_MODE, 0x00000012
.set PSR_SVC_MODE, 0x00000013
.set PSR_ABT_MODE, 0x00000017
.set PSR_UND_MODE, 0x0000001b
.set PSR_SYS_MODE, 0x0000001f
.set PSR_MODE_MASK, 0x0000001f
.set PSR_T_BIT, 0x00000020
.set PSR_F_BIT, 0x00000040
.set PSR_I_BIT, 0x00000080
.set EWRAM_START, 0x2000000
.set EWRAM_END, EWRAM_START + 0x40000
.set IWRAM_START, 0x3000000
.set IWRAM_END, IWRAM_START + 0x8000
.set PLTT, 0x5000000
.set BG_PLTT, PLTT
.set OBJ_PLTT, PLTT + 0x200
.set VRAM, 0x6000000
.set BG_VRAM, VRAM
.set OBJ_VRAM0, VRAM + 0x10000 @ text-mode BG
.set OBJ_VRAM1, VRAM + 0x14000 @ bitmap-mode BG
.set OAM, 0x7000000
.set SOUND_INFO_PTR, 0x3007FF0
.set INTR_CHECK, 0x3007FF8
.set INTR_VECTOR, 0x3007FFC
.set INTR_FLAG_VBLANK, 1 << 0
.set INTR_FLAG_HBLANK, 1 << 1
.set INTR_FLAG_VCOUNT, 1 << 2
.set INTR_FLAG_TIMER0, 1 << 3
.set INTR_FLAG_TIMER1, 1 << 4
.set INTR_FLAG_TIMER2, 1 << 5
.set INTR_FLAG_TIMER3, 1 << 6
.set INTR_FLAG_SERIAL, 1 << 7
.set INTR_FLAG_DMA0, 1 << 8
.set INTR_FLAG_DMA1, 1 << 9
.set INTR_FLAG_DMA2, 1 << 10
.set INTR_FLAG_DMA3, 1 << 11
.set INTR_FLAG_KEYPAD, 1 << 12
.set INTR_FLAG_GAMEPAK, 1 << 13
.set VCOUNT_VBLANK, 160
.set TOTAL_SCANLINES, 228
.set REG_BASE, 0x4000000 @ I/O register base address
@ I/O register offsets
.set OFFSET_REG_DISPCNT, 0x0
.set OFFSET_REG_DISPSTAT, 0x4
.set OFFSET_REG_VCOUNT, 0x6
.set OFFSET_REG_BG0CNT, 0x8
.set OFFSET_REG_BG1CNT, 0xa
.set OFFSET_REG_BG2CNT, 0xc
.set OFFSET_REG_BG3CNT, 0xe
.set OFFSET_REG_BG0HOFS, 0x10
.set OFFSET_REG_BG0VOFS, 0x12
.set OFFSET_REG_BG1HOFS, 0x14
.set OFFSET_REG_BG1VOFS, 0x16
.set OFFSET_REG_BG2HOFS, 0x18
.set OFFSET_REG_BG2VOFS, 0x1a
.set OFFSET_REG_BG3HOFS, 0x1c
.set OFFSET_REG_BG3VOFS, 0x1e
.set OFFSET_REG_BG2PA, 0x20
.set OFFSET_REG_BG2PB, 0x22
.set OFFSET_REG_BG2PC, 0x24
.set OFFSET_REG_BG2PD, 0x26
.set OFFSET_REG_BG2X_L, 0x28
.set OFFSET_REG_BG2X_H, 0x2a
.set OFFSET_REG_BG2Y_L, 0x2c
.set OFFSET_REG_BG2Y_H, 0x2e
.set OFFSET_REG_BG3PA, 0x30
.set OFFSET_REG_BG3PB, 0x32
.set OFFSET_REG_BG3PC, 0x34
.set OFFSET_REG_BG3PD, 0x36
.set OFFSET_REG_BG3X_L, 0x38
.set OFFSET_REG_BG3X_H, 0x3a
.set OFFSET_REG_BG3Y_L, 0x3c
.set OFFSET_REG_BG3Y_H, 0x3e
.set OFFSET_REG_WIN0H, 0x40
.set OFFSET_REG_WIN1H, 0x42
.set OFFSET_REG_WIN0V, 0x44
.set OFFSET_REG_WIN1V, 0x46
.set OFFSET_REG_WININ, 0x48
.set OFFSET_REG_WINOUT, 0x4a
.set OFFSET_REG_MOSAIC, 0x4c
.set OFFSET_REG_BLDCNT, 0x50
.set OFFSET_REG_BLDALPHA, 0x52
.set OFFSET_REG_BLDY, 0x54
.set OFFSET_REG_SOUND1CNT, 0x60
.set OFFSET_REG_SOUND1CNT_L, 0x60
.set OFFSET_REG_NR10, 0x60
.set OFFSET_REG_SOUND1CNT_H, 0x62
.set OFFSET_REG_NR11, 0x62
.set OFFSET_REG_NR12, 0x63
.set OFFSET_REG_SOUND1CNT_X, 0x64
.set OFFSET_REG_NR13, 0x64
.set OFFSET_REG_NR14, 0x65
.set OFFSET_REG_SOUND2CNT, 0x68
.set OFFSET_REG_SOUND2CNT_L, 0x68
.set OFFSET_REG_NR21, 0x68
.set OFFSET_REG_NR22, 0x69
.set OFFSET_REG_SOUND2CNT_H, 0x6c
.set OFFSET_REG_NR23, 0x6c
.set OFFSET_REG_NR24, 0x6d
.set OFFSET_REG_SOUND3CNT, 0x70
.set OFFSET_REG_SOUND3CNT_L, 0x70
.set OFFSET_REG_NR30, 0x70
.set OFFSET_REG_SOUND3CNT_H, 0x72
.set OFFSET_REG_NR31, 0x72
.set OFFSET_REG_NR32, 0x73
.set OFFSET_REG_SOUND3CNT_X, 0x74
.set OFFSET_REG_NR33, 0x74
.set OFFSET_REG_NR34, 0x75
.set OFFSET_REG_SOUND4CNT, 0x78
.set OFFSET_REG_SOUND4CNT_L, 0x78
.set OFFSET_REG_NR41, 0x78
.set OFFSET_REG_NR42, 0x79
.set OFFSET_REG_SOUND4CNT_H, 0x7c
.set OFFSET_REG_NR43, 0x7c
.set OFFSET_REG_NR44, 0x7d
.set OFFSET_REG_SOUNDCNT, 0x80
.set OFFSET_REG_SOUNDCNT_L, 0x80
.set OFFSET_REG_NR50, 0x80
.set OFFSET_REG_NR51, 0x81
.set OFFSET_REG_SOUNDCNT_H, 0x82
.set OFFSET_REG_SOUNDCNT_X, 0x84
.set OFFSET_REG_NR52, 0x84
.set OFFSET_REG_SOUNDBIAS, 0x88
.set OFFSET_REG_WAVE_RAM, 0x90
.set OFFSET_REG_WAVE_RAM0, 0x90
.set OFFSET_REG_WAVE_RAM0_L, 0x90
.set OFFSET_REG_WAVE_RAM0_H, 0x92
.set OFFSET_REG_WAVE_RAM1, 0x94
.set OFFSET_REG_WAVE_RAM1_L, 0x94
.set OFFSET_REG_WAVE_RAM1_H, 0x96
.set OFFSET_REG_WAVE_RAM2, 0x98
.set OFFSET_REG_WAVE_RAM2_L, 0x98
.set OFFSET_REG_WAVE_RAM2_H, 0x9a
.set OFFSET_REG_WAVE_RAM3, 0x9c
.set OFFSET_REG_WAVE_RAM3_L, 0x9c
.set OFFSET_REG_WAVE_RAM3_H, 0x9e
.set OFFSET_REG_FIFO, 0xa0
.set OFFSET_REG_FIFO_A, 0xa0
.set OFFSET_REG_FIFO_A_L, 0xa0
.set OFFSET_REG_FIFO_A_H, 0xa2
.set OFFSET_REG_FIFO_B, 0xa4
.set OFFSET_REG_FIFO_B_L, 0xa4
.set OFFSET_REG_FIFO_B_H, 0xa6
.set OFFSET_REG_DMA0, 0xb0
.set OFFSET_REG_DMA0SAD, 0xb0
.set OFFSET_REG_DMA0SAD_L, 0xb0
.set OFFSET_REG_DMA0SAD_H, 0xb2
.set OFFSET_REG_DMA0DAD, 0xb4
.set OFFSET_REG_DMA0DAD_L, 0xb4
.set OFFSET_REG_DMA0DAD_H, 0xb6
.set OFFSET_REG_DMA0CNT, 0xb8
.set OFFSET_REG_DMA0CNT_L, 0xb8
.set OFFSET_REG_DMA0CNT_H, 0xba
.set OFFSET_REG_DMA1, 0xbc
.set OFFSET_REG_DMA1SAD, 0xbc
.set OFFSET_REG_DMA1SAD_L, 0xbc
.set OFFSET_REG_DMA1SAD_H, 0xbe
.set OFFSET_REG_DMA1DAD, 0xc0
.set OFFSET_REG_DMA1DAD_L, 0xc0
.set OFFSET_REG_DMA1DAD_H, 0xc2
.set OFFSET_REG_DMA1CNT, 0xc4
.set OFFSET_REG_DMA1CNT_L, 0xc4
.set OFFSET_REG_DMA1CNT_H, 0xc6
.set OFFSET_REG_DMA2, 0xc8
.set OFFSET_REG_DMA2SAD, 0xc8
.set OFFSET_REG_DMA2SAD_L, 0xc8
.set OFFSET_REG_DMA2SAD_H, 0xca
.set OFFSET_REG_DMA2DAD, 0xcc
.set OFFSET_REG_DMA2DAD_L, 0xcc
.set OFFSET_REG_DMA2DAD_H, 0xce
.set OFFSET_REG_DMA2CNT, 0xd0
.set OFFSET_REG_DMA2CNT_L, 0xd0
.set OFFSET_REG_DMA2CNT_H, 0xd2
.set OFFSET_REG_DMA3, 0xd4
.set OFFSET_REG_DMA3SAD, 0xd4
.set OFFSET_REG_DMA3SAD_L, 0xd4
.set OFFSET_REG_DMA3SAD_H, 0xd6
.set OFFSET_REG_DMA3DAD, 0xd8
.set OFFSET_REG_DMA3DAD_L, 0xd8
.set OFFSET_REG_DMA3DAD_H, 0xda
.set OFFSET_REG_DMA3CNT, 0xdc
.set OFFSET_REG_DMA3CNT_L, 0xdc
.set OFFSET_REG_DMA3CNT_H, 0xde
.set OFFSET_REG_TM0CNT, 0x100
.set OFFSET_REG_TM0CNT_L, 0x100
.set OFFSET_REG_TM0CNT_H, 0x102
.set OFFSET_REG_TM1CNT, 0x104
.set OFFSET_REG_TM1CNT_L, 0x104
.set OFFSET_REG_TM1CNT_H, 0x106
.set OFFSET_REG_TM2CNT, 0x108
.set OFFSET_REG_TM2CNT_L, 0x108
.set OFFSET_REG_TM2CNT_H, 0x10a
.set OFFSET_REG_TM3CNT, 0x10c
.set OFFSET_REG_TM3CNT_L, 0x10c
.set OFFSET_REG_TM3CNT_H, 0x10e
.set OFFSET_REG_SIOCNT, 0x128
.set OFFSET_REG_SIODATA8, 0x12a
.set OFFSET_REG_SIODATA32, 0x120
.set OFFSET_REG_SIOMLT_SEND, 0x12a
.set OFFSET_REG_SIOMLT_RECV, 0x120
.set OFFSET_REG_SIOMULTI0, 0x120
.set OFFSET_REG_SIOMULTI1, 0x122
.set OFFSET_REG_SIOMULTI2, 0x124
.set OFFSET_REG_SIOMULTI3, 0x126
.set OFFSET_REG_KEYINPUT, 0x130
.set OFFSET_REG_KEYCNT, 0x132
.set OFFSET_REG_RCNT, 0x134
.set OFFSET_REG_JOYCNT, 0x140
.set OFFSET_REG_JOYSTAT, 0x158
.set OFFSET_REG_JOY_RECV, 0x150
.set OFFSET_REG_JOY_RECV_L, 0x150
.set OFFSET_REG_JOY_RECV_H, 0x152
.set OFFSET_REG_JOY_TRANS, 0x154
.set OFFSET_REG_JOY_TRANS_L, 0x154
.set OFFSET_REG_JOY_TRANS_H, 0x156
.set OFFSET_REG_IME, 0x208
.set OFFSET_REG_IE, 0x200
.set OFFSET_REG_IF, 0x202
.set OFFSET_REG_WAITCNT, 0x204
@ I/O register addresses
.set REG_DISPCNT, REG_BASE + OFFSET_REG_DISPCNT
.set REG_DISPSTAT, REG_BASE + OFFSET_REG_DISPSTAT
.set REG_VCOUNT, REG_BASE + OFFSET_REG_VCOUNT
.set REG_BG0CNT, REG_BASE + OFFSET_REG_BG0CNT
.set REG_BG1CNT, REG_BASE + OFFSET_REG_BG1CNT
.set REG_BG2CNT, REG_BASE + OFFSET_REG_BG2CNT
.set REG_BG3CNT, REG_BASE + OFFSET_REG_BG3CNT
.set REG_BG0HOFS, REG_BASE + OFFSET_REG_BG0HOFS
.set REG_BG0VOFS, REG_BASE + OFFSET_REG_BG0VOFS
.set REG_BG1HOFS, REG_BASE + OFFSET_REG_BG1HOFS
.set REG_BG1VOFS, REG_BASE + OFFSET_REG_BG1VOFS
.set REG_BG2HOFS, REG_BASE + OFFSET_REG_BG2HOFS
.set REG_BG2VOFS, REG_BASE + OFFSET_REG_BG2VOFS
.set REG_BG3HOFS, REG_BASE + OFFSET_REG_BG3HOFS
.set REG_BG3VOFS, REG_BASE + OFFSET_REG_BG3VOFS
.set REG_BG2PA, REG_BASE + OFFSET_REG_BG2PA
.set REG_BG2PB, REG_BASE + OFFSET_REG_BG2PB
.set REG_BG2PC, REG_BASE + OFFSET_REG_BG2PC
.set REG_BG2PD, REG_BASE + OFFSET_REG_BG2PD
.set REG_BG2X_L, REG_BASE + OFFSET_REG_BG2X_L
.set REG_BG2X_H, REG_BASE + OFFSET_REG_BG2X_H
.set REG_BG2Y_L, REG_BASE + OFFSET_REG_BG2Y_L
.set REG_BG2Y_H, REG_BASE + OFFSET_REG_BG2Y_H
.set REG_BG3PA, REG_BASE + OFFSET_REG_BG3PA
.set REG_BG3PB, REG_BASE + OFFSET_REG_BG3PB
.set REG_BG3PC, REG_BASE + OFFSET_REG_BG3PC
.set REG_BG3PD, REG_BASE + OFFSET_REG_BG3PD
.set REG_BG3X_L, REG_BASE + OFFSET_REG_BG3X_L
.set REG_BG3X_H, REG_BASE + OFFSET_REG_BG3X_H
.set REG_BG3Y_L, REG_BASE + OFFSET_REG_BG3Y_L
.set REG_BG3Y_H, REG_BASE + OFFSET_REG_BG3Y_H
.set REG_WIN0H, REG_BASE + OFFSET_REG_WIN0H
.set REG_WIN1H, REG_BASE + OFFSET_REG_WIN1H
.set REG_WIN0V, REG_BASE + OFFSET_REG_WIN0V
.set REG_WIN1V, REG_BASE + OFFSET_REG_WIN1V
.set REG_WININ, REG_BASE + OFFSET_REG_WININ
.set REG_WINOUT, REG_BASE + OFFSET_REG_WINOUT
.set REG_MOSAIC, REG_BASE + OFFSET_REG_MOSAIC
.set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT
.set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA
.set REG_BLDY, REG_BASE + OFFSET_REG_BLDY
.set REG_SOUND1CNT, REG_BASE + OFFSET_REG_SOUND1CNT
.set REG_SOUND1CNT_L, REG_BASE + OFFSET_REG_SOUND1CNT_L
.set REG_NR10, REG_BASE + OFFSET_REG_NR10
.set REG_SOUND1CNT_H, REG_BASE + OFFSET_REG_SOUND1CNT_H
.set REG_NR11, REG_BASE + OFFSET_REG_NR11
.set REG_NR12, REG_BASE + OFFSET_REG_NR12
.set REG_SOUND1CNT_X, REG_BASE + OFFSET_REG_SOUND1CNT_X
.set REG_NR13, REG_BASE + OFFSET_REG_NR13
.set REG_NR14, REG_BASE + OFFSET_REG_NR14
.set REG_SOUND2CNT, REG_BASE + OFFSET_REG_SOUND2CNT
.set REG_SOUND2CNT_L, REG_BASE + OFFSET_REG_SOUND2CNT_L
.set REG_NR21, REG_BASE + OFFSET_REG_NR21
.set REG_NR22, REG_BASE + OFFSET_REG_NR22
.set REG_SOUND2CNT_H, REG_BASE + OFFSET_REG_SOUND2CNT_H
.set REG_NR23, REG_BASE + OFFSET_REG_NR23
.set REG_NR24, REG_BASE + OFFSET_REG_NR24
.set REG_SOUND3CNT, REG_BASE + OFFSET_REG_SOUND3CNT
.set REG_SOUND3CNT_L, REG_BASE + OFFSET_REG_SOUND3CNT_L
.set REG_NR30, REG_BASE + OFFSET_REG_NR30
.set REG_SOUND3CNT_H, REG_BASE + OFFSET_REG_SOUND3CNT_H
.set REG_NR31, REG_BASE + OFFSET_REG_NR31
.set REG_NR32, REG_BASE + OFFSET_REG_NR32
.set REG_SOUND3CNT_X, REG_BASE + OFFSET_REG_SOUND3CNT_X
.set REG_NR33, REG_BASE + OFFSET_REG_NR33
.set REG_NR34, REG_BASE + OFFSET_REG_NR34
.set REG_SOUND4CNT, REG_BASE + OFFSET_REG_SOUND4CNT
.set REG_SOUND4CNT_L, REG_BASE + OFFSET_REG_SOUND4CNT_L
.set REG_NR41, REG_BASE + OFFSET_REG_NR41
.set REG_NR42, REG_BASE + OFFSET_REG_NR42
.set REG_SOUND4CNT_H, REG_BASE + OFFSET_REG_SOUND4CNT_H
.set REG_NR43, REG_BASE + OFFSET_REG_NR43
.set REG_NR44, REG_BASE + OFFSET_REG_NR44
.set REG_SOUNDCNT, REG_BASE + OFFSET_REG_SOUNDCNT
.set REG_SOUNDCNT_L, REG_BASE + OFFSET_REG_SOUNDCNT_L
.set REG_NR50, REG_BASE + OFFSET_REG_NR50
.set REG_NR51, REG_BASE + OFFSET_REG_NR51
.set REG_SOUNDCNT_H, REG_BASE + OFFSET_REG_SOUNDCNT_H
.set REG_SOUNDCNT_X, REG_BASE + OFFSET_REG_SOUNDCNT_X
.set REG_NR52, REG_BASE + OFFSET_REG_NR52
.set REG_SOUNDBIAS, REG_BASE + OFFSET_REG_SOUNDBIAS
.set REG_WAVE_RAM, REG_BASE + OFFSET_REG_WAVE_RAM
.set REG_WAVE_RAM0, REG_BASE + OFFSET_REG_WAVE_RAM0
.set REG_WAVE_RAM0_L, REG_BASE + OFFSET_REG_WAVE_RAM0_L
.set REG_WAVE_RAM0_H, REG_BASE + OFFSET_REG_WAVE_RAM0_H
.set REG_WAVE_RAM1, REG_BASE + OFFSET_REG_WAVE_RAM1
.set REG_WAVE_RAM1_L, REG_BASE + OFFSET_REG_WAVE_RAM1_L
.set REG_WAVE_RAM1_H, REG_BASE + OFFSET_REG_WAVE_RAM1_H
.set REG_WAVE_RAM2, REG_BASE + OFFSET_REG_WAVE_RAM2
.set REG_WAVE_RAM2_L, REG_BASE + OFFSET_REG_WAVE_RAM2_L
.set REG_WAVE_RAM2_H, REG_BASE + OFFSET_REG_WAVE_RAM2_H
.set REG_WAVE_RAM3, REG_BASE + OFFSET_REG_WAVE_RAM3
.set REG_WAVE_RAM3_L, REG_BASE + OFFSET_REG_WAVE_RAM3_L
.set REG_WAVE_RAM3_H, REG_BASE + OFFSET_REG_WAVE_RAM3_H
.set REG_FIFO, REG_BASE + OFFSET_REG_FIFO
.set REG_FIFO_A, REG_BASE + OFFSET_REG_FIFO_A
.set REG_FIFO_A_L, REG_BASE + OFFSET_REG_FIFO_A_L
.set REG_FIFO_A_H, REG_BASE + OFFSET_REG_FIFO_A_H
.set REG_FIFO_B, REG_BASE + OFFSET_REG_FIFO_B
.set REG_FIFO_B_L, REG_BASE + OFFSET_REG_FIFO_B_L
.set REG_FIFO_B_H, REG_BASE + OFFSET_REG_FIFO_B_H
.set REG_DMA0, REG_BASE + OFFSET_REG_DMA0
.set REG_DMA0SAD, REG_BASE + OFFSET_REG_DMA0SAD
.set REG_DMA0SAD_L, REG_BASE + OFFSET_REG_DMA0SAD_L
.set REG_DMA0SAD_H, REG_BASE + OFFSET_REG_DMA0SAD_H
.set REG_DMA0DAD, REG_BASE + OFFSET_REG_DMA0DAD
.set REG_DMA0DAD_L, REG_BASE + OFFSET_REG_DMA0DAD_L
.set REG_DMA0DAD_H, REG_BASE + OFFSET_REG_DMA0DAD_H
.set REG_DMA0CNT, REG_BASE + OFFSET_REG_DMA0CNT
.set REG_DMA0CNT_L, REG_BASE + OFFSET_REG_DMA0CNT_L
.set REG_DMA0CNT_H, REG_BASE + OFFSET_REG_DMA0CNT_H
.set REG_DMA1, REG_BASE + OFFSET_REG_DMA1
.set REG_DMA1SAD, REG_BASE + OFFSET_REG_DMA1SAD
.set REG_DMA1SAD_L, REG_BASE + OFFSET_REG_DMA1SAD_L
.set REG_DMA1SAD_H, REG_BASE + OFFSET_REG_DMA1SAD_H
.set REG_DMA1DAD, REG_BASE + OFFSET_REG_DMA1DAD
.set REG_DMA1DAD_L, REG_BASE + OFFSET_REG_DMA1DAD_L
.set REG_DMA1DAD_H, REG_BASE + OFFSET_REG_DMA1DAD_H
.set REG_DMA1CNT, REG_BASE + OFFSET_REG_DMA1CNT
.set REG_DMA1CNT_L, REG_BASE + OFFSET_REG_DMA1CNT_L
.set REG_DMA1CNT_H, REG_BASE + OFFSET_REG_DMA1CNT_H
.set REG_DMA2, REG_BASE + OFFSET_REG_DMA2
.set REG_DMA2SAD, REG_BASE + OFFSET_REG_DMA2SAD
.set REG_DMA2SAD_L, REG_BASE + OFFSET_REG_DMA2SAD_L
.set REG_DMA2SAD_H, REG_BASE + OFFSET_REG_DMA2SAD_H
.set REG_DMA2DAD, REG_BASE + OFFSET_REG_DMA2DAD
.set REG_DMA2DAD_L, REG_BASE + OFFSET_REG_DMA2DAD_L
.set REG_DMA2DAD_H, REG_BASE + OFFSET_REG_DMA2DAD_H
.set REG_DMA2CNT, REG_BASE + OFFSET_REG_DMA2CNT
.set REG_DMA2CNT_L, REG_BASE + OFFSET_REG_DMA2CNT_L
.set REG_DMA2CNT_H, REG_BASE + OFFSET_REG_DMA2CNT_H
.set REG_DMA3, REG_BASE + OFFSET_REG_DMA3
.set REG_DMA3SAD, REG_BASE + OFFSET_REG_DMA3SAD
.set REG_DMA3SAD_L, REG_BASE + OFFSET_REG_DMA3SAD_L
.set REG_DMA3SAD_H, REG_BASE + OFFSET_REG_DMA3SAD_H
.set REG_DMA3DAD, REG_BASE + OFFSET_REG_DMA3DAD
.set REG_DMA3DAD_L, REG_BASE + OFFSET_REG_DMA3DAD_L
.set REG_DMA3DAD_H, REG_BASE + OFFSET_REG_DMA3DAD_H
.set REG_DMA3CNT, REG_BASE + OFFSET_REG_DMA3CNT
.set REG_DMA3CNT_L, REG_BASE + OFFSET_REG_DMA3CNT_L
.set REG_DMA3CNT_H, REG_BASE + OFFSET_REG_DMA3CNT_H
.set REG_TM0CNT, REG_BASE + OFFSET_REG_TM0CNT
.set REG_TM0CNT_L, REG_BASE + OFFSET_REG_TM0CNT_L
.set REG_TM0CNT_H, REG_BASE + OFFSET_REG_TM0CNT_H
.set REG_TM1CNT, REG_BASE + OFFSET_REG_TM1CNT
.set REG_TM1CNT_L, REG_BASE + OFFSET_REG_TM1CNT_L
.set REG_TM1CNT_H, REG_BASE + OFFSET_REG_TM1CNT_H
.set REG_TM2CNT, REG_BASE + OFFSET_REG_TM2CNT
.set REG_TM2CNT_L, REG_BASE + OFFSET_REG_TM2CNT_L
.set REG_TM2CNT_H, REG_BASE + OFFSET_REG_TM2CNT_H
.set REG_TM3CNT, REG_BASE + OFFSET_REG_TM3CNT
.set REG_TM3CNT_L, REG_BASE + OFFSET_REG_TM3CNT_L
.set REG_TM3CNT_H, REG_BASE + OFFSET_REG_TM3CNT_H
.set REG_SIOCNT, REG_BASE + OFFSET_REG_SIOCNT
.set REG_SIODATA8, REG_BASE + OFFSET_REG_SIODATA8
.set REG_SIODATA32, REG_BASE + OFFSET_REG_SIODATA32
.set REG_SIOMLT_SEND, REG_BASE + OFFSET_REG_SIOMLT_SEND
.set REG_SIOMLT_RECV, REG_BASE + OFFSET_REG_SIOMLT_RECV
.set REG_SIOMULTI0, REG_BASE + OFFSET_REG_SIOMULTI0
.set REG_SIOMULTI1, REG_BASE + OFFSET_REG_SIOMULTI1
.set REG_SIOMULTI2, REG_BASE + OFFSET_REG_SIOMULTI2
.set REG_SIOMULTI3, REG_BASE + OFFSET_REG_SIOMULTI3
.set REG_KEYINPUT, REG_BASE + OFFSET_REG_KEYINPUT
.set REG_KEYCNT, REG_BASE + OFFSET_REG_KEYCNT
.set REG_RCNT, REG_BASE + OFFSET_REG_RCNT
.set REG_JOYCNT, REG_BASE + OFFSET_REG_JOYCNT
.set REG_JOYSTAT, REG_BASE + OFFSET_REG_JOYSTAT
.set REG_JOY_RECV, REG_BASE + OFFSET_REG_JOY_RECV
.set REG_JOY_RECV_L, REG_BASE + OFFSET_REG_JOY_RECV_L
.set REG_JOY_RECV_H, REG_BASE + OFFSET_REG_JOY_RECV_H
.set REG_JOY_TRANS, REG_BASE + OFFSET_REG_JOY_TRANS
.set REG_JOY_TRANS_L, REG_BASE + OFFSET_REG_JOY_TRANS_L
.set REG_JOY_TRANS_H, REG_BASE + OFFSET_REG_JOY_TRANS_H
.set REG_IME, REG_BASE + OFFSET_REG_IME
.set REG_IE, REG_BASE + OFFSET_REG_IE
.set REG_IF, REG_BASE + OFFSET_REG_IF
.set REG_WAITCNT, REG_BASE + OFFSET_REG_WAITCNT
@ DMA register constants
.set DMA_DEST_INC, 0x0000
.set DMA_DEST_DEC, 0x0020
.set DMA_DEST_FIXED, 0x0040
.set DMA_DEST_RELOAD, 0x0060
.set DMA_SRC_INC, 0x0000
.set DMA_SRC_DEC, 0x0080
.set DMA_SRC_FIXED, 0x0100
.set DMA_REPEAT, 0x0200
.set DMA_16BIT, 0x0000
.set DMA_32BIT, 0x0400
.set DMA_DREQ_ON, 0x0800
.set DMA_START_NOW, 0x0000
.set DMA_START_VBLANK, 0x1000
.set DMA_START_HBLANK, 0x2000
.set DMA_START_SPECIAL, 0x3000
.set DMA_INTR_ENABLE, 0x4000
.set DMA_ENABLE, 0x8000
@ OAM attribute constants
.set OAM_OBJ_NORMAL, 0x00000000
.set OAM_OBJ_BLEND, 0x00000400
.set OAM_OBJ_WINDOW, 0x00000800
.set OAM_AFFINE_NONE, 0x00000000
.set OAM_AFFINE_NORMAL_SIZE, 0x00000100
.set OAM_OBJ_DISABLED, 0x00000200
.set OAM_AFFINE_DOUBLE_SIZE, 0x00000300
.set OAM_MOSAIC_OFF, 0x00000000
.set OAM_MOSAIC_ON, 0x00001000
.set OAM_4BPP, 0x00000000
.set OAM_8BPP, 0x00002000
.set OAM_H_FLIP, 0x10000000
.set OAM_V_FLIP, 0x20000000
.set OAM_SQUARE, 0x00000000
.set OAM_H_RECTANGLE, 0x00004000
.set OAM_V_RECTANGLE, 0x00008000
.set OAM_SIZE_0, 0x00000000
.set OAM_SIZE_1, 0x40000000
.set OAM_SIZE_2, 0x80000000
.set OAM_SIZE_3, 0xc0000000
.set OAM_SIZE_8x8, OAM_SIZE_0 | OAM_SQUARE
.set OAM_SIZE_16x16, OAM_SIZE_1 | OAM_SQUARE
.set OAM_SIZE_32x32, OAM_SIZE_2 | OAM_SQUARE
.set OAM_SIZE_64x64, OAM_SIZE_3 | OAM_SQUARE
.set OAM_SIZE_16x8, OAM_SIZE_0 | OAM_H_RECTANGLE
.set OAM_SIZE_32x8, OAM_SIZE_1 | OAM_H_RECTANGLE
.set OAM_SIZE_32x16, OAM_SIZE_2 | OAM_H_RECTANGLE
.set OAM_SIZE_64x32, OAM_SIZE_3 | OAM_H_RECTANGLE
.set OAM_SIZE_8x16, OAM_SIZE_0 | OAM_V_RECTANGLE
.set OAM_SIZE_8x32, OAM_SIZE_1 | OAM_V_RECTANGLE
.set OAM_SIZE_16x32, OAM_SIZE_2 | OAM_V_RECTANGLE
.set OAM_SIZE_32x64, OAM_SIZE_3 | OAM_V_RECTANGLE
@ SIO constants
.set SIO_ENABLE, 0x80
.set SIO_ERROR, 0x40
+19
View File
@@ -0,0 +1,19 @@
.set TRUE, 1
.set FALSE, 0
.set NULL, 0
.set SPRITE_SIZE_8x8, (OAM_SIZE_0 >> 28) | (OAM_SQUARE >> 14)
.set SPRITE_SIZE_16x16, (OAM_SIZE_1 >> 28) | (OAM_SQUARE >> 14)
.set SPRITE_SIZE_32x32, (OAM_SIZE_2 >> 28) | (OAM_SQUARE >> 14)
.set SPRITE_SIZE_64x64, (OAM_SIZE_3 >> 28) | (OAM_SQUARE >> 14)
.set SPRITE_SIZE_16x8, (OAM_SIZE_0 >> 28) | (OAM_H_RECTANGLE >> 14)
.set SPRITE_SIZE_32x8, (OAM_SIZE_1 >> 28) | (OAM_H_RECTANGLE >> 14)
.set SPRITE_SIZE_32x16, (OAM_SIZE_2 >> 28) | (OAM_H_RECTANGLE >> 14)
.set SPRITE_SIZE_64x32, (OAM_SIZE_3 >> 28) | (OAM_H_RECTANGLE >> 14)
.set SPRITE_SIZE_8x16, (OAM_SIZE_0 >> 28) | (OAM_V_RECTANGLE >> 14)
.set SPRITE_SIZE_8x32, (OAM_SIZE_1 >> 28) | (OAM_V_RECTANGLE >> 14)
.set SPRITE_SIZE_16x32, (OAM_SIZE_2 >> 28) | (OAM_V_RECTANGLE >> 14)
.set SPRITE_SIZE_32x64, (OAM_SIZE_3 >> 28) | (OAM_V_RECTANGLE >> 14)
+66
View File
@@ -0,0 +1,66 @@
@ Optimize the following settings based on the software specifications
MULTI_SIO_BLOCK_SIZE = 20 @ Communication Data Block Size (Max. 24 Bytes)
MULTI_SIO_PLAYERS_MAX = 4 @ Maximum Number of Players
MULTI_SIO_SYNC_DATA = 0xfefe @ Synchronized Data (0x0000/0xfffa~0xffff prohibited)
@ Comment out if no space in CPU internal Work RAM
MULTI_SIO_DI_FUNC_FAST = 1 @ SIO Interrupt Prohibit Function High Speed Flag (CPU Internal RAM Execution)
MULTI_SIO_TIMER_NO = 3 @ Timer No.
MULTI_SIO_TIMER_INTR_FLAG = (INTR_FLAG_TIMER0 << MULTI_SIO_TIMER_NO)
@ Timer Interrupt Flag
REG_MULTI_SIO_TIMER = (REG_TM0CNT + MULTI_SIO_TIMER_NO * 4)
REG_MULTI_SIO_TIMER_L = REG_MULTI_SIO_TIMER
REG_MULTI_SIO_TIMER_H = (REG_MULTI_SIO_TIMER + 2)
@ Timer Register
@ Multi-play Communication Packet Structure Offset
OFS_MSP_FRAME_COUNTER = 0 @ Frame Counter
OFS_MSP_RECV_ERROR_FLAGS = 1 @ Receive Error Flag
OFS_MSP_CHECK_SUM = 2 @ Checksum
OFS_MSP_DATA = 4 @ Communication Data
OFS_MSP_OVERRUN_CATCH = (OFS_MSP_DATA + MULTI_SIO_BLOCK_SIZE)
@ Overrun Protect Area
MULTI_SIO_PACKET_SIZE = (OFS_MSP_OVERRUN_CATCH + 4)
@ Structure Size
@ Multi-play Communication Work Area Structure Offset
OFS_MS_TYPE = 0 @ Connection (Master/Slave)
OFS_MS_STATE = 1 @ Communication Function State
OFS_MS_CONNECTED_FLAG = 2 @ Connection History Flag
OFS_MS_RECV_SUCCESS_FLAGS = 3 @ Receive Success Flag
OFS_MS_SYNC_RECV_FLAG = 4 @ Synchronized Data Receive Confirmation Flag
OFS_MS_SYNC_RECV_ADJUST_COUNTER = 8 @ Synchronization Adjustment Counter
OFS_MS_SEND_BUF_COUNTER_INIT = 10 @ Send Buffer Counter Initialization
OFS_MS_SYNC_SEND_FRAME_COUNTER = 11 @ Send Frame Counter
OFS_MS_SYNC_RECV_FRAME_COUNTER = 12 @ Receive Frame Counter
OFS_MS_SEND_BUF_COUNTER = 20 @ Send Buffer Counter
OFS_MS_RECV_BUF_COUNTER = 24 @ Receive Buffer Counter
OFS_MS_NEXT_SEND_BUF_P = 40 @ Send Buffer Pointer
OFS_MS_CURRENT_SEND_BUF_P = 44
OFS_MS_CURRENT_RECV_BUF_P = 48 @ Receive Buffer Pointer
OFS_MS_LAST_RECV_BUF_P = 64
OFS_MS_RECV_CHECK_BUF_P = 80
OFS_MS_SEND_BUF = 96 @ Send Buffer (Double Buffer)
OFS_MS_RECV_BUF = (OFS_MS_SEND_BUF + MULTI_SIO_PACKET_SIZE * 2)
@ Receive Buffer (Triple Buffer)
MULTI_SIO_AREA_SIZE = (OFS_MS_RECV_BUF + MULTI_SIO_PACKET_SIZE * 3 * MULTI_SIO_PLAYERS_MAX)
@ Structure Size
OFS_MS_HARD_ERROR = 9
-471
View File
@@ -1,471 +0,0 @@
@-------------------------------------------------------------------------------
@ Program Status Register
@-------------------------------------------------------------------------------
PSR_USR_MODE = 0x00000010
PSR_FIQ_MODE = 0x00000011
PSR_IRQ_MODE = 0x00000012
PSR_SVC_MODE = 0x00000013
PSR_ABT_MODE = 0x00000017
PSR_UND_MODE = 0x0000001B
PSR_SYS_MODE = 0x0000001F
PSR_MODE_MASK = 0x0000001F
PSR_THUMB_BIT = 0x00000020
PSR_FIQ_DISABLE_BIT = 0x00000040
PSR_IRQ_DISABLE_BIT = 0x00000080
@-------------------------------------------------------------------------------
@ Memory
@-------------------------------------------------------------------------------
EWRAM_START = 0x02000000
EWRAM_END = EWRAM_START + 0x40000
IWRAM_START = 0x03000000
IWRAM_END = IWRAM_START + 0x8000
REG_BASE = 0x04000000
PLTT = 0x05000000
BG_PLTT = PLTT
OBJ_PLTT = PLTT + 0x200
VRAM = 0x06000000
BG_VRAM = VRAM
OBJ_VRAM0 = VRAM + 0x10000 @ text-mode BG
OBJ_VRAM1 = VRAM + 0x14000 @ bitmap-mode BG
OAM = 0x07000000
SOUND_INFO_PTR = 0x3007FF0
INTR_CHECK = 0x3007FF8
INTR_VECTOR = 0x3007FFC
ROM = 0x08000000
@-------------------------------------------------------------------------------
@ I/O Register Offsets
@-------------------------------------------------------------------------------
REG_OFFSET_DISPCNT = 0x0
REG_OFFSET_DISPSTAT = 0x4
REG_OFFSET_VCOUNT = 0x6
REG_OFFSET_BG0CNT = 0x8
REG_OFFSET_BG1CNT = 0xa
REG_OFFSET_BG2CNT = 0xc
REG_OFFSET_BG3CNT = 0xe
REG_OFFSET_BG0HOFS = 0x10
REG_OFFSET_BG0VOFS = 0x12
REG_OFFSET_BG1HOFS = 0x14
REG_OFFSET_BG1VOFS = 0x16
REG_OFFSET_BG2HOFS = 0x18
REG_OFFSET_BG2VOFS = 0x1a
REG_OFFSET_BG3HOFS = 0x1c
REG_OFFSET_BG3VOFS = 0x1e
REG_OFFSET_BG2PA = 0x20
REG_OFFSET_BG2PB = 0x22
REG_OFFSET_BG2PC = 0x24
REG_OFFSET_BG2PD = 0x26
REG_OFFSET_BG2X_L = 0x28
REG_OFFSET_BG2X_H = 0x2a
REG_OFFSET_BG2Y_L = 0x2c
REG_OFFSET_BG2Y_H = 0x2e
REG_OFFSET_BG3PA = 0x30
REG_OFFSET_BG3PB = 0x32
REG_OFFSET_BG3PC = 0x34
REG_OFFSET_BG3PD = 0x36
REG_OFFSET_BG3X_L = 0x38
REG_OFFSET_BG3X_H = 0x3a
REG_OFFSET_BG3Y_L = 0x3c
REG_OFFSET_BG3Y_H = 0x3e
REG_OFFSET_WIN0H = 0x40
REG_OFFSET_WIN1H = 0x42
REG_OFFSET_WIN0V = 0x44
REG_OFFSET_WIN1V = 0x46
REG_OFFSET_WININ = 0x48
REG_OFFSET_WINOUT = 0x4a
REG_OFFSET_MOSAIC = 0x4c
REG_OFFSET_BLDCNT = 0x50
REG_OFFSET_BLDALPHA = 0x52
REG_OFFSET_BLDY = 0x54
REG_OFFSET_SOUND1CNT = 0x60
REG_OFFSET_SOUND1CNT_L = 0x60
REG_OFFSET_NR10 = 0x60
REG_OFFSET_SOUND1CNT_H = 0x62
REG_OFFSET_NR11 = 0x62
REG_OFFSET_NR12 = 0x63
REG_OFFSET_SOUND1CNT_X = 0x64
REG_OFFSET_NR13 = 0x64
REG_OFFSET_NR14 = 0x65
REG_OFFSET_SOUND2CNT = 0x68
REG_OFFSET_SOUND2CNT_L = 0x68
REG_OFFSET_NR21 = 0x68
REG_OFFSET_NR22 = 0x69
REG_OFFSET_SOUND2CNT_H = 0x6c
REG_OFFSET_NR23 = 0x6c
REG_OFFSET_NR24 = 0x6d
REG_OFFSET_SOUND3CNT = 0x70
REG_OFFSET_SOUND3CNT_L = 0x70
REG_OFFSET_NR30 = 0x70
REG_OFFSET_SOUND3CNT_H = 0x72
REG_OFFSET_NR31 = 0x72
REG_OFFSET_NR32 = 0x73
REG_OFFSET_SOUND3CNT_X = 0x74
REG_OFFSET_NR33 = 0x74
REG_OFFSET_NR34 = 0x75
REG_OFFSET_SOUND4CNT = 0x78
REG_OFFSET_SOUND4CNT_L = 0x78
REG_OFFSET_NR41 = 0x78
REG_OFFSET_NR42 = 0x79
REG_OFFSET_SOUND4CNT_H = 0x7c
REG_OFFSET_NR43 = 0x7c
REG_OFFSET_NR44 = 0x7d
REG_OFFSET_SOUNDCNT = 0x80
REG_OFFSET_SOUNDCNT_L = 0x80
REG_OFFSET_NR50 = 0x80
REG_OFFSET_NR51 = 0x81
REG_OFFSET_SOUNDCNT_H = 0x82
REG_OFFSET_SOUNDCNT_X = 0x84
REG_OFFSET_NR52 = 0x84
REG_OFFSET_SOUNDBIAS = 0x88
REG_OFFSET_WAVE_RAM = 0x90
REG_OFFSET_WAVE_RAM0 = 0x90
REG_OFFSET_WAVE_RAM0_L = 0x90
REG_OFFSET_WAVE_RAM0_H = 0x92
REG_OFFSET_WAVE_RAM1 = 0x94
REG_OFFSET_WAVE_RAM1_L = 0x94
REG_OFFSET_WAVE_RAM1_H = 0x96
REG_OFFSET_WAVE_RAM2 = 0x98
REG_OFFSET_WAVE_RAM2_L = 0x98
REG_OFFSET_WAVE_RAM2_H = 0x9a
REG_OFFSET_WAVE_RAM3 = 0x9c
REG_OFFSET_WAVE_RAM3_L = 0x9c
REG_OFFSET_WAVE_RAM3_H = 0x9e
REG_OFFSET_FIFO = 0xa0
REG_OFFSET_FIFO_A = 0xa0
REG_OFFSET_FIFO_A_L = 0xa0
REG_OFFSET_FIFO_A_H = 0xa2
REG_OFFSET_FIFO_B = 0xa4
REG_OFFSET_FIFO_B_L = 0xa4
REG_OFFSET_FIFO_B_H = 0xa6
REG_OFFSET_DMA0 = 0xb0
REG_OFFSET_DMA0SAD = 0xb0
REG_OFFSET_DMA0SAD_L = 0xb0
REG_OFFSET_DMA0SAD_H = 0xb2
REG_OFFSET_DMA0DAD = 0xb4
REG_OFFSET_DMA0DAD_L = 0xb4
REG_OFFSET_DMA0DAD_H = 0xb6
REG_OFFSET_DMA0CNT = 0xb8
REG_OFFSET_DMA0CNT_L = 0xb8
REG_OFFSET_DMA0CNT_H = 0xba
REG_OFFSET_DMA1 = 0xbc
REG_OFFSET_DMA1SAD = 0xbc
REG_OFFSET_DMA1SAD_L = 0xbc
REG_OFFSET_DMA1SAD_H = 0xbe
REG_OFFSET_DMA1DAD = 0xc0
REG_OFFSET_DMA1DAD_L = 0xc0
REG_OFFSET_DMA1DAD_H = 0xc2
REG_OFFSET_DMA1CNT = 0xc4
REG_OFFSET_DMA1CNT_L = 0xc4
REG_OFFSET_DMA1CNT_H = 0xc6
REG_OFFSET_DMA2 = 0xc8
REG_OFFSET_DMA2SAD = 0xc8
REG_OFFSET_DMA2SAD_L = 0xc8
REG_OFFSET_DMA2SAD_H = 0xca
REG_OFFSET_DMA2DAD = 0xcc
REG_OFFSET_DMA2DAD_L = 0xcc
REG_OFFSET_DMA2DAD_H = 0xce
REG_OFFSET_DMA2CNT = 0xd0
REG_OFFSET_DMA2CNT_L = 0xd0
REG_OFFSET_DMA2CNT_H = 0xd2
REG_OFFSET_DMA3 = 0xd4
REG_OFFSET_DMA3SAD = 0xd4
REG_OFFSET_DMA3SAD_L = 0xd4
REG_OFFSET_DMA3SAD_H = 0xd6
REG_OFFSET_DMA3DAD = 0xd8
REG_OFFSET_DMA3DAD_L = 0xd8
REG_OFFSET_DMA3DAD_H = 0xda
REG_OFFSET_DMA3CNT = 0xdc
REG_OFFSET_DMA3CNT_L = 0xdc
REG_OFFSET_DMA3CNT_H = 0xde
REG_OFFSET_TM0CNT = 0x100
REG_OFFSET_TM0CNT_L = 0x100
REG_OFFSET_TM0CNT_H = 0x102
REG_OFFSET_TM1CNT = 0x104
REG_OFFSET_TM1CNT_L = 0x104
REG_OFFSET_TM1CNT_H = 0x106
REG_OFFSET_TM2CNT = 0x108
REG_OFFSET_TM2CNT_L = 0x108
REG_OFFSET_TM2CNT_H = 0x10a
REG_OFFSET_TM3CNT = 0x10c
REG_OFFSET_TM3CNT_L = 0x10c
REG_OFFSET_TM3CNT_H = 0x10e
REG_OFFSET_SIOCNT = 0x128
REG_OFFSET_SIODATA8 = 0x12a
REG_OFFSET_SIODATA32 = 0x120
REG_OFFSET_SIOMLT_SEND = 0x12a
REG_OFFSET_SIOMLT_RECV = 0x120
REG_OFFSET_SIOMULTI0 = 0x120
REG_OFFSET_SIOMULTI1 = 0x122
REG_OFFSET_SIOMULTI2 = 0x124
REG_OFFSET_SIOMULTI3 = 0x126
REG_OFFSET_KEYINPUT = 0x130
REG_OFFSET_KEYCNT = 0x132
REG_OFFSET_RCNT = 0x134
REG_OFFSET_JOYCNT = 0x140
REG_OFFSET_JOYSTAT = 0x158
REG_OFFSET_JOY_RECV = 0x150
REG_OFFSET_JOY_RECV_L = 0x150
REG_OFFSET_JOY_RECV_H = 0x152
REG_OFFSET_JOY_TRANS = 0x154
REG_OFFSET_JOY_TRANS_L = 0x154
REG_OFFSET_JOY_TRANS_H = 0x156
REG_OFFSET_IME = 0x208
REG_OFFSET_IE = 0x200
REG_OFFSET_IF = 0x202
REG_OFFSET_WAITCNT = 0x204
@-------------------------------------------------------------------------------
@ I/O Register Addresses
@-------------------------------------------------------------------------------
REG_DISPCNT = (REG_BASE + REG_OFFSET_DISPCNT)
REG_DISPSTAT = (REG_BASE + REG_OFFSET_DISPSTAT)
REG_VCOUNT = (REG_BASE + REG_OFFSET_VCOUNT)
REG_BG0CNT = (REG_BASE + REG_OFFSET_BG0CNT)
REG_BG1CNT = (REG_BASE + REG_OFFSET_BG1CNT)
REG_BG2CNT = (REG_BASE + REG_OFFSET_BG2CNT)
REG_BG3CNT = (REG_BASE + REG_OFFSET_BG3CNT)
REG_BG0HOFS = (REG_BASE + REG_OFFSET_BG0HOFS)
REG_BG0VOFS = (REG_BASE + REG_OFFSET_BG0VOFS)
REG_BG1HOFS = (REG_BASE + REG_OFFSET_BG1HOFS)
REG_BG1VOFS = (REG_BASE + REG_OFFSET_BG1VOFS)
REG_BG2HOFS = (REG_BASE + REG_OFFSET_BG2HOFS)
REG_BG2VOFS = (REG_BASE + REG_OFFSET_BG2VOFS)
REG_BG3HOFS = (REG_BASE + REG_OFFSET_BG3HOFS)
REG_BG3VOFS = (REG_BASE + REG_OFFSET_BG3VOFS)
REG_BG2PA = (REG_BASE + REG_OFFSET_BG2PA)
REG_BG2PB = (REG_BASE + REG_OFFSET_BG2PB)
REG_BG2PC = (REG_BASE + REG_OFFSET_BG2PC)
REG_BG2PD = (REG_BASE + REG_OFFSET_BG2PD)
REG_BG2X_L = (REG_BASE + REG_OFFSET_BG2X_L)
REG_BG2X_H = (REG_BASE + REG_OFFSET_BG2X_H)
REG_BG2Y_L = (REG_BASE + REG_OFFSET_BG2Y_L)
REG_BG2Y_H = (REG_BASE + REG_OFFSET_BG2Y_H)
REG_BG3PA = (REG_BASE + REG_OFFSET_BG3PA)
REG_BG3PB = (REG_BASE + REG_OFFSET_BG3PB)
REG_BG3PC = (REG_BASE + REG_OFFSET_BG3PC)
REG_BG3PD = (REG_BASE + REG_OFFSET_BG3PD)
REG_BG3X_L = (REG_BASE + REG_OFFSET_BG3X_L)
REG_BG3X_H = (REG_BASE + REG_OFFSET_BG3X_H)
REG_BG3Y_L = (REG_BASE + REG_OFFSET_BG3Y_L)
REG_BG3Y_H = (REG_BASE + REG_OFFSET_BG3Y_H)
REG_WIN0H = (REG_BASE + REG_OFFSET_WIN0H)
REG_WIN1H = (REG_BASE + REG_OFFSET_WIN1H)
REG_WIN0V = (REG_BASE + REG_OFFSET_WIN0V)
REG_WIN1V = (REG_BASE + REG_OFFSET_WIN1V)
REG_WININ = (REG_BASE + REG_OFFSET_WININ)
REG_WINOUT = (REG_BASE + REG_OFFSET_WINOUT)
REG_MOSAIC = (REG_BASE + REG_OFFSET_MOSAIC)
REG_BLDCNT = (REG_BASE + REG_OFFSET_BLDCNT)
REG_BLDALPHA = (REG_BASE + REG_OFFSET_BLDALPHA)
REG_BLDY = (REG_BASE + REG_OFFSET_BLDY)
REG_SOUND1CNT = (REG_BASE + REG_OFFSET_SOUND1CNT)
REG_SOUND1CNT_L = (REG_BASE + REG_OFFSET_SOUND1CNT_L)
REG_NR10 = (REG_BASE + REG_OFFSET_NR10)
REG_SOUND1CNT_H = (REG_BASE + REG_OFFSET_SOUND1CNT_H)
REG_NR11 = (REG_BASE + REG_OFFSET_NR11)
REG_NR12 = (REG_BASE + REG_OFFSET_NR12)
REG_SOUND1CNT_X = (REG_BASE + REG_OFFSET_SOUND1CNT_X)
REG_NR13 = (REG_BASE + REG_OFFSET_NR13)
REG_NR14 = (REG_BASE + REG_OFFSET_NR14)
REG_SOUND2CNT = (REG_BASE + REG_OFFSET_SOUND2CNT)
REG_SOUND2CNT_L = (REG_BASE + REG_OFFSET_SOUND2CNT_L)
REG_NR21 = (REG_BASE + REG_OFFSET_NR21)
REG_NR22 = (REG_BASE + REG_OFFSET_NR22)
REG_SOUND2CNT_H = (REG_BASE + REG_OFFSET_SOUND2CNT_H)
REG_NR23 = (REG_BASE + REG_OFFSET_NR23)
REG_NR24 = (REG_BASE + REG_OFFSET_NR24)
REG_SOUND3CNT = (REG_BASE + REG_OFFSET_SOUND3CNT)
REG_SOUND3CNT_L = (REG_BASE + REG_OFFSET_SOUND3CNT_L)
REG_NR30 = (REG_BASE + REG_OFFSET_NR30)
REG_SOUND3CNT_H = (REG_BASE + REG_OFFSET_SOUND3CNT_H)
REG_NR31 = (REG_BASE + REG_OFFSET_NR31)
REG_NR32 = (REG_BASE + REG_OFFSET_NR32)
REG_SOUND3CNT_X = (REG_BASE + REG_OFFSET_SOUND3CNT_X)
REG_NR33 = (REG_BASE + REG_OFFSET_NR33)
REG_NR34 = (REG_BASE + REG_OFFSET_NR34)
REG_SOUND4CNT = (REG_BASE + REG_OFFSET_SOUND4CNT)
REG_SOUND4CNT_L = (REG_BASE + REG_OFFSET_SOUND4CNT_L)
REG_NR41 = (REG_BASE + REG_OFFSET_NR41)
REG_NR42 = (REG_BASE + REG_OFFSET_NR42)
REG_SOUND4CNT_H = (REG_BASE + REG_OFFSET_SOUND4CNT_H)
REG_NR43 = (REG_BASE + REG_OFFSET_NR43)
REG_NR44 = (REG_BASE + REG_OFFSET_NR44)
REG_SOUNDCNT = (REG_BASE + REG_OFFSET_SOUNDCNT)
REG_SOUNDCNT_L = (REG_BASE + REG_OFFSET_SOUNDCNT_L)
REG_NR50 = (REG_BASE + REG_OFFSET_NR50)
REG_NR51 = (REG_BASE + REG_OFFSET_NR51)
REG_SOUNDCNT_H = (REG_BASE + REG_OFFSET_SOUNDCNT_H)
REG_SOUNDCNT_X = (REG_BASE + REG_OFFSET_SOUNDCNT_X)
REG_NR52 = (REG_BASE + REG_OFFSET_NR52)
REG_SOUNDBIAS = (REG_BASE + REG_OFFSET_SOUNDBIAS)
REG_WAVE_RAM = (REG_BASE + REG_OFFSET_WAVE_RAM)
REG_WAVE_RAM0 = (REG_BASE + REG_OFFSET_WAVE_RAM0)
REG_WAVE_RAM0_L = (REG_BASE + REG_OFFSET_WAVE_RAM0_L)
REG_WAVE_RAM0_H = (REG_BASE + REG_OFFSET_WAVE_RAM0_H)
REG_WAVE_RAM1 = (REG_BASE + REG_OFFSET_WAVE_RAM1)
REG_WAVE_RAM1_L = (REG_BASE + REG_OFFSET_WAVE_RAM1_L)
REG_WAVE_RAM1_H = (REG_BASE + REG_OFFSET_WAVE_RAM1_H)
REG_WAVE_RAM2 = (REG_BASE + REG_OFFSET_WAVE_RAM2)
REG_WAVE_RAM2_L = (REG_BASE + REG_OFFSET_WAVE_RAM2_L)
REG_WAVE_RAM2_H = (REG_BASE + REG_OFFSET_WAVE_RAM2_H)
REG_WAVE_RAM3 = (REG_BASE + REG_OFFSET_WAVE_RAM3)
REG_WAVE_RAM3_L = (REG_BASE + REG_OFFSET_WAVE_RAM3_L)
REG_WAVE_RAM3_H = (REG_BASE + REG_OFFSET_WAVE_RAM3_H)
REG_FIFO = (REG_BASE + REG_OFFSET_FIFO)
REG_FIFO_A = (REG_BASE + REG_OFFSET_FIFO_A)
REG_FIFO_A_L = (REG_BASE + REG_OFFSET_FIFO_A_L)
REG_FIFO_A_H = (REG_BASE + REG_OFFSET_FIFO_A_H)
REG_FIFO_B = (REG_BASE + REG_OFFSET_FIFO_B)
REG_FIFO_B_L = (REG_BASE + REG_OFFSET_FIFO_B_L)
REG_FIFO_B_H = (REG_BASE + REG_OFFSET_FIFO_B_H)
REG_DMA0 = (REG_BASE + REG_OFFSET_DMA0)
REG_DMA0SAD = (REG_BASE + REG_OFFSET_DMA0SAD)
REG_DMA0SAD_L = (REG_BASE + REG_OFFSET_DMA0SAD_L)
REG_DMA0SAD_H = (REG_BASE + REG_OFFSET_DMA0SAD_H)
REG_DMA0DAD = (REG_BASE + REG_OFFSET_DMA0DAD)
REG_DMA0DAD_L = (REG_BASE + REG_OFFSET_DMA0DAD_L)
REG_DMA0DAD_H = (REG_BASE + REG_OFFSET_DMA0DAD_H)
REG_DMA0CNT = (REG_BASE + REG_OFFSET_DMA0CNT)
REG_DMA0CNT_L = (REG_BASE + REG_OFFSET_DMA0CNT_L)
REG_DMA0CNT_H = (REG_BASE + REG_OFFSET_DMA0CNT_H)
REG_DMA1 = (REG_BASE + REG_OFFSET_DMA1)
REG_DMA1SAD = (REG_BASE + REG_OFFSET_DMA1SAD)
REG_DMA1SAD_L = (REG_BASE + REG_OFFSET_DMA1SAD_L)
REG_DMA1SAD_H = (REG_BASE + REG_OFFSET_DMA1SAD_H)
REG_DMA1DAD = (REG_BASE + REG_OFFSET_DMA1DAD)
REG_DMA1DAD_L = (REG_BASE + REG_OFFSET_DMA1DAD_L)
REG_DMA1DAD_H = (REG_BASE + REG_OFFSET_DMA1DAD_H)
REG_DMA1CNT = (REG_BASE + REG_OFFSET_DMA1CNT)
REG_DMA1CNT_L = (REG_BASE + REG_OFFSET_DMA1CNT_L)
REG_DMA1CNT_H = (REG_BASE + REG_OFFSET_DMA1CNT_H)
REG_DMA2 = (REG_BASE + REG_OFFSET_DMA2)
REG_DMA2SAD = (REG_BASE + REG_OFFSET_DMA2SAD)
REG_DMA2SAD_L = (REG_BASE + REG_OFFSET_DMA2SAD_L)
REG_DMA2SAD_H = (REG_BASE + REG_OFFSET_DMA2SAD_H)
REG_DMA2DAD = (REG_BASE + REG_OFFSET_DMA2DAD)
REG_DMA2DAD_L = (REG_BASE + REG_OFFSET_DMA2DAD_L)
REG_DMA2DAD_H = (REG_BASE + REG_OFFSET_DMA2DAD_H)
REG_DMA2CNT = (REG_BASE + REG_OFFSET_DMA2CNT)
REG_DMA2CNT_L = (REG_BASE + REG_OFFSET_DMA2CNT_L)
REG_DMA2CNT_H = (REG_BASE + REG_OFFSET_DMA2CNT_H)
REG_DMA3 = (REG_BASE + REG_OFFSET_DMA3)
REG_DMA3SAD = (REG_BASE + REG_OFFSET_DMA3SAD)
REG_DMA3SAD_L = (REG_BASE + REG_OFFSET_DMA3SAD_L)
REG_DMA3SAD_H = (REG_BASE + REG_OFFSET_DMA3SAD_H)
REG_DMA3DAD = (REG_BASE + REG_OFFSET_DMA3DAD)
REG_DMA3DAD_L = (REG_BASE + REG_OFFSET_DMA3DAD_L)
REG_DMA3DAD_H = (REG_BASE + REG_OFFSET_DMA3DAD_H)
REG_DMA3CNT = (REG_BASE + REG_OFFSET_DMA3CNT)
REG_DMA3CNT_L = (REG_BASE + REG_OFFSET_DMA3CNT_L)
REG_DMA3CNT_H = (REG_BASE + REG_OFFSET_DMA3CNT_H)
REG_TM0CNT = (REG_BASE + REG_OFFSET_TM0CNT)
REG_TM0CNT_L = (REG_BASE + REG_OFFSET_TM0CNT_L)
REG_TM0CNT_H = (REG_BASE + REG_OFFSET_TM0CNT_H)
REG_TM1CNT = (REG_BASE + REG_OFFSET_TM1CNT)
REG_TM1CNT_L = (REG_BASE + REG_OFFSET_TM1CNT_L)
REG_TM1CNT_H = (REG_BASE + REG_OFFSET_TM1CNT_H)
REG_TM2CNT = (REG_BASE + REG_OFFSET_TM2CNT)
REG_TM2CNT_L = (REG_BASE + REG_OFFSET_TM2CNT_L)
REG_TM2CNT_H = (REG_BASE + REG_OFFSET_TM2CNT_H)
REG_TM3CNT = (REG_BASE + REG_OFFSET_TM3CNT)
REG_TM3CNT_L = (REG_BASE + REG_OFFSET_TM3CNT_L)
REG_TM3CNT_H = (REG_BASE + REG_OFFSET_TM3CNT_H)
REG_SIOCNT = (REG_BASE + REG_OFFSET_SIOCNT)
REG_SIODATA8 = (REG_BASE + REG_OFFSET_SIODATA8)
REG_SIODATA32 = (REG_BASE + REG_OFFSET_SIODATA32)
REG_SIOMLT_SEND = (REG_BASE + REG_OFFSET_SIOMLT_SEND)
REG_SIOMLT_RECV = (REG_BASE + REG_OFFSET_SIOMLT_RECV)
REG_SIOMULTI0 = (REG_BASE + REG_OFFSET_SIOMULTI0)
REG_SIOMULTI1 = (REG_BASE + REG_OFFSET_SIOMULTI1)
REG_SIOMULTI2 = (REG_BASE + REG_OFFSET_SIOMULTI2)
REG_SIOMULTI3 = (REG_BASE + REG_OFFSET_SIOMULTI3)
REG_KEYINPUT = (REG_BASE + REG_OFFSET_KEYINPUT)
REG_KEYCNT = (REG_BASE + REG_OFFSET_KEYCNT)
REG_RCNT = (REG_BASE + REG_OFFSET_RCNT)
REG_JOYCNT = (REG_BASE + REG_OFFSET_JOYCNT)
REG_JOYSTAT = (REG_BASE + REG_OFFSET_JOYSTAT)
REG_JOY_RECV = (REG_BASE + REG_OFFSET_JOY_RECV)
REG_JOY_RECV_L = (REG_BASE + REG_OFFSET_JOY_RECV_L)
REG_JOY_RECV_H = (REG_BASE + REG_OFFSET_JOY_RECV_H)
REG_JOY_TRANS = (REG_BASE + REG_OFFSET_JOY_TRANS)
REG_JOY_TRANS_L = (REG_BASE + REG_OFFSET_JOY_TRANS_L)
REG_JOY_TRANS_H = (REG_BASE + REG_OFFSET_JOY_TRANS_H)
REG_IME = (REG_BASE + REG_OFFSET_IME)
REG_IE = (REG_BASE + REG_OFFSET_IE)
REG_IF = (REG_BASE + REG_OFFSET_IF)
REG_WAITCNT = (REG_BASE + REG_OFFSET_WAITCNT)
@-------------------------------------------------------------------------------
@ I/O Register Flags
@-------------------------------------------------------------------------------
@ DMA
DMA_DEST_INC = 0x0000
DMA_DEST_DEC = 0x0020
DMA_DEST_FIXED = 0x0040
DMA_DEST_RELOAD = 0x0060
DMA_SRC_INC = 0x0000
DMA_SRC_DEC = 0x0080
DMA_SRC_FIXED = 0x0100
DMA_REPEAT = 0x0200
DMA_16BIT = 0x0000
DMA_32BIT = 0x0400
DMA_DREQ_ON = 0x0800
DMA_START_NOW = 0x0000
DMA_START_VBLANK = 0x1000
DMA_START_HBLANK = 0x2000
DMA_START_SPECIAL = 0x3000
DMA_START_MASK = 0x3000
DMA_INTR_ENABLE = 0x4000
DMA_ENABLE = 0x8000
@ Interrupt Flags
INTR_FLAG_VBLANK = (1 << 0)
INTR_FLAG_HBLANK = (1 << 1)
INTR_FLAG_VCOUNT = (1 << 2)
INTR_FLAG_TIMER0 = (1 << 3)
INTR_FLAG_TIMER1 = (1 << 4)
INTR_FLAG_TIMER2 = (1 << 5)
INTR_FLAG_TIMER3 = (1 << 6)
INTR_FLAG_SERIAL = (1 << 7)
INTR_FLAG_DMA0 = (1 << 8)
INTR_FLAG_DMA1 = (1 << 9)
INTR_FLAG_DMA2 = (1 << 10)
INTR_FLAG_DMA3 = (1 << 11)
INTR_FLAG_KEYPAD = (1 << 12)
INTR_FLAG_GAMEPAK = (1 << 13)
VCOUNT_VBLANK = 160
TOTAL_SCANLINES = 228
+133 -87
View File
@@ -28,83 +28,18 @@ typedef u8 bool8;
typedef u16 bool16;
typedef u32 bool32;
struct DispCnt
{
u16 mode:3;
u16 cgbMode:1; // reserved, do not use
u16 bmpFrameNum:1;
u16 hblankIntervalFree:1;
u16 obj1dMap:1;
u16 forcedBlank:1;
u16 bg0_on:1;
u16 bg1_on:1;
u16 bg2_on:1;
u16 bg3_on:1;
u16 obj_on:1;
u16 win0_on:1;
u16 win1_on:1;
u16 objWin_on:1;
};
struct DispStat
{
u16 vblankFlag:1;
u16 hblankFlag:1;
u16 vcountFlag:1;
u16 vblankIrqEnable:1;
u16 hblankIrqEnable:1;
u16 vcountIrqEnable:1;
u16 dummy:2;
u8 vcountCompare;
};
struct BgCnt
{
u16 priority:2;
u16 charBaseBlock:2;
u16 dummy:2;
u16 mosaic:1;
u16 colorMode:1;
u16 palettes:1;
u16 screenBaseBlock:5;
u16 areaOverflowMode:1;
u16 screenSize:2;
};
struct WinCnt
{
u8 win0_bg0_on:1;
u8 win0_bg1_on:1;
u8 win0_bg2_on:1;
u8 win0_bg3_on:1;
u8 win0_obj_on:1;
u8 win0_blend_on:1;
u8 dummy1:2;
u8 win1_bg0_on:1;
u8 win1_bg1_on:1;
u8 win1_bg2_on:1;
u8 win1_bg3_on:1;
u8 win1_obj_on:1;
u8 win1_blend_on:1;
u8 dummy2:2;
};
struct BlendCnt
{
u16 target1_bg0_on:1;
u16 target1_bg1_on:1;
u16 target1_bg2_on:1;
u16 target1_bg3_on:1;
u16 target1_obj_on:1;
u16 target1_bd_on:1;
u16 effect:2;
u16 target2_bg0_on:1;
u16 target2_bg1_on:1;
u16 target2_bg2_on:1;
u16 target2_bg3_on:1;
u16 target2_obj_on:1;
u16 target2_bd_on:1;
};
typedef volatile struct BgCnt vBgCnt;
struct PlttData
{
@@ -112,7 +47,7 @@ struct PlttData
u16 g:5; // green
u16 b:5; // blue
u16 unused_15:1;
} /*__attribute__((packed))*/;
};
typedef union {
struct {
@@ -144,6 +79,10 @@ typedef union {
} all;
} OamData;
#define ST_OAM_HFLIP 0x08
#define ST_OAM_VFLIP 0x10
#define ST_OAM_MNUM_FLIP_MASK 0x18
#define ST_OAM_OBJ_NORMAL 0
#define ST_OAM_OBJ_BLEND 1
#define ST_OAM_OBJ_WINDOW 2
@@ -163,6 +102,29 @@ typedef union {
#define ST_OAM_H_RECTANGLE 1
#define ST_OAM_V_RECTANGLE 2
#define ST_OAM_SIZE_0 0
#define ST_OAM_SIZE_1 1
#define ST_OAM_SIZE_2 2
#define ST_OAM_SIZE_3 3
#define SPRITE_SIZE_8x8 ((ST_OAM_SIZE_0 << 2) | (ST_OAM_SQUARE))
#define SPRITE_SIZE_16x16 ((ST_OAM_SIZE_1 << 2) | (ST_OAM_SQUARE))
#define SPRITE_SIZE_32x32 ((ST_OAM_SIZE_2 << 2) | (ST_OAM_SQUARE))
#define SPRITE_SIZE_64x64 ((ST_OAM_SIZE_3 << 2) | (ST_OAM_SQUARE))
#define SPRITE_SIZE_16x8 ((ST_OAM_SIZE_0 << 2) | (ST_OAM_H_RECTANGLE))
#define SPRITE_SIZE_32x8 ((ST_OAM_SIZE_1 << 2) | (ST_OAM_H_RECTANGLE))
#define SPRITE_SIZE_32x16 ((ST_OAM_SIZE_2 << 2) | (ST_OAM_H_RECTANGLE))
#define SPRITE_SIZE_64x32 ((ST_OAM_SIZE_3 << 2) | (ST_OAM_H_RECTANGLE))
#define SPRITE_SIZE_8x16 ((ST_OAM_SIZE_0 << 2) | (ST_OAM_V_RECTANGLE))
#define SPRITE_SIZE_8x32 ((ST_OAM_SIZE_1 << 2) | (ST_OAM_V_RECTANGLE))
#define SPRITE_SIZE_16x32 ((ST_OAM_SIZE_2 << 2) | (ST_OAM_V_RECTANGLE))
#define SPRITE_SIZE_32x64 ((ST_OAM_SIZE_3 << 2) | (ST_OAM_V_RECTANGLE))
#define SPRITE_SIZE(dim) ((SPRITE_SIZE_##dim >> 2) & 0x03)
#define SPRITE_SHAPE(dim) (SPRITE_SIZE_##dim & 0x03)
struct BgAffineSrcData
{
s32 texX;
@@ -191,6 +153,31 @@ struct ObjAffineSrcData
u16 rotation;
};
// Normal SIO Control Structure
struct SioNormalCnt
{
u16 sck_I_O:1; // Clock I/O Select
u16 sck:1; // Internal Clock Select
u16 ackRecv:1; // Transfer Enable Flag Receive
u16 ackSend:1; // Transfer Enable Flag Send
u16 unused_6_4:3;
u16 enable:1; // SIO Enable
u16 unused_11_8:4;
u16 mode:2; // Communication Mode Select
u16 ifEnable:1; // Interrupt Request Enable
u16 unused_15:1;
u8 data; // Data
u8 unused_31_24;
};
#define ST_SIO_8BIT_MODE 0 // Normal 8-bit communication mode
#define ST_SIO_32BIT_MODE 1 // Normal 32-bit communication mode
#define ST_SIO_SCK_OUT 0 // Select external clock
#define ST_SIO_SCK_IN 1 // Select internal clock
#define ST_SIO_IN_SCK_256K 0 // Select internal clock 256KHz
#define ST_SIO_IN_SCK_2M 1 // Select 2MHz
// Multi-player SIO Control Structure
struct SioMultiCnt
{
@@ -202,32 +189,91 @@ struct SioMultiCnt
u16 enable:1; // SIO enable
u16 unused_11_8:4;
u16 mode:2; // communication mode (should equal 2)
u16 intrEnable:1; // IRQ enable
u16 ifEnable:1; // IRQ enable
u16 unused_15:1;
u16 data; // data
};
#define ST_SIO_MULTI_MODE 2 // Multi-player communication mode
#define ST_SIO_MULTI_MODE 2 // Multi-play communication mode
// baud rate
#define ST_SIO_9600_BPS 0 // 9600 bps
#define ST_SIO_38400_BPS 1 // 38400 bps
#define ST_SIO_57600_BPS 2 // 57600 bps
#define ST_SIO_115200_BPS 3 // 115200 bps
#define ST_SIO_9600_BPS 0 // Baud rate 9600 bps
#define ST_SIO_38400_BPS 1 // 38400 bps
#define ST_SIO_57600_BPS 2 // 57600 bps
#define ST_SIO_115200_BPS 3 // 115200 bps
#define ST_SIO_MULTI_PARENT 1 // Multi-play communication Connect master
#define ST_SIO_MULTI_CHILD 0 // Connect slave
struct WaitCnt
// UART - SIO Control Structure
struct SioUartCnt
{
u16 sramWait:2;
u16 rom0_1stAcc:2;
u16 rom0_2ndAcc:1;
u16 rom1_1stAcc:2;
u16 rom1_2ndAcc:1;
u16 rom2_1stAcc:2;
u16 rom2_2ndAcc:1;
u16 phiTerminalClock:2;
u16 dummy:1;
u16 prefetchBufEnable:1;
u16 gamePakType:1;
u16 baudRate:2; // Baud Rate
u16 ctsEnable:1; // Send Signal Enable
u16 paritySelect:1; // Parity Even/Odd
u16 transDataFull:1; // Transmit Data Full
u16 recvDataEmpty:1; // Receive Data Empty
u16 error:1; // Error Detect
u16 length:1; // Data Length
u16 fifoEnable:1; // FIFO Enable
u16 parityEnable:1; // Parity Enable
u16 transEnable:1; // Transmitter Enable
u16 recvEnable:1; // Receiver Enable
u16 mode:2; // Communication Mode Select
u16 ifEnable:1; // Interrupt Request Enable
u16 unused_15:1;
u8 data; // Data
u8 unused_31_24;
};
#define ST_SIO_UART_MODE 3 // UART communication mode
#define ST_SIO_UART_7BIT 0 // UART communication data length 7 bits
#define ST_SIO_UART_8BIT 1 // 8 bits
#define ST_SIO_PARITY_EVEN 0 // Even parity
#define ST_SIO_PARITY_ODD 1 // Odd parity
// JOY Bus Communication Control Structure
struct JoyCnt
{
u8 ifReset:1; // JOY Bus Reset Interrupt Request
u8 ifRecv:1; // JOY Bus Received Interrupt Request
u8 ifSend:1; // JOY Bus Sent Interrupt Request
u8 unused_5_3:3;
u8 ifEnable:1; // Interrupt Request Enable
u8 unused_7:1;
};
// JOY Bus Communication Status Structure
struct JoyStat
{
u8 unused_0:1;
u8 recv:1; // Receive Status
u8 unused_2:1;
u8 send:1; // Send Status
u8 flags:2; // General Flag
u8 unused_7_6:2;
};
// General Input/Output Control Structure
struct RCnt
{
u8 sc:1; // Data
u8 sd:1;
u8 si:1;
u8 so:1;
u8 sc_i_o:1; // I/O Select
u8 sd_i_o:1;
u8 si_i_o:1;
u8 so_i_o:1;
u8 ifEnable:1; // Interrupt Request Enable
u8 unused_13_9:5;
u8 sioModeMaster:2; // SIO Mode Master
};
#define ST_R_SIO_MASTER_MODE 0 // SIO master mode
#define ST_R_DIRECT_MODE 2 // General input/output communication mode
#define ST_R_JOY_MODE 3 // JOY communication mode
#define ST_R_IN 0 // Select input
#define ST_R_OUT 1 // Select output
#endif // GUARD_GBA_TYPES_H
+1 -1
View File
@@ -125,7 +125,7 @@ struct MultiSioArea
};
extern u32 gMultiSioRecvFuncBuf[0x40 / 4]; // Receive Data/Check Buffer Change Routine RAM Execution Buffer
extern u32 gMultiSioIntrFuncBuf[0x180 / 4]; // Interrupt Routine RAM Execution Buffer
extern u32 gMultiSioIntrFuncBuf[0x120 / 4]; // Interrupt Routine RAM Execution Buffer
extern struct MultiSioArea gMultiSioArea; // Multi-play Communication Work Area
+3 -1
View File
@@ -23,7 +23,9 @@ SECTIONS
ALIGN(4)
{
build/sa2/asm/crt0.o(.text);
build/sa2/asm/libraries.o(.text);
build/sa2/asm/multi_sio_asm.o(.text);
build/sa2/src/multi_sio.o(.text);
build/sa2/asm/libraries1.o(.text);
build/sa2/src/main.o(.text);
build/sa2/src/task.o(.text);
build/sa2/asm/code0.o(.text);
+42
View File
@@ -1,3 +1,45 @@
#include "global.h"
#include "multi_sio.h"
static const char sMultiSioLibVer[] = "MultiSio4Sio32Load010528";
#ifdef MULTI_SIO_DI_FUNC_FAST
// u32 gMultiSioRecvFuncBuf[0x40 / 4]; // Receive Data/Check Buffer Change Routine RAM Execution Buffer
// u32 gMultiSioIntrFuncBuf[0x180 / 4]; // Interrupt Routine RAM Execution Buffer
#endif
/*------------------------------------------------------------------*/
/* Multi-play Communication Initialization */
/*------------------------------------------------------------------*/
extern u32 MultiSioRecvBufChange(void);
void MultiSioInit(u32 connectedFlags)
{
s32 i;
REG_IME = 0;
REG_IE &= ~(INTR_FLAG_SERIAL // Disable SIO & Timer Interrupt
| MULTI_SIO_TIMER_INTR_FLAG);
REG_IME = 1;
REG_RCNT = ST_R_SIO_MASTER_MODE;
*(vu32 *)REG_ADDR_SIOCNT = SIO_MULTI_MODE;
REG_SIOCNT |= SIO_INTR_ENABLE | MULTI_SIO_BAUD_RATE_NO;
CpuFill32(0, &gMultiSioArea, sizeof(struct MultiSioArea)); // Clear Multi-play Communication Work Area
#ifdef MULTI_SIO_DI_FUNC_FAST // Copy Function
CpuCopy32(MultiSioRecvBufChange, gMultiSioRecvFuncBuf, sizeof(gMultiSioRecvFuncBuf));
CpuCopy32(MultiSioIntr, gMultiSioIntrFuncBuf, sizeof(gMultiSioIntrFuncBuf));
#endif
gMultiSioArea.connectedFlags = connectedFlags;
gMultiSioArea.sendBufCounter = 13;
gMultiSioArea.nextSendBufp = (u16 *)&gMultiSioArea.sendBuf[0]; // Set Send Buffer Pointer
gMultiSioArea.currentSendBufp = (u16 *)&gMultiSioArea.sendBuf[1];
for (i = 0; i < 4; ++i)
{ // Set Receive Buffer Pointer
gMultiSioArea.currentRecvBufp[i] = (u16 *)&gMultiSioArea.recvBuf[i][0];
gMultiSioArea.lastRecvBufp[i] = (u16 *)&gMultiSioArea.recvBuf[i][1];
gMultiSioArea.recvCheckBufp[i] = (u16 *)&gMultiSioArea.recvBuf[i][2];
}
REG_IME = 0;
REG_IE |= INTR_FLAG_SERIAL; // Enable SIO Interrupt
REG_IME = 1;
}
+2 -2
View File
@@ -405,7 +405,7 @@
. = 0x0000051C; gUnknown_0300051C = .;
. = 0x0000051E; gUnknown_0300051E = .;
. = 0x00000558; gUnknown_03000558 = .;
. = 0x00000560; gUnknown_03000560 = .;
. = 0x00000560; gMultiSioArea = .;
. = 0x00000594; gUnknown_03000594 = .;
. = 0x00000598; gUnknown_03000598 = .;
. = 0x0000059C; gUnknown_0300059C = .;
@@ -449,7 +449,7 @@
. = 0x00000711; gUnknown_03000711 = .;
. = 0x00000712; gUnknown_03000712 = .;
. = 0x00000718; gUnknown_03000718 = .;
. = 0x00000750; gUnknown_03000750 = .;
. = 0x00000750; gMultiSioRecvFuncBuf = .;
. = 0x00000758; gUnknown_03000758 = .;
. = 0x00000774; gUnknown_03000774 = .;
. = 0x00000780; gUnknown_03000780 = .;