diff options
-rw-r--r-- | asm/slot_machine.s | 206 | ||||
-rwxr-xr-x | include/ewram.h | 2 | ||||
-rw-r--r-- | ld_script.txt | 3 | ||||
-rw-r--r-- | src/field/slot_machine.c | 125 |
4 files changed, 125 insertions, 211 deletions
diff --git a/asm/slot_machine.s b/asm/slot_machine.s index 62792245d..4060e2541 100644 --- a/asm/slot_machine.s +++ b/asm/slot_machine.s @@ -5,212 +5,6 @@ .text - thumb_func_start PlaySlotMachine -PlaySlotMachine: @ 81018A0 - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl sub_81019B0 - ldr r0, _081018B4 @ =sub_81018B8 - bl SetMainCallback2 - pop {r0} - bx r0 - .align 2, 0 -_081018B4: .4byte sub_81018B8 - thumb_func_end PlaySlotMachine - - thumb_func_start sub_81018B8 -sub_81018B8: @ 81018B8 - push {lr} - ldr r0, _081018D0 @ =gMain - ldr r1, _081018D4 @ =0x0000043c - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0x6 - bhi _0810194A - lsls r0, 2 - ldr r1, _081018D8 @ =_081018DC - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_081018D0: .4byte gMain -_081018D4: .4byte 0x0000043c -_081018D8: .4byte _081018DC - .align 2, 0 -_081018DC: - .4byte _081018F8 - .4byte _08101902 - .4byte _08101908 - .4byte _08101912 - .4byte _08101918 - .4byte _0810191E - .4byte _08101938 -_081018F8: - bl sub_8101A28 - bl sub_8101BA4 - b _08101922 -_08101902: - bl sub_8101A8C - b _08101922 -_08101908: - bl sub_8101AE0 - bl sub_8101B04 - b _08101922 -_08101912: - bl sub_8101C84 - b _08101922 -_08101918: - bl sub_8101CA0 - b _08101922 -_0810191E: - bl sub_8101CC0 -_08101922: - ldr r1, _08101930 @ =gMain - ldr r0, _08101934 @ =0x0000043c - adds r1, r0 - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] - b _0810194A - .align 2, 0 -_08101930: .4byte gMain -_08101934: .4byte 0x0000043c -_08101938: - bl sub_8101CD4 - bl sub_8101CEC - bl sub_8101A44 - ldr r0, _08101950 @ =sub_8101954 - bl SetMainCallback2 -_0810194A: - pop {r0} - bx r0 - .align 2, 0 -_08101950: .4byte sub_8101954 - thumb_func_end sub_81018B8 - - thumb_func_start sub_8101954 -sub_8101954: @ 8101954 - push {lr} - bl RunTasks - bl AnimateSprites - bl BuildOamBuffer - bl UpdatePaletteFade - pop {r0} - bx r0 - thumb_func_end sub_8101954 - - thumb_func_start sub_810196C -sub_810196C: @ 810196C - push {lr} - bl LoadOam - bl ProcessSpriteCopyRequests - bl TransferPlttBuffer - ldr r1, _081019A8 @ =REG_WIN0H - ldr r2, _081019AC @ =gSharedMem - adds r0, r2, 0 - adds r0, 0x58 - ldrh r0, [r0] - strh r0, [r1] - adds r1, 0x4 - adds r0, r2, 0 - adds r0, 0x5A - ldrh r0, [r0] - strh r0, [r1] - adds r1, 0x4 - adds r0, r2, 0 - adds r0, 0x5C - ldrh r0, [r0] - strh r0, [r1] - adds r1, 0x2 - adds r0, r2, 0 - adds r0, 0x5E - ldrh r0, [r0] - strh r0, [r1] - pop {r0} - bx r0 - .align 2, 0 -_081019A8: .4byte REG_WIN0H -_081019AC: .4byte gSharedMem - thumb_func_end sub_810196C - - thumb_func_start sub_81019B0 -sub_81019B0: @ 81019B0 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - lsls r4, 24 - lsrs r4, 24 - ldr r0, _081019E4 @ =nullsub_67 - movs r1, 0xFF - bl CreateTask - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 3 - ldr r1, _081019E8 @ =gTasks - adds r0, r1 - strh r4, [r0, 0x8] - adds r0, 0xA - adds r1, r5, 0 - bl StoreWordInTwoHalfwords - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_081019E4: .4byte nullsub_67 -_081019E8: .4byte gTasks - thumb_func_end sub_81019B0 - - thumb_func_start sub_81019EC -sub_81019EC: @ 81019EC - push {lr} - ldr r0, _08101A18 @ =nullsub_67 - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - lsls r2, r0, 2 - adds r2, r0 - lsls r2, 3 - ldr r0, _08101A1C @ =gTasks - adds r2, r0 - ldr r1, _08101A20 @ =gSharedMem - ldrh r0, [r2, 0x8] - strb r0, [r1, 0x1] - adds r2, 0xA - adds r1, 0x64 - adds r0, r2, 0 - bl LoadWordFromTwoHalfwords - pop {r0} - bx r0 - .align 2, 0 -_08101A18: .4byte nullsub_67 -_08101A1C: .4byte gTasks -_08101A20: .4byte gSharedMem - thumb_func_end sub_81019EC - - thumb_func_start nullsub_67 -nullsub_67: @ 8101A24 - bx lr - thumb_func_end nullsub_67 - - thumb_func_start sub_8101A28 -sub_8101A28: @ 8101A28 - push {lr} - movs r0, 0 - bl SetVBlankCallback - movs r0, 0 - bl SetHBlankCallback - movs r1, 0x80 - lsls r1, 19 - movs r0, 0 - strh r0, [r1] - pop {r0} - bx r0 - thumb_func_end sub_8101A28 - thumb_func_start sub_8101A44 sub_8101A44: @ 8101A44 push {r4,lr} diff --git a/include/ewram.h b/include/ewram.h index eacc02cab..9d3002615 100755 --- a/include/ewram.h +++ b/include/ewram.h @@ -24,7 +24,7 @@ extern u8 gSharedMem[]; #define ewram0arr ((u8 (*)[32])gSharedMem) #define eVoidSharedArr (void *)(ewram_addr + 0x0) #define eVoidSharedArr2 (u32)(ewram_addr) // ew(ram) -#define ewram0_8 ((struct UnkStruct2000000 *)(gSharedMem + 0x0)) +#define eSlotMachine ((struct SlotMachineEwramStruct *)(gSharedMem + 0x0)) #define ewram0_9(i) (u8 *)(ewram_addr + (i * 0x20)) #define ewram0_10 (*(struct UnknownPokenav0*)(gSharedMem + 0)) #define ewram0_11 (*(struct UnknownPokenav0_1*)(gSharedMem + 0)) diff --git a/ld_script.txt b/ld_script.txt index 6353fceec..5014ebb4b 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -318,8 +318,9 @@ SECTIONS { src/scene/cute_sketch.o(.text); asm/cute_sketch.o(.text); src/field/decoration.o(.text); - asm/slot_machine.o(.text); src/field/slot_machine.o(.text); + asm/slot_machine.o(.text); + src/field/slot_machine.o(.text_a); asm/slot_machine.o(.text_8104D30) src/field/slot_machine.o(.text_b); src/scene/contest_painting.o(.text); diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index 89ec68b0a..3bff71f4f 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -1,13 +1,24 @@ #include "global.h" +#include "main.h" #include "slot_machine.h" #include "decompress.h" #include "palette.h" #include "task.h" +#include "util.h" #include "ewram.h" -struct UnkStruct2000000 { - /*0x00*/ u8 filler00[61]; +struct SlotMachineEwramStruct { + /*0x00*/ u8 unk00; + /*0x01*/ u8 unk01; + /*0x02*/ u8 filler02[59]; /*0x3D*/ u8 unk3D; + /*0x3E*/ u8 filler3E[26]; + /*0x58*/ u16 win0h; + /*0x5a*/ u16 win0v; + /*0x5c*/ u16 winIn; + /*0x5e*/ u16 winOut; + /*0x60*/ u8 filler_60[4]; + /*0x64*/ void *unk64; }; struct UnkStruct1 { @@ -31,6 +42,114 @@ extern const u16 gUnknown_08E95A18[]; extern u16 gUnknown_08E95AB8[]; extern u16 gUnknown_08E95FB8[]; +void sub_81018B8(void); +void sub_8101954(void); +void sub_81019B0(u8 arg0, void *ptr); +void nullsub_67(u8 taskId); +void sub_8101A28(void); +void sub_8101BA4(void); +void sub_8101A8C(void); +void sub_8101AE0(void); +void sub_8101B04(void); +void sub_8101C84(void); +void sub_8101CA0(void); +void sub_8101CC0(void); +void sub_8101CD4(void); +void sub_8101CEC(void); +void sub_8101A44(void); + + +void PlaySlotMachine(u8 arg0, void *ptr) +{ + sub_81019B0(arg0, ptr); + SetMainCallback2(sub_81018B8); +} + +void sub_81018B8(void) +{ + switch (gMain.state) + { + case 0: + sub_8101A28(); + sub_8101BA4(); + gMain.state++; + break; + case 1: + sub_8101A8C(); + gMain.state++; + break; + case 2: + sub_8101AE0(); + sub_8101B04(); + gMain.state++; + break; + case 3: + sub_8101C84(); + gMain.state++; + break; + case 4: + sub_8101CA0(); + gMain.state++; + break; + case 5: + sub_8101CC0(); + gMain.state++; + break; + case 6: + sub_8101CD4(); + sub_8101CEC(); + sub_8101A44(); + SetMainCallback2(sub_8101954); + break; + } +} + +void sub_8101954(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_810196C(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + REG_WIN0H = eSlotMachine->win0h; + REG_WIN0V = eSlotMachine->win0v; + REG_WININ = eSlotMachine->winIn; + REG_WINOUT = eSlotMachine->winOut; +} + +void sub_81019B0(u8 arg0, void *ptr) +{ + struct Task *task = &gTasks[CreateTask(nullsub_67, 0xFF)]; + task->data[0] = arg0; + StoreWordInTwoHalfwords(task->data + 1, (intptr_t)ptr); +} + +void sub_81019EC(void) +{ + struct Task *task = &gTasks[FindTaskIdByFunc(nullsub_67)]; + eSlotMachine->unk01 = task->data[0]; + LoadWordFromTwoHalfwords((u16 *)(task->data + 1), (u32 *)&eSlotMachine->unk64); +} + +void nullsub_67(u8 taskId) +{ +} + +void sub_8101A28(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); + REG_DISPCNT = 0; +} + +asm(".section .text_a"); + static void LoadSlotMachineWheelOverlay(void); void sub_8104CAC(u8 arg0) { @@ -39,7 +158,7 @@ void sub_8104CAC(u8 arg0) { sub_8104DA4(); - task = &gTasks[ewram0_8->unk3D]; + task = &gTasks[eSlotMachine->unk3D]; task->data[1] = arg0; i = 0; |