From 8c59b45736a19edb31669815c542828edd11b162 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 4 Jul 2026 10:53:54 -0700 Subject: [PATCH 01/10] continue moving nitro code to c --- asm/include/main_02003DB8.inc | 6 +- asm/include/main_0207F894.inc | 8 +- asm/itcm.s | 651 --------------------- asm/itcm_1.s | 559 ++++++++++++++++++ asm/main_02003DB8.s | 76 +-- asm/main_bss_022AB0AC.s | 12 +- asm/main_rodata_020A2808.s | 8 +- lib/MSL_C/asm/include/main_0207F894.inc | 8 +- lib/NitroSDK/asm/card_rom.s | 2 +- lib/NitroSDK/asm/fs_overlay.s | 34 +- lib/NitroSDK/asm/fs_rom.s | 14 +- lib/NitroSDK/asm/include/main_0207F894.inc | 8 +- lib/NitroSDK/asm/include/mi_memory.inc | 8 +- lib/NitroSDK/asm/include/nitro.inc | 8 +- lib/NitroSDK/asm/include/os_interrupt.inc | 1 + lib/NitroSDK/asm/mi_dma.s | 497 ---------------- lib/NitroSDK/asm/mi_dma_card.s | 43 -- lib/NitroSDK/asm/os_interrupt.s | 153 ----- lib/NitroSDK/asm/os_irqHandler.s | 41 ++ lib/NitroSDK/asm/os_irqTable.s | 122 ++++ lib/NitroSDK/asm/pxi_fifo.s | 4 +- lib/NitroSDK/asm/rtc_convert.s | 4 +- lib/NitroSDK/asm/snd_alarm.s | 75 --- lib/NitroSDK/src/mi/mi_dma.c | 489 ++++++++++++++++ lib/NitroSDK/src/mi/mi_dma_card.c | 26 + lib/NitroSDK/src/snd/snd_alarm.c | 171 ++++++ lib/include/nitro/mi.h | 1 + lib/include/nitro/mi/mi_dma.h | 189 ++++++ lib/include/nitro/snd.h | 9 +- lib/include/nitro/snd/common/alarm.h | 53 ++ lib/include/nitro/snd/common/capture.h | 110 ++++ lib/include/nitro/snd/common/command.h | 84 +++ lib/include/nitro/snd/common/global.h | 38 ++ lib/include/nitro/snd/common/seq.h | 128 ++++ main.lsf | 10 +- 35 files changed, 2126 insertions(+), 1524 deletions(-) create mode 100644 asm/itcm_1.s delete mode 100644 lib/NitroSDK/asm/mi_dma.s delete mode 100644 lib/NitroSDK/asm/mi_dma_card.s create mode 100644 lib/NitroSDK/asm/os_irqHandler.s create mode 100644 lib/NitroSDK/asm/os_irqTable.s delete mode 100644 lib/NitroSDK/asm/snd_alarm.s create mode 100644 lib/NitroSDK/src/mi/mi_dma.c create mode 100644 lib/NitroSDK/src/mi/mi_dma_card.c create mode 100644 lib/NitroSDK/src/snd/snd_alarm.c create mode 100644 lib/include/nitro/mi/mi_dma.h create mode 100644 lib/include/nitro/snd/common/alarm.h create mode 100644 lib/include/nitro/snd/common/capture.h create mode 100644 lib/include/nitro/snd/common/command.h create mode 100644 lib/include/nitro/snd/common/global.h create mode 100644 lib/include/nitro/snd/common/seq.h diff --git a/asm/include/main_02003DB8.inc b/asm/include/main_02003DB8.inc index 6330f02c..a9961f7b 100644 --- a/asm/include/main_02003DB8.inc +++ b/asm/include/main_02003DB8.inc @@ -61,7 +61,7 @@ .public FS_SeekFile .public FS_UnloadOverlay .public GetDsFirmwareUserSettings -.public GetOverlayInfo +.public FS_LoadOverlayInfo .public GX_BeginLoadBGExtPltt .public GX_BeginLoadOBJExtPltt .public GX_EndLoadBGExtPltt @@ -69,9 +69,9 @@ .public GXS_BeginLoadBGExtPltt .public GXS_EndLoadBGExtPltt .public IC_InvalidateAll -.public InitOverlay +.public FS_StartOverlay .public LOADED_OVERLAY_GROUP_0 -.public LoadOverlayInternal +.public FS_LoadOverlayImage .public Math_CalcCrc32 .public Mathi_Crc32InitTable .public MemAlloc diff --git a/asm/include/main_0207F894.inc b/asm/include/main_0207F894.inc index 3becc0ed..5f88b5df 100644 --- a/asm/include/main_0207F894.inc +++ b/asm/include/main_0207F894.inc @@ -2,12 +2,12 @@ .public _02000BC4 .public _020AEC5C .public _020B2BB4 -.public _020B2BB8 +.public fsi_digest_key_len .public _020B2BC0 .public _020B2BC4 .public _020B2C84 .public _020B2D88 -.public _020B2E9C +.public sDayOfYear .public _020B2ED0 .public _020B2ED4 .public _020B2FBC @@ -16,7 +16,7 @@ .public _022BB5FC .public _022BB604 .public _022BB60C -.public _022BB614 +.public fsi_arc_rom .public _022BB670 .public _022BB68C .public _022BB6AC @@ -106,7 +106,7 @@ .public MI_DmaCopy16 .public MI_StopDma .public MIi_UncompressBackward -.public MTi_CardDmaCopy32 +.public MIi_CardDmaCopy32 .public MTi_CpuClear32 .public MTi_CpuClearFast .public MTi_CpuCopy32 diff --git a/asm/itcm.s b/asm/itcm.s index d7b1cf2e..20ab796c 100644 --- a/asm/itcm.s +++ b/asm/itcm.s @@ -2140,654 +2140,3 @@ _01FF9A60: .word 0x040001A1 _01FF9A64: .word 0x04100010 arm_func_end OSi_ReadCardRom32 - arm_func_start InitDmaTransfer_Standard -InitDmaTransfer_Standard: ; 0x01FF9A68 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r0 - mov r6, r1 - mov r5, r2 - mov r4, r3 - bl EnableIrqFlag - mov r1, #0xc - mul r2, r7, r1 - add r1, r2, #0xb0 - add r2, r2, #0x4000000 - str r6, [r2, #0xb0] - add r1, r1, #0x4000000 - str r5, [r1, #4] - str r4, [r1, #8] - bl SetIrqFlag - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end InitDmaTransfer_Standard - - arm_func_start MIi_DmaSetParams_Wait -MIi_DmaSetParams_Wait: ; 0x01FF9AA8 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r0 - mov r6, r1 - mov r5, r2 - mov r4, r3 - bl EnableIrqFlag - mov r1, #0xc - mul r2, r7, r1 - add r1, r2, #0xb0 - add r2, r2, #0x4000000 - str r6, [r2, #0xb0] - add r3, r1, #0x4000000 - str r5, [r3, #4] - ldr r2, _01FF9B10 ; =0x040000B0 - str r4, [r3, #8] - ldr r1, [r2] - cmp r7, #0 - ldr r1, [r2] - bne _01FF9B08 - mov r2, #0 - str r2, [r3] - ldr r1, _01FF9B14 ; =0x81400001 - str r2, [r3, #4] - str r1, [r3, #8] -_01FF9B08: - bl SetIrqFlag - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_01FF9B10: .word 0x040000B0 -_01FF9B14: .word 0x81400001 - arm_func_end MIi_DmaSetParams_Wait - - arm_func_start MIi_DmaSetParams_NoInt -MIi_DmaSetParams_NoInt: ; 0x01FF9B18 - mov ip, #0xc - mul ip, r0, ip - add r0, ip, #0xb0 - add ip, ip, #0x4000000 - str r1, [ip, #0xb0] - add r0, r0, #0x4000000 - str r2, [r0, #4] - str r3, [r0, #8] - bx lr - arm_func_end MIi_DmaSetParams_NoInt - - arm_func_start sub_01FF9B3C -sub_01FF9B3C: ; 0x01FF9B3C - stmdb sp!, {r3, lr} - mov ip, #0xc - mul lr, r0, ip - add ip, lr, #0xb0 - add lr, lr, #0x4000000 - str r1, [lr, #0xb0] - add ip, ip, #0x4000000 - str r2, [ip, #4] - ldr r2, _01FF9B98 ; =0x040000B0 - str r3, [ip, #8] - ldr r1, [r2] - cmp r0, #0 - ldr r0, [r2] - bne _01FF9B88 - mov r1, #0 - str r1, [ip] - ldr r0, _01FF9B9C ; =0x81400001 - str r1, [ip, #4] - str r0, [ip, #8] -_01FF9B88: - ldr r1, _01FF9B98 ; =0x040000B0 - ldr r0, [r1] - ldr r0, [r1] - ldmia sp!, {r3, pc} - .align 2, 0 -_01FF9B98: .word 0x040000B0 -_01FF9B9C: .word 0x81400001 - arm_func_end sub_01FF9B3C - - arm_func_start sub_01FF9BA0 -sub_01FF9BA0: ; 0x01FF9BA0 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - ldr r1, [r0, #0x10] - ldrh lr, [r0, #0xa] - cmp r1, #0 - ldr r2, [r0, #0x18] - ldr r3, [r0, #0x1c] - beq _01FF9CFC - mov ip, #0 -_01FF9BC0: - ldrb r4, [r2, #1] - ldrb r5, [r2, #2] - ldrb r6, [r2], #4 - add r4, r1, r4, lsl #2 - add r5, r1, r5, lsl #2 - ldrb r4, [r4, #1] - ldrb r5, [r5, #2] - ldrb r6, [r1, r6, lsl #2] - mul r4, lr, r4 - mul r5, lr, r5 - mul r6, lr, r6 - mov r4, r4, lsr #8 - mov r7, r6, lsr #8 - mov r5, r5, lsr #8 - and r6, r5, #0xff - and r4, r4, #0xff - and r5, r4, #0xf8 - and r7, r7, #0xff - mov r4, ip, lsl #1 - add ip, ip, #1 - and r6, r6, #0xf8 - mov r5, r5, lsl #2 - and r7, r7, #0xf8 - orr r5, r5, r6, lsl #7 - orr r5, r5, r7, asr #3 - strh r5, [r3, r4] - cmp ip, #0xe0 - blt _01FF9BC0 - b _01FF9C64 -_01FF9C34: - ldrb r4, [r2, #1] - ldrb r5, [r2, #2] - ldrb r7, [r2], #4 - and r4, r4, #0xf8 - and r6, r5, #0xf8 - mov r5, r4, lsl #2 - mov r4, ip, lsl #1 - and r7, r7, #0xf8 - orr r5, r5, r6, lsl #7 - orr r5, r5, r7, asr #3 - strh r5, [r3, r4] - add ip, ip, #1 -_01FF9C64: - cmp ip, #0xf0 - blt _01FF9C34 - b _01FF9CD8 -_01FF9C70: - ldrb r4, [r2, #1] - ldrb r5, [r2, #2] - ldrb r6, [r2], #4 - add r4, r1, r4, lsl #2 - add r5, r1, r5, lsl #2 - ldrb r4, [r4, #1] - ldrb r5, [r5, #2] - ldrb r6, [r1, r6, lsl #2] - mul r4, lr, r4 - mul r5, lr, r5 - mul r6, lr, r6 - mov r4, r4, lsr #8 - mov r7, r6, lsr #8 - mov r5, r5, lsr #8 - and r6, r5, #0xff - and r4, r4, #0xff - and r5, r4, #0xf8 - and r7, r7, #0xff - mov r4, ip, lsl #1 - and r6, r6, #0xf8 - mov r5, r5, lsl #2 - and r7, r7, #0xf8 - orr r5, r5, r6, lsl #7 - orr r5, r5, r7, asr #3 - strh r5, [r3, r4] - add ip, ip, #1 -_01FF9CD8: - ldr r4, [r0, #4] - cmp ip, r4 - blt _01FF9C70 - ldr r1, _01FF9E10 ; =ov29_02353530 - mov r0, r3 - ldr r1, [r1] - add r1, r1, #0x4c - bl Rgb8ToRgb5 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_01FF9CFC: - mov r0, #0 -_01FF9D00: - ldrb r1, [r2, #1] - ldrb r5, [r2, #2] - ldrb r7, [r2], #4 - mul r4, r1, lr - mul r6, r5, lr - mov r1, r4, lsr #8 - mul r5, r7, lr - mov r4, r6, lsr #8 - mov r6, r5, lsr #8 - and r5, r4, #0xff - and r1, r1, #0xff - and r4, r1, #0xf8 - and r6, r6, #0xff - mov r1, r0, lsl #1 - add r0, r0, #1 - and r5, r5, #0xf8 - mov r4, r4, lsl #2 - and r6, r6, #0xf8 - orr r4, r4, r5, lsl #7 - orr r4, r4, r6, asr #3 - strh r4, [r3, r1] - cmp r0, #0xe0 - blt _01FF9D00 - b _01FF9D90 -_01FF9D60: - ldrb r1, [r2, #1] - ldrb r4, [r2, #2] - ldrb r6, [r2], #4 - and r1, r1, #0xf8 - and r5, r4, #0xf8 - mov r4, r1, lsl #2 - mov r1, r0, lsl #1 - and r6, r6, #0xf8 - orr r4, r4, r5, lsl #7 - orr r4, r4, r6, asr #3 - strh r4, [r3, r1] - add r0, r0, #1 -_01FF9D90: - cmp r0, #0xf0 - blt _01FF9D60 - b _01FF9DF0 -_01FF9D9C: - ldrb r1, [r2, #1] - ldrb r4, [r2, #2] - ldrb r6, [r2], #4 - mul ip, r1, lr - mul r5, r4, lr - mov r1, ip, lsr #8 - mov r4, r5, lsr #8 - mul r7, r6, lr - and r1, r1, #0xff - and ip, r1, #0xf8 - mov r5, r7, lsr #8 - and r4, r4, #0xff - and r5, r5, #0xff - mov r1, r0, lsl #1 - and r4, r4, #0xf8 - mov ip, ip, lsl #2 - and r5, r5, #0xf8 - orr r4, ip, r4, lsl #7 - orr r4, r4, r5, asr #3 - strh r4, [r3, r1] - add r0, r0, #1 -_01FF9DF0: - cmp r0, #0xf0 - blt _01FF9D9C - ldr r1, _01FF9E10 ; =ov29_02353530 - mov r0, r3 - ldr r1, [r1] - add r1, r1, #0x4c - bl Rgb8ToRgb5 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_01FF9E10: .word ov29_02353530 - arm_func_end sub_01FF9BA0 - - arm_func_start sub_01FF9E14 -sub_01FF9E14: ; 0x01FF9E14 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - ldr r1, _01FF9F7C ; =ov29_02353530 - ldr r4, [r0, #0x10] - ldr r1, [r1] - cmp r4, #0 - add sb, r1, #0x51 - ldrh sl, [r0, #0xa] - ldr r5, [r0, #0x18] - ldr r6, [r0, #0x1c] - mov r7, #0 - beq _01FF9EE8 - ldr r8, [r0, #4] - mov fp, r7 - b _01FF9EDC -_01FF9E4C: - ldrb r0, [sb, r7, asr #4] - cmp r0, #0 - ldrneb r0, [r5] - ldrneb r2, [r5, #1] - ldrneb r3, [r5, #2] - bne _01FF9EA8 - ldrb r1, [r5, #1] - ldrb r0, [r5, #2] - ldrb r2, [r5] - add r1, r4, r1, lsl #2 - add r0, r4, r0, lsl #2 - ldrb r2, [r4, r2, lsl #2] - ldrb r1, [r1, #1] - ldrb r0, [r0, #2] - mul r2, sl, r2 - mul r1, sl, r1 - mul r0, sl, r0 - mov r3, r2, lsr #8 - mov r2, r1, lsr #8 - mov r1, r0, lsr #8 - and r0, r3, #0xff - and r2, r2, #0xff - and r3, r1, #0xff -_01FF9EA8: - and r1, r2, #0xf8 - and r2, r3, #0xf8 - mov r1, r1, lsl #2 - and r3, r0, #0xf8 - orr r0, r1, r2, lsl #7 - mov r1, fp - orr r3, r0, r3, asr #3 - mov r2, r7, lsl #1 - and r0, r7, #0xff - strh r3, [r6, r2] - bl sub_0201BD50 - add r5, r5, #4 - add r7, r7, #1 -_01FF9EDC: - cmp r7, r8 - blt _01FF9E4C - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_01FF9EE8: - ldr r4, [r0, #4] - mov r8, r7 - b _01FF9F70 -_01FF9EF4: - ldrb r0, [sb, r7, asr #4] - cmp r0, #0 - ldrneb r3, [r5] - ldrneb r1, [r5, #1] - ldrneb r2, [r5, #2] - bne _01FF9F3C - ldrb r2, [r5] - ldrb r1, [r5, #1] - ldrb r0, [r5, #2] - mul r3, r2, sl - mul r2, r1, sl - mul r1, r0, sl - mov r3, r3, lsr #8 - mov r2, r2, lsr #8 - mov r0, r1, lsr #8 - and r3, r3, #0xff - and r1, r2, #0xff - and r2, r0, #0xff -_01FF9F3C: - and r0, r1, #0xf8 - and r1, r2, #0xf8 - mov r0, r0, lsl #2 - and r2, r3, #0xf8 - orr r0, r0, r1, lsl #7 - mov r1, r8 - orr r3, r0, r2, asr #3 - mov r2, r7, lsl #1 - and r0, r7, #0xff - strh r3, [r6, r2] - bl sub_0201BD50 - add r5, r5, #4 - add r7, r7, #1 -_01FF9F70: - cmp r7, r4 - blt _01FF9EF4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_01FF9F7C: .word ov29_02353530 - arm_func_end sub_01FF9E14 - - arm_func_start sub_01FF9F80 -sub_01FF9F80: ; 0x01FF9F80 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - ldr r1, _01FFA38C ; =ov29_02353530 - ldr r4, [r0, #0x10] - ldr r1, [r1] - cmp r4, #0 - add sb, r1, #0x51 - ldrh sl, [r0, #0xa] - ldr r5, [r0, #0x18] - ldr r6, [r0, #0x1c] - beq _01FFA290 - mov r8, #0 -_01FF9FAC: - and r0, r8, #0xff - add fp, sb, r8 - mov r7, #0 - str r0, [sp] -_01FF9FBC: - ldrb r0, [fp, #0x10] - add r1, r7, r8, lsl #8 - add r2, r5, r1, lsl #2 - cmp r0, #0 - ldrneb r0, [r2, #1] - ldrneb r3, [r5, r1, lsl #2] - ldrneb r2, [r2, #2] - bne _01FFA020 - ldrb r0, [r2, #1] - ldrb ip, [r2, #2] - ldrb r2, [r5, r1, lsl #2] - add r0, r4, r0, lsl #2 - ldrb r0, [r0, #1] - ldrb r3, [r4, r2, lsl #2] - add r2, r4, ip, lsl #2 - ldrb r2, [r2, #2] - mul r0, sl, r0 - mul r3, sl, r3 - mul r2, sl, r2 - mov r3, r3, lsr #8 - mov r0, r0, lsr #8 - mov r2, r2, lsr #8 - and r3, r3, #0xff - and r0, r0, #0xff - and r2, r2, #0xff -_01FFA020: - and r0, r0, #0xf8 - and r2, r2, #0xf8 - mov r0, r0, lsl #2 - orr r2, r0, r2, lsl #7 - and r3, r3, #0xf8 - orr r3, r2, r3, asr #3 - mov r1, r1, lsl #1 - strh r3, [r6, r1] - ldr r0, [sp] - mov r2, #0 - and r1, r7, #0xff - bl sub_0201BD80 - add r7, r7, #1 - cmp r7, #0x10 - blt _01FF9FBC - mov r7, #0x10 - and fp, r8, #0xff -_01FFA064: - add r1, r7, r8, lsl #8 - add r2, r5, r1, lsl #2 - ldrb r0, [r2, #1] - ldrb r3, [r2, #2] - ldrb r2, [r5, r1, lsl #2] - add r0, r4, r0, lsl #2 - add ip, r4, r3, lsl #2 - ldrb r3, [r0, #1] - ldrb r0, [ip, #2] - ldrb ip, [r4, r2, lsl #2] - mul r2, sl, r3 - mul r3, sl, r0 - mul r0, sl, ip - mov r2, r2, lsr #8 - mov r3, r3, lsr #8 - and r2, r2, #0xff - mov r0, r0, lsr #8 - and r2, r2, #0xf8 - and r3, r3, #0xff - and ip, r0, #0xff - and r0, r3, #0xf8 - mov r2, r2, lsl #2 - and r3, ip, #0xf8 - orr ip, r2, r0, lsl #7 - orr r3, ip, r3, asr #3 - mov ip, r1, lsl #1 - mov r0, fp - mov r2, #0 - and r1, r7, #0xff - strh r3, [r6, ip] - bl sub_0201BD80 - add r7, r7, #1 - cmp r7, #0x20 - blt _01FFA064 - mov r7, #0xc0 - and fp, r8, #0xff -_01FFA0F4: - add r1, r7, r8, lsl #8 - add r2, r5, r1, lsl #2 - ldrb r0, [r2, #1] - ldrb r3, [r2, #2] - ldrb r2, [r5, r1, lsl #2] - add r0, r4, r0, lsl #2 - add ip, r4, r3, lsl #2 - ldrb r3, [r0, #1] - ldrb r0, [ip, #2] - ldrb ip, [r4, r2, lsl #2] - mul r2, sl, r3 - mul r3, sl, r0 - mul r0, sl, ip - mov r2, r2, lsr #8 - mov r3, r3, lsr #8 - and r2, r2, #0xff - mov r0, r0, lsr #8 - and r2, r2, #0xf8 - and r3, r3, #0xff - and ip, r0, #0xff - and r0, r3, #0xf8 - mov r2, r2, lsl #2 - and r3, ip, #0xf8 - orr ip, r2, r0, lsl #7 - orr r3, ip, r3, asr #3 - mov ip, r1, lsl #1 - mov r0, fp - mov r2, #0 - and r1, r7, #0xff - strh r3, [r6, ip] - bl sub_0201BD80 - add r7, r7, #1 - cmp r7, #0xf0 - blt _01FFA0F4 - mov r7, #0xf0 - mov r1, r7 - and r0, r8, #0xff - mov r2, #0 - bl sub_0201BD80 -_01FFA190: - add r1, r7, r8, lsl #8 - add r2, r5, r1, lsl #2 - ldrb r0, [r2, #1] - ldrb r3, [r2, #2] - ldrb fp, [r5, r1, lsl #2] - mul r2, sl, r0 - mul r3, sl, r3 - mul r0, sl, fp - mov r2, r2, lsr #8 - mov r3, r3, lsr #8 - and r2, r2, #0xff - mov fp, r0, lsr #8 - and r3, r3, #0xff - and r0, r2, #0xf8 - and fp, fp, #0xff - add r7, r7, #1 - and r2, r3, #0xf8 - mov r0, r0, lsl #2 - and r3, fp, #0xf8 - orr r0, r0, r2, lsl #7 - orr r2, r0, r3, asr #3 - mov r0, r1, lsl #1 - strh r2, [r6, r0] - cmp r7, #0x100 - blt _01FFA190 - add r8, r8, #1 - cmp r8, #0x10 - blt _01FF9FAC - mov r7, #0xb0 - mov r8, #0 -_01FFA208: - add r1, r5, r7, lsl #2 - ldrb r0, [r1, #1] - ldrb r1, [r1, #2] - ldrb r2, [r5, r7, lsl #2] - add r0, r4, r0, lsl #2 - add r1, r4, r1, lsl #2 - ldrb r0, [r0, #1] - ldrb r1, [r1, #2] - ldrb r2, [r4, r2, lsl #2] - mul r0, sl, r0 - mul r1, sl, r1 - mul r2, sl, r2 - mov r0, r0, lsr #8 - mov r1, r1, lsr #8 - and r0, r0, #0xff - mov r2, r2, lsr #8 - and r1, r1, #0xff - and r0, r0, #0xf8 - and r2, r2, #0xff - and r1, r1, #0xf8 - mov r0, r0, lsl #2 - and r3, r2, #0xf8 - orr r1, r0, r1, lsl #7 - mov r0, r8 - mov r2, r8 - orr sb, r1, r3, asr #3 - mov r3, r7, lsl #1 - and r1, r7, #0xff - strh sb, [r6, r3] - bl sub_0201BD80 - add r7, r7, #1 - cmp r7, #0xc0 - blt _01FFA208 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_01FFA290: - mov r7, #0 -_01FFA294: - add r0, sb, r7 - ldrb r0, [r0, #0x10] - mov r8, #0 - and r4, r7, #0xff - cmp r0, #0 - beq _01FFA304 - mov fp, r8 -_01FFA2B0: - add r1, r8, r7, lsl #8 - add r2, r5, r1, lsl #2 - ldrb r0, [r2, #1] - ldrb ip, [r2, #2] - ldrb r2, [r5, r1, lsl #2] - and r3, r0, #0xf8 - and r0, ip, #0xf8 - mov ip, r3, lsl #2 - and r3, r2, #0xf8 - orr ip, ip, r0, lsl #7 - mov r0, r4 - mov r2, fp - orr r3, ip, r3, asr #3 - mov ip, r1, lsl #1 - and r1, r8, #0xff - strh r3, [r6, ip] - bl sub_0201BD80 - add r8, r8, #1 - cmp r8, #0xf0 - blt _01FFA2B0 - b _01FFA37C -_01FFA304: - mov fp, r8 -_01FFA308: - add r1, r8, r7, lsl #8 - add r2, r5, r1, lsl #2 - ldrb r0, [r2, #1] - ldrb ip, [r2, #2] - ldrb r2, [r5, r1, lsl #2] - mul r3, sl, r0 - mul r0, sl, ip - mul ip, sl, r2 - mov r2, r3, lsr #8 - mov r3, r0, lsr #8 - and r2, r2, #0xff - mov r0, ip, lsr #8 - and r3, r3, #0xff - and r2, r2, #0xf8 - and ip, r0, #0xff - and r0, r3, #0xf8 - mov r2, r2, lsl #2 - and r3, ip, #0xf8 - orr ip, r2, r0, lsl #7 - mov r0, r4 - mov r2, fp - orr r3, ip, r3, asr #3 - mov ip, r1, lsl #1 - and r1, r8, #0xff - strh r3, [r6, ip] - bl sub_0201BD80 - add r8, r8, #1 - cmp r8, #0xf0 - blt _01FFA308 -_01FFA37C: - add r7, r7, #1 - cmp r7, #0x10 - blt _01FFA294 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_01FFA38C: .word ov29_02353530 - arm_func_end sub_01FF9F80 diff --git a/asm/itcm_1.s b/asm/itcm_1.s new file mode 100644 index 00000000..8eda5331 --- /dev/null +++ b/asm/itcm_1.s @@ -0,0 +1,559 @@ + .include "asm/macros.inc" + .include "itcm.inc" + + .section .itcm,4,1,4 + + arm_func_start sub_01FF9BA0 +sub_01FF9BA0: ; 0x01FF9BA0 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + ldr r1, [r0, #0x10] + ldrh lr, [r0, #0xa] + cmp r1, #0 + ldr r2, [r0, #0x18] + ldr r3, [r0, #0x1c] + beq _01FF9CFC + mov ip, #0 +_01FF9BC0: + ldrb r4, [r2, #1] + ldrb r5, [r2, #2] + ldrb r6, [r2], #4 + add r4, r1, r4, lsl #2 + add r5, r1, r5, lsl #2 + ldrb r4, [r4, #1] + ldrb r5, [r5, #2] + ldrb r6, [r1, r6, lsl #2] + mul r4, lr, r4 + mul r5, lr, r5 + mul r6, lr, r6 + mov r4, r4, lsr #8 + mov r7, r6, lsr #8 + mov r5, r5, lsr #8 + and r6, r5, #0xff + and r4, r4, #0xff + and r5, r4, #0xf8 + and r7, r7, #0xff + mov r4, ip, lsl #1 + add ip, ip, #1 + and r6, r6, #0xf8 + mov r5, r5, lsl #2 + and r7, r7, #0xf8 + orr r5, r5, r6, lsl #7 + orr r5, r5, r7, asr #3 + strh r5, [r3, r4] + cmp ip, #0xe0 + blt _01FF9BC0 + b _01FF9C64 +_01FF9C34: + ldrb r4, [r2, #1] + ldrb r5, [r2, #2] + ldrb r7, [r2], #4 + and r4, r4, #0xf8 + and r6, r5, #0xf8 + mov r5, r4, lsl #2 + mov r4, ip, lsl #1 + and r7, r7, #0xf8 + orr r5, r5, r6, lsl #7 + orr r5, r5, r7, asr #3 + strh r5, [r3, r4] + add ip, ip, #1 +_01FF9C64: + cmp ip, #0xf0 + blt _01FF9C34 + b _01FF9CD8 +_01FF9C70: + ldrb r4, [r2, #1] + ldrb r5, [r2, #2] + ldrb r6, [r2], #4 + add r4, r1, r4, lsl #2 + add r5, r1, r5, lsl #2 + ldrb r4, [r4, #1] + ldrb r5, [r5, #2] + ldrb r6, [r1, r6, lsl #2] + mul r4, lr, r4 + mul r5, lr, r5 + mul r6, lr, r6 + mov r4, r4, lsr #8 + mov r7, r6, lsr #8 + mov r5, r5, lsr #8 + and r6, r5, #0xff + and r4, r4, #0xff + and r5, r4, #0xf8 + and r7, r7, #0xff + mov r4, ip, lsl #1 + and r6, r6, #0xf8 + mov r5, r5, lsl #2 + and r7, r7, #0xf8 + orr r5, r5, r6, lsl #7 + orr r5, r5, r7, asr #3 + strh r5, [r3, r4] + add ip, ip, #1 +_01FF9CD8: + ldr r4, [r0, #4] + cmp ip, r4 + blt _01FF9C70 + ldr r1, _01FF9E10 ; =ov29_02353530 + mov r0, r3 + ldr r1, [r1] + add r1, r1, #0x4c + bl Rgb8ToRgb5 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_01FF9CFC: + mov r0, #0 +_01FF9D00: + ldrb r1, [r2, #1] + ldrb r5, [r2, #2] + ldrb r7, [r2], #4 + mul r4, r1, lr + mul r6, r5, lr + mov r1, r4, lsr #8 + mul r5, r7, lr + mov r4, r6, lsr #8 + mov r6, r5, lsr #8 + and r5, r4, #0xff + and r1, r1, #0xff + and r4, r1, #0xf8 + and r6, r6, #0xff + mov r1, r0, lsl #1 + add r0, r0, #1 + and r5, r5, #0xf8 + mov r4, r4, lsl #2 + and r6, r6, #0xf8 + orr r4, r4, r5, lsl #7 + orr r4, r4, r6, asr #3 + strh r4, [r3, r1] + cmp r0, #0xe0 + blt _01FF9D00 + b _01FF9D90 +_01FF9D60: + ldrb r1, [r2, #1] + ldrb r4, [r2, #2] + ldrb r6, [r2], #4 + and r1, r1, #0xf8 + and r5, r4, #0xf8 + mov r4, r1, lsl #2 + mov r1, r0, lsl #1 + and r6, r6, #0xf8 + orr r4, r4, r5, lsl #7 + orr r4, r4, r6, asr #3 + strh r4, [r3, r1] + add r0, r0, #1 +_01FF9D90: + cmp r0, #0xf0 + blt _01FF9D60 + b _01FF9DF0 +_01FF9D9C: + ldrb r1, [r2, #1] + ldrb r4, [r2, #2] + ldrb r6, [r2], #4 + mul ip, r1, lr + mul r5, r4, lr + mov r1, ip, lsr #8 + mov r4, r5, lsr #8 + mul r7, r6, lr + and r1, r1, #0xff + and ip, r1, #0xf8 + mov r5, r7, lsr #8 + and r4, r4, #0xff + and r5, r5, #0xff + mov r1, r0, lsl #1 + and r4, r4, #0xf8 + mov ip, ip, lsl #2 + and r5, r5, #0xf8 + orr r4, ip, r4, lsl #7 + orr r4, r4, r5, asr #3 + strh r4, [r3, r1] + add r0, r0, #1 +_01FF9DF0: + cmp r0, #0xf0 + blt _01FF9D9C + ldr r1, _01FF9E10 ; =ov29_02353530 + mov r0, r3 + ldr r1, [r1] + add r1, r1, #0x4c + bl Rgb8ToRgb5 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_01FF9E10: .word ov29_02353530 + arm_func_end sub_01FF9BA0 + + arm_func_start sub_01FF9E14 +sub_01FF9E14: ; 0x01FF9E14 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r1, _01FF9F7C ; =ov29_02353530 + ldr r4, [r0, #0x10] + ldr r1, [r1] + cmp r4, #0 + add sb, r1, #0x51 + ldrh sl, [r0, #0xa] + ldr r5, [r0, #0x18] + ldr r6, [r0, #0x1c] + mov r7, #0 + beq _01FF9EE8 + ldr r8, [r0, #4] + mov fp, r7 + b _01FF9EDC +_01FF9E4C: + ldrb r0, [sb, r7, asr #4] + cmp r0, #0 + ldrneb r0, [r5] + ldrneb r2, [r5, #1] + ldrneb r3, [r5, #2] + bne _01FF9EA8 + ldrb r1, [r5, #1] + ldrb r0, [r5, #2] + ldrb r2, [r5] + add r1, r4, r1, lsl #2 + add r0, r4, r0, lsl #2 + ldrb r2, [r4, r2, lsl #2] + ldrb r1, [r1, #1] + ldrb r0, [r0, #2] + mul r2, sl, r2 + mul r1, sl, r1 + mul r0, sl, r0 + mov r3, r2, lsr #8 + mov r2, r1, lsr #8 + mov r1, r0, lsr #8 + and r0, r3, #0xff + and r2, r2, #0xff + and r3, r1, #0xff +_01FF9EA8: + and r1, r2, #0xf8 + and r2, r3, #0xf8 + mov r1, r1, lsl #2 + and r3, r0, #0xf8 + orr r0, r1, r2, lsl #7 + mov r1, fp + orr r3, r0, r3, asr #3 + mov r2, r7, lsl #1 + and r0, r7, #0xff + strh r3, [r6, r2] + bl sub_0201BD50 + add r5, r5, #4 + add r7, r7, #1 +_01FF9EDC: + cmp r7, r8 + blt _01FF9E4C + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_01FF9EE8: + ldr r4, [r0, #4] + mov r8, r7 + b _01FF9F70 +_01FF9EF4: + ldrb r0, [sb, r7, asr #4] + cmp r0, #0 + ldrneb r3, [r5] + ldrneb r1, [r5, #1] + ldrneb r2, [r5, #2] + bne _01FF9F3C + ldrb r2, [r5] + ldrb r1, [r5, #1] + ldrb r0, [r5, #2] + mul r3, r2, sl + mul r2, r1, sl + mul r1, r0, sl + mov r3, r3, lsr #8 + mov r2, r2, lsr #8 + mov r0, r1, lsr #8 + and r3, r3, #0xff + and r1, r2, #0xff + and r2, r0, #0xff +_01FF9F3C: + and r0, r1, #0xf8 + and r1, r2, #0xf8 + mov r0, r0, lsl #2 + and r2, r3, #0xf8 + orr r0, r0, r1, lsl #7 + mov r1, r8 + orr r3, r0, r2, asr #3 + mov r2, r7, lsl #1 + and r0, r7, #0xff + strh r3, [r6, r2] + bl sub_0201BD50 + add r5, r5, #4 + add r7, r7, #1 +_01FF9F70: + cmp r7, r4 + blt _01FF9EF4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_01FF9F7C: .word ov29_02353530 + arm_func_end sub_01FF9E14 + + arm_func_start sub_01FF9F80 +sub_01FF9F80: ; 0x01FF9F80 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r1, _01FFA38C ; =ov29_02353530 + ldr r4, [r0, #0x10] + ldr r1, [r1] + cmp r4, #0 + add sb, r1, #0x51 + ldrh sl, [r0, #0xa] + ldr r5, [r0, #0x18] + ldr r6, [r0, #0x1c] + beq _01FFA290 + mov r8, #0 +_01FF9FAC: + and r0, r8, #0xff + add fp, sb, r8 + mov r7, #0 + str r0, [sp] +_01FF9FBC: + ldrb r0, [fp, #0x10] + add r1, r7, r8, lsl #8 + add r2, r5, r1, lsl #2 + cmp r0, #0 + ldrneb r0, [r2, #1] + ldrneb r3, [r5, r1, lsl #2] + ldrneb r2, [r2, #2] + bne _01FFA020 + ldrb r0, [r2, #1] + ldrb ip, [r2, #2] + ldrb r2, [r5, r1, lsl #2] + add r0, r4, r0, lsl #2 + ldrb r0, [r0, #1] + ldrb r3, [r4, r2, lsl #2] + add r2, r4, ip, lsl #2 + ldrb r2, [r2, #2] + mul r0, sl, r0 + mul r3, sl, r3 + mul r2, sl, r2 + mov r3, r3, lsr #8 + mov r0, r0, lsr #8 + mov r2, r2, lsr #8 + and r3, r3, #0xff + and r0, r0, #0xff + and r2, r2, #0xff +_01FFA020: + and r0, r0, #0xf8 + and r2, r2, #0xf8 + mov r0, r0, lsl #2 + orr r2, r0, r2, lsl #7 + and r3, r3, #0xf8 + orr r3, r2, r3, asr #3 + mov r1, r1, lsl #1 + strh r3, [r6, r1] + ldr r0, [sp] + mov r2, #0 + and r1, r7, #0xff + bl sub_0201BD80 + add r7, r7, #1 + cmp r7, #0x10 + blt _01FF9FBC + mov r7, #0x10 + and fp, r8, #0xff +_01FFA064: + add r1, r7, r8, lsl #8 + add r2, r5, r1, lsl #2 + ldrb r0, [r2, #1] + ldrb r3, [r2, #2] + ldrb r2, [r5, r1, lsl #2] + add r0, r4, r0, lsl #2 + add ip, r4, r3, lsl #2 + ldrb r3, [r0, #1] + ldrb r0, [ip, #2] + ldrb ip, [r4, r2, lsl #2] + mul r2, sl, r3 + mul r3, sl, r0 + mul r0, sl, ip + mov r2, r2, lsr #8 + mov r3, r3, lsr #8 + and r2, r2, #0xff + mov r0, r0, lsr #8 + and r2, r2, #0xf8 + and r3, r3, #0xff + and ip, r0, #0xff + and r0, r3, #0xf8 + mov r2, r2, lsl #2 + and r3, ip, #0xf8 + orr ip, r2, r0, lsl #7 + orr r3, ip, r3, asr #3 + mov ip, r1, lsl #1 + mov r0, fp + mov r2, #0 + and r1, r7, #0xff + strh r3, [r6, ip] + bl sub_0201BD80 + add r7, r7, #1 + cmp r7, #0x20 + blt _01FFA064 + mov r7, #0xc0 + and fp, r8, #0xff +_01FFA0F4: + add r1, r7, r8, lsl #8 + add r2, r5, r1, lsl #2 + ldrb r0, [r2, #1] + ldrb r3, [r2, #2] + ldrb r2, [r5, r1, lsl #2] + add r0, r4, r0, lsl #2 + add ip, r4, r3, lsl #2 + ldrb r3, [r0, #1] + ldrb r0, [ip, #2] + ldrb ip, [r4, r2, lsl #2] + mul r2, sl, r3 + mul r3, sl, r0 + mul r0, sl, ip + mov r2, r2, lsr #8 + mov r3, r3, lsr #8 + and r2, r2, #0xff + mov r0, r0, lsr #8 + and r2, r2, #0xf8 + and r3, r3, #0xff + and ip, r0, #0xff + and r0, r3, #0xf8 + mov r2, r2, lsl #2 + and r3, ip, #0xf8 + orr ip, r2, r0, lsl #7 + orr r3, ip, r3, asr #3 + mov ip, r1, lsl #1 + mov r0, fp + mov r2, #0 + and r1, r7, #0xff + strh r3, [r6, ip] + bl sub_0201BD80 + add r7, r7, #1 + cmp r7, #0xf0 + blt _01FFA0F4 + mov r7, #0xf0 + mov r1, r7 + and r0, r8, #0xff + mov r2, #0 + bl sub_0201BD80 +_01FFA190: + add r1, r7, r8, lsl #8 + add r2, r5, r1, lsl #2 + ldrb r0, [r2, #1] + ldrb r3, [r2, #2] + ldrb fp, [r5, r1, lsl #2] + mul r2, sl, r0 + mul r3, sl, r3 + mul r0, sl, fp + mov r2, r2, lsr #8 + mov r3, r3, lsr #8 + and r2, r2, #0xff + mov fp, r0, lsr #8 + and r3, r3, #0xff + and r0, r2, #0xf8 + and fp, fp, #0xff + add r7, r7, #1 + and r2, r3, #0xf8 + mov r0, r0, lsl #2 + and r3, fp, #0xf8 + orr r0, r0, r2, lsl #7 + orr r2, r0, r3, asr #3 + mov r0, r1, lsl #1 + strh r2, [r6, r0] + cmp r7, #0x100 + blt _01FFA190 + add r8, r8, #1 + cmp r8, #0x10 + blt _01FF9FAC + mov r7, #0xb0 + mov r8, #0 +_01FFA208: + add r1, r5, r7, lsl #2 + ldrb r0, [r1, #1] + ldrb r1, [r1, #2] + ldrb r2, [r5, r7, lsl #2] + add r0, r4, r0, lsl #2 + add r1, r4, r1, lsl #2 + ldrb r0, [r0, #1] + ldrb r1, [r1, #2] + ldrb r2, [r4, r2, lsl #2] + mul r0, sl, r0 + mul r1, sl, r1 + mul r2, sl, r2 + mov r0, r0, lsr #8 + mov r1, r1, lsr #8 + and r0, r0, #0xff + mov r2, r2, lsr #8 + and r1, r1, #0xff + and r0, r0, #0xf8 + and r2, r2, #0xff + and r1, r1, #0xf8 + mov r0, r0, lsl #2 + and r3, r2, #0xf8 + orr r1, r0, r1, lsl #7 + mov r0, r8 + mov r2, r8 + orr sb, r1, r3, asr #3 + mov r3, r7, lsl #1 + and r1, r7, #0xff + strh sb, [r6, r3] + bl sub_0201BD80 + add r7, r7, #1 + cmp r7, #0xc0 + blt _01FFA208 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} +_01FFA290: + mov r7, #0 +_01FFA294: + add r0, sb, r7 + ldrb r0, [r0, #0x10] + mov r8, #0 + and r4, r7, #0xff + cmp r0, #0 + beq _01FFA304 + mov fp, r8 +_01FFA2B0: + add r1, r8, r7, lsl #8 + add r2, r5, r1, lsl #2 + ldrb r0, [r2, #1] + ldrb ip, [r2, #2] + ldrb r2, [r5, r1, lsl #2] + and r3, r0, #0xf8 + and r0, ip, #0xf8 + mov ip, r3, lsl #2 + and r3, r2, #0xf8 + orr ip, ip, r0, lsl #7 + mov r0, r4 + mov r2, fp + orr r3, ip, r3, asr #3 + mov ip, r1, lsl #1 + and r1, r8, #0xff + strh r3, [r6, ip] + bl sub_0201BD80 + add r8, r8, #1 + cmp r8, #0xf0 + blt _01FFA2B0 + b _01FFA37C +_01FFA304: + mov fp, r8 +_01FFA308: + add r1, r8, r7, lsl #8 + add r2, r5, r1, lsl #2 + ldrb r0, [r2, #1] + ldrb ip, [r2, #2] + ldrb r2, [r5, r1, lsl #2] + mul r3, sl, r0 + mul r0, sl, ip + mul ip, sl, r2 + mov r2, r3, lsr #8 + mov r3, r0, lsr #8 + and r2, r2, #0xff + mov r0, ip, lsr #8 + and r3, r3, #0xff + and r2, r2, #0xf8 + and ip, r0, #0xff + and r0, r3, #0xf8 + mov r2, r2, lsl #2 + and r3, ip, #0xf8 + orr ip, r2, r0, lsl #7 + mov r0, r4 + mov r2, fp + orr r3, ip, r3, asr #3 + mov ip, r1, lsl #1 + and r1, r8, #0xff + strh r3, [r6, ip] + bl sub_0201BD80 + add r8, r8, #1 + cmp r8, #0xf0 + blt _01FFA308 +_01FFA37C: + add r7, r7, #1 + cmp r7, #0x10 + blt _01FFA294 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_01FFA38C: .word ov29_02353530 + arm_func_end sub_01FF9F80 + diff --git a/asm/main_02003DB8.s b/asm/main_02003DB8.s index 2365224d..79b61118 100644 --- a/asm/main_02003DB8.s +++ b/asm/main_02003DB8.s @@ -356,7 +356,7 @@ _02004270: ldr r2, _020047D8 ; =0x00000000 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -366,7 +366,7 @@ _02004294: ldr r2, _020047DC ; =0x0000000A add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -376,7 +376,7 @@ _020042B8: ldr r2, _020047E0 ; =0x00000023 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -386,7 +386,7 @@ _020042DC: ldr r2, _020047E4 ; =0x00000001 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -396,7 +396,7 @@ _02004300: ldr r2, _020047E8 ; =0x00000002 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -406,7 +406,7 @@ _02004324: ldr r2, _020047EC ; =0x00000003 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -416,7 +416,7 @@ _02004348: ldr r2, _020047F0 ; =0x00000006 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -426,7 +426,7 @@ _0200436C: ldr r2, _020047F4 ; =0x00000004 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -436,7 +436,7 @@ _02004390: ldr r2, _020047F8 ; =0x00000005 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -446,7 +446,7 @@ _020043B4: ldr r2, _020047FC ; =0x00000007 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -456,7 +456,7 @@ _020043D8: ldr r2, _02004800 ; =0x00000008 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -466,7 +466,7 @@ _020043FC: ldr r2, _02004804 ; =0x00000009 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -476,7 +476,7 @@ _02004420: ldr r2, _02004808 ; =0x0000000B add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -486,7 +486,7 @@ _02004444: ldr r2, _0200480C ; =0x0000001D add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -496,7 +496,7 @@ _02004468: ldr r2, _02004810 ; =0x00000022 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -506,7 +506,7 @@ _0200448C: ldr r2, _02004814 ; =0x0000000C add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -516,7 +516,7 @@ _020044B0: ldr r2, _02004818 ; =0x0000000D add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -526,7 +526,7 @@ _020044D4: ldr r2, _0200481C ; =0x0000000E add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -536,7 +536,7 @@ _020044F8: ldr r2, _02004820 ; =0x0000000F add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -546,7 +546,7 @@ _0200451C: ldr r2, _02004824 ; =0x00000010 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -556,7 +556,7 @@ _02004540: ldr r2, _02004828 ; =0x00000011 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -566,7 +566,7 @@ _02004564: ldr r2, _0200482C ; =0x00000012 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -576,7 +576,7 @@ _02004588: ldr r2, _02004830 ; =0x00000013 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -586,7 +586,7 @@ _020045AC: ldr r2, _02004834 ; =0x00000014 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -596,7 +596,7 @@ _020045D0: ldr r2, _02004838 ; =0x00000015 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -606,7 +606,7 @@ _020045F4: ldr r2, _0200483C ; =0x00000016 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -616,7 +616,7 @@ _02004618: ldr r2, _02004840 ; =0x00000017 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -626,7 +626,7 @@ _0200463C: ldr r2, _02004844 ; =0x00000018 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -636,7 +636,7 @@ _02004660: ldr r2, _02004848 ; =0x00000019 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -646,7 +646,7 @@ _02004684: ldr r2, _0200484C ; =0x0000001A add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -656,7 +656,7 @@ _020046A8: ldr r2, _02004850 ; =0x0000001B add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -666,7 +666,7 @@ _020046CC: ldr r2, _02004854 ; =0x0000001C add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -676,7 +676,7 @@ _020046F0: ldr r2, _02004858 ; =0x0000001E add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -686,7 +686,7 @@ _02004714: ldr r2, _0200485C ; =0x0000001F add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -696,7 +696,7 @@ _02004738: ldr r2, _02004860 ; =0x00000020 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -706,7 +706,7 @@ _0200475C: ldr r2, _02004864 ; =0x00000021 add r0, sp, #0x10 mov r1, #0 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 bne _020047A0 mov r0, #1 @@ -723,14 +723,14 @@ _02004780: bl Debug_FatalError _020047A0: add r0, sp, #0x10 - bl LoadOverlayInternal + bl FS_LoadOverlayImage cmp r0, #0 bne _020047B8 mov r0, #1 bl CardPullOutWithStatus _020047B8: add r0, sp, #0x10 - bl InitOverlay + bl FS_StartOverlay bl FileRom_StopDataTransfer _020047C4: add sp, sp, #0x3c diff --git a/asm/main_bss_022AB0AC.s b/asm/main_bss_022AB0AC.s index a5a07253..91914a2e 100644 --- a/asm/main_bss_022AB0AC.s +++ b/asm/main_bss_022AB0AC.s @@ -319,14 +319,14 @@ _022BAA20: .global _022BB4E8 _022BB4E8: .space 0x18 - .global _022BB500 -_022BB500: + .global sCallbackTable +sCallbackTable: .space 0x60 .global SNDi_SharedWork SNDi_SharedWork: .space 0x4 - .global _022BB564 -_022BB564: + .global FifoCtrlInit +FifoCtrlInit: .space 0x4 .global _022BB568 _022BB568: @@ -349,8 +349,8 @@ _022BB604: .global _022BB60C _022BB60C: .space 0x8 - .global _022BB614 -_022BB614: + .global fsi_arc_rom +fsi_arc_rom: .space 0x5C .global _022BB670 _022BB670: diff --git a/asm/main_rodata_020A2808.s b/asm/main_rodata_020A2808.s index 6a0f21ed..a58a0d05 100644 --- a/asm/main_rodata_020A2808.s +++ b/asm/main_rodata_020A2808.s @@ -13709,8 +13709,8 @@ _020B2BB0: .global _020B2BB4 _020B2BB4: .byte 0x72, 0x6F, 0x6D, 0x00 - .global _020B2BB8 -_020B2BB8: + .global fsi_digest_key_len +fsi_digest_key_len: .word _020AEC1C .byte 0x40, 0x00, 0x00, 0x00 .global _020B2BC0 @@ -13799,8 +13799,8 @@ _020B2E5C: .byte 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 .byte 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 .byte 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 - .global _020B2E9C -_020B2E9C: + .global sDayOfYear +sDayOfYear: .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0x1F, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00 .byte 0x97, 0x00, 0x00, 0x00, 0xB5, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0xF3, 0x00, 0x00, 0x00 diff --git a/lib/MSL_C/asm/include/main_0207F894.inc b/lib/MSL_C/asm/include/main_0207F894.inc index 5193caf5..7f71ae62 100644 --- a/lib/MSL_C/asm/include/main_0207F894.inc +++ b/lib/MSL_C/asm/include/main_0207F894.inc @@ -2,12 +2,12 @@ .public _02000BC4 .public _020AEC5C .public _020B2BB4 -.public _020B2BB8 +.public fsi_digest_key_len .public _020B2BC0 .public _020B2BC4 .public _020B2C84 .public _020B2D88 -.public _020B2E9C +.public sDayOfYear .public _020B2ED0 .public _020B2ED4 .public _020B2FBC @@ -16,7 +16,7 @@ .public _022BB5FC .public _022BB604 .public _022BB60C -.public _022BB614 +.public fsi_arc_rom .public _022BB670 .public _022BB68C .public _022BB6AC @@ -73,7 +73,7 @@ .public MI_DmaCopy16 .public MI_StopDma .public MIi_UncompressBackward -.public MTi_CardDmaCopy32 +.public MIi_CardDmaCopy32 .public MTi_CpuClear32 .public MTi_CpuClearFast .public MTi_CpuCopy32 diff --git a/lib/NitroSDK/asm/card_rom.s b/lib/NitroSDK/asm/card_rom.s index 97638238..8b25e17a 100644 --- a/lib/NitroSDK/asm/card_rom.s +++ b/lib/NitroSDK/asm/card_rom.s @@ -83,7 +83,7 @@ sub_02083D78: ; 0x02083D78 ldr r2, [r4, #0x20] mov r3, #0x200 ldr r5, _02083DC4 ; =_022BBE20 - bl MTi_CardDmaCopy32 + bl MIi_CardDmaCopy32 ldr r1, [r4, #0x1c] mov r0, r1, lsr #8 orr r0, r0, #0xb7000000 diff --git a/lib/NitroSDK/asm/fs_overlay.s b/lib/NitroSDK/asm/fs_overlay.s index 108df800..8af9caac 100644 --- a/lib/NitroSDK/asm/fs_overlay.s +++ b/lib/NitroSDK/asm/fs_overlay.s @@ -37,7 +37,7 @@ FS_ClearOverlayImage: ; 0x0207FB40 FS_GetOverlayFileID: ; 0x0207FB7C sub sp, sp, #8 ldr r1, [r1, #0x18] - ldr r2, _0207FBA0 ; =_022BB614 + ldr r2, _0207FBA0 ; =fsi_arc_rom str r1, [sp, #4] str r2, [r0] str r2, [sp] @@ -45,7 +45,7 @@ FS_GetOverlayFileID: ; 0x0207FB7C add sp, sp, #8 bx lr .align 2, 0 -_0207FBA0: .word _022BB614 +_0207FBA0: .word fsi_arc_rom arm_func_end FS_GetOverlayFileID arm_func_start FSi_LoadOverlayInfoCore @@ -115,8 +115,8 @@ _0207FC3C: ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} arm_func_end FSi_LoadOverlayInfoCore - arm_func_start GetOverlayInfo -GetOverlayInfo: ; 0x0207FC9C + arm_func_start FS_LoadOverlayInfo +FS_LoadOverlayInfo: ; 0x0207FC9C stmdb sp!, {r3, r4, r5, lr} sub sp, sp, #0x60 movs r4, r1 @@ -163,7 +163,7 @@ GetOverlayInfo: ; 0x0207FC9C ldmia sp!, {r3, r4, r5, pc} _0207FD4C: ldr ip, _0207FD90 ; =0x027FFE50 - ldr r3, _0207FD94 ; =_022BB614 + ldr r3, _0207FD94 ; =fsi_arc_rom ldr r1, [ip] mov r0, r5 str r1, [sp] @@ -181,11 +181,11 @@ _0207FD4C: _0207FD88: .word _022BB604 _0207FD8C: .word _022BB60C _0207FD90: .word 0x027FFE50 -_0207FD94: .word _022BB614 - arm_func_end GetOverlayInfo +_0207FD94: .word fsi_arc_rom + arm_func_end FS_LoadOverlayInfo - arm_func_start LoadOverlayInternal -LoadOverlayInternal: ; 0x0207FD98 + arm_func_start FS_LoadOverlayImage +FS_LoadOverlayImage: ; 0x0207FD98 stmdb sp!, {r3, r4, r5, lr} sub sp, sp, #0x50 mov r5, r0 @@ -223,7 +223,7 @@ _0207FE18: mov r0, #1 add sp, sp, #0x50 ldmia sp!, {r3, r4, r5, pc} - arm_func_end LoadOverlayInternal + arm_func_end FS_LoadOverlayImage arm_func_start FSi_CompareDigest FSi_CompareDigest: ; 0x0207FE28 @@ -236,11 +236,11 @@ FSi_CompareDigest: ; 0x0207FE28 mov r1, #0 mov r2, #0x14 bl MI_CpuFill8 - ldr r2, _0207FEB8 ; =_020B2BB8 + ldr r2, _0207FEB8 ; =fsi_digest_key_len add r1, sp, #4 ldmia r2, {r0, r2} bl MI_CpuCopy8 - ldr r3, _0207FEB8 ; =_020B2BB8 + ldr r3, _0207FEB8 ; =fsi_digest_key_len mov r1, r6 ldr ip, [r3, #4] mov r2, r5 @@ -266,11 +266,11 @@ _0207FEA4: add sp, sp, #0x58 ldmia sp!, {r4, r5, r6, pc} .align 2, 0 -_0207FEB8: .word _020B2BB8 +_0207FEB8: .word fsi_digest_key_len arm_func_end FSi_CompareDigest - arm_func_start InitOverlay -InitOverlay: ; 0x0207FEBC + arm_func_start FS_StartOverlay +FS_StartOverlay: ; 0x0207FEBC stmdb sp!, {r3, r4, r5, lr} mov r5, r0 bl FSi_GetOverlayBinarySize @@ -338,7 +338,7 @@ _0207FFA0: .word 0x027FFC40 _0207FFA4: .word _020B3364 _0207FFA8: .word _020B3364 _0207FFAC: .word 0x66666667 - arm_func_end InitOverlay + arm_func_end FS_StartOverlay arm_func_start FS_EndOverlay FS_EndOverlay: ; 0x0207FFB0 @@ -431,7 +431,7 @@ FS_UnloadOverlay: ; 0x020800B0 mov r2, r1 add r0, sp, #0 mov r1, r3 - bl GetOverlayInfo + bl FS_LoadOverlayInfo cmp r0, #0 beq _020800E4 add r0, sp, #0 diff --git a/lib/NitroSDK/asm/fs_rom.s b/lib/NitroSDK/asm/fs_rom.s index 0081fee4..8306e553 100644 --- a/lib/NitroSDK/asm/fs_rom.s +++ b/lib/NitroSDK/asm/fs_rom.s @@ -108,9 +108,9 @@ FSi_InitRom: ; 0x0207F9DC str r2, [r1, #0x10] str r2, [r1, #0x14] bl CARD_Init - ldr r0, _0207FB00 ; =_022BB614 + ldr r0, _0207FB00 ; =fsi_arc_rom bl FS_InitArchive - ldr r0, _0207FB00 ; =_022BB614 + ldr r0, _0207FB00 ; =fsi_arc_rom ldr r1, _0207FB04 ; =_020B2BB4 mov r2, #3 bl FS_RegisterArchiveName @@ -124,7 +124,7 @@ FSi_InitRom: ; 0x0207F9DC mov ip, #0 str ip, [r3, #0xc] str r2, [r3, #0x10] - ldr r0, _0207FB00 ; =_022BB614 + ldr r0, _0207FB00 ; =fsi_arc_rom ldr r1, _0207FB0C ; =_0207F9D4 str ip, [r3, #0x14] bl FS_SetArchiveProc @@ -134,7 +134,7 @@ FSi_InitRom: ; 0x0207F9DC str r1, [sp, #4] str r0, [sp, #8] ldr ip, _0207FB14 ; =_0207F958 - ldr r0, _0207FB00 ; =_022BB614 + ldr r0, _0207FB00 ; =fsi_arc_rom mov r2, r1 mov r3, r1 str ip, [sp, #0xc] @@ -142,7 +142,7 @@ FSi_InitRom: ; 0x0207F9DC add sp, sp, #0x10 ldmia sp!, {r4, pc} _0207FA94: - ldr r0, _0207FB00 ; =_022BB614 + ldr r0, _0207FB00 ; =fsi_arc_rom ldr r1, _0207FB18 ; =FSi_RomArchiveProc ldr r2, _0207FB1C ; =0x00000602 bl FS_SetArchiveProc @@ -163,14 +163,14 @@ _0207FA94: str r1, [sp, #8] str r0, [sp, #0xc] ldr r3, [r4, #0x20c] - ldr r0, _0207FB00 ; =_022BB614 + ldr r0, _0207FB00 ; =fsi_arc_rom mov r1, #0 bl FS_LoadArchive add sp, sp, #0x10 ldmia sp!, {r4, pc} .align 2, 0 _0207FAFC: .word _022BB5FC -_0207FB00: .word _022BB614 +_0207FB00: .word fsi_arc_rom _0207FB04: .word _020B2BB4 _0207FB08: .word 0x027FFC40 _0207FB0C: .word FSi_EmptyArchiveProc diff --git a/lib/NitroSDK/asm/include/main_0207F894.inc b/lib/NitroSDK/asm/include/main_0207F894.inc index 4ff7d44a..8ee00b15 100644 --- a/lib/NitroSDK/asm/include/main_0207F894.inc +++ b/lib/NitroSDK/asm/include/main_0207F894.inc @@ -2,12 +2,12 @@ .public _02000BC4 .public _020AEC5C .public _020B2BB4 -.public _020B2BB8 +.public fsi_digest_key_len .public _020B2BC0 .public _020B2BC4 .public _020B2C84 .public _020B2D88 -.public _020B2E9C +.public sDayOfYear .public _020B2ED0 .public _020B2ED4 .public _020B2FBC @@ -16,7 +16,7 @@ .public _022BB5FC .public _022BB604 .public _022BB60C -.public _022BB614 +.public fsi_arc_rom .public _022BB670 .public _022BB68C .public _022BB6AC @@ -99,7 +99,7 @@ .public MI_DmaCopy16 .public MI_StopDma .public MIi_UncompressBackward -.public MTi_CardDmaCopy32 +.public MIi_CardDmaCopy32 .public MTi_CpuClear32 .public MTi_CpuClearFast .public MTi_CpuCopy32 diff --git a/lib/NitroSDK/asm/include/mi_memory.inc b/lib/NitroSDK/asm/include/mi_memory.inc index e39c8505..af417d00 100644 --- a/lib/NitroSDK/asm/include/mi_memory.inc +++ b/lib/NitroSDK/asm/include/mi_memory.inc @@ -7,15 +7,15 @@ .public _022B9D00 .public _022BAA20 .public _022BB4E8 -.public _022BB500 -.public _022BB564 +.public sCalllackTable +.public FifoCtrlInit .public _022BB568 .public DC_FlushRange .public DC_InvalidateRange .public DC_StoreRange .public EnableIrqFlag .public FS_InitFile -.public InitDmaTransfer_Standard +.public MIi_DmaSetParams .public MI_CpuCopy8 .public MI_SetWramBank .public MI_StopDma @@ -38,6 +38,6 @@ .public SNDi_SharedWork .public sReserveList .public sSndMutex -.public sub_01FF9B3C +.public MIi_DmaSetParams_wait_noInt .public VolumeTable .public WaitForever2 diff --git a/lib/NitroSDK/asm/include/nitro.inc b/lib/NitroSDK/asm/include/nitro.inc index b11e2918..46240f9e 100644 --- a/lib/NitroSDK/asm/include/nitro.inc +++ b/lib/NitroSDK/asm/include/nitro.inc @@ -7,8 +7,8 @@ .public _022B9D00 .public _022BAA20 .public _022BB4E8 -.public _022BB500 -.public _022BB564 +.public sCallbackTable +.public FifoCtrlInit .public _022BB568 .public DC_FlushRange .public DC_InvalidateRange @@ -16,7 +16,7 @@ .public EnableIrqFlag .public FS_InitFile .public FSi_TranslateCommand -.public InitDmaTransfer_Standard +.public MIi_DmaSetParams .public MI_CpuCopy8 .public MI_SetWramBank .public MI_StopDma @@ -54,6 +54,6 @@ .public Sndi_UnlockMutex .public sReserveList .public sSndMutex -.public sub_01FF9B3C +.public MIi_DmaSetParams_wait_noInt .public VolumeTable .public WaitForever2 diff --git a/lib/NitroSDK/asm/include/os_interrupt.inc b/lib/NitroSDK/asm/include/os_interrupt.inc index c73d2dce..3f192788 100644 --- a/lib/NitroSDK/asm/include/os_interrupt.inc +++ b/lib/NitroSDK/asm/include/os_interrupt.inc @@ -88,6 +88,7 @@ .public MTi_CpuCopy32 .public MTX_LookAt .public MTX_OrthoW +.public OS_DisableIrqMask .public OS_InitReset .public OS_IRQTable .public OS_SleepThread diff --git a/lib/NitroSDK/asm/mi_dma.s b/lib/NitroSDK/asm/mi_dma.s deleted file mode 100644 index 5ce012b1..00000000 --- a/lib/NitroSDK/asm/mi_dma.s +++ /dev/null @@ -1,497 +0,0 @@ - .include "asm/macros.inc" - .include "include/mi_memory.inc" - - .text - - arm_func_start MI_DmaFill32 -MI_DmaFill32: ; 0x0207BC4C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - movs r4, r3 - mov r8, r0 - mov r7, r1 - mov r6, r2 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - add r0, r8, r8, lsl #1 - add r0, r0, #2 - mov r0, r0, lsl #2 - add r0, r0, #0xb0 - add r5, r0, #0x4000000 -_0207BC78: - ldr r0, [r5] - tst r0, #0x80000000 - bne _0207BC78 - bl EnableIrqFlag - mov r2, r8, lsl #2 - add r1, r2, #0xe0 - mov r3, r4, lsr #2 - mov r4, r0 - add ip, r2, #0x4000000 - mov r0, r8 - mov r2, r7 - add r1, r1, #0x4000000 - orr r3, r3, #0x85000000 - str r6, [ip, #0xe0] - bl sub_01FF9B3C - mov r0, r4 - bl SetIrqFlag -_0207BCBC: - ldr r0, [r5] - tst r0, #0x80000000 - bne _0207BCBC - ldmia sp!, {r4, r5, r6, r7, r8, pc} - arm_func_end MI_DmaFill32 - - arm_func_start MI_DmaCopy32 -MI_DmaCopy32: ; 0x0207BCCC - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r5, r3 - mov r6, r2 - mov r2, r5 - mov r3, #0 - mov r8, r0 - mov r7, r1 - bl MIi_CheckDma0SourceAddress - cmp r5, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - add r0, r8, r8, lsl #1 - add r0, r0, #2 - mov r0, r0, lsl #2 - add r0, r0, #0xb0 - add r4, r0, #0x4000000 -_0207BD08: - ldr r0, [r4] - tst r0, #0x80000000 - bne _0207BD08 - mov r3, r5, lsr #2 - mov r0, r8 - mov r1, r7 - mov r2, r6 - orr r3, r3, #0x84000000 - bl MIi_DmaSetParams_Wait -_0207BD2C: - ldr r0, [r4] - tst r0, #0x80000000 - bne _0207BD2C - ldmia sp!, {r4, r5, r6, r7, r8, pc} - arm_func_end MI_DmaCopy32 - - arm_func_start MI_DmaCopy16 -MI_DmaCopy16: ; 0x0207BD3C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - movs r5, r3 - mov r8, r0 - mov r7, r1 - mov r6, r2 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - mov r2, r5 - mov r3, #0 - bl MIi_CheckDma0SourceAddress - add r0, r8, r8, lsl #1 - add r0, r0, #2 - mov r0, r0, lsl #2 - add r0, r0, #0xb0 - add r4, r0, #0x4000000 -_0207BD74: - ldr r0, [r4] - tst r0, #0x80000000 - bne _0207BD74 - mov r3, r5, lsr #1 - mov r0, r8 - mov r1, r7 - mov r2, r6 - orr r3, r3, #0x80000000 - bl MIi_DmaSetParams_Wait -_0207BD98: - ldr r0, [r4] - tst r0, #0x80000000 - bne _0207BD98 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - arm_func_end MI_DmaCopy16 - - arm_func_start MI_DmaFill32Async -MI_DmaFill32Async: ; 0x0207BDA8 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - movs r4, r3 - mov r7, r0 - mov r6, r1 - mov r5, r2 - ldr r8, [sp, #0x18] - bne _0207BDD8 - cmp r8, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - ldr r0, [sp, #0x1c] - blx r8 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0207BDD8: - bl MI_WaitDma - cmp r8, #0 - beq _0207BE30 - ldr r2, [sp, #0x1c] - mov r0, r7 - mov r1, r8 - bl OSi_EnterDmaCallback - bl EnableIrqFlag - mov r3, r4, lsr #2 - mov r2, r7, lsl #2 - add r1, r2, #0xe0 - add r2, r2, #0x4000000 - str r5, [r2, #0xe0] - mov r4, r0 - mov r0, r7 - mov r2, r6 - add r1, r1, #0x4000000 - orr r3, r3, #0xc5000000 - bl MIi_DmaSetParams_NoInt - mov r0, r4 - bl SetIrqFlag - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0207BE30: - bl EnableIrqFlag - mov r2, r7, lsl #2 - add r1, r2, #0xe0 - mov r3, r4, lsr #2 - mov r4, r0 - add ip, r2, #0x4000000 - mov r0, r7 - mov r2, r6 - add r1, r1, #0x4000000 - orr r3, r3, #0x85000000 - str r5, [ip, #0xe0] - bl MIi_DmaSetParams_NoInt - mov r0, r4 - bl SetIrqFlag - ldmia sp!, {r4, r5, r6, r7, r8, pc} - arm_func_end MI_DmaFill32Async - - arm_func_start MI_DmaCopy32Async -MI_DmaCopy32Async: ; 0x0207BE6C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r5, r3 - mov r6, r2 - mov r2, r5 - mov r3, #0 - mov r8, r0 - mov r7, r1 - ldr r4, [sp, #0x18] - bl MIi_CheckDma0SourceAddress - cmp r5, #0 - bne _0207BEAC - cmp r4, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - ldr r0, [sp, #0x1c] - blx r4 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0207BEAC: - mov r0, r8 - bl MI_WaitDma - cmp r4, #0 - beq _0207BEE8 - ldr r2, [sp, #0x1c] - mov r0, r8 - mov r1, r4 - bl OSi_EnterDmaCallback - mov r3, r5, lsr #2 - mov r0, r8 - mov r1, r7 - mov r2, r6 - orr r3, r3, #0xc4000000 - bl InitDmaTransfer_Standard - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0207BEE8: - mov r3, r5, lsr #2 - mov r0, r8 - mov r1, r7 - mov r2, r6 - orr r3, r3, #0x84000000 - bl InitDmaTransfer_Standard - ldmia sp!, {r4, r5, r6, r7, r8, pc} - arm_func_end MI_DmaCopy32Async - - arm_func_start MI_DmaSend32Async -MI_DmaSend32Async: ; 0x0207BF04 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r5, r3 - mov r6, r2 - mov r2, r5 - mov r3, #0 - mov r8, r0 - mov r7, r1 - ldr r4, [sp, #0x18] - bl MIi_CheckDma0SourceAddress - cmp r5, #0 - bne _0207BF44 - cmp r4, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - ldr r0, [sp, #0x1c] - blx r4 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0207BF44: - mov r0, r8 - bl MI_WaitDma - cmp r4, #0 - beq _0207BF84 - ldr r2, [sp, #0x1c] - mov r0, r8 - mov r1, r4 - bl OSi_EnterDmaCallback - mov r3, #0x3bc00000 - rsb r3, r3, #0 - mov r0, r8 - mov r1, r7 - mov r2, r6 - orr r3, r3, r5, lsr #2 - bl InitDmaTransfer_Standard - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0207BF84: - ldr r3, _0207BFA0 ; =0x84400000 - mov r0, r8 - mov r1, r7 - mov r2, r6 - orr r3, r3, r5, lsr #2 - bl InitDmaTransfer_Standard - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_0207BFA0: .word 0x84400000 - arm_func_end MI_DmaSend32Async - - arm_func_start MI_DmaCopy16Async -MI_DmaCopy16Async: ; 0x0207BFA4 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r5, r3 - mov r6, r2 - mov r2, r5 - mov r3, #0 - mov r8, r0 - mov r7, r1 - ldr r4, [sp, #0x18] - bl MIi_CheckDma0SourceAddress - cmp r5, #0 - bne _0207BFE4 - cmp r4, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - ldr r0, [sp, #0x1c] - blx r4 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0207BFE4: - mov r0, r8 - bl MI_WaitDma - cmp r4, #0 - beq _0207C020 - ldr r2, [sp, #0x1c] - mov r0, r8 - mov r1, r4 - bl OSi_EnterDmaCallback - mov r3, r5, lsr #1 - mov r0, r8 - mov r1, r7 - mov r2, r6 - orr r3, r3, #0xc0000000 - bl InitDmaTransfer_Standard - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0207C020: - mov r3, r5, lsr #1 - mov r0, r8 - mov r1, r7 - mov r2, r6 - orr r3, r3, #0x80000000 - bl InitDmaTransfer_Standard - ldmia sp!, {r4, r5, r6, r7, r8, pc} - arm_func_end MI_DmaCopy16Async - - arm_func_start MI_DmaSend16Async -MI_DmaSend16Async: ; 0x0207C03C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r5, r3 - mov r6, r2 - mov r2, r5 - mov r3, #0 - mov r8, r0 - mov r7, r1 - ldr r4, [sp, #0x18] - bl MIi_CheckDma0SourceAddress - cmp r5, #0 - bne _0207C07C - cmp r4, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - ldr r0, [sp, #0x1c] - blx r4 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0207C07C: - mov r0, r8 - bl MI_WaitDma - cmp r4, #0 - beq _0207C0BC - ldr r2, [sp, #0x1c] - mov r0, r8 - mov r1, r4 - bl OSi_EnterDmaCallback - mov r3, #0x3fc00000 - rsb r3, r3, #0 - mov r0, r8 - mov r1, r7 - mov r2, r6 - orr r3, r3, r5, lsr #1 - bl InitDmaTransfer_Standard - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0207C0BC: - ldr r3, _0207C0D8 ; =0x80400000 - mov r0, r8 - mov r1, r7 - mov r2, r6 - orr r3, r3, r5, lsr #1 - bl InitDmaTransfer_Standard - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_0207C0D8: .word 0x80400000 - arm_func_end MI_DmaSend16Async - - arm_func_start MI_IsDmaBusy -MI_IsDmaBusy: ; 0x0207C0DC - add r0, r0, r0, lsl #1 - add r0, r0, #2 - mov r0, r0, lsl #2 - add r0, r0, #0x4000000 - ldr r0, [r0, #0xb0] - and r0, r0, #0x80000000 - mov r0, r0, lsr #0x1f - bx lr - arm_func_end MI_IsDmaBusy - - arm_func_start MI_WaitDma -MI_WaitDma: ; 0x0207C0FC - stmdb sp!, {r4, lr} - mov r4, r0 - bl EnableIrqFlag - add r1, r4, r4, lsl #1 - add r1, r1, #2 - mov r1, r1, lsl #2 - add r1, r1, #0xb0 - add r2, r1, #0x4000000 -_0207C11C: - ldr r1, [r2] - tst r1, #0x80000000 - bne _0207C11C - cmp r4, #0 - bne _0207C158 - mov r1, #0xc - mul r2, r4, r1 - add r1, r2, #0xb0 - add r2, r2, #0x4000000 - mov r3, #0 - str r3, [r2, #0xb0] - add r2, r1, #0x4000000 - ldr r1, _0207C160 ; =0x81400001 - str r3, [r2, #4] - str r1, [r2, #8] -_0207C158: - bl SetIrqFlag - ldmia sp!, {r4, pc} - .align 2, 0 -_0207C160: .word 0x81400001 - arm_func_end MI_WaitDma - - arm_func_start MI_StopDma -MI_StopDma: ; 0x0207C164 - stmdb sp!, {r4, lr} - mov r4, r0 - bl EnableIrqFlag - mov r1, #6 - mul r1, r4, r1 - add r1, r1, #5 - mov r1, r1, lsl #1 - add r1, r1, #0x4000000 - ldrh r2, [r1, #0xb0] - cmp r4, #0 - bic r2, r2, #0x3a00 - strh r2, [r1, #0xb0] - ldrh r2, [r1, #0xb0] - bic r2, r2, #0x8000 - strh r2, [r1, #0xb0] - ldrh r2, [r1, #0xb0] - ldrh r1, [r1, #0xb0] - bne _0207C1D4 - mov r1, #0xc - mul r2, r4, r1 - add r1, r2, #0xb0 - add r2, r2, #0x4000000 - mov r3, #0 - str r3, [r2, #0xb0] - add r2, r1, #0x4000000 - ldr r1, _0207C1DC ; =0x81400001 - str r3, [r2, #4] - str r1, [r2, #8] -_0207C1D4: - bl SetIrqFlag - ldmia sp!, {r4, pc} - .align 2, 0 -_0207C1DC: .word 0x81400001 - arm_func_end MI_StopDma - - arm_func_start MIi_CheckAnotherAutoDma -MIi_CheckAnotherAutoDma: ; 0x0207C1E0 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - ldr r5, _0207C260 ; =0x040000B8 - mov r7, r0 - mov r6, r1 - mov r4, #0 -_0207C1F4: - cmp r4, r7 - beq _0207C24C - ldr r0, [r5] - tst r0, #0x80000000 - andne r0, r0, #0x38000000 - cmpne r0, r6 - beq _0207C24C - cmp r0, #0x8000000 - cmpeq r6, #0x10000000 - beq _0207C24C - cmp r0, #0x10000000 - cmpeq r6, #0x8000000 - beq _0207C24C - cmp r0, #0x18000000 - cmpne r0, #0x20000000 - cmpne r0, #0x28000000 - cmpne r0, #0x30000000 - cmpne r0, #0x38000000 - cmpne r0, #0x8000000 - cmpne r0, #0x10000000 - bne _0207C24C - bl WaitForever2 -_0207C24C: - add r4, r4, #1 - cmp r4, #3 - add r5, r5, #0xc - blt _0207C1F4 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_0207C260: .word 0x040000B8 - arm_func_end MIi_CheckAnotherAutoDma - - arm_func_start MIi_CheckDma0SourceAddress -MIi_CheckDma0SourceAddress: ; 0x0207C264 - stmdb sp!, {r3, lr} - cmp r0, #0 - ldmneia sp!, {r3, pc} - cmp r3, #0 - and ip, r1, #0xff000000 - beq _0207C288 - cmp r3, #0x800000 - subeq r1, r1, r2 - b _0207C28C -_0207C288: - add r1, r1, r2 -_0207C28C: - cmp ip, #0x4000000 - and r0, r1, #0xff000000 - beq _0207C2B0 - cmp ip, #0x8000000 - bhs _0207C2B0 - cmp r0, #0x4000000 - beq _0207C2B0 - cmp r0, #0x8000000 - ldmloia sp!, {r3, pc} -_0207C2B0: - bl WaitForever2 - ldmia sp!, {r3, pc} - arm_func_end MIi_CheckDma0SourceAddress - diff --git a/lib/NitroSDK/asm/mi_dma_card.s b/lib/NitroSDK/asm/mi_dma_card.s deleted file mode 100644 index fd6c908d..00000000 --- a/lib/NitroSDK/asm/mi_dma_card.s +++ /dev/null @@ -1,43 +0,0 @@ - .include "asm/macros.inc" - - .text - - .public MIi_CheckAnotherAutoDma - .public MIi_CheckDma0SourceAddress - .public InitDmaTransfer_Standard - - arm_func_start MTi_CardDmaCopy32 ; -MTi_CardDmaCopy32: ; 0x0207C750 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r5, r1 - mov r6, r0 - mov r7, r3 - mvn r1, #0 - mov r4, r2 - bl MIi_CheckAnotherAutoDma - mov r0, r6 - mov r1, r5 - mov r2, r7 - mov r3, #0x1000000 - bl MIi_CheckDma0SourceAddress - cmp r7, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - add r0, r6, r6, lsl #1 - add r0, r0, #2 - mov r0, r0, lsl #2 - add r0, r0, #0xb0 - add r1, r0, #0x4000000 -_0207C79C: - ldr r0, [r1] - tst r0, #0x80000000 - bne _0207C79C - ldr r3, _0207C7C0 ; =0xAF000001 - mov r0, r6 - mov r1, r5 - mov r2, r4 - bl InitDmaTransfer_Standard - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_0207C7C0: .word 0xAF000001 - arm_func_end MTi_CardDmaCopy32 - diff --git a/lib/NitroSDK/asm/os_interrupt.s b/lib/NitroSDK/asm/os_interrupt.s index 63223e89..317830f9 100644 --- a/lib/NitroSDK/asm/os_interrupt.s +++ b/lib/NitroSDK/asm/os_interrupt.s @@ -3,159 +3,6 @@ .text - arm_func_start OS_WaitIrq -OS_WaitIrq: ; 0x02078900 - stmdb sp!, {r4, r5, r6, lr} - mov r5, r0 - mov r4, r1 - bl EnableIrqFlag - cmp r5, #0 - beq _02078930 - ldr r1, _0207896C ; =OS_IRQTable - mvn r2, r4 - add r1, r1, #0x3000 - ldr r3, [r1, #0xff8] - and r2, r3, r2 - str r2, [r1, #0xff8] -_02078930: - bl SetIrqFlag - ldr r1, _0207896C ; =OS_IRQTable - add r0, r1, #0x3000 - ldr r0, [r0, #0xff8] - tst r4, r0 - ldmneia sp!, {r4, r5, r6, pc} - add r0, r1, #0x3f8 - ldr r5, _02078970 ; =DTCM_BSS - add r6, r0, #0x3c00 -_02078954: - mov r0, r5 - bl OS_SleepThread - ldr r0, [r6] - tst r4, r0 - beq _02078954 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0207896C: .word OS_IRQTable -_02078970: .word DTCM_BSS - arm_func_end OS_WaitIrq - - arm_func_start OS_IrqDummy -OS_IrqDummy: ; 0x02078974 - bx lr - arm_func_end OS_IrqDummy - - arm_func_start OSi_IrqCallback -OSi_IrqCallback: ; 0x02078978 - stmdb sp!, {r3, r4, r5, lr} - mov r1, #0xc - mul r5, r0, r1 - ldr r2, _020789EC ; =_022B95E4 - ldr r3, _020789F0 ; =_020B2B9C - mov r4, r0, lsl #1 - ldr r1, [r2, r5] - mov r0, #0 - ldrh r3, [r3, r4] - mov r4, #1 - str r0, [r2, r5] - cmp r1, #0 - mov r4, r4, lsl r3 - beq _020789BC - ldr r0, _020789F4 ; =_022B95EC - ldr r0, [r0, r5] - blx r1 -_020789BC: - ldr r0, _020789F8 ; =OS_IRQTable - ldr r1, _020789FC ; =_022B95E8 - add r0, r0, #0x3000 - ldr r2, [r0, #0xff8] - ldr r1, [r1, r5] - orr r2, r2, r4 - str r2, [r0, #0xff8] - cmp r1, #0 - ldmneia sp!, {r3, r4, r5, pc} - mov r0, r4 - bl OS_DisableIrqMask - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_020789EC: .word _022B95E4 -_020789F0: .word _020B2B9C -_020789F4: .word _022B95EC -_020789F8: .word OS_IRQTable -_020789FC: .word _022B95E8 - arm_func_end OSi_IrqCallback - - arm_func_start OSi_IrqDma0 -OSi_IrqDma0: ; 0x02078A00 - ldr ip, _02078A0C ; =OSi_IrqCallback - mov r0, #0 - bx ip - .align 2, 0 -_02078A0C: .word OSi_IrqCallback - arm_func_end OSi_IrqDma0 - - arm_func_start OSi_IrqDma1 -OSi_IrqDma1: ; 0x02078A10 - ldr ip, _02078A1C ; =OSi_IrqCallback - mov r0, #1 - bx ip - .align 2, 0 -_02078A1C: .word OSi_IrqCallback - arm_func_end OSi_IrqDma1 - - arm_func_start OSi_IrqDma2 -OSi_IrqDma2: ; 0x02078A20 - ldr ip, _02078A2C ; =OSi_IrqCallback - mov r0, #2 - bx ip - .align 2, 0 -_02078A2C: .word OSi_IrqCallback - arm_func_end OSi_IrqDma2 - - arm_func_start OSi_IrqDma3 -OSi_IrqDma3: ; 0x02078A30 - ldr ip, _02078A3C ; =OSi_IrqCallback - mov r0, #3 - bx ip - .align 2, 0 -_02078A3C: .word OSi_IrqCallback - arm_func_end OSi_IrqDma3 - - arm_func_start OSi_IrqTimer0 -OSi_IrqTimer0: ; 0x02078A40 - ldr ip, _02078A4C ; =OSi_IrqCallback - mov r0, #4 - bx ip - .align 2, 0 -_02078A4C: .word OSi_IrqCallback - arm_func_end OSi_IrqTimer0 - - arm_func_start OSi_IrqTimer1 -OSi_IrqTimer1: ; 0x02078A50 - ldr ip, _02078A5C ; =OSi_IrqCallback - mov r0, #5 - bx ip - .align 2, 0 -_02078A5C: .word OSi_IrqCallback - arm_func_end OSi_IrqTimer1 - - arm_func_start OSi_IrqTimer2 -OSi_IrqTimer2: ; 0x02078A60 - ldr ip, _02078A6C ; =OSi_IrqCallback - mov r0, #6 - bx ip - .align 2, 0 -_02078A6C: .word OSi_IrqCallback - arm_func_end OSi_IrqTimer2 - - arm_func_start OSi_IrqTimer3 -OSi_IrqTimer3: ; 0x02078A70 - ldr ip, _02078A7C ; =OSi_IrqCallback - mov r0, #7 - bx ip - .align 2, 0 -_02078A7C: .word OSi_IrqCallback - arm_func_end OSi_IrqTimer3 - arm_func_start OS_InitIrqTable OS_InitIrqTable: ; 0x02078A80 ldr r0, _02078A94 ; =DTCM_BSS diff --git a/lib/NitroSDK/asm/os_irqHandler.s b/lib/NitroSDK/asm/os_irqHandler.s new file mode 100644 index 00000000..644735a0 --- /dev/null +++ b/lib/NitroSDK/asm/os_irqHandler.s @@ -0,0 +1,41 @@ + .include "asm/macros.inc" + .include "include/os_interrupt.inc" + + .text + + arm_func_start OS_WaitIrq +OS_WaitIrq: ; 0x02078900 + stmdb sp!, {r4, r5, r6, lr} + mov r5, r0 + mov r4, r1 + bl EnableIrqFlag + cmp r5, #0 + beq _02078930 + ldr r1, _0207896C ; =OS_IRQTable + mvn r2, r4 + add r1, r1, #0x3000 + ldr r3, [r1, #0xff8] + and r2, r3, r2 + str r2, [r1, #0xff8] +_02078930: + bl SetIrqFlag + ldr r1, _0207896C ; =OS_IRQTable + add r0, r1, #0x3000 + ldr r0, [r0, #0xff8] + tst r4, r0 + ldmneia sp!, {r4, r5, r6, pc} + add r0, r1, #0x3f8 + ldr r5, _02078970 ; =DTCM_BSS + add r6, r0, #0x3c00 +_02078954: + mov r0, r5 + bl OS_SleepThread + ldr r0, [r6] + tst r4, r0 + beq _02078954 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_0207896C: .word OS_IRQTable +_02078970: .word DTCM_BSS + arm_func_end OS_WaitIrq + diff --git a/lib/NitroSDK/asm/os_irqTable.s b/lib/NitroSDK/asm/os_irqTable.s new file mode 100644 index 00000000..4d350748 --- /dev/null +++ b/lib/NitroSDK/asm/os_irqTable.s @@ -0,0 +1,122 @@ + .include "asm/macros.inc" + .include "include/os_interrupt.inc" + + .text + + arm_func_start OS_IrqDummy +OS_IrqDummy: ; 0x02078974 + bx lr + arm_func_end OS_IrqDummy + + arm_func_start OSi_IrqCallback +OSi_IrqCallback: ; 0x02078978 + stmdb sp!, {r3, r4, r5, lr} + mov r1, #0xc + mul r5, r0, r1 + ldr r2, _020789EC ; =_022B95E4 + ldr r3, _020789F0 ; =_020B2B9C + mov r4, r0, lsl #1 + ldr r1, [r2, r5] + mov r0, #0 + ldrh r3, [r3, r4] + mov r4, #1 + str r0, [r2, r5] + cmp r1, #0 + mov r4, r4, lsl r3 + beq _020789BC + ldr r0, _020789F4 ; =_022B95EC + ldr r0, [r0, r5] + blx r1 +_020789BC: + ldr r0, _020789F8 ; =OS_IRQTable + ldr r1, _020789FC ; =_022B95E8 + add r0, r0, #0x3000 + ldr r2, [r0, #0xff8] + ldr r1, [r1, r5] + orr r2, r2, r4 + str r2, [r0, #0xff8] + cmp r1, #0 + ldmneia sp!, {r3, r4, r5, pc} + mov r0, r4 + bl OS_DisableIrqMask + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_020789EC: .word _022B95E4 +_020789F0: .word _020B2B9C +_020789F4: .word _022B95EC +_020789F8: .word OS_IRQTable +_020789FC: .word _022B95E8 + arm_func_end OSi_IrqCallback + + arm_func_start OSi_IrqDma0 +OSi_IrqDma0: ; 0x02078A00 + ldr ip, _02078A0C ; =OSi_IrqCallback + mov r0, #0 + bx ip + .align 2, 0 +_02078A0C: .word OSi_IrqCallback + arm_func_end OSi_IrqDma0 + + arm_func_start OSi_IrqDma1 +OSi_IrqDma1: ; 0x02078A10 + ldr ip, _02078A1C ; =OSi_IrqCallback + mov r0, #1 + bx ip + .align 2, 0 +_02078A1C: .word OSi_IrqCallback + arm_func_end OSi_IrqDma1 + + arm_func_start OSi_IrqDma2 +OSi_IrqDma2: ; 0x02078A20 + ldr ip, _02078A2C ; =OSi_IrqCallback + mov r0, #2 + bx ip + .align 2, 0 +_02078A2C: .word OSi_IrqCallback + arm_func_end OSi_IrqDma2 + + arm_func_start OSi_IrqDma3 +OSi_IrqDma3: ; 0x02078A30 + ldr ip, _02078A3C ; =OSi_IrqCallback + mov r0, #3 + bx ip + .align 2, 0 +_02078A3C: .word OSi_IrqCallback + arm_func_end OSi_IrqDma3 + + arm_func_start OSi_IrqTimer0 +OSi_IrqTimer0: ; 0x02078A40 + ldr ip, _02078A4C ; =OSi_IrqCallback + mov r0, #4 + bx ip + .align 2, 0 +_02078A4C: .word OSi_IrqCallback + arm_func_end OSi_IrqTimer0 + + arm_func_start OSi_IrqTimer1 +OSi_IrqTimer1: ; 0x02078A50 + ldr ip, _02078A5C ; =OSi_IrqCallback + mov r0, #5 + bx ip + .align 2, 0 +_02078A5C: .word OSi_IrqCallback + arm_func_end OSi_IrqTimer1 + + arm_func_start OSi_IrqTimer2 +OSi_IrqTimer2: ; 0x02078A60 + ldr ip, _02078A6C ; =OSi_IrqCallback + mov r0, #6 + bx ip + .align 2, 0 +_02078A6C: .word OSi_IrqCallback + arm_func_end OSi_IrqTimer2 + + arm_func_start OSi_IrqTimer3 +OSi_IrqTimer3: ; 0x02078A70 + ldr ip, _02078A7C ; =OSi_IrqCallback + mov r0, #7 + bx ip + .align 2, 0 +_02078A7C: .word OSi_IrqCallback + arm_func_end OSi_IrqTimer3 + diff --git a/lib/NitroSDK/asm/pxi_fifo.s b/lib/NitroSDK/asm/pxi_fifo.s index 301f2fce..dafb7231 100644 --- a/lib/NitroSDK/asm/pxi_fifo.s +++ b/lib/NitroSDK/asm/pxi_fifo.s @@ -7,7 +7,7 @@ PXI_InitFifo: ; 0x0207D9B0 stmdb sp!, {r3, r4, r5, lr} bl EnableIrqFlag - ldr r1, _0207DA94 ; =_022BB564 + ldr r1, _0207DA94 ; =FifoCtrlInit mov r4, r0 ldrh r0, [r1] cmp r0, #0 @@ -69,7 +69,7 @@ _0207DA88: bl SetIrqFlag ldmia sp!, {r3, r4, r5, pc} .align 2, 0 -_0207DA94: .word _022BB564 +_0207DA94: .word FifoCtrlInit _0207DA98: .word 0x027FFC00 _0207DA9C: .word _022BB568 _0207DAA0: .word 0x0000C408 diff --git a/lib/NitroSDK/asm/rtc_convert.s b/lib/NitroSDK/asm/rtc_convert.s index 06ca5f4a..ed2213ef 100644 --- a/lib/NitroSDK/asm/rtc_convert.s +++ b/lib/NitroSDK/asm/rtc_convert.s @@ -29,7 +29,7 @@ _02082F80: mvn r0, #0 bx lr _02082F88: - ldr r0, _02082FBC ; =_020B2E9C + ldr r0, _02082FBC ; =sDayOfYear sub r1, r1, #1 ldr r0, [r0, r2, lsl #2] cmp r2, #3 @@ -44,7 +44,7 @@ _02082FA8: add r0, r0, r1, lsr #2 bx lr .align 2, 0 -_02082FBC: .word _020B2E9C +_02082FBC: .word sDayOfYear _02082FC0: .word 0x0000016D arm_func_end Rtc_ConvertDateToDay diff --git a/lib/NitroSDK/asm/snd_alarm.s b/lib/NitroSDK/asm/snd_alarm.s deleted file mode 100644 index 0d615b3b..00000000 --- a/lib/NitroSDK/asm/snd_alarm.s +++ /dev/null @@ -1,75 +0,0 @@ - .include "asm/macros.inc" - .include "include/nitro.inc" - - .text - - arm_func_start Snd_AlarmInit -Snd_AlarmInit: ; 0x0207D380 - mov r1, #0 - ldr r2, _0207D3AC ; =_022BB500 - mov r0, r1 -_0207D38C: - str r0, [r2] - str r0, [r2, #4] - add r1, r1, #1 - strb r0, [r2, #8] - cmp r1, #8 - add r2, r2, #0xc - blt _0207D38C - bx lr - .align 2, 0 -_0207D3AC: .word _022BB500 - arm_func_end Snd_AlarmInit - - arm_func_start Sndi_IncAlarmId -Sndi_IncAlarmId: ; 0x0207D3B0 - ldr r2, _0207D3CC ; =_022BB500 - mov r1, #0xc - mla r1, r0, r1, r2 - ldrb r0, [r1, #8] - add r0, r0, #1 - strb r0, [r1, #8] - bx lr - .align 2, 0 -_0207D3CC: .word _022BB500 - arm_func_end Sndi_IncAlarmId - - arm_func_start Sndi_SetAlarmHandler -Sndi_SetAlarmHandler: ; 0x0207D3D0 - mov r3, #0xc - mul r3, r0, r3 - ldr r0, _0207D3FC ; =_022BB500 - str r1, [r0, r3] - add r1, r0, r3 - str r2, [r1, #4] - ldrb r0, [r1, #8] - add r0, r0, #1 - strb r0, [r1, #8] - and r0, r0, #0xff - bx lr - .align 2, 0 -_0207D3FC: .word _022BB500 - arm_func_end Sndi_SetAlarmHandler - - arm_func_start Sndi_CallAlarmHandler -Sndi_CallAlarmHandler: ; 0x0207D400 - stmdb sp!, {r3, lr} - ldr r3, _0207D440 ; =_022BB500 - and r2, r0, #0xff - mov r1, #0xc - mla r3, r2, r1, r3 - mov r1, r0, asr #8 - ldrb r0, [r3, #8] - and r1, r1, #0xff - cmp r1, r0 - ldmneia sp!, {r3, pc} - ldr r1, [r3] - cmp r1, #0 - ldmeqia sp!, {r3, pc} - ldr r0, [r3, #4] - blx r1 - ldmia sp!, {r3, pc} - .align 2, 0 -_0207D440: .word _022BB500 - arm_func_end Sndi_CallAlarmHandler - diff --git a/lib/NitroSDK/src/mi/mi_dma.c b/lib/NitroSDK/src/mi/mi_dma.c new file mode 100644 index 00000000..e6236f25 --- /dev/null +++ b/lib/NitroSDK/src/mi/mi_dma.c @@ -0,0 +1,489 @@ +#include + +#ifdef SDK_ARM9 + #include + + void MIi_DmaSetParams (u32 dmaNo, u32 src, u32 dest, u32 ctrl) + { + OSIntrMode enabled = EnableIrqFlag(); + vu32 * p = (vu32 *)((u32)REG_DMA0SAD_ADDR + dmaNo * 12); + *p = (vu32)src; + *(p + 1) = (vu32)dest; + *(p + 2) = (vu32)ctrl; + (void)SetIrqFlag(enabled); + } + + void MIi_DmaSetParams_Wait (u32 dmaNo, u32 src, u32 dest, u32 ctrl) + { + OSIntrMode enabled = EnableIrqFlag(); + vu32 * p = (vu32 *)((u32)REG_DMA0SAD_ADDR + dmaNo * 12); + *p = (vu32)src; + *(p + 1) = (vu32)dest; + *(p + 2) = (vu32)ctrl; + + { + u32 dummy = reg_MI_DMA0SAD; + } + { + u32 dummy = reg_MI_DMA0SAD; + } + + if (dmaNo == MIi_DUMMY_DMA_NO) { + *p = (vu32)MIi_DUMMY_SRC; + *(p + 1) = (vu32)MIi_DUMMY_DEST; + *(p + 2) = (vu32)MIi_DUMMY_CNT; + } + + (void)SetIrqFlag(enabled); + } + + void MIi_DmaSetParams_NoInt (u32 dmaNo, u32 src, u32 dest, u32 ctrl) + { + vu32 * p = (vu32 *)((u32)REG_DMA0SAD_ADDR + dmaNo * 12); + *p = (vu32)src; + *(p + 1) = (vu32)dest; + *(p + 2) = (vu32)ctrl; + } + + void MIi_DmaSetParams_wait_noInt (u32 dmaNo, u32 src, u32 dest, u32 ctrl) + { + vu32 * p = (vu32 *)((u32)REG_DMA0SAD_ADDR + dmaNo * 12); + *p = (vu32)src; + *(p + 1) = (vu32)dest; + *(p + 2) = (vu32)ctrl; + + { + u32 dummy = reg_MI_DMA0SAD; + } + { + u32 dummy = reg_MI_DMA0SAD; + } + + if (dmaNo == MIi_DUMMY_DMA_NO) { + *p = (vu32)MIi_DUMMY_SRC; + *(p + 1) = (vu32)MIi_DUMMY_DEST; + *(p + 2) = (vu32)MIi_DUMMY_CNT; + } + + { + u32 dummy = reg_MI_DMA0SAD; + } + { + u32 dummy = reg_MI_DMA0SAD; + } + } + + #include +#endif + +void MI_DmaFill32 (u32 dmaNo, void * dest, u32 data, u32 size) +{ + vu32 * dmaCntp; + + MIi_ASSERT_DMANO(dmaNo); + MIi_ASSERT_MUL4(size); + MIi_ASSERT_SIZE(dmaNo, size / 4); + MIi_ASSERT_DEST_ALIGN4(dest); + MIi_WARNING_ADDRINTCM(dest, size); + + if (size == 0) { + return; + } + + MIi_Wait_BeforeDMA(dmaCntp, dmaNo); + MIi_DmaSetParams_wait_src32(dmaNo, data, (u32)dest, MI_CNT_CLEAR32(size)); + MIi_Wait_AfterDMA(dmaCntp); +} + +void MI_DmaCopy32 (u32 dmaNo, const void * src, void * dest, u32 size) +{ + vu32 * dmaCntp; + + MIi_ASSERT_DMANO(dmaNo); + MIi_ASSERT_MUL4(size); + MIi_ASSERT_SIZE(dmaNo, size / 4); + MIi_ASSERT_SRC_ALIGN4(src); + MIi_ASSERT_DEST_ALIGN4(dest); + MIi_WARNING_ADDRINTCM(src, size); + MIi_WARNING_ADDRINTCM(dest, size); + + MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC); + + if (size == 0) { + return; + } + + MIi_Wait_BeforeDMA(dmaCntp, dmaNo); + MIi_DmaSetParams_Wait(dmaNo, (u32)src, (u32)dest, MI_CNT_COPY32(size)); + MIi_Wait_AfterDMA(dmaCntp); +} + +// void MI_DmaSend32 (u32 dmaNo, const void * src, volatile void * dest, u32 size) +// { +// vu32 * dmaCntp; +// +// MIi_ASSERT_DMANO(dmaNo); +// MIi_ASSERT_MUL4(size); +// MIi_ASSERT_SIZE(dmaNo, size / 4); +// MIi_ASSERT_SRC_ALIGN4(src); +// MIi_ASSERT_DEST_ALIGN4(dest); +// MIi_WARNING_ADDRINTCM(src, size); +// MIi_WARNING_ADDRINTCM(dest, size); +// +// MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC); +// +// if (size == 0) { +// return; +// } +// +// MIi_Wait_BeforeDMA(dmaCntp, dmaNo); +// MIi_DmaSetParams_Wait(dmaNo, (u32)src, (u32)dest, MI_CNT_SEND32(size)); +// MIi_Wait_AfterDMA(dmaCntp); +// } +// +// void MI_DmaFill16 (u32 dmaNo, void * dest, u16 data, u32 size) +// { +// vu32 * dmaCntp; +// +// MIi_ASSERT_DMANO(dmaNo); +// MIi_ASSERT_MUL2(size); +// MIi_ASSERT_SIZE(dmaNo, size / 2); +// MIi_ASSERT_DEST_ALIGN2(dest); +// MIi_WARNING_ADDRINTCM(dest, size); +// +// if (size == 0) { +// return; +// } +// +// MIi_Wait_BeforeDMA(dmaCntp, dmaNo); +// MIi_DmaSetParams_wait_src32(dmaNo, data, (u32)dest, MI_CNT_CLEAR16(size)); +// MIi_Wait_AfterDMA(dmaCntp); +// } + +void MI_DmaCopy16 (u32 dmaNo, const void * src, void * dest, u32 size) +{ + vu32 * dmaCntp; + + MIi_ASSERT_DMANO(dmaNo); + MIi_ASSERT_MUL2(size); + MIi_ASSERT_SIZE(dmaNo, size / 2); + MIi_ASSERT_SRC_ALIGN2(src); + MIi_ASSERT_DEST_ALIGN2(dest); + MIi_WARNING_ADDRINTCM(src, size); + MIi_WARNING_ADDRINTCM(dest, size); + + if (size == 0) { + return; + } + + MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC); + + MIi_Wait_BeforeDMA(dmaCntp, dmaNo); + MIi_DmaSetParams_Wait(dmaNo, (u32)src, (u32)dest, MI_CNT_COPY16(size)); + MIi_Wait_AfterDMA(dmaCntp); +} + +// void MI_DmaSend16 (u32 dmaNo, const void * src, volatile void * dest, u32 size) +// { +// vu32 * dmaCntp; +// +// MIi_ASSERT_DMANO(dmaNo); +// MIi_ASSERT_MUL2(size); +// MIi_ASSERT_SIZE(dmaNo, size / 2); +// MIi_ASSERT_SRC_ALIGN2(src); +// MIi_ASSERT_DEST_ALIGN2(dest); +// MIi_WARNING_ADDRINTCM(src, size); +// MIi_WARNING_ADDRINTCM(dest, size); +// +// if (size == 0) { +// return; +// } +// +// MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC); +// +// MIi_Wait_BeforeDMA(dmaCntp, dmaNo); +// MIi_DmaSetParams_Wait(dmaNo, (u32)src, (u32)dest, MI_CNT_SEND16(size)); +// MIi_Wait_AfterDMA(dmaCntp); +// } + +void MI_DmaFill32Async (u32 dmaNo, void * dest, u32 data, u32 size, MIDmaCallback callback, void * arg) +{ + MIi_ASSERT_DMANO(dmaNo); + MIi_ASSERT_MUL4(size); + MIi_ASSERT_SIZE(dmaNo, size / 4); + MIi_ASSERT_DEST_ALIGN4(dest); + MIi_WARNING_ADDRINTCM(dest, size); + + if (size == 0) { + MIi_CallCallback(callback, arg); + } else { + MI_WaitDma(dmaNo); + + if (callback) { + OSi_EnterDmaCallback(dmaNo, callback, arg); + MIi_DmaSetParams_src32(dmaNo, data, (u32)dest, MI_CNT_CLEAR32_IF(size)); + } else { + MIi_DmaSetParams_src32(dmaNo, data, (u32)dest, MI_CNT_CLEAR32(size)); + } + } +} + +void MI_DmaCopy32Async (u32 dmaNo, const void * src, void * dest, u32 size, MIDmaCallback callback, void * arg) +{ + MIi_ASSERT_DMANO(dmaNo); + MIi_ASSERT_MUL4(size); + MIi_ASSERT_SIZE(dmaNo, size / 4); + MIi_ASSERT_SRC_ALIGN4(src); + MIi_ASSERT_DEST_ALIGN4(dest); + MIi_WARNING_ADDRINTCM(src, size); + MIi_WARNING_ADDRINTCM(dest, size); + + MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC); + + if (size == 0) { + MIi_CallCallback(callback, arg); + } else { + MI_WaitDma(dmaNo); + + if (callback) { + OSi_EnterDmaCallback(dmaNo, callback, arg); + MIi_DmaSetParams(dmaNo, (u32)src, (u32)dest, MI_CNT_COPY32_IF(size)); + } else { + MIi_DmaSetParams(dmaNo, (u32)src, (u32)dest, MI_CNT_COPY32(size)); + } + } +} + +void MI_DmaSend32Async (u32 dmaNo, const void * src, volatile void * dest, u32 size, MIDmaCallback callback, void * arg) +{ + MIi_ASSERT_DMANO(dmaNo); + MIi_ASSERT_MUL4(size); + MIi_ASSERT_SIZE(dmaNo, size / 4); + MIi_ASSERT_SRC_ALIGN4(src); + MIi_ASSERT_DEST_ALIGN4(dest); + MIi_WARNING_ADDRINTCM(src, size); + MIi_WARNING_ADDRINTCM(dest, size); + + MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC); + + if (size == 0) { + MIi_CallCallback(callback, arg); + } else { + MI_WaitDma(dmaNo); + + if (callback) { + OSi_EnterDmaCallback(dmaNo, callback, arg); + MIi_DmaSetParams(dmaNo, (u32)src, (u32)dest, MI_CNT_SEND32_IF(size)); + } else { + MIi_DmaSetParams(dmaNo, (u32)src, (u32)dest, MI_CNT_SEND32(size)); + } + } +} + +// void MI_DmaFill16Async (u32 dmaNo, void * dest, u16 data, u32 size, MIDmaCallback callback, void * arg) +// { +// MIi_ASSERT_DMANO(dmaNo); +// MIi_ASSERT_MUL2(size); +// MIi_ASSERT_SIZE(dmaNo, size / 2); +// MIi_ASSERT_DEST_ALIGN2(dest); +// MIi_WARNING_ADDRINTCM(dest, size); +// +// if (size == 0) { +// MIi_CallCallback(callback, arg); +// } else { +// MI_WaitDma(dmaNo); +// +// if (callback) { +// OSi_EnterDmaCallback(dmaNo, callback, arg); +// MIi_DmaSetParams_src32(dmaNo, data, (u32)dest, MI_CNT_CLEAR16_IF(size)); +// } else { +// MIi_DmaSetParams_src32(dmaNo, data, (u32)dest, MI_CNT_CLEAR16(size)); +// } +// } +// } + +void MI_DmaCopy16Async (u32 dmaNo, const void * src, void * dest, u32 size, MIDmaCallback callback, void * arg) +{ + MIi_ASSERT_DMANO(dmaNo); + MIi_ASSERT_MUL2(size); + MIi_ASSERT_SIZE(dmaNo, size / 2); + MIi_ASSERT_SRC_ALIGN2(src); + MIi_ASSERT_DEST_ALIGN2(dest); + MIi_WARNING_ADDRINTCM(src, size); + MIi_WARNING_ADDRINTCM(dest, size); + + MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC); + + if (size == 0) { + MIi_CallCallback(callback, arg); + } else { + MI_WaitDma(dmaNo); + + if (callback) { + OSi_EnterDmaCallback(dmaNo, callback, arg); + MIi_DmaSetParams(dmaNo, (u32)src, (u32)dest, MI_CNT_COPY16_IF(size)); + } else { + MIi_DmaSetParams(dmaNo, (u32)src, (u32)dest, MI_CNT_COPY16(size)); + } + } +} + +void MI_DmaSend16Async (u32 dmaNo, const void * src, volatile void * dest, u32 size, MIDmaCallback callback, void * arg) +{ + MIi_ASSERT_DMANO(dmaNo); + MIi_ASSERT_MUL2(size); + MIi_ASSERT_SIZE(dmaNo, size / 2); + MIi_ASSERT_SRC_ALIGN2(src); + MIi_ASSERT_DEST_ALIGN2(dest); + MIi_WARNING_ADDRINTCM(src, size); + MIi_WARNING_ADDRINTCM(dest, size); + + MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC); + + if (size == 0) { + MIi_CallCallback(callback, arg); + } else { + MI_WaitDma(dmaNo); + + if (callback) { + OSi_EnterDmaCallback(dmaNo, callback, arg); + MIi_DmaSetParams(dmaNo, (u32)src, (u32)dest, MI_CNT_SEND16_IF(size)); + } else { + MIi_DmaSetParams(dmaNo, (u32)src, (u32)dest, MI_CNT_SEND16(size)); + } + } +} + +BOOL MI_IsDmaBusy (u32 dmaNo) +{ + vu32 * dmaCntp = &((vu32 *)REG_DMA0SAD_ADDR)[dmaNo * 3 + 2]; + + MIi_ASSERT_DMANO(dmaNo); + return (BOOL)((*(vu32 *)dmaCntp & REG_MI_DMA0CNT_E_MASK) >> REG_MI_DMA0CNT_E_SHIFT); +} + +void MI_WaitDma (u32 dmaNo) +{ + OSIntrMode enabled = EnableIrqFlag(); + vu32 * dmaCntp = &((vu32 *)REG_DMA0SAD_ADDR)[dmaNo * 3 + 2]; + + MIi_ASSERT_DMANO(dmaNo); + while (*dmaCntp & REG_MI_DMA0CNT_E_MASK) { + } + + if (dmaNo == MIi_DUMMY_DMA_NO) { + vu32 * p = (vu32 *)((u32)REG_DMA0SAD_ADDR + dmaNo * 12); + *p = (vu32)MIi_DUMMY_SRC; + *(p + 1) = (vu32)MIi_DUMMY_DEST; + *(p + 2) = (vu32)MIi_DUMMY_CNT; + } + + (void)SetIrqFlag(enabled); +} + +void MI_StopDma (u32 dmaNo) +{ + OSIntrMode enabled = EnableIrqFlag(); + vu16 * dmaCntp = &((vu16 *)REG_DMA0SAD_ADDR)[dmaNo * 6 + 5]; + + MIi_ASSERT_DMANO(dmaNo); + + *dmaCntp &= ~((MI_DMA_TIMING_MASK | MI_DMA_CONTINUOUS_ON) >> 16); + *dmaCntp &= ~(MI_DMA_ENABLE >> 16); + + { + s32 dummy = dmaCntp[0]; + } + { + s32 dummy = dmaCntp[0]; + } + + if (dmaNo == MIi_DUMMY_DMA_NO) { + vu32 * p = (vu32 *)((u32)REG_DMA0SAD_ADDR + dmaNo * 12); + *p = (vu32)MIi_DUMMY_SRC; + *(p + 1) = (vu32)MIi_DUMMY_DEST; + *(p + 2) = (vu32)MIi_DUMMY_CNT; + } + + (void)SetIrqFlag(enabled); +} + +#ifdef SDK_ARM9 + void MIi_CheckAnotherAutoDma (u32 dmaNo, u32 dmaType) + { + int n; + u32 dmaCnt; + u32 timing; + + for (n = 0; n < MI_DMA_MAX_NUM; n++) { + if (n == dmaNo) { + continue; + } + + dmaCnt = *(REGType32v *)(REG_DMA0CNT_ADDR + n * 12); + + if ((dmaCnt & MI_DMA_ENABLE) == 0) { + continue; + } + + timing = dmaCnt & MI_DMA_TIMING_MASK; + + if (timing == dmaType + || (timing == MI_DMA_TIMING_V_BLANK && dmaType == MI_DMA_TIMING_H_BLANK) + || (timing == MI_DMA_TIMING_H_BLANK && dmaType == MI_DMA_TIMING_V_BLANK)) { + continue; + } + + if (timing == MI_DMA_TIMING_DISP + || timing == MI_DMA_TIMING_DISP_MMEM + || timing == MI_DMA_TIMING_CARD + || timing == MI_DMA_TIMING_CARTRIDGE + || timing == MI_DMA_TIMING_GXFIFO + || timing == MI_DMA_TIMING_V_BLANK || timing == MI_DMA_TIMING_H_BLANK) { + // OS_Panic("cannot start auto DMA at the same time."); + WaitForever2(); + } + } + } +#endif + +void MIi_CheckDma0SourceAddress (u32 dmaNo, u32 src, u32 size, u32 dir) +{ + if (dmaNo == 0) { + u32 addStart; + u32 addEnd; + + addStart = src & 0xff000000; + + switch (dir) { + case MI_DMA_SRC_INC: + addEnd = src + size; + break; + case MI_DMA_SRC_DEC: + addEnd = src - size; + break; + default: + addEnd = src; + break; + } + + addEnd &= 0xff000000; + + if (addStart == 0x04000000 || addStart >= 0x08000000 || + addEnd == 0x04000000 || addEnd >= 0x08000000) { + // OS_Panic("illegal DMA0 source address."); + WaitForever2(); + } + } +} + +#if defined(SDK_ARM9) && defined(SDK_DEBUG) + void MIi_CheckAddressInTCM (u32 addr, u32 size) + { + u32 itcm = HW_ITCM; + u32 dtcm = OS_GetDTCMAddress(); + + SDK_WARNING(itcm >= addr + size || addr >= itcm + HW_ITCM_SIZE, "intend to do DMA in ITCM area (%x)", addr); + SDK_WARNING(dtcm >= addr + size || addr >= dtcm + HW_DTCM_SIZE, "intend to do DMA in DTCM area (%x)", addr); + } +#endif diff --git a/lib/NitroSDK/src/mi/mi_dma_card.c b/lib/NitroSDK/src/mi/mi_dma_card.c new file mode 100644 index 00000000..449f17c9 --- /dev/null +++ b/lib/NitroSDK/src/mi/mi_dma_card.c @@ -0,0 +1,26 @@ +#include + +void MIi_CardDmaCopy32 (u32 dmaNo, const void * src, void * dest, u32 size) +{ + vu32 * dmaCntp; + + MIi_ASSERT_DMANO(dmaNo); + MIi_ASSERT_DEST_ALIGN4(dest); + MIi_ASSERT_SRC_ALIGN512(size); + MIi_WARNING_ADDRINTCM(dest, size); + + (void)size; + +#ifdef SDK_ARM9 + MIi_CheckAnotherAutoDma(dmaNo, MIi_DMA_TIMING_ANY); +#endif + + MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_FIX); + + if (size == 0) { + return; + } + + MIi_Wait_BeforeDMA(dmaCntp, dmaNo); + MIi_DmaSetParams(dmaNo, (u32)src, (u32)dest, (u32)(MI_CNT_CARDRECV32(4) | MI_DMA_CONTINUOUS_ON)); +} diff --git a/lib/NitroSDK/src/snd/snd_alarm.c b/lib/NitroSDK/src/snd/snd_alarm.c new file mode 100644 index 00000000..c9eafd8a --- /dev/null +++ b/lib/NitroSDK/src/snd/snd_alarm.c @@ -0,0 +1,171 @@ +#include + +#ifdef SDK_ARM9 + typedef struct AlarmCallbackInfo { + void (*func)(void *); + void * arg; + u8 id; + u8 pad; + u16 pad2; + } AlarmCallbackInfo; +#endif + +// #ifdef SDK_ARM9 +// static AlarmCallbackInfo sCallbackTable[SND_ALARM_NUM]; +// #endif + +#ifdef SDK_ARM9 + extern AlarmCallbackInfo sCallbackTable[SND_ALARM_NUM]; +#endif + + +#ifdef SDK_ARM7 + static void AlarmHandler(void * arg); +#endif + +#ifdef SDK_ARM9 + void Snd_AlarmInit (void) + { + int alarmNo; + + for (alarmNo = 0; alarmNo < SND_ALARM_NUM; alarmNo++) { + AlarmCallbackInfo * info; + + info = &sCallbackTable[alarmNo]; + + info->func = NULL; + info->arg = NULL; + info->id = 0; + } + } +#else + void SND_AlarmInit (void) + { + int alarmNo; + + for (alarmNo = 0; alarmNo < SND_ALARM_NUM; alarmNo++) { + SNDi_Work.alarm[alarmNo].enable = FALSE; + SNDi_Work.alarm[alarmNo].id = 0; + } + } + + void SND_SetupAlarm (int alarmNo, OSTick tick, OSTick period, int id) + { + SNDAlarm * alarm; + + SDK_MINMAX_ASSERT(alarmNo, SND_ALARM_MIN, SND_ALARM_MAX); + SDK_MINMAX_ASSERT(id, 0x00, 0xff); + + alarm = &SNDi_Work.alarm[alarmNo]; + + if (alarm->enable) { + OS_CancelAlarm(&alarm->alarm); + alarm->enable = FALSE; + } + + alarm->setting.tick = tick; + alarm->setting.period = period; + alarm->id = (u8)id; + } + + void SND_StartAlarm (int alarmNo) + { + OSTick tick; + OSTick period; + SNDAlarm * alarm; + void * arg; + + SDK_MINMAX_ASSERT(alarmNo, SND_ALARM_MIN, SND_ALARM_MAX); + + alarm = &SNDi_Work.alarm[alarmNo]; + + if (alarm->enable) { + OS_CancelAlarm(&alarm->alarm); + alarm->enable = FALSE; + } + + tick = alarm->setting.tick; + period = alarm->setting.period; + arg = (void *)((alarm->id << 8) | alarmNo); + + OS_CreateAlarm(&alarm->alarm); + + if (period == 0) { + OS_SetAlarm(&alarm->alarm, tick, AlarmHandler, arg); + } else { + OS_SetPeriodicAlarm(&alarm->alarm, OS_GetTick() + tick, period, AlarmHandler, arg); + } + + alarm->enable = TRUE; + } + + void SND_StopAlarm (int alarmNo) + { + SNDAlarm * alarm; + + SDK_MINMAX_ASSERT(alarmNo, SND_ALARM_MIN, SND_ALARM_MAX); + + alarm = &SNDi_Work.alarm[alarmNo]; + + if (!alarm->enable) + return; + + OS_CancelAlarm(&alarm->alarm); + + alarm->id++; + alarm->enable = FALSE; + } +#endif + +#ifdef SDK_ARM7 + static void AlarmHandler (void * arg) + { + while (PXI_SendWordByFifo(PXI_FIFO_TAG_SOUND, (u32)arg, FALSE) < 0) { + + } + } +#endif + +#ifdef SDK_ARM9 + void Sndi_IncAlarmId (int alarmNo) + { + AlarmCallbackInfo * info; + + SDK_MINMAX_ASSERT(alarmNo, SND_ALARM_MIN, SND_ALARM_MAX); + + info = &sCallbackTable[alarmNo]; + info->id++; + } + + u8 Sndi_SetAlarmHandler (int alarmNo, SNDAlarmHandler handler, void * arg) + { + AlarmCallbackInfo * info; + + SDK_MINMAX_ASSERT(alarmNo, SND_ALARM_MIN, SND_ALARM_MAX); + + info = &sCallbackTable[alarmNo]; + + info->func = handler; + info->arg = arg; + info->id++; + + return info->id; + } + + void Sndi_CallAlarmHandler (int msg) + { + AlarmCallbackInfo * info; + int alarmNo = msg & 0xff; + int id = (msg >> 8) & 0xff; + + SDK_MINMAX_ASSERT(alarmNo, SND_ALARM_MIN, SND_ALARM_MAX); + + info = &sCallbackTable[alarmNo]; + + if (id == info->id) { + if (info->func != NULL) { + info->func(info->arg); + } + } + } +#endif diff --git a/lib/include/nitro/mi.h b/lib/include/nitro/mi.h index 421894a1..47e981b1 100644 --- a/lib/include/nitro/mi.h +++ b/lib/include/nitro/mi.h @@ -6,5 +6,6 @@ #include #include #include +#include #endif //NITRO_MI_H_ diff --git a/lib/include/nitro/mi/mi_dma.h b/lib/include/nitro/mi/mi_dma.h new file mode 100644 index 00000000..d680c003 --- /dev/null +++ b/lib/include/nitro/mi/mi_dma.h @@ -0,0 +1,189 @@ +#ifndef NITRO_COMMON_MI_DMA_H_ +#define NITRO_COMMON_MI_DMA_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +//#include + +//#ifdef SDK_ARM9 + #define MIi_DMA_CLEAR_DATA_BUF REG_DMA0_CLR_DATA_ADDR + //#else + // #define MIi_DMA_CLEAR_DATA_BUF HW_DMA_CLEAR_DATA_BUF + //#endif +//#else +// #define MIi_DMA_CLEAR_DATA_BUF HW_PRV_WRAM_DMA_CLEAR_DATA_BUF +//#endif + +typedef union { + u32 b32; + u16 b16; +} MIiDmaClearSrc; + +#ifdef SDK_ARM9 + void MIi_DmaSetParams(u32 dmaNo, u32 src, u32 dest, u32 ctrl); + void MIi_DmaSetParams_Wait(u32 dmaNo, u32 src, u32 dest, u32 ctrl); + void MIi_DmaSetParams_NoInt(u32 dmaNo, u32 src, u32 dest, u32 ctrl); + void MIi_DmaSetParams_wait_noInt(u32 dmaNo, u32 src, u32 dest, u32 ctrl); +#else + static inline void MIi_DmaSetParams (u32 dmaNo, u32 src, u32 dest, u32 ctrl) + { + OSIntrMode enabled = EnableIrqFlag(); + vu32 * p = (vu32 *)((u32)REG_DMA0SAD_ADDR + dmaNo * 12); + *p = (vu32)src; + *(p + 1) = (vu32)dest; + *(p + 2) = (vu32)ctrl; + (void)SetIrqFlag(enabled); + } + + static inline void MIi_DmaSetParams_Wait (u32 dmaNo, u32 src, u32 dest, u32 ctrl) + { + OSIntrMode enabled = EnableIrqFlag(); + vu32 * p = (vu32 *)((u32)REG_DMA0SAD_ADDR + dmaNo * 12); + *p = (vu32)src; + *(p + 1) = (vu32)dest; + *(p + 2) = (vu32)ctrl; + + { + u32 dummy = reg_MI_DMA0SAD; + } + + (void)SetIrqFlag(enabled); + } + + static inline void MIi_DmaSetParams_NoInt (u32 dmaNo, u32 src, u32 dest, u32 ctrl) + { + vu32 * p = (vu32 *)((u32)REG_DMA0SAD_ADDR + dmaNo * 12); + *p = (vu32)src; + *(p + 1) = (vu32)dest; + *(p + 2) = (vu32)ctrl; + } + + static inline void MIi_DmaSetParams_wait_noInt (u32 dmaNo, u32 src, u32 dest, u32 ctrl) + { + vu32 * p = (vu32 *)((u32)REG_DMA0SAD_ADDR + dmaNo * 12); + *p = (vu32)src; + *(p + 1) = (vu32)dest; + *(p + 2) = (vu32)ctrl; + + { + u32 dummy = reg_MI_DMA0SAD; + } + } +#endif + +static inline void MIi_DmaSetParams_src32 (u32 dmaNo, u32 data, u32 dest, u32 ctrl) +{ + OSIntrMode enabled = EnableIrqFlag(); + + MIiDmaClearSrc * srcp = (MIiDmaClearSrc *) ((u32)MIi_DMA_CLEAR_DATA_BUF + dmaNo * 4); + srcp->b32 = data; + MIi_DmaSetParams_NoInt(dmaNo, (u32)srcp, dest, ctrl); + + (void)SetIrqFlag(enabled); +} + +static inline void MIi_DmaSetParams_src16 (u32 dmaNo, u16 data, u32 dest, u32 ctrl) +{ + OSIntrMode enabled = EnableIrqFlag(); + + MIiDmaClearSrc * srcp = (MIiDmaClearSrc *) ((u32)MIi_DMA_CLEAR_DATA_BUF + dmaNo * 4); + srcp->b16 = data; + MIi_DmaSetParams_NoInt(dmaNo, (u32)srcp, dest, ctrl); + + (void)SetIrqFlag(enabled); +} + +static inline void MIi_DmaSetParams_wait_src32 (u32 dmaNo, u32 data, u32 dest, u32 ctrl) +{ + OSIntrMode enabled = EnableIrqFlag(); + + MIiDmaClearSrc * srcp = (MIiDmaClearSrc *) ((u32)MIi_DMA_CLEAR_DATA_BUF + dmaNo * 4); + srcp->b32 = data; + MIi_DmaSetParams_wait_noInt(dmaNo, (u32)srcp, dest, ctrl); + + (void)SetIrqFlag(enabled); +} + +static inline void MIi_DmaSetParams_wait_src16 (u32 dmaNo, u16 data, u32 dest, u32 ctrl) +{ + OSIntrMode enabled = EnableIrqFlag(); + + MIiDmaClearSrc * srcp = (MIiDmaClearSrc *) ((u32)MIi_DMA_CLEAR_DATA_BUF + dmaNo * 4); + srcp->b16 = data; + MIi_DmaSetParams_wait_noInt(dmaNo, (u32)srcp, dest, ctrl); + + (void)SetIrqFlag(enabled); +} + +extern void OSi_EnterDmaCallback(u32 dmaNo, MIDmaCallback callback, void * arg); + +static inline void MIi_CallCallback (MIDmaCallback callback, void * arg) +{ + if (callback) { + (callback) (arg); + } +} + +#define MIi_Wait_BeforeDMA(dmaCntp, dmaNo) \ + do { \ + dmaCntp = &((vu32 *)REG_DMA0SAD_ADDR)[dmaNo * 3 + 2]; \ + MIi_ASSERT_DMANO(dmaNo); \ + while ( *dmaCntp & REG_MI_DMA0CNT_E_MASK ) {} \ + } while (0) + +#define MIi_Wait_AfterDMA(dmaCntp) \ + do { \ + while ( *dmaCntp & REG_MI_DMA0CNT_E_MASK ) {} \ + } while (0) + +#define MIi_ASSERT_DMANO(dmaNo) SDK_ASSERTMSG((dmaNo) <= MI_DMA_MAX_NUM, "illegal DMA No.") +#define MIi_ASSERT_MUL2(size) SDK_ASSERTMSG(((size) & 1) == 0, "size & 1 must be 0") +#define MIi_ASSERT_MUL4(size) SDK_ASSERTMSG(((size) & 3) == 0, "size & 3 must be 0") +#define MIi_ASSERT_SRC_ALIGN512(src) SDK_ASSERTMSG(((u32)(src) & 511) == 0, "source address must be in 512-byte alignment") +#define MIi_ASSERT_SRC_ALIGN4(src) SDK_ASSERTMSG(((u32)(src) & 3) == 0, "source address must be in 4-byte alignment") +#define MIi_ASSERT_SRC_ALIGN2(src) SDK_ASSERTMSG(((u32)(src) & 1) == 0, "source address must be in 2-byte alignment") +#define MIi_ASSERT_DEST_ALIGN4(dest) SDK_ASSERTMSG(((u32)(dest) & 3) == 0, "destination address must be in 4-byte alignment") +#define MIi_ASSERT_DEST_ALIGN2(dest) SDK_ASSERTMSG(((u32)(dest) & 1) == 0, "destination address must be in 2-byte alignment") + +#ifdef SDK_ARM9 + #define MIi_ASSERT_SIZE(dmaNo, size) SDK_ASSERTMSG((size) <= 0x1fffff, "size too large"); +#else + #define MIi_ASSERT_SIZE(dmaNo, size) \ + do { \ + if ( dmaNo <= 2 ) \ + { \ + SDK_ASSERTMSG((size) <= 0x3fff, "size too large"); \ + } \ + else \ + { \ + SDK_ASSERTMSG((size) <= 0xffff, "size too large"); \ + } \ + } while (0) +#endif + +#if defined(SDK_ARM9) && defined(SDK_DEBUG) + void MIi_CheckAddressInTCM(u32 addr, u32 size); + + #define MIi_WARNING_ADDRINTCM(addr, size) MIi_CheckAddressInTCM((u32)addr, (u32)size) +#else + #define MIi_WARNING_ADDRINTCM(addr, size) ((void)0) +#endif + +#ifdef SDK_ARM9 + void MIi_CheckAnotherAutoDma(u32 dmaNo, u32 dmaType); +#endif + +void MIi_CheckDma0SourceAddress(u32 dmaNo, u32 src, u32 size, u32 dir); + +#define MIi_DUMMY_DMA_NO 0 +#define MIi_DUMMY_SRC 0 +#define MIi_DUMMY_DEST 0 +#define MIi_DUMMY_CNT (MI_DMA_ENABLE | MI_DMA_SRC_FIX | MI_DMA_DEST_FIX | MI_DMA_16BIT_BUS | 1) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/nitro/snd.h b/lib/include/nitro/snd.h index 0ff406f7..da6ca6c2 100644 --- a/lib/include/nitro/snd.h +++ b/lib/include/nitro/snd.h @@ -1,8 +1,13 @@ #ifndef NITRO_SND_H_ #define NITRO_SND_H_ -#include -#include +#include #include +#include +#include +#include +#include +#include +#include #endif //NITRO_SND_H_ diff --git a/lib/include/nitro/snd/common/alarm.h b/lib/include/nitro/snd/common/alarm.h new file mode 100644 index 00000000..7d78cde1 --- /dev/null +++ b/lib/include/nitro/snd/common/alarm.h @@ -0,0 +1,53 @@ +#ifndef NITRO_SND_COMMON_ALARM_H_ +#define NITRO_SND_COMMON_ALARM_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define SND_ALARM_NUM 8 +#define SND_ALARM_MIN 0 +#define SND_ALARM_MAX (SND_ALARM_NUM - 1) + +#define SND_ALARM_PRESCALER 32 + +typedef void (*SNDAlarmHandler) (void *); + + +#ifdef SDK_ARM7 + +typedef struct SNDAlarm { + u8 enable; + u8 id; + u16 padding; + struct { + OSTick tick; + OSTick period; + } setting; + OSAlarm alarm; +} SNDAlarm; + +#endif + +void Snd_AlarmInit(void); + +#ifdef SDK_ARM7 + void SND_SetupAlarm(int alarmNo, OSTick tick, OSTick period, int id); + void SND_StartAlarm(int alarmNo); + void SND_StopAlarm(int alarmNo); +#endif + +#ifdef SDK_ARM9 + void Sndi_IncAlarmId(int alarmNo); + u8 Sndi_SetAlarmHandler(int alarmNo, SNDAlarmHandler handler, void * arg); + void Sndi_CallAlarmHandler(int alarmNo); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/nitro/snd/common/capture.h b/lib/include/nitro/snd/common/capture.h new file mode 100644 index 00000000..c62b2206 --- /dev/null +++ b/lib/include/nitro/snd/common/capture.h @@ -0,0 +1,110 @@ +#ifndef NITRO_SND_COMMON_CAPTURE_H_ +#define NITRO_SND_COMMON_CAPTURE_H_ + +#include + +#if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL)) + #ifdef SDK_ARM7 + #include + #endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define SND_CAPTURE_NUM 2 + +#ifndef SDK_TEG + #define SND_CAPTURE_0_OUT_CHANNEL 1 + #define SND_CAPTURE_1_OUT_CHANNEL 3 + + #define SND_CAPTURE_0_IN_CHANNEL 0 + #define SND_CAPTURE_1_IN_CHANNEL 2 + + #define SND_CAPTURE_LEN_MAX 0xffff +#else + #define SND_CAPTURE_0_OUT_CHANNEL 3 + #define SND_CAPTURE_1_OUT_CHANNEL 1 + + #define SND_CAPTURE_0_IN_CHANNEL 2 + #define SND_CAPTURE_1_IN_CHANNEL 0 + + #define SND_CAPTURE_LEN_MAX 0x0fff +#endif + +#define SND_CAPTURE_DAD_MASK 0x07fffffc +#define SND_CAPTURE_REG_OFFSET 0x8 + +#ifndef SDK_TEG + typedef enum { + SND_CAPTURE_0, + SND_CAPTURE_1 + } SNDCapture; +#else + typedef enum { + SND_CAPTURE_1, + SND_CAPTURE_0 + } SNDCapture; +#endif + +typedef enum { + SND_CAPTURE_FORMAT_PCM16, + SND_CAPTURE_FORMAT_PCM8 +} SNDCaptureFormat; + +typedef enum { + SND_CAPTURE_REPEAT_YES, + SND_CAPTURE_REPEAT_NO +} SNDCaptureRepeat; + +typedef enum { + SND_CAPTURE_IN_MIXER, + SND_CAPTURE_IN_CHANNEL, + SND_CAPTURE_IN_MIXER_L = SND_CAPTURE_IN_MIXER, + SND_CAPTURE_IN_MIXER_R = SND_CAPTURE_IN_MIXER, + SND_CAPTURE_IN_CHANNEL0 = SND_CAPTURE_IN_CHANNEL, + SND_CAPTURE_IN_CHANNEL2 = SND_CAPTURE_IN_CHANNEL +} SNDCaptureIn; + +typedef enum { + SND_CAPTURE_OUT_NORMAL, + SND_CAPTURE_OUT_CHANNEL_MIX, + SND_CAPTURE_OUT_CHANNEL0_MIX = SND_CAPTURE_OUT_CHANNEL_MIX, + SND_CAPTURE_OUT_CHANNEL2_MIX = SND_CAPTURE_OUT_CHANNEL_MIX +} SNDCaptureOut; + +#ifdef SDK_ARM7 + #if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL)) + static inline void SND_StartCapture (SNDCapture capture) + { + REGType8v * reg = (REGType8v *)(REG_SNDCAP0CNT_ADDR + capture); + *reg |= REG_SND_SNDCAP0CNT_E_MASK; + } + + static inline void SND_StartCaptureBoth (void) + { + reg_SND_SNDCAPCNT |= REG_SND_SNDCAPCNT_CAP0_E_MASK | REG_SND_SNDCAPCNT_CAP1_E_MASK; + } + + static inline void SND_StopCapture (SNDCapture capture) + { + (*(REGType8v *)(REG_SNDCAP0CNT_ADDR + capture)) = 0; + } + #else + void SND_StartCapture(SNDCapture capture); + void SND_StartCaptureBoth(void); + void SND_StopCapture(SNDCapture capture); + #endif +#endif + +#ifdef SDK_ARM7 + void SND_SetupCapture(SNDCapture capture, SNDCaptureFormat format, void * buffer_addr, int length, BOOL repeat, SNDCaptureIn in, SNDCaptureOut out); + BOOL SND_IsCaptureActive(SNDCapture capture); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/nitro/snd/common/command.h b/lib/include/nitro/snd/common/command.h new file mode 100644 index 00000000..ab51152c --- /dev/null +++ b/lib/include/nitro/snd/common/command.h @@ -0,0 +1,84 @@ +#ifndef NITRO_SND_COMMON_COMMAND_H_ +#define NITRO_SND_COMMON_COMMAND_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define SND_COMMAND_NOBLOCK 0 +#define SND_COMMAND_BLOCK (1 << 0) +#define SND_COMMAND_IMMEDIATE (1 << 1) + +typedef enum SNDCommandID { + SND_COMMAND_START_SEQ, + SND_COMMAND_STOP_SEQ, + SND_COMMAND_PREPARE_SEQ, + SND_COMMAND_START_PREPARED_SEQ, + SND_COMMAND_PAUSE_SEQ, + SND_COMMAND_SKIP_SEQ, + SND_COMMAND_PLAYER_PARAM, + SND_COMMAND_TRACK_PARAM, + SND_COMMAND_MUTE_TRACK, + SND_COMMAND_ALLOCATABLE_CHANNEL, + SND_COMMAND_PLAYER_LOCAL_VAR, + SND_COMMAND_PLAYER_GLOBAL_VAR, + SND_COMMAND_START_TIMER, + SND_COMMAND_STOP_TIMER, + SND_COMMAND_SETUP_CHANNEL_PCM, + SND_COMMAND_SETUP_CHANNEL_PSG, + SND_COMMAND_SETUP_CHANNEL_NOISE, + SND_COMMAND_SETUP_CAPTURE, + SND_COMMAND_SETUP_ALARM, + SND_COMMAND_CHANNEL_TIMER, + SND_COMMAND_CHANNEL_VOLUME, + SND_COMMAND_CHANNEL_PAN, + SND_COMMAND_SURROUND_DECAY, + SND_COMMAND_MASTER_VOLUME, + SND_COMMAND_MASTER_PAN, + SND_COMMAND_OUTPUT_SELECTOR, + SND_COMMAND_LOCK_CHANNEL, + SND_COMMAND_UNLOCK_CHANNEL, + SND_COMMAND_STOP_UNLOCKED_CHANNEL, + SND_COMMAND_SHARED_WORK, + SND_COMMAND_INVALIDATE_SEQ, + SND_COMMAND_INVALIDATE_BANK, + SND_COMMAND_INVALIDATE_WAVE, + SND_COMMAND_READ_DRIVER_INFO +} SNDCommandID; + +typedef struct SNDCommand { + struct SNDCommand * next; + SNDCommandID id; + u32 arg[4]; +} SNDCommand; + +void SND_CommandInit(void); + +#ifdef SDK_ARM9 + struct SNDCommand * Snd_AllocCommand(u32 flags); + void Snd_PushCommand(struct SNDCommand * command); + + const SNDCommand * SND_RecvCommandReply(u32 flags); + + BOOL SND_FlushCommand(u32 flags); + + void SND_WaitForCommandProc(u32 tag); + void SND_WaitForFreeCommand(int count); + + u32 SND_GetCurrentCommandTag(void); + BOOL SND_IsFinishedCommandTag(u32 tag); + + int SND_CountFreeCommand(void); + int SND_CountReservedCommand(void); + int SND_CountWaitingCommand(void); +#else + void SND_CommandProc(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/nitro/snd/common/global.h b/lib/include/nitro/snd/common/global.h new file mode 100644 index 00000000..5088e1d5 --- /dev/null +++ b/lib/include/nitro/snd/common/global.h @@ -0,0 +1,38 @@ +#ifndef NITRO_SND_COMMON_GLOBAL_H_ +#define NITRO_SND_COMMON_GLOBAL_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define SND_MASTER_VOLUME_MAX 0x7f + +typedef enum SNDChannelOut { + SND_CHANNEL_OUT_MIXER, + SND_CHANNEL_OUT_BYPASS +} SNDChannelOut; + +typedef enum SNDOutput { + SND_OUTPUT_MIXER, + SND_OUTPUT_CHANNEL1, + SND_OUTPUT_CHANNEL3, + SND_OUTPUT_CHANNEL1_3 +} SNDOutput; + +#ifdef SDK_ARM7 + void SND_Enable(void); + void SND_Disable(void); + void SND_Shutdown(void); + void SND_BeginSleep(void); + void SND_EndSleep(void); + void SND_SetMasterVolume(int volume); + void SND_SetOutputSelector(SNDOutput left, SNDOutput right, SNDChannelOut channel1, SNDChannelOut channel3); +#endif + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/lib/include/nitro/snd/common/seq.h b/lib/include/nitro/snd/common/seq.h new file mode 100644 index 00000000..e2f27a2d --- /dev/null +++ b/lib/include/nitro/snd/common/seq.h @@ -0,0 +1,128 @@ +#ifndef NITRO_SND_COMMON_SEQ_H_ +#define NITRO_SND_COMMON_SEQ_H_ + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define SND_PLAYER_NUM 16 +#define SND_PLAYER_MIN 0 +#define SND_PLAYER_MAX 15 + +#define SND_TRACK_NUM 32 +#define SND_TRACK_MIN 0 +#define SND_TRACK_MAX 31 + +#define SND_TRACK_NUM_PER_PLAYER 16 + +#define SND_INVALID_TRACK_INDEX 0xff + +#define SND_BASE_TEMPO 240 +#define SND_DEFAULT_TEMPO 120 + +#define SND_TRACK_CALL_STACK_DEPTH 3 + +#define SND_PLAYER_VARIABLE_NUM 16 +#define SND_GLOBAL_VARIABLE_NUM 16 + +typedef enum { + SND_SEQ_MUTE_OFF, + SND_SEQ_MUTE_NO_STOP, + SND_SEQ_MUTE_RELEASE, + SND_SEQ_MUTE_STOP +} SNDSeqMute; + +struct SNDBankData; + +typedef struct SNDPlayer { + u8 active_flag :1; + u8 prepared_flag :1; + u8 pause_flag :1; + u8 pad_ :5; + u8 myNo; + u8 pad2_; + u8 pad3_; + u8 prio; + u8 volume; + s16 extFader; + u8 tracks[SND_TRACK_NUM_PER_PLAYER]; + u16 tempo; + u16 tempo_ratio; + u16 tempo_counter; + u16 pad__; + struct SNDBankData * bank; +} SNDPlayer; + +typedef struct SNDTrack { + u8 active_flag :1; + u8 note_wait :1; + u8 mute_flag :1; + u8 tie_flag :1; + u8 note_finish_wait :1; + u8 porta_flag :1; + u8 cmp_flag :1; + u8 channel_mask_flag :1; + u8 pan_range; + u16 prgNo; + u8 volume; + u8 volume2; + s8 pitch_bend; + u8 bend_range; + s8 pan; + s8 ext_pan; + s16 extFader; + s16 ext_pitch; + u8 attack; + u8 decay; + u8 sustain; + u8 release; + u8 prio; + s8 transpose; + u8 porta_key; + u8 porta_time; + s16 sweep_pitch; + struct SNDLfoParam mod; + u16 channel_mask; + s32 wait; + const u8 * base; + const u8 * cur; + const u8 * call_stack[SND_TRACK_CALL_STACK_DEPTH]; + u8 loop_count[SND_TRACK_CALL_STACK_DEPTH]; + u8 call_stack_depth; + struct SNDExChannel * channel_list; +} SNDTrack; + +#ifdef SDK_ARM7 + void SND_SeqInit(void); + void SND_SeqMain(BOOL doPeriodicProc); + + void SND_StartSeq(int playerNo, const void * seqBase, u32 seqOffset, struct SNDBankData * bank_p); + void SND_StopSeq(int playerNo); + void SND_PrepareSeq(int playerNo, const void * seqBase, u32 seqOffset, struct SNDBankData * bank_p); + void SND_StartPreparedSeq(int playerNo); + void SND_PauseSeq(int playerNo, BOOL flag); + void SND_SkipSeq(int playerNo, u32 tick); + + void SND_SetTrackMute(int playerNo, u32 trackBitMask, SNDSeqMute mute); + void SND_SetTrackAllocatableChannel(int playerNo, u32 trackBitMask, u32 chBitMask); + + void SND_InvalidateSeq(const void * start, const void * end); + void SND_InvalidateBank(const void * start, const void * end); + + void SND_MmlPrintEnable(BOOL enble); +#endif + +#ifdef SDK_ARM7 + void SNDi_SetPlayerParam(int playerNo, u32 offset, u32 data, int size); + void SNDi_SetTrackParam(int playerNo, u32 trackBitMask, u32 offset, u32 data, int size); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/main.lsf b/main.lsf index 371ee3df..aa5b322f 100644 --- a/main.lsf +++ b/main.lsf @@ -249,6 +249,8 @@ Static main Object lib/NitroSDK/asm/gx_load2d.o Object lib/NitroSDK/asm/gx_load3d.o Object lib/NitroSDK/src/gxasm.o + Object lib/NitroSDK/asm/os_irqHandler.o + Object lib/NitroSDK/asm/os_irqTable.o Object lib/NitroSDK/asm/os_interrupt.o Object lib/NitroSDK/asm/os_spinlock.o Object lib/NitroSDK/asm/os_thread.o @@ -275,16 +277,16 @@ Static main Object lib/NitroSDK/src/os/os_entropy.o Object lib/NitroSDK/src/os/os_terminate_proc.o Object lib/NitroSDK/src/mi/mi_wram.o - Object lib/NitroSDK/asm/mi_dma.o + Object lib/NitroSDK/src/mi/mi_dma.o Object lib/NitroSDK/src/mi/mi_memory.o Object lib/NitroSDK/asm/mi_memory_1.o Object lib/NitroSDK/src/mi/mi_uncompress.o - Object lib/NitroSDK/asm/mi_dma_card.o + Object lib/NitroSDK/src/mi/mi_dma_card.o Object lib/NitroSDK/src/mi/mi_init.o Object lib/NitroSDK/asm/snd_interface.o Object lib/NitroSDK/src/snd/snd_main.o Object lib/NitroSDK/asm/snd_command.o - Object lib/NitroSDK/asm/snd_alarm.o + Object lib/NitroSDK/src/snd/snd_alarm.o Object lib/NitroSDK/asm/snd_work.o Object lib/NitroSDK/src/snd/snd_util.o Object lib/NitroSDK/src/snd/snd_bank.o @@ -338,6 +340,8 @@ Autoload ITCM { Address 0x01FF8000 Object asm/itcm.o (.itcm) + Object lib/NitroSDK/src/mi/mi_dma.o (.itcm) + Object asm/itcm_1.o (.itcm) Object src/dungeon_ai_movement.o (.itcm) Object asm/itcm_01FFB62C.o (.itcm) Object src/dungeon_ai_itcm.o (.itcm) From 8fc38e7ae7b92cd3f34c253abb3e65f39d7835b2 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 6 Jul 2026 11:53:14 -0700 Subject: [PATCH 02/10] move more files to src --- asm/include/main_02003DB8.inc | 4 +- asm/include/main_0207F894.inc | 6 +- asm/include/overlay_00.inc | 14 +- asm/include/overlay_02.inc | 4 +- asm/main_02003DB8.s | 4 +- asm/overlay_00.s | 38 +-- asm/overlay_02.s | 4 +- common.mk | 5 +- lib/NitroSDK/asm/dgt.s | 30 +-- lib/NitroSDK/asm/include/main_0207F894.inc | 6 +- lib/NitroSDK/asm/math_crc.s | 60 ++--- lib/NitroSDK/asm/math_dgt.s | 25 -- lib/NitroSDK/src/{math_math.c => math/math.c} | 0 lib/NitroSDK/src/math/math_crc.c | 250 ++++++++++++++++++ lib/NitroSDK/src/math/math_dgt.c | 19 ++ lib/NitroSDK/src/{ => rtc}/rtc_internal.c | 0 lib/include/nitro/dgt/common.h | 19 ++ lib/include/nitro/dgt/dgt.h | 77 ++++++ lib/include/nitro/math.h | 2 + lib/include/nitro/math/dgt.h | 79 ++++++ main.lsf | 6 +- 21 files changed, 537 insertions(+), 115 deletions(-) delete mode 100644 lib/NitroSDK/asm/math_dgt.s rename lib/NitroSDK/src/{math_math.c => math/math.c} (100%) create mode 100644 lib/NitroSDK/src/math/math_crc.c create mode 100644 lib/NitroSDK/src/math/math_dgt.c rename lib/NitroSDK/src/{ => rtc}/rtc_internal.c (100%) create mode 100644 lib/include/nitro/dgt/common.h create mode 100644 lib/include/nitro/dgt/dgt.h create mode 100644 lib/include/nitro/math/dgt.h diff --git a/asm/include/main_02003DB8.inc b/asm/include/main_02003DB8.inc index a9961f7b..fe912b18 100644 --- a/asm/include/main_02003DB8.inc +++ b/asm/include/main_02003DB8.inc @@ -72,8 +72,8 @@ .public FS_StartOverlay .public LOADED_OVERLAY_GROUP_0 .public FS_LoadOverlayImage -.public Math_CalcCrc32 -.public Mathi_Crc32InitTable +.public MATH_CalcCRC32 +.public MATHi_CRC32InitTable .public MemAlloc .public MemFree .public MemLocateSet diff --git a/asm/include/main_0207F894.inc b/asm/include/main_0207F894.inc index 5f88b5df..d596a379 100644 --- a/asm/include/main_0207F894.inc +++ b/asm/include/main_0207F894.inc @@ -82,9 +82,9 @@ .public DC_StoreRange .public DC_WaitWriteBufferEmpty .public Dgt_Hash2CalcHmac -.public Dgt_Hash2GetHash -.public Dgt_Hash2Init -.public Dgt_Hash2Update +.public DGT_Hash2GetDigest +.public DGT_Hash2Reset +.public DGT_Hash2SetSource .public EnableIrqFlag .public fflush .public FS_CloseFile diff --git a/asm/include/overlay_00.inc b/asm/include/overlay_00.inc index 2b353414..c51748a8 100644 --- a/asm/include/overlay_00.inc +++ b/asm/include/overlay_00.inc @@ -74,15 +74,15 @@ .public InitMenu .public InitWfcSettingsOverlay .public LoadOverlay -.public Math_CalcCrc16 -.public Math_CalcCrc32 -.public Math_CalcCrc8 +.public MATH_CalcCRC16 +.public MATH_CalcCRC32 +.public MATH_CalcCRC8 .public Math_CalcSha1 .public Math_CountPopulation -.public Mathi_Crc16InitTable -.public Mathi_Crc16Update -.public Mathi_Crc32InitTable -.public Mathi_Crc8InitTable +.public MATHi_CRC16InitTable +.public MATHi_CRC16Update +.public MATHi_CRC32InitTable +.public MATHi_CRC8InitTable .public MD5_Digest .public MD5_Init .public MD5_Update diff --git a/asm/include/overlay_02.inc b/asm/include/overlay_02.inc index 5da0792f..6295268b 100644 --- a/asm/include/overlay_02.inc +++ b/asm/include/overlay_02.inc @@ -112,8 +112,8 @@ .public GXS_SetGraphicsMode .public GXx_SetMasterBrightness_ .public InitWfc -.public Math_CalcCrc16 -.public Mathi_Crc16InitTable +.public MATH_CalcCRC16 +.public MATHi_CRC16InitTable .public MB_CommGetChildUser .public MB_CommIsBootable .public MB_CommResponseRequest diff --git a/asm/main_02003DB8.s b/asm/main_02003DB8.s index 79b61118..af2e7fc9 100644 --- a/asm/main_02003DB8.s +++ b/asm/main_02003DB8.s @@ -1300,11 +1300,11 @@ sub_02004F80: ; 0x02004F80 bl MemAlloc ldr r1, _02004FC8 ; =0xEDB88320 mov r5, r0 - bl Mathi_Crc32InitTable + bl MATHi_CRC32InitTable mov r0, r5 mov r1, r6 mov r2, r4 - bl Math_CalcCrc32 + bl MATH_CalcCRC32 mov r4, r0 mov r0, r5 bl MemFree diff --git a/asm/overlay_00.s b/asm/overlay_00.s index c8f9ba2f..f48ec248 100644 --- a/asm/overlay_00.s +++ b/asm/overlay_00.s @@ -36235,14 +36235,14 @@ _022DA63C: add r0, r0, #0x1a00 add r1, r1, #0x1800 add r2, r4, r7 - bl Mathi_Crc16Update + bl MATHi_CRC16Update ldr r0, _022DA86C ; =ov00_02326CA4 add r1, r4, r7 ldr r0, [r0] mov r2, #0x6e add r0, r0, #0x96 add r0, r0, #0x1a00 - bl Math_CalcCrc16 + bl MATH_CalcCRC16 ldr r1, _022DA86C ; =ov00_02326CA4 mov r2, #0x70 ldr r4, [r1] @@ -36364,7 +36364,7 @@ Wds_Initialize: ; 0x022DA884 ldr r0, [r2] add r0, r0, #0x96 add r0, r0, #0x1a00 - bl Mathi_Crc16InitTable + bl MATHi_CRC16InitTable ldr r0, _022DA914 ; =ov00_02326CA4 mov r1, r6 ldr r0, [r0] @@ -37254,11 +37254,11 @@ Dwc_Acc_CreateFriendKey: ; 0x022DB358 _022DB37C: add r0, sp, #0x70 mov r1, #7 - bl Mathi_Crc8InitTable + bl MATHi_CRC8InitTable add r0, sp, #0x70 add r1, sp, #0 mov r2, #8 - bl Math_CalcCrc8 + bl MATH_CalcCRC8 and r0, r0, #0x7f b _022DB3D0 _022DB3A0: @@ -37452,11 +37452,11 @@ Dwci_Acc_CreateUserData: ; 0x022DB5B8 bl Dwci_Acc_SetFlag_DataType ldr r1, _022DB630 ; =0xEDB88320 add r0, sp, #0 - bl Mathi_Crc32InitTable + bl MATHi_CRC32InitTable add r0, sp, #0 mov r1, r5 mov r2, #0x3c - bl Math_CalcCrc32 + bl MATH_CalcCRC32 str r0, [r5, #0x3c] ldr r0, [r5, #0x20] orr r0, r0, #1 @@ -37608,11 +37608,11 @@ Dwc_CheckUserData: ; 0x022DB7BC ldr r1, _022DB7FC ; =0xEDB88320 mov r4, r0 add r0, sp, #0 - bl Mathi_Crc32InitTable + bl MATHi_CRC32InitTable add r0, sp, #0 mov r1, r4 mov r2, #0x3c - bl Math_CalcCrc32 + bl MATH_CalcCRC32 ldr r1, [r4, #0x3c] cmp r0, r1 moveq r0, #1 @@ -37682,11 +37682,11 @@ Dwci_Acc_SetLoginIdToUserData: ; 0x022DB898 ldr r1, _022DB8EC ; =0xEDB88320 add r0, sp, #0 str ip, [r4, #0x1c] - bl Mathi_Crc32InitTable + bl MATHi_CRC32InitTable add r0, sp, #0 mov r1, r4 mov r2, #0x3c - bl Math_CalcCrc32 + bl MATH_CalcCRC32 str r0, [r4, #0x3c] ldr r0, [r4, #0x20] orr r0, r0, #1 @@ -37733,11 +37733,11 @@ Dwci_Acc_ClearDirty: ; 0x022DB920 bic r2, r1, #1 ldr r1, _022DB960 ; =0xEDB88320 str r2, [r4, #0x20] - bl Mathi_Crc32InitTable + bl MATHi_CRC32InitTable add r0, sp, #0 mov r1, r4 mov r2, #0x3c - bl Math_CalcCrc32 + bl MATH_CalcCRC32 str r0, [r4, #0x3c] add sp, sp, #0x400 ldmia sp!, {r4, pc} @@ -58594,7 +58594,7 @@ Dwci_BM_SetWiFiInfo: ; 0x022ED540 bl Dwci_BackuplConvWifiInfo ldr r1, _022ED614 ; =0x0000A001 add r0, sl, #0x200 - bl Mathi_Crc16InitTable + bl MATHi_CRC16InitTable mov r5, #0x100 ldr r6, _022ED618 ; =ov00_023276E0 mov r8, #0 @@ -58619,7 +58619,7 @@ _022ED59C: mov r1, sl mov r2, #0xfe add r0, sl, #0x200 - bl Math_CalcCrc16 + bl MATH_CalcCRC16 strh r0, [sl, #0xfe] _022ED5C0: mov r0, sb @@ -58743,7 +58743,7 @@ _022ED738: mov r1, r7 mov r2, r4 add r0, r8, #0x500 - bl Math_CalcCrc16 + bl MATH_CalcCRC16 add r1, r8, r5, lsl #8 strh r0, [r1, #0xfe] _022ED750: @@ -59426,7 +59426,7 @@ Dwc_BM_Init: ; 0x022EE018 ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} ldr r1, _022EE310 ; =0x0000A001 add r0, r8, #0x500 - bl Mathi_Crc16InitTable + bl MATHi_CRC16InitTable mov r0, r8 bl Dwci_BackuplRead cmp r0, #0 @@ -59447,7 +59447,7 @@ _022EE094: mov r1, r6 mov r2, r4 add r0, r8, #0x500 - bl Math_CalcCrc16 + bl MATH_CalcCRC16 add r1, r8, r5, lsl #8 ldrh r1, [r1, #0xfe] cmp r0, r1 @@ -59465,7 +59465,7 @@ _022EE0C4: add r0, r8, #0x500 add r1, r8, #0x300 mov r2, #0xfe - bl Math_CalcCrc16 + bl MATH_CalcCRC16 add r1, r8, #0x300 ldrh r1, [r1, #0xfe] cmp r0, r1 diff --git a/asm/overlay_02.s b/asm/overlay_02.s index 4618f31e..ba68b010 100644 --- a/asm/overlay_02.s +++ b/asm/overlay_02.s @@ -42705,7 +42705,7 @@ Dwci_SettignlInit: ; 0x023474C0 str r0, [r1] ldr r1, _02347500 ; =0x0000A001 add r0, r2, #0x400 - bl Mathi_Crc16InitTable + bl MATHi_CRC16InitTable ldr r0, _023474FC ; =ov02_0235AB48 ldr r0, [r0] bl Dwci_BackuplRead @@ -43525,7 +43525,7 @@ _02347F08: add r0, r1, #0xf8 add r0, r0, #0x400 add r1, r1, r7 - bl Math_CalcCrc16 + bl MATH_CalcCRC16 ldr r1, [r8] add r1, r1, r6, lsl #8 strh r0, [r1, #0xfe] diff --git a/common.mk b/common.mk index 919b3851..566343b8 100644 --- a/common.mk +++ b/common.mk @@ -88,7 +88,7 @@ PRECOMPILE_OBJ_DIR := $(dir $(PRECOMPILE_OBJ)) PRECOMPILE_DEPFILE := $(BUILD_DIR)/precompile/global.d # Directories -NITROSDK_SRC_SUBDIRS := os mi snd fs gx fx +NITROSDK_SRC_SUBDIRS := os mi snd fs gx fx rtc math LIB_SUBDIRS := DSE NitroSDK MSL_C SRC_SUBDIR := src @@ -132,6 +132,7 @@ XMAP := $(NEF).xMAP EXCCFLAGS := -Cpp_exceptions off MWCFLAGS = $(DEFINES) -enum min -lang c99 $(EXCCFLAGS) -gccext,on -proc $(PROC) -msgstyle gcc -gccinc -i ./include -i ./include/library -i $(WORK_DIR)/files -I$(WORK_DIR)/lib/include -interworking -inline on,noauto -char signed -W all -W pedantic -W noimpl_signedunsigned -W noimplicitconv -W nounusedarg -W nomissingreturn -W error +MWCFLAGS_LIB = $(DEFINES) -enum int -lang c99 $(EXCCFLAGS) -gccext,on -proc $(PROC) -msgstyle gcc -gccinc -i ./include -i ./include/library -i $(WORK_DIR)/files -I$(WORK_DIR)/lib/include -interworking -inline on,noauto -char signed -W all -W pedantic -W noimpl_signedunsigned -W noimplicitconv -W nounusedarg -W nomissingreturn -W error -stdinc MWASFLAGS = $(DEFINES) -proc $(PROC_S) -gccinc -i . -i ./include -i $(WORK_DIR)/asm/include -i $(WORK_DIR)/files -i $(WORK_DIR)/lib/asm/include -i $(WORK_DIR)/lib/syscall/asm/include -I$(WORK_DIR)/lib/include -DSDK_ASM MWLDFLAGS := -proc $(PROC) -nopic -nopid -interworking -map closure,unused -symtab sort -m _start -msgstyle gcc @@ -146,7 +147,7 @@ SRC_INCLUDE_FLAGS := -i ./include -i ./include/library -i $(WORK_DIR)/files $(LI SDK_INCLUDE_FLAGS := $(LIBRARY_INCLUDE_FLAGS) MW_COMPILE_SRC = $(WINE) $(MWCC) $(OPTFLAGS) $(MWCFLAGS) $(SRC_INCLUDE_FLAGS) -i $(PRECOMPILE_OBJ_DIR) -prefix $(PRECOMPILE_OBJ_BASENAME) -MW_COMPILE_LIB = $(WINE) $(MWCC) $(OPTFLAGS_SDK) $(MWCFLAGS) $(SRC_INCLUDE_FLAGS) -i $(PRECOMPILE_OBJ_DIR) -prefix $(PRECOMPILE_OBJ_BASENAME) +MW_COMPILE_LIB = $(WINE) $(MWCC) $(OPTFLAGS_SDK) $(MWCFLAGS_LIB) $(SRC_INCLUDE_FLAGS) -i $(PRECOMPILE_OBJ_DIR) -prefix $(PRECOMPILE_OBJ_BASENAME) MW_COMPILE_SRC_PRECOMPILE = $(WINE) $(MWCC) $(MWCFLAGS) $(SRC_INCLUDE_FLAGS) MW_ASSEMBLE = $(WINE) $(MWAS) $(MWASFLAGS) diff --git a/lib/NitroSDK/asm/dgt.s b/lib/NitroSDK/asm/dgt.s index 76002179..7611a743 100644 --- a/lib/NitroSDK/asm/dgt.s +++ b/lib/NitroSDK/asm/dgt.s @@ -3,8 +3,8 @@ .text - arm_func_start Dgt_Hash2Init -Dgt_Hash2Init: ; 0x02080670 + arm_func_start DGT_Hash2Reset +DGT_Hash2Reset: ; 0x02080670 ldr r1, _020806AC ; =0x67452301 ldr r2, _020806B0 ; =0xEFCDAB89 str r1, [r0] @@ -26,10 +26,10 @@ _020806B0: .word 0xEFCDAB89 _020806B4: .word 0x98BADCFE _020806B8: .word 0x10325476 _020806BC: .word 0xC3D2E1F0 - arm_func_end Dgt_Hash2Init + arm_func_end DGT_Hash2Reset - arm_func_start Dgt_Hash2Update -Dgt_Hash2Update: ; 0x020806C0 + arm_func_start DGT_Hash2SetSource +DGT_Hash2SetSource: ; 0x020806C0 stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} mov sl, r0 movs r8, r2 @@ -121,10 +121,10 @@ _020807F0: ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} .align 2, 0 _02080810: .word _020B2D88 - arm_func_end Dgt_Hash2Update + arm_func_end DGT_Hash2SetSource - arm_func_start Dgt_Hash2GetHash -Dgt_Hash2GetHash: ; 0x02080814 + arm_func_start DGT_Hash2GetDigest +DGT_Hash2GetDigest: ; 0x02080814 stmdb sp!, {r0, r1, r2, r3} stmdb sp!, {r4, r5, r6, lr} ldr r0, [sp, #0x10] @@ -260,7 +260,7 @@ _020808D4: bx lr .align 2, 0 _02080A0C: .word _020B2D88 - arm_func_end Dgt_Hash2GetHash + arm_func_end DGT_Hash2GetDigest arm_func_start Dgt_Hash2CalcHmac Dgt_Hash2CalcHmac: ; 0x02080A10 @@ -280,11 +280,11 @@ Dgt_Hash2CalcHmac: ; 0x02080A10 add lr, sp, #0x38 add ip, sp, #0x24 str lr, [sp, #0x10] - ldr lr, _02080A98 ; =Dgt_Hash2Init + ldr lr, _02080A98 ; =DGT_Hash2Reset str ip, [sp, #0x14] - ldr ip, _02080A9C ; =Dgt_Hash2Update + ldr ip, _02080A9C ; =DGT_Hash2SetSource str lr, [sp, #0x18] - ldr lr, _02080AA0 ; =Dgt_Hash2GetHash + ldr lr, _02080AA0 ; =DGT_Hash2GetDigest str ip, [sp, #0x1c] ldr ip, [sp, #0xb8] str lr, [sp, #0x20] @@ -299,9 +299,9 @@ Dgt_Hash2CalcHmac: ; 0x02080A10 ldmia sp!, {r4, r5, r6, r7, r8, pc} .align 2, 0 _02080A94: .word _020AEC5C -_02080A98: .word Dgt_Hash2Init -_02080A9C: .word Dgt_Hash2Update -_02080AA0: .word Dgt_Hash2GetHash +_02080A98: .word DGT_Hash2Reset +_02080A9C: .word DGT_Hash2SetSource +_02080AA0: .word DGT_Hash2GetDigest arm_func_end Dgt_Hash2CalcHmac arm_func_start Dgti_CalcHmac diff --git a/lib/NitroSDK/asm/include/main_0207F894.inc b/lib/NitroSDK/asm/include/main_0207F894.inc index 8ee00b15..8f3db743 100644 --- a/lib/NitroSDK/asm/include/main_0207F894.inc +++ b/lib/NitroSDK/asm/include/main_0207F894.inc @@ -75,9 +75,9 @@ .public DC_InvalidateRange .public DC_StoreRange .public DC_WaitWriteBufferEmpty -.public Dgt_Hash2GetHash -.public Dgt_Hash2Init -.public Dgt_Hash2Update +.public DGT_Hash2GetDigest +.public DGT_Hash2Reset +.public DGT_Hash2SetSource .public EnableIrqFlag .public fflush .public FS_CloseFile diff --git a/lib/NitroSDK/asm/math_crc.s b/lib/NitroSDK/asm/math_crc.s index 74b3b218..159bfa05 100644 --- a/lib/NitroSDK/asm/math_crc.s +++ b/lib/NitroSDK/asm/math_crc.s @@ -3,8 +3,8 @@ .text - arm_func_start Mathi_Crc8InitTable -Mathi_Crc8InitTable: ; 0x02084FB8 + arm_func_start MATHi_CRC8InitTable +MATHi_CRC8InitTable: ; 0x02084FB8 stmdb sp!, {r3, lr} mov ip, #0 mov r2, ip @@ -23,10 +23,10 @@ _02084FCC: cmp ip, #0x100 blo _02084FC4 ldmia sp!, {r3, pc} - arm_func_end Mathi_Crc8InitTable + arm_func_end MATHi_CRC8InitTable - arm_func_start Mathi_Crc8Update -Mathi_Crc8Update: ; 0x02084FF8 + arm_func_start MATHi_CRC8Update +MATHi_CRC8Update: ; 0x02084FF8 stmdb sp!, {r4, lr} cmp r3, #0 ldrb lr, [r1] @@ -43,10 +43,10 @@ _0208500C: _02085028: strb lr, [r1] ldmia sp!, {r4, pc} - arm_func_end Mathi_Crc8Update + arm_func_end MATHi_CRC8Update - arm_func_start Mathi_Crc16InitTable -Mathi_Crc16InitTable: ; 0x02085030 + arm_func_start MATHi_CRC16InitTable +MATHi_CRC16InitTable: ; 0x02085030 stmdb sp!, {r3, lr} mov lr, #0 mov r3, lr @@ -66,10 +66,10 @@ _02085044: cmp lr, #0x100 blo _0208503C ldmia sp!, {r3, pc} - arm_func_end Mathi_Crc16InitTable + arm_func_end MATHi_CRC16InitTable - arm_func_start Mathi_Crc16Update -Mathi_Crc16Update: ; 0x02085074 + arm_func_start MATHi_CRC16Update +MATHi_CRC16Update: ; 0x02085074 stmdb sp!, {r4, lr} cmp r3, #0 ldrh lr, [r1] @@ -88,10 +88,10 @@ _02085088: _020850AC: strh lr, [r1] ldmia sp!, {r4, pc} - arm_func_end Mathi_Crc16Update + arm_func_end MATHi_CRC16Update - arm_func_start Mathi_Crc32InitTable -Mathi_Crc32InitTable: ; 0x020850B4 + arm_func_start MATHi_CRC32InitTable +MATHi_CRC32InitTable: ; 0x020850B4 stmdb sp!, {r3, lr} mov ip, #0 mov r2, ip @@ -110,10 +110,10 @@ _020850C8: cmp ip, #0x100 blo _020850C0 ldmia sp!, {r3, pc} - arm_func_end Mathi_Crc32InitTable + arm_func_end MATHi_CRC32InitTable - arm_func_start Mathi_Crc32Update -Mathi_Crc32Update: ; 0x020850F4 + arm_func_start MATHi_CRC32Update +MATHi_CRC32Update: ; 0x020850F4 stmdb sp!, {r4, lr} cmp r3, #0 ldr lr, [r1] @@ -131,10 +131,10 @@ _02085108: _02085128: str lr, [r1] ldmia sp!, {r4, pc} - arm_func_end Mathi_Crc32Update + arm_func_end MATHi_CRC32Update - arm_func_start Math_CalcCrc8 -Math_CalcCrc8: ; 0x02085130 + arm_func_start MATH_CalcCRC8 +MATH_CalcCRC8: ; 0x02085130 stmdb sp!, {r3, lr} mov lr, r1 mov ip, #0 @@ -142,13 +142,13 @@ Math_CalcCrc8: ; 0x02085130 add r1, sp, #0 mov r2, lr strb ip, [sp] - bl Mathi_Crc8Update + bl MATHi_CRC8Update ldrb r0, [sp] ldmia sp!, {r3, pc} - arm_func_end Math_CalcCrc8 + arm_func_end MATH_CalcCRC8 - arm_func_start Math_CalcCrc16 -Math_CalcCrc16: ; 0x02085158 + arm_func_start MATH_CalcCRC16 +MATH_CalcCRC16: ; 0x02085158 stmdb sp!, {r3, lr} mov lr, r1 mov ip, #0 @@ -156,13 +156,13 @@ Math_CalcCrc16: ; 0x02085158 add r1, sp, #0 mov r2, lr strh ip, [sp] - bl Mathi_Crc16Update + bl MATHi_CRC16Update ldrh r0, [sp] ldmia sp!, {r3, pc} - arm_func_end Math_CalcCrc16 + arm_func_end MATH_CalcCRC16 - arm_func_start Math_CalcCrc32 -Math_CalcCrc32: ; 0x02085180 + arm_func_start MATH_CalcCRC32 +MATH_CalcCRC32: ; 0x02085180 stmdb sp!, {r3, lr} mov lr, r1 mvn ip, #0 @@ -170,11 +170,11 @@ Math_CalcCrc32: ; 0x02085180 add r1, sp, #0 mov r2, lr str ip, [sp] - bl Mathi_Crc32Update + bl MATHi_CRC32Update ldr r0, [sp] mvn r0, r0 ldmia sp!, {r3, pc} - arm_func_end Math_CalcCrc32 + arm_func_end MATH_CalcCRC32 arm_func_start sub_020851AC sub_020851AC: ; 0x020851AC diff --git a/lib/NitroSDK/asm/math_dgt.s b/lib/NitroSDK/asm/math_dgt.s deleted file mode 100644 index 380733c8..00000000 --- a/lib/NitroSDK/asm/math_dgt.s +++ /dev/null @@ -1,25 +0,0 @@ - .include "asm/macros.inc" - .include "main_0207F894.inc" - - .text - - arm_func_start Math_CalcSha1 -Math_CalcSha1: ; 0x02084F78 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x68 - mov r6, r0 - add r0, sp, #0 - mov r5, r1 - mov r4, r2 - bl Dgt_Hash2Init - add r0, sp, #0 - mov r1, r5 - mov r2, r4 - bl Dgt_Hash2Update - add r0, sp, #0 - mov r1, r6 - bl Dgt_Hash2GetHash - add sp, sp, #0x68 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end Math_CalcSha1 - diff --git a/lib/NitroSDK/src/math_math.c b/lib/NitroSDK/src/math/math.c similarity index 100% rename from lib/NitroSDK/src/math_math.c rename to lib/NitroSDK/src/math/math.c diff --git a/lib/NitroSDK/src/math/math_crc.c b/lib/NitroSDK/src/math/math_crc.c new file mode 100644 index 00000000..d96f20e0 --- /dev/null +++ b/lib/NitroSDK/src/math/math_crc.c @@ -0,0 +1,250 @@ +#include + +void MATHi_CRC8InitTable (MATHCRC8Table *table, u8 poly) +{ + u32 r; + u32 i, j; + u8 *t = table->table; + + for (i = 0; i < 256; i++) { + r = i; + for (j = 0; j < 8; j++) { + if (r & 0x80) { + r = (r << 1) ^ poly; + } else { + r <<= 1; + } + } + t[i] = (u8)r; + } +} + +// void MATHi_CRC8InitTableRev (MATHCRC8Table *table, u8 poly) +// { +// u32 r; +// u32 i, j; +// u8 *t = table->table; +// +// for (i = 0; i < 256; i++) { +// r = i; +// for (j = 0; j < 8; j++) { +// if (r & 1) { +// r = (r >> 1) ^ poly; +// } else { +// r >>= 1; +// } +// } +// t[i] = (u8)r; +// } +// } + +void MATHi_CRC8Update (const MATHCRC8Table *table, MATHCRC8Context *context, const void *input, u32 length) +{ + u32 r; + u32 i; + const u8 *t = table->table; + u8 *data = (u8 *)input; + + r = (u32) * context; + + for (i = 0; i < length; i++) { + r = t[(r ^ *data) & 0xff]; + data++; + } + + *context = (MATHCRC8Context) r; +} + +void MATHi_CRC16InitTable (MATHCRC16Table *table, u16 poly) +{ + u32 r; + u32 i, j; + u16 *t = table->table; + + for (i = 0; i < 256; i++) { + r = i << 8; + for (j = 0; j < 8; j++) { + if (r & 0x8000) { + r = (r << 1) ^ poly; + } else { + r <<= 1; + } + } + t[i] = (u16)r; + } +} + +// void MATHi_CRC16InitTableRev (MATHCRC16Table *table, u16 poly) +// { +// u32 r; +// u32 i, j; +// u16 *t = table->table; +// +// for (i = 0; i < 256; i++) { +// r = i; +// for (j = 0; j < 8; j++) { +// if (r & 1) { +// r = (r >> 1) ^ poly; +// } else { +// r >>= 1; +// } +// } +// t[i] = (u16)r; +// } +// } + +void MATHi_CRC16Update (const MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length) +{ + u32 r; + u32 i; + const u16 *t = table->table; + u8 *data = (u8 *)input; + + r = (u32) * context; + + for (i = 0; i < length; i++) { + r = (r << 8) ^ t[((r >> 8) ^ *data) & 0xff]; + data++; + } + + *context = (MATHCRC16Context) r; +} + +// void MATHi_CRC16UpdateRev (const MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length) +// { +// u32 r; +// u32 i; +// const u16 *t = table->table; +// u8 *data = (u8 *)input; +// +// r = (u32) * context; +// +// for (i = 0; i < length; i++) { +// r = (r >> 8) ^ t[(r ^ *data) & 0xff]; +// data++; +// } +// +// *context = (MATHCRC16Context) r; +// } + +void MATHi_CRC32InitTable (MATHCRC32Table *table, u32 poly) +{ + u32 r; + u32 i, j; + u32 *t = table->table; + + for (i = 0; i < 256; i++) { + r = i << 24; + for (j = 0; j < 8; j++) { + if (r & 0x80000000U) { + r = (r << 1) ^ poly; + } else { + r <<= 1; + } + } + t[i] = r; + } +} + +// void MATHi_CRC32InitTableRev (MATHCRC32Table *table, u32 poly) +// { +// u32 r; +// u32 i, j; +// u32 *t = table->table; +// +// for (i = 0; i < 256; i++) { +// r = i; +// for (j = 0; j < 8; j++) { +// if (r & 1) { +// r = (r >> 1) ^ poly; +// } else { +// r >>= 1; +// } +// } +// t[i] = r; +// } +// } + +void MATHi_CRC32Update (const MATHCRC32Table *table, MATHCRC32Context *context, const void *input, u32 length) +{ + u32 r; + u32 i; + const u32 *t = table->table; + u8 *data = (u8 *)input; + + r = (u32) * context; + + for (i = 0; i < length; i++) { + r = (r << 8) ^ t[((r >> 24) ^ *data) & 0xff]; + data++; + } + + *context = (MATHCRC32Context) r; +} + +// void MATHi_CRC32UpdateRev (const MATHCRC32Table *table, MATHCRC32Context *context, const void *input, u32 length) +// { +// u32 r; +// u32 i; +// const u32 *t = table->table; +// u8 *data = (u8 *)input; +// +// r = (u32) * context; +// +// for (i = 0; i < length; i++) { +// r = (r >> 8) ^ t[(r ^ *data) & 0xff]; +// data++; +// } +// +// *context = (MATHCRC32Context) r; +// } + +u8 MATH_CalcCRC8 (const MATHCRC8Table *table, const void *data, u32 dataLength) +{ + MATHCRC8Context context; + + MATH_CRC8Init(&context); + MATH_CRC8Update(table, &context, data, dataLength); + + return MATH_CRC8GetHash(&context); +} + +u16 MATH_CalcCRC16 (const MATHCRC16Table *table, const void *data, u32 dataLength) +{ + MATHCRC16Context context; + + MATH_CRC16Init(&context); + MATH_CRC16Update(table, &context, data, dataLength); + + return MATH_CRC16GetHash(&context); +} + +// u16 MATH_CalcCRC16CCITT (const MATHCRC16Table *table, const void *data, u32 dataLength) +// { +// MATHCRC16Context context; +// +// MATH_CRC16CCITTInit(&context); +// MATH_CRC16CCITTUpdate(table, &context, data, dataLength); +// +// return MATH_CRC16CCITTGetHash(&context); +// } + +u32 MATH_CalcCRC32 (const MATHCRC32Table *table, const void *data, u32 dataLength) +{ + MATHCRC32Context context; + + MATH_CRC32Init(&context); + MATH_CRC32Update(table, &context, data, dataLength); + + return MATH_CRC32GetHash(&context); +} + +// u32 MATH_CalcCRC32POSIX (const MATHCRC32Table *table, const void *data, u32 dataLength) +// { +// MATHCRC32Context context; +// +// MATH_CRC32POSIXInit(&context); +// MATH_CRC32POSIXUpdate(table, &context, data, dataLength); +// +// return MATH_CRC32POSIXGetHash(&context); +// } diff --git a/lib/NitroSDK/src/math/math_dgt.c b/lib/NitroSDK/src/math/math_dgt.c new file mode 100644 index 00000000..e4361e56 --- /dev/null +++ b/lib/NitroSDK/src/math/math_dgt.c @@ -0,0 +1,19 @@ +#include + +// void MATH_CalcMD5 (void *digest, const void *data, u32 dataLength) +// { +// MATHMD5Context context; +// +// MATH_MD5Init(&context); +// MATH_MD5Update(&context, data, dataLength); +// MATH_MD5GetHash(&context, digest); +// } + +void Math_CalcSha1 (void *digest, const void *data, u32 dataLength) +{ + MATHSHA1Context context; + + MATH_SHA1Init(&context); + MATH_SHA1Update(&context, data, dataLength); + MATH_SHA1GetHash(&context, digest); +} diff --git a/lib/NitroSDK/src/rtc_internal.c b/lib/NitroSDK/src/rtc/rtc_internal.c similarity index 100% rename from lib/NitroSDK/src/rtc_internal.c rename to lib/NitroSDK/src/rtc/rtc_internal.c diff --git a/lib/include/nitro/dgt/common.h b/lib/include/nitro/dgt/common.h new file mode 100644 index 00000000..547ce04b --- /dev/null +++ b/lib/include/nitro/dgt/common.h @@ -0,0 +1,19 @@ +#ifndef NITRO_DGT_COMMON_H_ +#define NITRO_DGT_COMMON_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#define DGT_HASH1_DIGEST_SIZE (128 / 8) +#define DGT_HASH2_DIGEST_SIZE (160 / 8) + +#define DGT_HASH_DIGEST_SIZE_MAX DGT_HASH2_DIGEST_SIZE + +#define DGT_HASH_BLOCK_SIZE (512 / 8) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/nitro/dgt/dgt.h b/lib/include/nitro/dgt/dgt.h new file mode 100644 index 00000000..a067a518 --- /dev/null +++ b/lib/include/nitro/dgt/dgt.h @@ -0,0 +1,77 @@ +#ifndef NITRO_DGT_DGT_H_ +#define NITRO_DGT_DGT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct DGTHash1Context { + union { + struct { + unsigned long a, b, c, d; + }; + unsigned long state[4]; + }; + unsigned long long length; + union { + unsigned long buffer32[16]; + unsigned char buffer8[64]; + }; +} DGTHash1Context; + +#if defined(SDK_DGT_HASH2_CODE_SAFE) || defined(SDK_WIN32) || defined(SDK_FROM_TOOL) + typedef struct DGTHash2Context { + unsigned long Intermediate_Hash[5]; + unsigned long Length_Low; + unsigned long Length_High; + int Message_Block_Index; + unsigned char Message_Block[64]; + int Computed; + int Corrupted; + } DGTHash2Context; +#else + typedef struct DGTHash2Context { + unsigned long h0, h1, h2, h3, h4; + unsigned long Nl, Nh; + int num; + unsigned long data[64 / 4]; + int dummy[2]; + } DGTHash2Context; +#endif + +#ifdef SDK_DGT_HASH1_CODE_SAFE + void DGT_Hash1Reset(DGTHash1Context *); + void DGT_Hash1SetSource(DGTHash1Context *, unsigned char *, unsigned long); + void DGT_Hash1GetDigest_R(unsigned char digest[16], DGTHash1Context *); +#else + void DGT_Hash1Reset(DGTHash1Context *); + void DGT_Hash1SetSource(DGTHash1Context *, const void *, unsigned long); + void DGT_Hash1GetDigest_R(void * digest, DGTHash1Context *); +#endif + +#if defined(SDK_DGT_HASH2_CODE_SAFE) || defined(SDK_WIN32) || defined(SDK_FROM_TOOL) + void DGT_Hash2Reset(DGTHash2Context *); + void DGT_Hash2SetSource(DGTHash2Context *, unsigned char *, unsigned long); + void DGT_Hash2GetDigest(DGTHash2Context *, unsigned char digest[20]); +#else + void DGT_Hash2Reset(DGTHash2Context *); + void DGT_Hash2SetSource(DGTHash2Context *, const unsigned char *, unsigned long); + void DGT_Hash2GetDigest(DGTHash2Context *, unsigned char * digest); +#endif + +void DGT_Hash1CalcHmac(void * digest, void * bin_ptr, int bin_len, void * key_ptr, int key_len); +void DGT_Hash2CalcHmac(void * digest, void * bin_ptr, int bin_len, void * key_ptr, int key_len); + +int DGT_Hash1CalcHmacForRms(void * digest, void * romh_ptr, int romh_len, void * mbin_ptr, int mbin_len, void * sbin_ptr, int sbin_len, void * key_ptr, int key_len); +int DGT_Hash2CalcHmacForRms(void * digest, void * romh_ptr, int romh_len, void * mbin_ptr, int mbin_len, void * sbin_ptr, int sbin_len, void * key_ptr, int key_len); +int DGT_Hash1TestHmacForRms(void * digest, void * romh_ptr, int romh_len, void * mbin_ptr, int mbin_len, void * sbin_ptr, int sbin_len, void * key_ptr, int key_len); +int DGT_Hash2TestHmacForRms(void * digest, void * romh_ptr, int romh_len, void * mbin_ptr, int mbin_len, void * sbin_ptr, int sbin_len, void * key_ptr, int key_len); +int DGT_SetOverlayTableMode(int flag); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/nitro/math.h b/lib/include/nitro/math.h index bfc300a8..64a8bce9 100644 --- a/lib/include/nitro/math.h +++ b/lib/include/nitro/math.h @@ -3,5 +3,7 @@ u8 Math_CountPopulation (u32 x); +#include + #endif //NITRO_MATH_H_ diff --git a/lib/include/nitro/math/dgt.h b/lib/include/nitro/math/dgt.h new file mode 100644 index 00000000..70dcc450 --- /dev/null +++ b/lib/include/nitro/math/dgt.h @@ -0,0 +1,79 @@ +#ifndef NITRO_MATH_DGT_H_ +#define NITRO_MATH_DGT_H_ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define MATH_MD5_DIGEST_SIZE DGT_HASH1_DIGEST_SIZE +#define MATH_SHA1_DIGEST_SIZE DGT_HASH2_DIGEST_SIZE + +#define MATH_MD5_BLOCK_SIZE DGT_HASH_BLOCK_SIZE +#define MATH_SHA1_BLOCK_SIZE DGT_HASH_BLOCK_SIZE + +typedef DGTHash1Context MATHMD5Context; +typedef DGTHash2Context MATHSHA1Context; + +static inline void MATH_MD5Init (MATHMD5Context * context) +{ + DGT_Hash1Reset(context); +} + +static inline void MATH_MD5Update (MATHMD5Context * context, const void * input, u32 length) +{ + DGT_Hash1SetSource(context, (u8 *)input, length); +} + +static inline void MATH_MD5GetHash (MATHMD5Context * context, void * digest) +{ + DGT_Hash1GetDigest_R((u8 *)digest, context); +} + +static inline void MATH_MD5GetDigest (MATHMD5Context * context, void * digest) +{ + MATH_MD5GetHash(context, digest); +} + +static inline void MATH_SHA1Init (MATHSHA1Context * context) +{ + DGT_Hash2Reset(context); +} + +static inline void MATH_SHA1Update (MATHSHA1Context * context, const void * input, u32 length) +{ + DGT_Hash2SetSource(context, (u8 *)input, length); +} + +static inline void MATH_SHA1GetHash (MATHSHA1Context * context, void * digest) +{ + DGT_Hash2GetDigest(context, (u8 *)digest); +} + +static inline void MATH_SHA1GetDigest (MATHSHA1Context * context, void * digest) +{ + MATH_SHA1GetHash(context, digest); +} + +void MATH_CalcMD5(void * digest, const void * data, u32 dataLength); +void Math_CalcSha1(void * digest, const void * data, u32 dataLength); + +static inline void MATH_CalcHMACMD5 (void * digest, const void * data, u32 dataLength, const void * key, u32 keyLength) +{ + DGT_Hash1CalcHmac(digest, (void *)data, (int)dataLength, (void *)key, (int)keyLength); +} + +static inline void MATH_CalcHMACSHA1 (void * digest, const void * data, u32 dataLength, const void * key, u32 keyLength) +{ + DGT_Hash2CalcHmac(digest, (void *)data, (int)dataLength, (void *)key, (int)keyLength); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/main.lsf b/main.lsf index aa5b322f..707d2b58 100644 --- a/main.lsf +++ b/main.lsf @@ -308,7 +308,7 @@ Static main Object lib/NitroSDK/asm/spi_tp.o Object lib/NitroSDK/asm/spi_pm.o Object lib/NitroSDK/asm/rtc_external.o - Object lib/NitroSDK/src/rtc_internal.o + Object lib/NitroSDK/src/rtc/rtc_internal.o Object lib/NitroSDK/asm/rtc_convert.o Object lib/NitroSDK/asm/card_common.o Object lib/NitroSDK/asm/card_spi.o @@ -319,8 +319,8 @@ Static main Object lib/NitroSDK/asm/ctrdg.o Object lib/NitroSDK/asm/ctrdg_proc.o Object lib/NitroSDK/asm/ctrdg_task.o - Object lib/NitroSDK/src/math_math.o - Object lib/NitroSDK/asm/math_dgt.o + Object lib/NitroSDK/src/math/math.o + Object lib/NitroSDK/src/math/math_dgt.o Object lib/NitroSDK/asm/math_crc.o Object lib/NitroSDK/asm/std_string.o Object lib/NitroSDK/src/os/os_printf_1.o From 2561788669aecd06e608fe0d4940124b13ba3b11 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 13 Jul 2026 11:03:18 -0700 Subject: [PATCH 03/10] move more gx files to src --- lib/NitroSDK/asm/g3_util.s | 59 -- lib/NitroSDK/asm/g3x.s | 353 -------- lib/NitroSDK/asm/gxstate.s | 35 - lib/NitroSDK/src/gx/g3x.c | 384 +++++++++ lib/NitroSDK/src/gx/gxstate.c | 397 +++++++++ lib/NitroSDK/src/math/math_crc.c | 250 ------ lib/include/nitro/gx.h | 5 + lib/include/nitro/gx/g3x.h | 280 +++++++ lib/include/nitro/gx/gx.h | 678 +++++++++++++++ lib/include/nitro/gx/gx_bgcnt.h | 1292 +++++++++++++++++++++++++++++ lib/include/nitro/gx/gx_vramcnt.h | 408 +++++++++ lib/include/nitro/gx/gxstate.h | 114 +++ main.lsf | 4 +- src/main_0200961C.c | 11 +- 14 files changed, 3561 insertions(+), 709 deletions(-) delete mode 100644 lib/NitroSDK/asm/g3_util.s delete mode 100644 lib/NitroSDK/asm/g3x.s delete mode 100644 lib/NitroSDK/asm/gxstate.s create mode 100644 lib/NitroSDK/src/gx/g3x.c create mode 100644 lib/NitroSDK/src/gx/gxstate.c delete mode 100644 lib/NitroSDK/src/math/math_crc.c create mode 100644 lib/include/nitro/gx/g3x.h create mode 100644 lib/include/nitro/gx/gx.h create mode 100644 lib/include/nitro/gx/gx_bgcnt.h create mode 100644 lib/include/nitro/gx/gx_vramcnt.h create mode 100644 lib/include/nitro/gx/gxstate.h diff --git a/lib/NitroSDK/asm/g3_util.s b/lib/NitroSDK/asm/g3_util.s deleted file mode 100644 index edff6799..00000000 --- a/lib/NitroSDK/asm/g3_util.s +++ /dev/null @@ -1,59 +0,0 @@ - .include "asm/macros.inc" - .include "include/g3x.inc" - - .text - - arm_func_start G3i_OrthoW_ -G3i_OrthoW_: ; 0x02077C48 - stmdb sp!, {r4, lr} - sub sp, sp, #0x50 - ldr ip, [sp, #0x58] - ldr lr, [sp, #0x5c] - str ip, [sp] - ldr r4, [sp, #0x68] - ldr ip, [sp, #0x60] - str lr, [sp, #4] - cmp r4, #0 - addeq r4, sp, #0x10 - str ip, [sp, #8] - str r4, [sp, #0xc] - bl MTX_OrthoW - ldr r0, [sp, #0x64] - cmp r0, #0 - addeq sp, sp, #0x50 - ldmeqia sp!, {r4, pc} - ldr r1, _02077CA8 ; =0x04000440 - mov r2, #0 - mov r0, r4 - str r2, [r1] - bl G3_LoadMtx44 - add sp, sp, #0x50 - ldmia sp!, {r4, pc} - .align 2, 0 -_02077CA8: .word 0x04000440 - arm_func_end G3i_OrthoW_ - - arm_func_start G3i_LookAt_ -G3i_LookAt_: ; 0x02077CAC - stmdb sp!, {r3, r4, r5, lr} - sub sp, sp, #0x30 - ldr r4, [sp, #0x40] - mov r5, r3 - cmp r4, #0 - addeq r4, sp, #0 - mov r3, r4 - bl MTX_LookAt - cmp r5, #0 - addeq sp, sp, #0x30 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r1, _02077CF4 ; =0x04000440 - mov r2, #2 - mov r0, r4 - str r2, [r1] - bl G3_LoadMtx43 - add sp, sp, #0x30 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02077CF4: .word 0x04000440 - arm_func_end G3i_LookAt_ - diff --git a/lib/NitroSDK/asm/g3x.s b/lib/NitroSDK/asm/g3x.s deleted file mode 100644 index b87bfbb9..00000000 --- a/lib/NitroSDK/asm/g3x.s +++ /dev/null @@ -1,353 +0,0 @@ - .include "asm/macros.inc" - .include "include/g3x.inc" - - .text - - arm_func_start G3X_Init -G3X_Init: ; 0x020777C4 - stmdb sp!, {r3, lr} - bl G3X_ClearFifo - ldr r1, _020778B0 ; =0x04000504 - mov r0, #0 - str r0, [r1] -_020777D8: - ldr r0, [r1, #0xfc] - tst r0, #0x8000000 - bne _020777D8 - ldr r0, _020778B4 ; =0x04000060 - mov r2, #0 - strh r2, [r0] - str r2, [r1, #0xfc] - str r2, [r0, #-0x50] - ldrh ip, [r0] - ldr r2, _020778B8 ; =0xFFFFCFFD - ldr r3, _020778BC ; =0x0000CFFB - orr ip, ip, #0x2000 - strh ip, [r0] - ldrh ip, [r0] - orr ip, ip, #0x1000 - strh ip, [r0] - ldrh ip, [r0] - and r2, ip, r2 - strh r2, [r0] - ldrh r2, [r0] - bic r2, r2, #0x3000 - orr r2, r2, #0x10 - strh r2, [r0] - ldrh r2, [r0] - and r2, r2, r3 - strh r2, [r0] - ldr r0, [r1, #0xfc] - orr r0, r0, #0x8000 - str r0, [r1, #0xfc] - ldr r0, [r1, #0xfc] - bic r0, r0, #0xc0000000 - orr r0, r0, #0x80000000 - str r0, [r1, #0xfc] - bl G3X_InitMtxStack - ldr r1, _020778C0 ; =0x04000350 - mov r2, #0 - ldr r0, _020778C4 ; =0x00007FFF - str r2, [r1] - strh r0, [r1, #4] - strh r2, [r1, #6] - str r2, [r1, #8] - strh r2, [r1, #0xc] - sub r1, r1, #0x348 - ldrh r0, [r1] - bic r0, r0, #3 - strh r0, [r1] - bl G3X_InitTable - ldr r2, _020778C8 ; =0x001F0080 - ldr r1, _020778CC ; =0x040004A4 - mov r0, #0 - str r2, [r1] - str r0, [r1, #4] - str r0, [r1, #8] - ldmia sp!, {r3, pc} - .align 2, 0 -_020778B0: .word 0x04000504 -_020778B4: .word 0x04000060 -_020778B8: .word 0xFFFFCFFD -_020778BC: .word 0x0000CFFB -_020778C0: .word 0x04000350 -_020778C4: .word 0x00007FFF -_020778C8: .word 0x001F0080 -_020778CC: .word 0x040004A4 - arm_func_end G3X_Init - - arm_func_start G3X_Reset -G3X_Reset: ; 0x020778D0 - stmdb sp!, {r3, lr} - ldr r2, _0207792C ; =0x04000600 -_020778D8: - ldr r0, [r2] - tst r0, #0x8000000 - bne _020778D8 - ldr r0, [r2] - ldr r1, _02077930 ; =0x04000060 - orr r0, r0, #0x8000 - str r0, [r2] - ldrh r0, [r1] - orr r0, r0, #0x2000 - strh r0, [r1] - ldrh r0, [r1] - orr r0, r0, #0x1000 - strh r0, [r1] - bl G3X_ResetMtxStack - ldr r2, _02077934 ; =0x001F0080 - ldr r1, _02077938 ; =0x040004A4 - mov r0, #0 - str r2, [r1] - str r0, [r1, #4] - str r0, [r1, #8] - ldmia sp!, {r3, pc} - .align 2, 0 -_0207792C: .word 0x04000600 -_02077930: .word 0x04000060 -_02077934: .word 0x001F0080 -_02077938: .word 0x040004A4 - arm_func_end G3X_Reset - - arm_func_start G3X_ClearFifo -G3X_ClearFifo: ; 0x0207793C - stmdb sp!, {r3, lr} - ldr r0, _0207795C ; =0x04000400 - bl GXi_NopClearFifo128_ - ldr r1, _02077960 ; =0x04000600 -_0207794C: - ldr r0, [r1] - tst r0, #0x8000000 - bne _0207794C - ldmia sp!, {r3, pc} - .align 2, 0 -_0207795C: .word 0x04000400 -_02077960: .word 0x04000600 - arm_func_end G3X_ClearFifo - - arm_func_start G3X_InitMtxStack -G3X_InitMtxStack: ; 0x02077964 - stmdb sp!, {r4, lr} - sub sp, sp, #8 - ldr r1, _020779F0 ; =0x04000600 - ldr r0, [r1] - orr r0, r0, #0x8000 - str r0, [r1] - add r4, sp, #4 -_02077980: - mov r0, r4 - bl G3X_GetMtxStackLevelPV - cmp r0, #0 - bne _02077980 - add r4, sp, #0 -_02077994: - mov r0, r4 - bl G3X_GetMtxStackLevelPJ - cmp r0, #0 - bne _02077994 - ldr r1, _020779F4 ; =0x04000440 - mov r0, #3 - str r0, [r1] - mov r0, #0 - str r0, [r1, #0x14] - str r0, [r1] - ldr r0, [sp] - mov r2, #0 - cmp r0, #0 - strne r0, [r1, #8] - ldr r1, _020779F8 ; =0x04000454 - mov r0, #2 - str r2, [r1] - str r0, [r1, #-0x14] - ldr r0, [sp, #4] - str r0, [r1, #-0xc] - str r2, [r1] - add sp, sp, #8 - ldmia sp!, {r4, pc} - .align 2, 0 -_020779F0: .word 0x04000600 -_020779F4: .word 0x04000440 -_020779F8: .word 0x04000454 - arm_func_end G3X_InitMtxStack - - arm_func_start G3X_ResetMtxStack -G3X_ResetMtxStack: ; 0x020779FC - stmdb sp!, {r4, lr} - sub sp, sp, #8 - ldr r1, _02077A84 ; =0x04000600 - ldr r0, [r1] - orr r0, r0, #0x8000 - str r0, [r1] - add r4, sp, #4 -_02077A18: - mov r0, r4 - bl G3X_GetMtxStackLevelPV - cmp r0, #0 - bne _02077A18 - add r4, sp, #0 -_02077A2C: - mov r0, r4 - bl G3X_GetMtxStackLevelPJ - cmp r0, #0 - bne _02077A2C - ldr r1, _02077A88 ; =0x04000440 - mov r0, #3 - str r0, [r1] - mov r0, #0 - str r0, [r1, #0x14] - str r0, [r1] - ldr r0, [sp] - ldr r2, _02077A88 ; =0x04000440 - cmp r0, #0 - strne r0, [r1, #8] - mov r0, #2 - str r0, [r2] - ldr r1, [sp, #4] - mov r0, #0 - str r1, [r2, #8] - str r0, [r2, #0x14] - add sp, sp, #8 - ldmia sp!, {r4, pc} - .align 2, 0 -_02077A84: .word 0x04000600 -_02077A88: .word 0x04000440 - arm_func_end G3X_ResetMtxStack - - arm_func_start G3X_SetClearColor -G3X_SetClearColor: ; 0x02077A8C - ldr ip, [sp] - orr r0, r0, r1, lsl #16 - orr r1, r0, r3, lsl #24 - cmp ip, #0 - ldr r0, _02077AB0 ; =0x04000350 - orrne r1, r1, #0x8000 - str r1, [r0] - strh r2, [r0, #4] - bx lr - .align 2, 0 -_02077AB0: .word 0x04000350 - arm_func_end G3X_SetClearColor - - arm_func_start G3X_InitTable -G3X_InitTable: ; 0x02077AB4 - stmdb sp!, {r3, lr} - sub sp, sp, #8 - ldr r0, _02077B44 ; =GXi_DmaId - mvn r1, #0 - ldr r0, [r0] - cmp r0, r1 - ldr r1, _02077B48 ; =0x04000330 - beq _02077B04 - mov r2, #0 - str r2, [sp] - mov r3, #0x10 - str r2, [sp, #4] - bl MI_DmaFill32Async - ldr r0, _02077B44 ; =GXi_DmaId - ldr r1, _02077B4C ; =0x04000360 - ldr r0, [r0] - mov r2, #0 - mov r3, #0x60 - bl MI_DmaFill32 - b _02077B20 -_02077B04: - mov r0, #0 - mov r2, #0x10 - bl MTi_CpuClear32 - ldr r1, _02077B4C ; =0x04000360 - mov r0, #0 - mov r2, #0x60 - bl MTi_CpuClear32 -_02077B20: - mov r2, #0 - ldr r0, _02077B50 ; =0x040004D0 - mov r1, r2 -_02077B2C: - add r2, r2, #1 - str r1, [r0] - cmp r2, #0x20 - blt _02077B2C - add sp, sp, #8 - ldmia sp!, {r3, pc} - .align 2, 0 -_02077B44: .word GXi_DmaId -_02077B48: .word 0x04000330 -_02077B4C: .word 0x04000360 -_02077B50: .word 0x040004D0 - arm_func_end G3X_InitTable - - arm_func_start G3X_GetMtxStackLevelPV -G3X_GetMtxStackLevelPV: ; 0x02077B54 - ldr r2, _02077B80 ; =0x04000600 - ldr r1, [r2] - tst r1, #0x4000 - mvnne r0, #0 - bxne lr - ldr r1, [r2] - and r1, r1, #0x1f00 - mov r1, r1, lsr #8 - str r1, [r0] - mov r0, #0 - bx lr - .align 2, 0 -_02077B80: .word 0x04000600 - arm_func_end G3X_GetMtxStackLevelPV - - arm_func_start G3X_GetMtxStackLevelPJ -G3X_GetMtxStackLevelPJ: ; 0x02077B84 - ldr r2, _02077BB0 ; =0x04000600 - ldr r1, [r2] - tst r1, #0x4000 - mvnne r0, #0 - bxne lr - ldr r1, [r2] - and r1, r1, #0x2000 - mov r1, r1, lsr #0xd - str r1, [r0] - mov r0, #0 - bx lr - .align 2, 0 -_02077BB0: .word 0x04000600 - arm_func_end G3X_GetMtxStackLevelPJ - - arm_func_start GXi_NopClearFifo128_ -GXi_NopClearFifo128_: ; 0x02077BB4 - mov r1, #0 - mov r2, #0 - mov r3, #0 - mov ip, #0 - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - stmia r0, {r1, r2, r3, ip} - bx lr - arm_func_end GXi_NopClearFifo128_ - diff --git a/lib/NitroSDK/asm/gxstate.s b/lib/NitroSDK/asm/gxstate.s deleted file mode 100644 index e46901a2..00000000 --- a/lib/NitroSDK/asm/gxstate.s +++ /dev/null @@ -1,35 +0,0 @@ - .include "asm/macros.inc" - .include "include/gx.inc" - - .text - - arm_func_start GX_InitGXState -GX_InitGXState: ; 0x0207634C - ldr r0, _020763A4 ; =gGXState - mov r2, #0 - strh r2, [r0] - strh r2, [r0, #2] - strh r2, [r0, #4] - strh r2, [r0, #6] - strh r2, [r0, #8] - strh r2, [r0, #0xa] - strh r2, [r0, #0xc] - strh r2, [r0, #0xe] - strh r2, [r0, #0x10] - strh r2, [r0, #0x12] - strh r2, [r0, #0x14] - strh r2, [r0, #0x16] - ldr r1, _020763A8 ; =0x04000240 - strh r2, [r0, #0x18] - str r2, [r1] - strb r2, [r1, #4] - strb r2, [r1, #5] - strb r2, [r1, #6] - strh r2, [r1, #8] - bx lr - .align 2, 0 -_020763A4: .word gGXState -_020763A8: .word 0x04000240 - arm_func_end GX_InitGXState - - diff --git a/lib/NitroSDK/src/gx/g3x.c b/lib/NitroSDK/src/gx/g3x.c new file mode 100644 index 00000000..6d431393 --- /dev/null +++ b/lib/NitroSDK/src/gx/g3x.c @@ -0,0 +1,384 @@ +#include +#include +#include + +static asm void GXi_NopClearFifo128_(register void *pDest); + +void G3X_Init (void) +{ +#ifdef SDK_DEBUG + { + GXPower power = GX_GetPower(); + SDK_WARNING(power & GX_POWER_RE, "GX_POWER_RE is off now, registers for it not initialized."); + SDK_WARNING(power & GX_POWER_GE, "GX_POWER_GE is off now, registers for it not initialized."); + } +#endif + + G3X_ClearFifo(); + G3_End(); + + while ( G3X_IsGeometryBusy()) { + } + + reg_G3X_DISP3DCNT = 0; + reg_G3X_GXSTAT = 0; + reg_G2_BG0OFS = 0; + + G3X_ResetListRamOverflow(); + G3X_ResetLineBufferUnderflow(); + G3X_SetShading(GX_SHADING_TOON); + G3X_AntiAlias(TRUE); + G3X_AlphaTest(FALSE, 0); + + G3X_ResetMtxStackOverflow(); + G3X_SetFifoIntrCond(GX_FIFOINTR_COND_EMPTY); + G3X_InitMtxStack(); + + reg_G3X_CLEAR_COLOR = 0; + reg_G3X_CLEAR_DEPTH = 0x7fff; + reg_G3X_CLRIMAGE_OFFSET = 0; + reg_G3X_FOG_COLOR = 0; + reg_G3X_FOG_OFFSET = 0; + + G2_SetBG0Priority(0); + G3X_InitTable(); + G3_PolygonAttr(GX_LIGHTMASK_NONE, GX_POLYGONMODE_MODULATE, GX_CULL_BACK, 0, 31, GX_POLYGON_ATTR_MISC_NONE); + + G3_TexImageParam(GX_TEXFMT_NONE, + GX_TEXGEN_NONE, + GX_TEXSIZE_S8, GX_TEXSIZE_T8, GX_TEXREPEAT_NONE, GX_TEXFLIP_NONE, GX_TEXPLTTCOLOR0_USE, 0); + + G3_Direct1(G3OP_TEXPLTT_BASE, 0); +} + +void G3X_Reset (void) +{ +#ifdef SDK_DEBUG + { + GXPower power = GX_GetPower(); + + SDK_WARNING(power & GX_POWER_RE, + "GX_POWER_RE is off now, registers for it not initialized."); + + SDK_WARNING(power & GX_POWER_GE, + "GX_POWER_GE is off now, registers for it not initialized."); + } +#endif + + while (G3X_IsGeometryBusy()) { + } + + G3X_ResetMtxStackOverflow(); + G3X_ResetListRamOverflow(); + G3X_ResetLineBufferUnderflow(); + G3X_ResetMtxStack(); + + G3_PolygonAttr(GX_LIGHTMASK_NONE, GX_POLYGONMODE_MODULATE, GX_CULL_BACK, 0, 31, + GX_POLYGON_ATTR_MISC_NONE); + + G3_TexImageParam(GX_TEXFMT_NONE, + GX_TEXGEN_NONE, + GX_TEXSIZE_S8, GX_TEXSIZE_T8, GX_TEXREPEAT_NONE, GX_TEXFLIP_NONE, + GX_TEXPLTTCOLOR0_USE, 0); + + G3_Direct1(G3OP_TEXPLTT_BASE, 0); +} + +void G3X_ClearFifo (void) +{ + GXi_NopClearFifo128_((void *)®_G3X_GXFIFO); + + while (G3X_IsGeometryBusy()) { + } +} + +void G3X_InitMtxStack (void) +{ + s32 levelPV; + s32 levelPJ; +#ifdef SDK_DEBUG + { + GXPower power = GX_GetPower(); + SDK_WARNING(power & GX_POWER_GE, + "GX_POWER_GE is off now, registers for it not initialized."); + } +#endif + G3X_ResetMtxStackOverflow(); + + while (G3X_GetMtxStackLevelPV(&levelPV)) + ; + + while (G3X_GetMtxStackLevelPJ(&levelPJ)) + ; + + G3_MtxMode(GX_MTXMODE_TEXTURE); + G3_Identity(); + G3_MtxMode(GX_MTXMODE_PROJECTION); + + if (levelPJ != 0) { + G3_PopMtx(levelPJ); + } + + G3_Identity(); + G3_MtxMode(GX_MTXMODE_POSITION_VECTOR); + G3_PopMtx(levelPV); + G3_Identity(); +} + +void G3X_ResetMtxStack (void) +{ + s32 levelPV; + s32 levelPJ; +#ifdef SDK_DEBUG + { + GXPower power = GX_GetPower(); + SDK_WARNING(power & GX_POWER_GE, "GX_POWER_GE is off now, registers for it not changes."); + } +#endif + G3X_ResetMtxStackOverflow(); + + while (G3X_GetMtxStackLevelPV(&levelPV)) + ; + + while (G3X_GetMtxStackLevelPJ(&levelPJ)) + ; + + G3_MtxMode(GX_MTXMODE_TEXTURE); + G3_Identity(); + G3_MtxMode(GX_MTXMODE_PROJECTION); + + if (levelPJ != 0) { + G3_PopMtx(levelPJ); + } + + G3_MtxMode(GX_MTXMODE_POSITION_VECTOR); + G3_PopMtx(levelPV); + G3_Identity(); + +} + +//void G3X_SetFog (BOOL enable, GXFogBlend fogMode, GXFogSlope fogSlope, int fogOffset) +//{ +// if (enable) { +// SDK_MINMAX_ASSERT(fogOffset, 0, 0x7fff); +// SDK_MINMAX_ASSERT(fogSlope, GX_FOGSLOPE_0x8000, GX_FOGSLOPE_0x0020); +// SDK_ASSERT(GX_FOGBLEND_COLOR_ALPHA == fogMode || GX_FOGBLEND_ALPHA == fogMode); +// +// reg_G3X_FOG_OFFSET = (u16)fogOffset; +// +// reg_G3X_DISP3DCNT = (u16)((reg_G3X_DISP3DCNT & +// ~(REG_G3X_DISP3DCNT_FOG_SHIFT_MASK +// | REG_G3X_DISP3DCNT_FMOD_MASK +// | REG_G3X_DISP3DCNT_RO_MASK +// | REG_G3X_DISP3DCNT_GO_MASK)) +// | ((fogSlope << REG_G3X_DISP3DCNT_FOG_SHIFT_SHIFT) +// | (fogMode << REG_G3X_DISP3DCNT_FMOD_SHIFT) +// | (REG_G3X_DISP3DCNT_FME_MASK))); +// } else { +// reg_G3X_DISP3DCNT &= (u16) ~(REG_G3X_DISP3DCNT_FME_MASK +// | REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK); +// } +//} +// +//int G3X_GetClipMtx (MtxFx44 *m) +//{ +// SDK_NULL_ASSERT(m); +// +// if (G3X_IsGeometryBusy()) { +// return -1; +// } else { +// MI_Copy64B((void *)REG_CLIPMTX_RESULT_0_ADDR, &m->_00); +// return 0; +// } +//} +// +//int G3X_GetVectorMtx (MtxFx33 *m) +//{ +// SDK_NULL_ASSERT(m); +// +// if (G3X_IsGeometryBusy()) { +// return -1; +// } else { +// MI_Copy36B((void *)(REG_VECMTX_RESULT_0_ADDR), &m->_00); +// return 0; +// } +//} +// +//void G3X_SetEdgeColorTable (const GXRgb *rgb_8) +//{ +// SDK_NULL_ASSERT(rgb_8); +// MI_CpuCopy16(rgb_8, (void *)REG_EDGE_COLOR_0_L_ADDR, 16); +//} +// +//void G3X_SetFogTable (const u32 *fogTable) +//{ +// SDK_NULL_ASSERT(fogTable); +// MI_Copy32B(&fogTable[0], (void *)REG_FOG_TABLE_0_ADDR); +//} +// +//void G3X_SetToonTable (const GXRgb *rgb_32) +//{ +// SDK_NULL_ASSERT(rgb_32); +// MI_CpuCopy16(rgb_32, (void *)REG_TOON_TABLE_0_L_ADDR, 64); +//} + +void G3X_SetClearColor (GXRgb rgb, int alpha, int depth, int polygonID, BOOL fog) +{ + u32 val; + GX_POLYGONID_ASSERT(polygonID); + GX_ALPHA_ASSERT(alpha); + GXRGB_ASSERT(rgb); + GX_DEPTH_ASSERT(depth); + + val = (u32)(rgb | (alpha << REG_G3X_CLEAR_COLOR_ALPHA_SHIFT) | (polygonID << REG_G3X_CLEAR_COLOR_POLYGONID_SHIFT)); + + if (fog) + val |= REG_G3X_CLEAR_COLOR_F_MASK; + + reg_G3X_CLEAR_COLOR = val; + reg_G3X_CLEAR_DEPTH = (u16)depth; +} + +void G3X_InitTable (void) +{ + int i; + + if (GXi_DmaId != GX_DMA_NOT_USE) { + MI_DmaFill32Async(GXi_DmaId, (void *)REG_EDGE_COLOR_0_L_ADDR, 0, 16, NULL, NULL); + MI_DmaFill32(GXi_DmaId, (void *)REG_FOG_TABLE_0_ADDR, 0, 96); + } else { + MI_CpuFill32((void *)REG_EDGE_COLOR_0_L_ADDR, 0, 16); + MI_CpuFill32((void *)REG_FOG_TABLE_0_ADDR, 0, 96); + } + + for (i = 0; i < 32; ++i) { + reg_G3_SHININESS = 0; + } +} + +int G3X_GetMtxStackLevelPV (s32 *level) +{ + SDK_NULL_ASSERT(level); + + if (reg_G3X_GXSTAT & REG_G3X_GXSTAT_SB_MASK) { + return -1; + } else { + *level = (s32)((reg_G3X_GXSTAT & REG_G3X_GXSTAT_PV_MASK) >> REG_G3X_GXSTAT_PV_SHIFT); + return 0; + } +} + +int G3X_GetMtxStackLevelPJ (s32 *level) +{ + SDK_NULL_ASSERT(level); + + if (reg_G3X_GXSTAT & REG_G3X_GXSTAT_SB_MASK) { + return -1; + } else { + *level = (s32)((reg_G3X_GXSTAT & REG_G3X_GXSTAT_PJ_MASK) >> REG_G3X_GXSTAT_PJ_SHIFT); + return 0; + } +} + +// void G3X_SetDisp1DotDepth (fx32 w) +// { +// SDK_MINMAX_ASSERT(w, 0, FX32_ONE * 0x1000 - 1); +// reg_G3X_DISP_1DOT_DEPTH = (u16)((w >> 9) & 0x7fff); +// } +// +// int G3X_GetBoxTestResult (s32 *in) +// { +// SDK_NULL_ASSERT(in); +// +// if (reg_G3X_GXSTAT & REG_G3X_GXSTAT_TB_MASK) +// return -1; +// else { +// *in = (s32)(reg_G3X_GXSTAT & REG_G3X_GXSTAT_TR_MASK); +// return 0; +// } +// } +// +// int G3X_GetPositionTestResult (VecFx32 *vec, fx32 *w) +// { +// SDK_NULL_ASSERT(vec); +// SDK_NULL_ASSERT(w); +// +// if (reg_G3X_GXSTAT & REG_G3X_GXSTAT_TB_MASK) { +// return -1; +// } else { +// vec->x = (fx32)reg_G3X_POS_RESULT_X; +// vec->y = (fx32)reg_G3X_POS_RESULT_Y; +// vec->z = (fx32)reg_G3X_POS_RESULT_Z; +// *w = (fx32)reg_G3X_POS_RESULT_W; +// return 0; +// } +// } +// +// int G3X_GetVectorTestResult (fx16 *vec) +// { +// SDK_NULL_ASSERT(vec); +// +// if (reg_G3X_GXSTAT & REG_G3X_GXSTAT_TB_MASK) { +// return -1; +// } else { +// *(vec + 0) = (fx16)reg_G3X_VEC_RESULT_X; +// *(vec + 1) = (fx16)reg_G3X_VEC_RESULT_Y; +// *(vec + 2) = (fx16)reg_G3X_VEC_RESULT_Z; +// return 0; +// } +// } +// +// void G3X_SetHOffset (int hOffset) +// { +// SDK_WARNING((reg_GX_DISPCNT & REG_GX_DISPCNT_BG02D3D_MASK) != 0, +// "BG0 is in 2D mode now. call \'G2_SetBG0Offset\'\n"); +// +// SDK_ASSERT(hOffset >= -256 && hOffset <= 255); +// +// reg_G2_BG0OFS = (u32)hOffset; +// } + +#include + +static asm void GXi_NopClearFifo128_ (register void *pDest) +{ + mov r1, #0 + mov r2, #0 + mov r3, #0 + mov r12, #0 + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + stmia r0, {r1 - r3, r12} + bx lr +} + +#include diff --git a/lib/NitroSDK/src/gx/gxstate.c b/lib/NitroSDK/src/gx/gxstate.c new file mode 100644 index 00000000..9069796f --- /dev/null +++ b/lib/NitroSDK/src/gx/gxstate.c @@ -0,0 +1,397 @@ +#include + +//GX_State gGXState; +extern GX_State gGXState; + +#ifdef SDK_CW_WARNOFF_SAFESTRB +#include +#endif + +void GX_InitGXState (void) +{ + gGXState.vramCnt.lcdc = 0; + gGXState.vramCnt.bg = 0; + gGXState.vramCnt.obj = 0; + gGXState.vramCnt.arm7 = 0; + gGXState.vramCnt.tex = 0; + gGXState.vramCnt.texPltt = 0; + gGXState.vramCnt.clrImg = 0; + gGXState.vramCnt.bgExtPltt = 0; + gGXState.vramCnt.objExtPltt = 0; + + gGXState.vramCnt.sub_bg = 0; + gGXState.vramCnt.sub_obj = 0; + gGXState.vramCnt.sub_bgExtPltt = 0; + gGXState.vramCnt.sub_objExtPltt = 0; + + reg_GX_VRAMCNT = 0; + *((u8 *)®_GX_WVRAMCNT + 0) = 0; + *((u8 *)®_GX_WVRAMCNT + 1) = 0; + *((u8 *)®_GX_WVRAMCNT + 2) = 0; + reg_GX_VRAM_HI_CNT = 0; +} + +#ifdef SDK_CW_WARNOFF_SAFESTRB +#include +#endif + +#define SDK_CONFLICT_ASSERT(a, b, name1, name2) \ + SDK_ASSERTMSG(!(a & b), \ + "VRAM Bank conflicts between "#name1 " and "#name2 " (0x%02x, 0x%02x)\n", \ + a, b) + +#define SDK_CONFLICT_CHECK(val, bank) \ + if (val & bank) goto SDK_VRAMCNT_ERROR; else val |= bank + +#ifdef SDK_DEBUG +void GX_StateCheck_VRAMCnt_ (void) +{ + GX_VRAMCnt_ *p = &gGXState.vramCnt; + u16 tmp = p->lcdc; + SDK_CONFLICT_CHECK(tmp, p->bg); + SDK_CONFLICT_CHECK(tmp, p->obj); + SDK_CONFLICT_CHECK(tmp, p->arm7); + SDK_CONFLICT_CHECK(tmp, p->tex); + SDK_CONFLICT_CHECK(tmp, p->texPltt); + SDK_CONFLICT_CHECK(tmp, p->clrImg); + SDK_CONFLICT_CHECK(tmp, p->bgExtPltt); + SDK_CONFLICT_CHECK(tmp, p->objExtPltt); + SDK_CONFLICT_CHECK(tmp, p->sub_bg); + SDK_CONFLICT_CHECK(tmp, p->sub_obj); + SDK_CONFLICT_CHECK(tmp, p->sub_bgExtPltt); + SDK_CONFLICT_CHECK(tmp, p->sub_objExtPltt); + return; + +SDK_VRAMCNT_ERROR: + SDK_CONFLICT_ASSERT(p->lcdc, p->bg, LCDC, BG); + SDK_CONFLICT_ASSERT(p->lcdc, p->obj, LCDC, OBJ); + SDK_CONFLICT_ASSERT(p->lcdc, p->arm7, LCDC, ARM7); + SDK_CONFLICT_ASSERT(p->lcdc, p->tex, LCDC, Tex); + SDK_CONFLICT_ASSERT(p->lcdc, p->texPltt, LCDC, TEXPltt); + SDK_CONFLICT_ASSERT(p->lcdc, p->clrImg, LCDC, ClearImage); + SDK_CONFLICT_ASSERT(p->lcdc, p->bgExtPltt, LCDC, BGExtPltt); + SDK_CONFLICT_ASSERT(p->lcdc, p->objExtPltt, LCDC, OBJExtPltt); + SDK_CONFLICT_ASSERT(p->lcdc, p->sub_bg, LCDC, SubBG); + SDK_CONFLICT_ASSERT(p->lcdc, p->sub_obj, LCDC, SubOBJ); + SDK_CONFLICT_ASSERT(p->lcdc, p->sub_bgExtPltt, LCDC, SubBGExtPltt); + SDK_CONFLICT_ASSERT(p->lcdc, p->sub_objExtPltt, LCDC, SubOBJExtPltt); + + SDK_CONFLICT_ASSERT(p->bg, p->obj, BG, OBJ); + SDK_CONFLICT_ASSERT(p->bg, p->arm7, BG, ARM7); + SDK_CONFLICT_ASSERT(p->bg, p->tex, BG, Tex); + SDK_CONFLICT_ASSERT(p->bg, p->texPltt, BG, TexPltt); + SDK_CONFLICT_ASSERT(p->bg, p->clrImg, BG, ClearImage); + SDK_CONFLICT_ASSERT(p->bg, p->bgExtPltt, BG, BGExtPltt); + SDK_CONFLICT_ASSERT(p->bg, p->objExtPltt, BG, OBJExtPltt); + SDK_CONFLICT_ASSERT(p->bg, p->sub_bg, BG, SubBG); + SDK_CONFLICT_ASSERT(p->bg, p->sub_obj, BG, SubOBJ); + SDK_CONFLICT_ASSERT(p->bg, p->sub_bgExtPltt, BG, SubBGExtPltt); + SDK_CONFLICT_ASSERT(p->bg, p->sub_objExtPltt, BG, SubOBJExtPltt); + + SDK_CONFLICT_ASSERT(p->obj, p->arm7, OBJ, ARM7); + SDK_CONFLICT_ASSERT(p->obj, p->tex, OBJ, Tex); + SDK_CONFLICT_ASSERT(p->obj, p->texPltt, OBJ, TexPltt); + SDK_CONFLICT_ASSERT(p->obj, p->clrImg, OBJ, ClearImage); + SDK_CONFLICT_ASSERT(p->obj, p->bgExtPltt, OBJ, BGExtPltt); + SDK_CONFLICT_ASSERT(p->obj, p->objExtPltt, OBJ, OBJExtPltt); + SDK_CONFLICT_ASSERT(p->obj, p->sub_bg, OBJ, SubBG); + SDK_CONFLICT_ASSERT(p->obj, p->sub_obj, OBJ, SubOBJ); + SDK_CONFLICT_ASSERT(p->obj, p->sub_bgExtPltt, OBJ, SubBGExtPltt); + SDK_CONFLICT_ASSERT(p->obj, p->sub_objExtPltt, OBJ, SubOBJExtPltt); + + SDK_CONFLICT_ASSERT(p->arm7, p->tex, ARM7, Tex); + SDK_CONFLICT_ASSERT(p->arm7, p->texPltt, ARM7, TexPltt); + SDK_CONFLICT_ASSERT(p->arm7, p->clrImg, ARM7, ClearImage); + SDK_CONFLICT_ASSERT(p->arm7, p->bgExtPltt, ARM7, BGExtPltt); + SDK_CONFLICT_ASSERT(p->arm7, p->objExtPltt, ARM7, OBJExtPltt); + SDK_CONFLICT_ASSERT(p->arm7, p->sub_bg, ARM7, SubBG); + SDK_CONFLICT_ASSERT(p->arm7, p->sub_obj, ARM7, SubOBJ); + SDK_CONFLICT_ASSERT(p->arm7, p->sub_bgExtPltt, ARM7, SubBGExtPltt); + SDK_CONFLICT_ASSERT(p->arm7, p->sub_objExtPltt, ARM7, SubOBJExtPltt); + + SDK_CONFLICT_ASSERT(p->tex, p->texPltt, Tex, TexPltt); + SDK_CONFLICT_ASSERT(p->tex, p->clrImg, Tex, ClearImage); + SDK_CONFLICT_ASSERT(p->tex, p->bgExtPltt, Tex, BGExtPltt); + SDK_CONFLICT_ASSERT(p->tex, p->objExtPltt, Tex, OBJExtPltt); + SDK_CONFLICT_ASSERT(p->tex, p->sub_bg, Tex, SubBG); + SDK_CONFLICT_ASSERT(p->tex, p->sub_obj, Tex, SubOBJ); + SDK_CONFLICT_ASSERT(p->tex, p->sub_bgExtPltt, Tex, SubBGExtPltt); + SDK_CONFLICT_ASSERT(p->tex, p->sub_objExtPltt, Tex, SubOBJExtPltt); + + SDK_CONFLICT_ASSERT(p->texPltt, p->clrImg, TexPltt, ClearImage); + SDK_CONFLICT_ASSERT(p->texPltt, p->bgExtPltt, TexPltt, BGExtPltt); + SDK_CONFLICT_ASSERT(p->texPltt, p->objExtPltt, TexPltt, OBJExtPltt); + SDK_CONFLICT_ASSERT(p->texPltt, p->sub_bg, TexPltt, SubBG); + SDK_CONFLICT_ASSERT(p->texPltt, p->sub_obj, TexPltt, SubOBJ); + SDK_CONFLICT_ASSERT(p->texPltt, p->sub_bgExtPltt, TexPltt, SubBGExtPltt); + SDK_CONFLICT_ASSERT(p->texPltt, p->sub_objExtPltt, TexPltt, SubOBJExtPltt); + + SDK_CONFLICT_ASSERT(p->clrImg, p->bgExtPltt, ClearImage, BGExtPltt); + SDK_CONFLICT_ASSERT(p->clrImg, p->objExtPltt, ClearImage, OBJExtPltt); + SDK_CONFLICT_ASSERT(p->clrImg, p->sub_bg, ClearImage, SubBG); + SDK_CONFLICT_ASSERT(p->clrImg, p->sub_obj, ClearImage, SubOBJ); + SDK_CONFLICT_ASSERT(p->clrImg, p->sub_bgExtPltt, ClearImage, SubBGExtPltt); + SDK_CONFLICT_ASSERT(p->clrImg, p->sub_objExtPltt, ClearImage, SubOBJExtPltt); + + SDK_CONFLICT_ASSERT(p->bgExtPltt, p->objExtPltt, BGExtPltt, OBJExtPltt); + SDK_CONFLICT_ASSERT(p->bgExtPltt, p->sub_bg, BGExtPltt, SubBG); + SDK_CONFLICT_ASSERT(p->bgExtPltt, p->sub_obj, BGExtPltt, SubOBJ); + SDK_CONFLICT_ASSERT(p->bgExtPltt, p->sub_bgExtPltt, BGExtPltt, SubBGExtPltt); + SDK_CONFLICT_ASSERT(p->bgExtPltt, p->sub_objExtPltt, BGExtPltt, SubOBJExtPltt); + + SDK_CONFLICT_ASSERT(p->objExtPltt, p->sub_bg, OBJExtPltt, SubBG); + SDK_CONFLICT_ASSERT(p->objExtPltt, p->sub_obj, OBJExtPltt, SubOBJ); + SDK_CONFLICT_ASSERT(p->objExtPltt, p->sub_bgExtPltt, OBJExtPltt, SubBGExtPltt); + SDK_CONFLICT_ASSERT(p->objExtPltt, p->sub_objExtPltt, OBJExtPltt, SubOBJExtPltt); + + SDK_CONFLICT_ASSERT(p->sub_bg, p->sub_obj, SubBG, SubOBJ); + SDK_CONFLICT_ASSERT(p->sub_bg, p->sub_bgExtPltt, SubBG, SubBGExtPltt); + SDK_CONFLICT_ASSERT(p->sub_bg, p->sub_objExtPltt, SubBG, SubOBJExtPltt); + + SDK_CONFLICT_ASSERT(p->sub_obj, p->sub_bgExtPltt, SubOBJ, SubBGExtPltt); + SDK_CONFLICT_ASSERT(p->sub_obj, p->sub_objExtPltt, SubOBJ, SubOBJExtPltt); + + SDK_CONFLICT_ASSERT(p->sub_bgExtPltt, p->sub_objExtPltt, SubBGExtPltt, SubOBJExtPltt); +} + +#define SDK_REGION_ASSERT(name, r1, r2, d1, d2) \ + SDK_ASSERTMSG(((r1) <= (d1)) && ((r2) >= (d2)), \ + "Region allocated to "#name " is (0x%08x -> 0x%08x),\n" \ + "access occured (0x%08x -> 0x%08x).", r1, r2, d1, d2) + +#define SDK_REGION_ASSERT_EX(name, r1, r2, r3, r4, d1, d2) \ + SDK_ASSERTMSG((((r1) <= (d1)) && ((r2) >= (d2))) || (((r3) <= (d1)) && ((r4) >= (d2))), \ + "Region allocated to "#name " is (0x%08x -> 0x%08x, 0x%08x -> 0x%08x),\n" \ + "access occured (0x%08x -> 0x%08x).", r1, r2, r3, r4, d1, d2) + +void GX_RegionCheck_OBJ_ (u32 first, u32 last) +{ + switch (gGXState.vramCnt.obj) { + case GX_VRAM_OBJ_NONE: + SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM, HW_OBJ_VRAM, first, last); + break; + case GX_VRAM_OBJ_16_F: + case GX_VRAM_OBJ_16_G: + SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM, HW_OBJ_VRAM + HW_VRAM_F_SIZE, first, last); + break; + case GX_VRAM_OBJ_32_FG: + SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM, HW_OBJ_VRAM + HW_VRAM_F_SIZE + HW_VRAM_G_SIZE, first, last); + break; + case GX_VRAM_OBJ_64_E: + SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM, HW_OBJ_VRAM + HW_VRAM_E_SIZE, first, last); + break; + case GX_VRAM_OBJ_80_EF: + SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM, HW_OBJ_VRAM + HW_VRAM_E_SIZE + HW_VRAM_F_SIZE, first, last); + break; + case GX_VRAM_OBJ_80_EG: + SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM, HW_OBJ_VRAM + HW_VRAM_E_SIZE + HW_VRAM_G_SIZE, first, last); + break; + case GX_VRAM_OBJ_96_EFG: + SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM, HW_OBJ_VRAM + HW_VRAM_E_SIZE + HW_VRAM_F_SIZE + HW_VRAM_G_SIZE, first, last); + break; + case GX_VRAM_OBJ_128_A: + case GX_VRAM_OBJ_128_B: + SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM, HW_OBJ_VRAM + HW_VRAM_A_SIZE, first, last); + break; + case GX_VRAM_OBJ_256_AB: + SDK_REGION_ASSERT(OBJ, HW_OBJ_VRAM, HW_OBJ_VRAM + HW_VRAM_A_SIZE + HW_VRAM_B_SIZE, first, last); + break; + default: + SDK_INTERNAL_ERROR("unknown case 0x%x", gGXState.vramCnt.obj); + break; + } +} + +void GX_RegionCheck_BG_ (u32 first, u32 last) +{ + u16 vram_abcd; + u16 vram_efg; + u32 abcd_size, efg_size; + + SDK_ASSERT(HW_VRAM_A_SIZE == HW_VRAM_B_SIZE && + HW_VRAM_A_SIZE == HW_VRAM_C_SIZE && HW_VRAM_A_SIZE == HW_VRAM_D_SIZE); + + if (gGXState.vramCnt.bg & (GX_VRAM_H | GX_VRAM_I)) { + SDK_INTERNAL_ERROR("unknown case 0x%x", gGXState.vramCnt.bg); + return; + } + + vram_abcd = (u16)(gGXState.vramCnt.bg & GX_VRAM_BG_512_ABCD); + vram_efg = (u16)(gGXState.vramCnt.bg & GX_VRAM_BG_96_EFG); + + switch (vram_efg) { + case GX_VRAM_BG_NONE: + efg_size = 0; + break; + case GX_VRAM_BG_16_F: + case GX_VRAM_BG_16_G: + efg_size = HW_VRAM_F_SIZE; + break; + case GX_VRAM_BG_32_FG: + efg_size = HW_VRAM_F_SIZE + HW_VRAM_G_SIZE; + break; + case GX_VRAM_BG_64_E: + efg_size = HW_VRAM_E_SIZE; + break; + case GX_VRAM_BG_80_EF: + case GX_VRAM_BG_80_EG: + efg_size = HW_VRAM_E_SIZE + HW_VRAM_F_SIZE; + break; + case GX_VRAM_BG_96_EFG: + efg_size = HW_VRAM_E_SIZE + HW_VRAM_F_SIZE + HW_VRAM_G_SIZE; + break; + } + + switch (vram_abcd) { + case GX_VRAM_BG_NONE: + abcd_size = 0; + break; + case GX_VRAM_BG_128_A: + case GX_VRAM_BG_128_B: + case GX_VRAM_BG_128_C: + case GX_VRAM_BG_128_D: + abcd_size = HW_VRAM_A_SIZE; + break; + case GX_VRAM_BG_256_AB: + case GX_VRAM_BG_256_BC: + case GX_VRAM_BG_256_CD: + case GX_VRAM_BG_256_AC: + case GX_VRAM_BG_256_AD: + case GX_VRAM_BG_256_BD: + abcd_size = HW_VRAM_A_SIZE + HW_VRAM_B_SIZE; + break; + case GX_VRAM_BG_384_ABC: + case GX_VRAM_BG_384_BCD: + case GX_VRAM_BG_384_ABD: + case GX_VRAM_BG_384_ACD: + abcd_size = HW_VRAM_A_SIZE + HW_VRAM_B_SIZE + HW_VRAM_C_SIZE; + break; + case GX_VRAM_BG_512_ABCD: + abcd_size = HW_VRAM_A_SIZE + HW_VRAM_B_SIZE + HW_VRAM_C_SIZE + HW_VRAM_D_SIZE; + break; + } + + if (vram_abcd && vram_efg) { + if (vram_abcd == GX_VRAM_BG_512_ABCD) { + SDK_INTERNAL_ERROR("unknown case 0x%x", gGXState.vramCnt.bg); + return; + } + + SDK_REGION_ASSERT_EX(BG, HW_BG_VRAM, HW_BG_VRAM + efg_size, + HW_BG_VRAM + HW_VRAM_A_SIZE, HW_BG_VRAM + HW_VRAM_A_SIZE + abcd_size, + first, last); + } else if (vram_abcd) { + SDK_REGION_ASSERT(BG, HW_BG_VRAM, HW_BG_VRAM + abcd_size, first, last); + } else { + SDK_REGION_ASSERT(BG, HW_BG_VRAM, HW_BG_VRAM + efg_size, first, last); + } +} + +void GX_RegionCheck_SubOBJ_ (u32 first, u32 last) +{ + switch (gGXState.vramCnt.sub_obj) { + case GX_VRAM_SUB_OBJ_NONE: + SDK_REGION_ASSERT(SubOBJ, HW_DB_OBJ_VRAM, HW_DB_OBJ_VRAM, first, last); + break; + case GX_VRAM_SUB_OBJ_128_D: + SDK_REGION_ASSERT(SubOBJ, HW_DB_OBJ_VRAM, HW_DB_OBJ_VRAM + HW_VRAM_D_SIZE, first, last); + break; + case GX_VRAM_SUB_OBJ_16_I: + SDK_REGION_ASSERT(SubOBJ, HW_DB_OBJ_VRAM, HW_DB_OBJ_VRAM + HW_VRAM_I_SIZE, first, last); + break; + } +} + +void GX_RegionCheck_SubBG_ (u32 first, u32 last) +{ + switch (gGXState.vramCnt.sub_bg) { + case GX_VRAM_SUB_BG_NONE: + SDK_REGION_ASSERT(SubBG, HW_DB_BG_VRAM, HW_DB_BG_VRAM, first, last); + break; + case GX_VRAM_SUB_BG_128_C: + SDK_REGION_ASSERT(SubBG, HW_DB_BG_VRAM, HW_DB_BG_VRAM + HW_VRAM_C_SIZE, first, last); + break; + case GX_VRAM_SUB_BG_32_H: + SDK_REGION_ASSERT(SubBG, HW_DB_BG_VRAM, HW_DB_BG_VRAM + HW_VRAM_H_SIZE, first, last); + break; + case GX_VRAM_SUB_BG_48_HI: + SDK_REGION_ASSERT(SubBG, HW_DB_BG_VRAM, + HW_DB_BG_VRAM + HW_VRAM_H_SIZE + HW_VRAM_I_SIZE, first, last); + break; + default: + SDK_INTERNAL_ERROR("unknown case 0x%x", gGXState.vramCnt.sub_bg); + break; + } +} + +void GX_RegionCheck_TexPltt_ (GXVRamTexPltt texPltt, u32 first, u32 last) +{ +#if defined(SDK_NO_MESSAGE) +#pragma unused(first) +#endif + switch (texPltt) { + case GX_VRAM_TEXPLTT_0_F: + case GX_VRAM_TEXPLTT_0_G: + SDK_ASSERTMSG(last <= 0x04000, + "Texture pallete 0x04000-0x18000 not available(0x%5x->0x%5x)", first, last); + break; + case GX_VRAM_TEXPLTT_01_FG: + SDK_ASSERTMSG(last <= 0x08000, + "Texture pallete 0x08000-0x18000 not available(0x%5x->0x%5x)", first, last); + break; + case GX_VRAM_TEXPLTT_0123_E: + SDK_ASSERTMSG(last <= 0x10000, + "Texture pallete 0x10000-0x18000 not available(0x%5x->0x%5x)", first, last); + break; + case GX_VRAM_TEXPLTT_01234_EF: + SDK_ASSERTMSG(last <= 0x14000, + "Texture pallete 0x14000-0x18000 not available(0x%5x->0x%5x)", first, last); + break; + case GX_VRAM_TEXPLTT_012345_EFG: + SDK_ASSERTMSG(last <= 0x18000, "Illegal Address/size specified(0x%5x->0x%5x)", first, last); + break; + + default: + SDK_INTERNAL_ERROR("unknown case 0x%x", texPltt); + break; + } +} + +void GX_RegionCheck_Tex_ (GXVRamTex tex, u32 first, u32 last) +{ +#if defined(SDK_NO_MESSAGE) +#pragma unused(first) +#endif + switch (tex) { + case GX_VRAM_TEX_0_A: + case GX_VRAM_TEX_0_B: + case GX_VRAM_TEX_0_C: + case GX_VRAM_TEX_0_D: + SDK_ASSERTMSG(last <= 0x20000, + "Texture slot 0x20000-0x80000 not available(0x%5x->0x%5x)", first, last); + break; + case GX_VRAM_TEX_01_AB: + case GX_VRAM_TEX_01_BC: + case GX_VRAM_TEX_01_CD: + case GX_VRAM_TEX_01_AC: + case GX_VRAM_TEX_01_AD: + case GX_VRAM_TEX_01_BD: + SDK_ASSERTMSG(last <= 0x40000, + "Texture slot 0x40000-0x80000 not available(0x%5x->0x%5x)", first, last); + break; + case GX_VRAM_TEX_012_ABC: + case GX_VRAM_TEX_012_BCD: + case GX_VRAM_TEX_012_ABD: + case GX_VRAM_TEX_012_ACD: + SDK_ASSERTMSG(last <= 0x60000, + "Texture slot 0x60000-0x80000 not available(0x%5x->0x%5x)", first, last); + break; + case GX_VRAM_TEX_0123_ABCD: + SDK_ASSERTMSG(last <= 0x80000, "Illegal Address/size specified(0x%5x->0x%5x)", first, last); + break; + default: + SDK_INTERNAL_ERROR("unknown case 0x%x", tex); + break; + } +} +#endif diff --git a/lib/NitroSDK/src/math/math_crc.c b/lib/NitroSDK/src/math/math_crc.c deleted file mode 100644 index d96f20e0..00000000 --- a/lib/NitroSDK/src/math/math_crc.c +++ /dev/null @@ -1,250 +0,0 @@ -#include - -void MATHi_CRC8InitTable (MATHCRC8Table *table, u8 poly) -{ - u32 r; - u32 i, j; - u8 *t = table->table; - - for (i = 0; i < 256; i++) { - r = i; - for (j = 0; j < 8; j++) { - if (r & 0x80) { - r = (r << 1) ^ poly; - } else { - r <<= 1; - } - } - t[i] = (u8)r; - } -} - -// void MATHi_CRC8InitTableRev (MATHCRC8Table *table, u8 poly) -// { -// u32 r; -// u32 i, j; -// u8 *t = table->table; -// -// for (i = 0; i < 256; i++) { -// r = i; -// for (j = 0; j < 8; j++) { -// if (r & 1) { -// r = (r >> 1) ^ poly; -// } else { -// r >>= 1; -// } -// } -// t[i] = (u8)r; -// } -// } - -void MATHi_CRC8Update (const MATHCRC8Table *table, MATHCRC8Context *context, const void *input, u32 length) -{ - u32 r; - u32 i; - const u8 *t = table->table; - u8 *data = (u8 *)input; - - r = (u32) * context; - - for (i = 0; i < length; i++) { - r = t[(r ^ *data) & 0xff]; - data++; - } - - *context = (MATHCRC8Context) r; -} - -void MATHi_CRC16InitTable (MATHCRC16Table *table, u16 poly) -{ - u32 r; - u32 i, j; - u16 *t = table->table; - - for (i = 0; i < 256; i++) { - r = i << 8; - for (j = 0; j < 8; j++) { - if (r & 0x8000) { - r = (r << 1) ^ poly; - } else { - r <<= 1; - } - } - t[i] = (u16)r; - } -} - -// void MATHi_CRC16InitTableRev (MATHCRC16Table *table, u16 poly) -// { -// u32 r; -// u32 i, j; -// u16 *t = table->table; -// -// for (i = 0; i < 256; i++) { -// r = i; -// for (j = 0; j < 8; j++) { -// if (r & 1) { -// r = (r >> 1) ^ poly; -// } else { -// r >>= 1; -// } -// } -// t[i] = (u16)r; -// } -// } - -void MATHi_CRC16Update (const MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length) -{ - u32 r; - u32 i; - const u16 *t = table->table; - u8 *data = (u8 *)input; - - r = (u32) * context; - - for (i = 0; i < length; i++) { - r = (r << 8) ^ t[((r >> 8) ^ *data) & 0xff]; - data++; - } - - *context = (MATHCRC16Context) r; -} - -// void MATHi_CRC16UpdateRev (const MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length) -// { -// u32 r; -// u32 i; -// const u16 *t = table->table; -// u8 *data = (u8 *)input; -// -// r = (u32) * context; -// -// for (i = 0; i < length; i++) { -// r = (r >> 8) ^ t[(r ^ *data) & 0xff]; -// data++; -// } -// -// *context = (MATHCRC16Context) r; -// } - -void MATHi_CRC32InitTable (MATHCRC32Table *table, u32 poly) -{ - u32 r; - u32 i, j; - u32 *t = table->table; - - for (i = 0; i < 256; i++) { - r = i << 24; - for (j = 0; j < 8; j++) { - if (r & 0x80000000U) { - r = (r << 1) ^ poly; - } else { - r <<= 1; - } - } - t[i] = r; - } -} - -// void MATHi_CRC32InitTableRev (MATHCRC32Table *table, u32 poly) -// { -// u32 r; -// u32 i, j; -// u32 *t = table->table; -// -// for (i = 0; i < 256; i++) { -// r = i; -// for (j = 0; j < 8; j++) { -// if (r & 1) { -// r = (r >> 1) ^ poly; -// } else { -// r >>= 1; -// } -// } -// t[i] = r; -// } -// } - -void MATHi_CRC32Update (const MATHCRC32Table *table, MATHCRC32Context *context, const void *input, u32 length) -{ - u32 r; - u32 i; - const u32 *t = table->table; - u8 *data = (u8 *)input; - - r = (u32) * context; - - for (i = 0; i < length; i++) { - r = (r << 8) ^ t[((r >> 24) ^ *data) & 0xff]; - data++; - } - - *context = (MATHCRC32Context) r; -} - -// void MATHi_CRC32UpdateRev (const MATHCRC32Table *table, MATHCRC32Context *context, const void *input, u32 length) -// { -// u32 r; -// u32 i; -// const u32 *t = table->table; -// u8 *data = (u8 *)input; -// -// r = (u32) * context; -// -// for (i = 0; i < length; i++) { -// r = (r >> 8) ^ t[(r ^ *data) & 0xff]; -// data++; -// } -// -// *context = (MATHCRC32Context) r; -// } - -u8 MATH_CalcCRC8 (const MATHCRC8Table *table, const void *data, u32 dataLength) -{ - MATHCRC8Context context; - - MATH_CRC8Init(&context); - MATH_CRC8Update(table, &context, data, dataLength); - - return MATH_CRC8GetHash(&context); -} - -u16 MATH_CalcCRC16 (const MATHCRC16Table *table, const void *data, u32 dataLength) -{ - MATHCRC16Context context; - - MATH_CRC16Init(&context); - MATH_CRC16Update(table, &context, data, dataLength); - - return MATH_CRC16GetHash(&context); -} - -// u16 MATH_CalcCRC16CCITT (const MATHCRC16Table *table, const void *data, u32 dataLength) -// { -// MATHCRC16Context context; -// -// MATH_CRC16CCITTInit(&context); -// MATH_CRC16CCITTUpdate(table, &context, data, dataLength); -// -// return MATH_CRC16CCITTGetHash(&context); -// } - -u32 MATH_CalcCRC32 (const MATHCRC32Table *table, const void *data, u32 dataLength) -{ - MATHCRC32Context context; - - MATH_CRC32Init(&context); - MATH_CRC32Update(table, &context, data, dataLength); - - return MATH_CRC32GetHash(&context); -} - -// u32 MATH_CalcCRC32POSIX (const MATHCRC32Table *table, const void *data, u32 dataLength) -// { -// MATHCRC32Context context; -// -// MATH_CRC32POSIXInit(&context); -// MATH_CRC32POSIXUpdate(table, &context, data, dataLength); -// -// return MATH_CRC32POSIXGetHash(&context); -// } diff --git a/lib/include/nitro/gx.h b/lib/include/nitro/gx.h index 0bd6a474..c20e8cfb 100644 --- a/lib/include/nitro/gx.h +++ b/lib/include/nitro/gx.h @@ -5,5 +5,10 @@ #include #include #include +#include +#include +#include +#include +#include #endif //NITRO_GX_H_ diff --git a/lib/include/nitro/gx/g3x.h b/lib/include/nitro/gx/g3x.h new file mode 100644 index 00000000..7383b7b3 --- /dev/null +++ b/lib/include/nitro/gx/g3x.h @@ -0,0 +1,280 @@ +#ifndef NITRO_G3X_H_ +#define NITRO_G3X_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + GX_SHADING_TOON = 0, + GX_SHADING_HIGHLIGHT = 1 +} GXShading; + +#define GX_SHADING_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_SHADING_TOON, GX_SHADING_HIGHLIGHT) + +typedef enum { + GX_FOGBLEND_COLOR_ALPHA = 0, + GX_FOGBLEND_ALPHA = 1 +} GXFogBlend; + +#define GX_FOGBLEND_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_FOGBLEND_COLOR_ALPHA, GX_FOGBLEND_ALPHA) + +typedef enum { + GX_FOGSLOPE_0x8000 = 0, + GX_FOGSLOPE_0x4000 = 1, + GX_FOGSLOPE_0x2000 = 2, + GX_FOGSLOPE_0x1000 = 3, + GX_FOGSLOPE_0x0800 = 4, + GX_FOGSLOPE_0x0400 = 5, + GX_FOGSLOPE_0x0200 = 6, + GX_FOGSLOPE_0x0100 = 7, + GX_FOGSLOPE_0x0080 = 8, + GX_FOGSLOPE_0x0040 = 9, + GX_FOGSLOPE_0x0020 = 10 +} GXFogSlope; + +#define GX_FOGSLOPE_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_FOGSLOPE_0x8000, GX_FOGSLOPE_0x0020) + +typedef enum { + GX_FIFOINTR_COND_DISABLE = 0, + GX_FIFOINTR_COND_UNDERHALF = 1, + GX_FIFOINTR_COND_EMPTY = 2 +} GXFifoIntrCond; + +#define GX_FIFOINTR_COND_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_FIFOINTR_COND_DISABLE, GX_FIFOINTR_COND_EMPTY) + +typedef enum { + GX_FIFOSTAT_EMPTY = 6, + GX_FIFOSTAT_UNDERHALF = 2, + GX_FIFOSTAT_OVERHALF = 0, + GX_FIFOSTAT_FULL = 1 +} GXFifoStat; + +#define GX_RDLINES_COUNT_MAX 46 +#define GX_LISTRAM_COUNT_MAX 2048 +#define GX_VTXRAM_COUNT_MAX 6144 + +#if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL)) +void G3X_Init(void); +void G3X_InitMtxStack(void); +void G3X_ResetMtxStack(void); +void G3X_InitTable(void); +void G3X_Reset(void); + +static void G3X_SetShading(GXShading shading); +static void G3X_AlphaTest(BOOL enable, int ref); +static void G3X_AlphaBlend(BOOL enable); +static void G3X_AntiAlias(BOOL enable); +static void G3X_EdgeMarking(BOOL enable); + +void G3X_SetFog(BOOL enable, GXFogBlend fogMode, GXFogSlope fogSlope, int fogOffset); + +int G3X_GetMtxStackLevelPV(s32 * level); +int G3X_GetMtxStackLevelPJ(s32 * level); + +static void G3X_SetFifoIntrCond(GXFifoIntrCond cond); + +void G3X_SetDisp1DotDepth(fx32 w); + +int G3X_GetBoxTestResult(s32 * in); +int G3X_GetPositionTestResult(VecFx32 * vec, fx32 * w); +int G3X_GetVectorTestResult(fx16 * vec); + +int G3X_GetClipMtx(MtxFx44 * m); +int G3X_GetVectorMtx(MtxFx33 * m); + +void G3X_SetHOffset(int hOffset); + +void G3X_SetEdgeColorTable(const GXRgb * rgb_8); +void G3X_SetFogTable(const u32 * fogTable); +void G3X_SetToonTable(const GXRgb * rgb_32); +void G3X_SetClearColor(GXRgb rgb, int alpha, int depth, int polygonID, BOOL fog); +static void G3X_SetClearImageOffset(int xOffset, int yOffset); +static void G3X_SetFogColor(GXRgb rgb, int alpha); + +static s32 G3X_IsMtxStackOverflow(s32 * overflow); +static s32 G3X_IsLineBufferUnderflow(void); +static s32 G3X_IsListRamOverflow(void); +static s32 G3X_IsGeometryBusy(void); + +static void G3X_ResetMtxStackOverflow(void); +static void G3X_ResetLineBufferUnderflow(void); +static void G3X_ResetListRamOverflow(void); +void G3X_ClearFifo(void); + +static s32 G3X_GetPolygonListRamCount(void); +static s32 G3X_GetVtxListRamCount(void); +static s32 G3X_GetRenderedLineCount(void); +static s32 G3X_GetCommandFifoCount(void); +static GXFifoStat G3X_GetCommandFifoStatus(void); + +static inline void G3X_SetShading (GXShading shading) +{ + reg_G3X_DISP3DCNT = (u16)((reg_G3X_DISP3DCNT & ~(REG_G3X_DISP3DCNT_THS_MASK | + REG_G3X_DISP3DCNT_RO_MASK | + REG_G3X_DISP3DCNT_GO_MASK)) | + (shading << REG_G3X_DISP3DCNT_THS_SHIFT)); +} + +static inline void G3X_AlphaTest (BOOL enable, int ref) +{ + if (enable) { + GX_ALPHA_ASSERT(ref); + reg_G3X_DISP3DCNT = (u16)(reg_G3X_DISP3DCNT & + ~(REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK) | + REG_G3X_DISP3DCNT_ATE_MASK); + reg_G3X_ALPHA_TEST_REF = (u16)ref; + } else { + reg_G3X_DISP3DCNT &= (u16) ~(REG_G3X_DISP3DCNT_ATE_MASK | + REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK); + } +} + +static inline void G3X_AlphaBlend (BOOL enable) +{ + if (enable) { + reg_G3X_DISP3DCNT = (u16)(reg_G3X_DISP3DCNT & + ~(REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK) | + REG_G3X_DISP3DCNT_ABE_MASK); + } else { + reg_G3X_DISP3DCNT &= (u16) ~(REG_G3X_DISP3DCNT_ABE_MASK | + REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK); + } +} + +static inline void G3X_AntiAlias (BOOL enable) +{ + if (enable) { + reg_G3X_DISP3DCNT = (u16)(reg_G3X_DISP3DCNT & + ~(REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK) | + REG_G3X_DISP3DCNT_AAE_MASK); + } else { + reg_G3X_DISP3DCNT &= (u16) ~(REG_G3X_DISP3DCNT_AAE_MASK | + REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK); + } +} + +static inline void G3X_EdgeMarking (BOOL enable) +{ + if (enable) { + reg_G3X_DISP3DCNT = (u16)(reg_G3X_DISP3DCNT & + ~(REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK) | + REG_G3X_DISP3DCNT_EME_MASK); + } else { + reg_G3X_DISP3DCNT &= (u16) ~(REG_G3X_DISP3DCNT_EME_MASK | + REG_G3X_DISP3DCNT_RO_MASK | REG_G3X_DISP3DCNT_GO_MASK); + } +} + +static inline void G3X_SetFifoIntrCond (GXFifoIntrCond cond) +{ + GX_FIFOINTR_COND_ASSERT(cond); + + reg_G3X_GXSTAT = ((reg_G3X_GXSTAT & ~REG_G3X_GXSTAT_FI_MASK) | + (cond << REG_G3X_GXSTAT_FI_SHIFT)); +} + +static inline void G3X_SetClearImageOffset (int xOffset, int yOffset) +{ + reg_G3X_CLRIMAGE_OFFSET = (u16)(((xOffset << REG_G3X_CLRIMAGE_OFFSET_OFFSETX_SHIFT) & + REG_G3X_CLRIMAGE_OFFSET_OFFSETX_MASK) | ((yOffset << + REG_G3X_CLRIMAGE_OFFSET_OFFSETY_SHIFT) + & + REG_G3X_CLRIMAGE_OFFSET_OFFSETY_MASK)); +} + +static inline void G3X_SetFogColor (GXRgb rgb, int alpha) +{ + GXRGB_ASSERT(rgb); + GX_ALPHA_ASSERT(alpha); + + reg_G3X_FOG_COLOR = (u32)((rgb << REG_G3X_FOG_COLOR_FOG_RED_SHIFT) | + (alpha << REG_G3X_FOG_COLOR_FOG_ALPHA_SHIFT)); +} + +static inline s32 G3X_IsMtxStackOverflow (s32 * overflow) +{ + SDK_NULL_ASSERT(overflow); + if (reg_G3X_GXSTAT & REG_G3X_GXSTAT_SB_MASK) { + return -1; + } + + *overflow = (s32)(reg_G3X_GXSTAT & REG_G3X_GXSTAT_SE_MASK); + return 0; +} + +#define G3X_IsLineBufferOverflow G3X_IsLineBufferUnderflow + +static inline s32 G3X_IsLineBufferUnderflow (void) +{ + return (reg_G3X_DISP3DCNT & REG_G3X_DISP3DCNT_RO_MASK); +} + +static inline s32 G3X_IsListRamOverflow (void) +{ + return (reg_G3X_DISP3DCNT & REG_G3X_DISP3DCNT_GO_MASK); +} + +static inline s32 G3X_IsGeometryBusy (void) +{ + return (s32)(reg_G3X_GXSTAT & REG_G3X_GXSTAT_B_MASK); +} + +static inline void G3X_ResetMtxStackOverflow (void) +{ + reg_G3X_GXSTAT |= REG_G3X_GXSTAT_SE_MASK; +} + +#define G3X_ResetLineBufferOverflow G3X_ResetLineBufferUnderflow + +static inline void G3X_ResetLineBufferUnderflow (void) +{ + reg_G3X_DISP3DCNT |= REG_G3X_DISP3DCNT_RO_MASK; +} + +static inline void G3X_ResetListRamOverflow (void) +{ + reg_G3X_DISP3DCNT |= REG_G3X_DISP3DCNT_GO_MASK; +} + +static inline s32 G3X_GetPolygonListRamCount (void) +{ + return reg_G3X_LISTRAM_COUNT; +} + +static inline s32 G3X_GetVtxListRamCount (void) +{ + return reg_G3X_VTXRAM_COUNT; +} + +static inline s32 G3X_GetRenderedLineCount (void) +{ + return reg_G3X_RDLINES_COUNT; +} + +static inline s32 G3X_GetCommandFifoCount (void) +{ + return (s32)((reg_G3X_GXSTAT & REG_G3X_GXSTAT_FIFOCNT_MASK) >> REG_G3X_GXSTAT_FIFOCNT_SHIFT); +} + +static inline GXFifoStat G3X_GetCommandFifoStatus (void) +{ + return (GXFifoStat)((reg_G3X_GXSTAT & (REG_G3X_GXSTAT_F_MASK | + REG_G3X_GXSTAT_H_MASK | + REG_G3X_GXSTAT_E_MASK)) >> REG_G3X_GXSTAT_F_SHIFT); +} + +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/nitro/gx/gx.h b/lib/include/nitro/gx/gx.h new file mode 100644 index 00000000..17bf53c8 --- /dev/null +++ b/lib/include/nitro/gx/gx.h @@ -0,0 +1,678 @@ +#ifndef NITRO_GX_GX_H_ +#define NITRO_GX_GX_H_ + +#include +#include + +#if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL)) + #include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define GX_LCD_SIZE_X 256 +#define GX_LCD_SIZE_Y 192 + +typedef union { + u32 raw; + struct { + u32 bgMode :3; + u32 bg0_2d3d :1; + u32 objMapChar :1; + u32 objMapBmp :2; + u32 blankScr :1; + u32 visiblePlane :5; + u32 visibleWnd :3; + u32 dispMode :4; + u32 extObjMapChar :2; + u32 extObjMapBmp :1; + u32 hBlankObjProc :1; + u32 bgCharOffset :3; + u32 bgScrOffset :3; + u32 bgExtPltt :1; + u32 objExtPltt :1; + }; +} GXDispCnt; + +typedef union { + u32 raw; + struct { + u32 bgMode :3; + u32 _reserve1 :1; + u32 objMapChar :1; + u32 objMapBmp :2; + u32 blankScr :1; + u32 visiblePlane :5; + u32 visibleWnd :3; + u32 dispMode :1; + u32 _reserve2 :3; + u32 extObjMapChar :2; + u32 _reserve3 :1; + u32 hBlankObjProc :1; + u32 _reserve4 :6; + u32 bgExtPltt :1; + u32 objExtPltt :1; + }; +} GXSDispCnt; + +typedef enum { + GX_BGMODE_0 = 0, + GX_BGMODE_1 = 1, + GX_BGMODE_2 = 2, + GX_BGMODE_3 = 3, + GX_BGMODE_4 = 4, + GX_BGMODE_5 = 5, + GX_BGMODE_6 = 6 +} GXBGMode; + +#define GX_BGMODE_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BGMODE_0, GX_BGMODE_6) + +typedef enum { + GX_BG0_AS_2D = 0, + GX_BG0_AS_3D = 1 +} GXBG0As; + +#define GX_BG0_AS_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BG0_AS_2D, GX_BG0_AS_3D) + +typedef enum { + GX_DISPMODE_GRAPHICS = 0x01, + GX_DISPMODE_VRAM_A = 0x02, + GX_DISPMODE_VRAM_B = 0x06, + GX_DISPMODE_VRAM_C = 0x0a, + GX_DISPMODE_VRAM_D = 0x0e, + GX_DISPMODE_MMEM = 0x03 +} GXDispMode; + +#define GX_DISPMODE_OFF ((GXDispMode)0x00) + +#define GX_DISPMODE_ASSERT(x) \ + SDK_ASSERT((x) == GX_DISPMODE_OFF || \ + (x) == GX_DISPMODE_GRAPHICS || \ + (x) == GX_DISPMODE_VRAM_A || \ + (x) == GX_DISPMODE_VRAM_B || \ + (x) == GX_DISPMODE_VRAM_C || \ + (x) == GX_DISPMODE_VRAM_D || \ + (x) == GX_DISPMODE_MMEM) + +typedef enum { + GX_OBJVRAMMODE_CHAR_2D = (0 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (0 << REG_GX_DISPCNT_EXOBJ_SHIFT), + GX_OBJVRAMMODE_CHAR_1D_32K = (1 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (0 << REG_GX_DISPCNT_EXOBJ_SHIFT), + GX_OBJVRAMMODE_CHAR_1D_64K = (1 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (1 << REG_GX_DISPCNT_EXOBJ_SHIFT), + GX_OBJVRAMMODE_CHAR_1D_128K = (1 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (2 << REG_GX_DISPCNT_EXOBJ_SHIFT), + GX_OBJVRAMMODE_CHAR_1D_256K = (1 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (3 << REG_GX_DISPCNT_EXOBJ_SHIFT) +} GXOBJVRamModeChar; + +#define GX_OBJVRAMMODE_CHAR_ASSERT(x) \ + SDK_ASSERT(x == GX_OBJVRAMMODE_CHAR_2D || \ + x == GX_OBJVRAMMODE_CHAR_1D_32K || \ + x == GX_OBJVRAMMODE_CHAR_1D_64K || \ + x == GX_OBJVRAMMODE_CHAR_1D_128K || \ + x == GX_OBJVRAMMODE_CHAR_1D_256K) + +#define GXS_OBJVRAMMODE_CHAR_ASSERT(x) \ + SDK_ASSERT(x == GX_OBJVRAMMODE_CHAR_2D || \ + x == GX_OBJVRAMMODE_CHAR_1D_32K || \ + x == GX_OBJVRAMMODE_CHAR_1D_64K || \ + x == GX_OBJVRAMMODE_CHAR_1D_128K) + +typedef enum { + GX_OBJVRAMMODE_BMP_2D_W128 = (0 << (REG_GX_DISPCNT_OBJMAP_SHIFT + 1)) | (0 << (REG_GX_DISPCNT_EXOBJ_SHIFT + 2)), + GX_OBJVRAMMODE_BMP_2D_W256 = (1 << (REG_GX_DISPCNT_OBJMAP_SHIFT + 1)) | (0 << (REG_GX_DISPCNT_EXOBJ_SHIFT + 2)), + GX_OBJVRAMMODE_BMP_1D_128K = (2 << (REG_GX_DISPCNT_OBJMAP_SHIFT + 1)) | (0 << (REG_GX_DISPCNT_EXOBJ_SHIFT + 2)), + GX_OBJVRAMMODE_BMP_1D_256K = (2 << (REG_GX_DISPCNT_OBJMAP_SHIFT + 1)) | (1 << (REG_GX_DISPCNT_EXOBJ_SHIFT + 2)) +} GXOBJVRamModeBmp; + +#define GX_OBJVRAMMODE_BMP_2D_W128_32K GX_OBJVRAMMODE_BMP_2D_W128 +#define GX_OBJVRAMMODE_BMP_2D_W256_32K GX_OBJVRAMMODE_BMP_2D_W256 + +#define GX_OBJVRAMMODE_BMP_ASSERT(x) \ + SDK_ASSERT(x == GX_OBJVRAMMODE_BMP_2D_W128_32K || \ + x == GX_OBJVRAMMODE_BMP_2D_W256_32K || \ + x == GX_OBJVRAMMODE_BMP_1D_128K || \ + x == GX_OBJVRAMMODE_BMP_1D_256K) + +#define GXS_OBJVRAMMODE_BMP_ASSERT(x) \ + SDK_ASSERT(x == GX_OBJVRAMMODE_BMP_2D_W128 || \ + x == GX_OBJVRAMMODE_BMP_2D_W256 || \ + x == GX_OBJVRAMMODE_BMP_1D_128K) + +typedef enum { + GX_PLANEMASK_NONE = 0x00, + GX_PLANEMASK_BG0 = 0x01, + GX_PLANEMASK_BG1 = 0x02, + GX_PLANEMASK_BG2 = 0x04, + GX_PLANEMASK_BG3 = 0x08, + GX_PLANEMASK_OBJ = 0x10 +} GXPlaneMask; + +#define GX_PLANEMASK_ASSERT(x) SDK_MINMAX_ASSERT(x, GX_PLANEMASK_NONE, 0x1f) + +typedef enum { + GX_WNDMASK_NONE = 0x00, + GX_WNDMASK_W0 = 0x01, + GX_WNDMASK_W1 = 0x02, + GX_WNDMASK_OW = 0x04 +} GXWndMask; + +#define GX_WNDMASK_ASSERT(x) SDK_MINMAX_ASSERT(x, GX_WNDMASK_NONE, 0x7) + +typedef enum { + GX_BGCHAROFFSET_0x00000 = 0x00, + GX_BGCHAROFFSET_0x10000 = 0x01, + GX_BGCHAROFFSET_0x20000 = 0x02, + GX_BGCHAROFFSET_0x30000 = 0x03, + GX_BGCHAROFFSET_0x40000 = 0x04, + GX_BGCHAROFFSET_0x50000 = 0x05, + GX_BGCHAROFFSET_0x60000 = 0x06, + GX_BGCHAROFFSET_0x70000 = 0x07 +} GXBGCharOffset; + +#define GX_BGCHAROFFSET_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BGCHAROFFSET_0x00000, GX_BGCHAROFFSET_0x70000) + +typedef enum { + GX_BGSCROFFSET_0x00000 = 0x00, + GX_BGSCROFFSET_0x10000 = 0x01, + GX_BGSCROFFSET_0x20000 = 0x02, + GX_BGSCROFFSET_0x30000 = 0x03, + GX_BGSCROFFSET_0x40000 = 0x04, + GX_BGSCROFFSET_0x50000 = 0x05, + GX_BGSCROFFSET_0x60000 = 0x06, + GX_BGSCROFFSET_0x70000 = 0x07 +} GXBGScrOffset; + +#define GX_BGSCROFFSET_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BGSCROFFSET_0x00000, GX_BGSCROFFSET_0x70000) + +typedef enum { + GX_POWER_OFF = 0, + GX_POWER_2D_MAIN = 1 << REG_GX_POWCNT_E2DG_SHIFT, + GX_POWER_2D_SUB = 1 << REG_GX_POWCNT_E2DGB_SHIFT, + GX_POWER_RE = 1 << REG_GX_POWCNT_RE_SHIFT, + GX_POWER_GE = 1 << REG_GX_POWCNT_GE_SHIFT, + GX_POWER_2D = GX_POWER_2D_MAIN | GX_POWER_2D_SUB, + GX_POWER_3D = GX_POWER_RE | GX_POWER_GE, + GX_POWER_ALL = GX_POWER_2D | GX_POWER_3D +} GXPower; + +#define GX_POWER_ASSERT(x) SDK_ASSERTMSG((((x) & ~GX_POWER_ALL) == 0), \ + "GX_POWER_LCD is obsolete. please use PM_SetLCDPower()\n") + +typedef enum { + GX_DISP_SELECT_SUB_MAIN = 0, + GX_DISP_SELECT_MAIN_SUB = 1 +} GXDispSelect; + +#define GX_DISP_SELECT_ASSERT(x) SDK_MINMAX_ASSERT(x, 0, 1) + +#if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL)) +static void GX_SetPower(int gxbit_power); +static GXPower GX_GetPower(void); + +static void GX_Power2DMain(BOOL enable); +static void GX_Power2DSub(BOOL enable); + +static void GX_PowerRender(BOOL enable); +static void GX_PowerGeometry(BOOL enable); + +static void GXi_PowerLCD(BOOL enable); +static void GX_Power2D(BOOL enable); +static void GX_Power3D(BOOL enable); + +static void GX_SetDispSelect(GXDispSelect sel); +static GXDispSelect GX_GetDispSelect(void); + +static s32 GX_IsHBlank(void); +s32 GX_HBlankIntr(BOOL enable); +static s32 GX_IsVBlank(void); +s32 GX_VBlankIntr(BOOL enable); +static s32 GX_IsVCountEq(void); +static void GX_VCountEqIntr(BOOL enable); +void GX_SetVCountEqVal(s32 val); +static s32 GX_GetVCountEqVal(void); + +#define GX_IsVCounterEq GX_IsVCountEq +#define GX_VCounterEqIntr GX_VCountEqIntr +#define GX_SetVCounterEqVal GX_SetVCountEqVal +#define GX_GetVCounterEqVal GX_GetVCountEqVal + +//static s32 GX_GetVCount(void); // TODO: Check this later +static void GX_SetVCount(s32 count); + +void GX_Init(void); +static void GX_InitEx(u32 dma_no); +u32 GX_SetDefaultDMA(u32 dma_no); +static u32 GX_GetDefaultDMA(void); + +void GX_SetGraphicsMode(GXDispMode dispMode, GXBGMode bgMode, GXBG0As bg0_2d3d); +void GX_DispOff(void); +void GX_DispOn(void); +BOOL GX_IsDispOn(void); + +static void GX_SetVisiblePlane(int plane); +static void GX_SetVisibleWnd(int window); +static void GX_BlankScr(BOOL blank); + +static GXBGScrOffset GX_GetBGScrOffset(); +static void GX_SetBGScrOffset(GXBGScrOffset offset); + +static GXBGCharOffset GX_GetBGCharOffset(); +static void GX_SetBGCharOffset(GXBGCharOffset offset); + +static void GX_SetOBJVRamModeChar(GXOBJVRamModeChar mode); +static void GX_SetOBJVRamModeBmp(GXOBJVRamModeBmp mode); + +static void GX_HBlankOBJProc(BOOL proc); + +static void GX_SetMasterBrightness(int brightness); + +void GXS_SetGraphicsMode(GXBGMode bgMode); +static void GXS_DispOff(void); +static void GXS_DispOn(void); + +static void GXS_SetVisiblePlane(int plane); +static void GXS_SetVisibleWnd(int window); + +static void GXS_SetOBJVRamModeChar(GXOBJVRamModeChar mode); +static void GXS_SetOBJVRamModeBmp(GXOBJVRamModeBmp mode); + +static void GXS_HBlankOBJProc(BOOL proc); + +static void GXS_SetMasterBrightness(int brightness); + +void GXx_SetMasterBrightness_(vu16 * reg, int brightness); +int GXx_GetMasterBrightness_(vu16 * reg); + +// static inline GXDispCnt GX_GetDispCnt (void) +// { +// return *(volatile GXDispCnt *)REG_DISPCNT_ADDR; +// } +// +// static inline GXSDispCnt GXS_GetDispCnt (void) +// { +// return *(volatile GXSDispCnt *)REG_DB_DISPCNT_ADDR; +// } +// +// static inline GXBGScrOffset GX_GetBGScrOffset () +// { +// return (GXBGScrOffset)((reg_GX_DISPCNT & REG_GX_DISPCNT_BGSCREENOFFSET_MASK) >> +// REG_GX_DISPCNT_BGSCREENOFFSET_SHIFT); +// } +// +// static inline void GX_SetBGScrOffset (GXBGScrOffset offset) +// { +// GX_BGSCROFFSET_ASSERT(offset); +// reg_GX_DISPCNT = (u32)((reg_GX_DISPCNT & ~REG_GX_DISPCNT_BGSCREENOFFSET_MASK) | +// (offset << REG_GX_DISPCNT_BGSCREENOFFSET_SHIFT)); +// } +// +// static inline GXBGCharOffset GX_GetBGCharOffset () +// { +// return (GXBGCharOffset)((reg_GX_DISPCNT & REG_GX_DISPCNT_BGCHAROFFSET_MASK) +// >> REG_GX_DISPCNT_BGCHAROFFSET_SHIFT); +// } +// +// static inline void GX_SetBGCharOffset (GXBGCharOffset offset) +// { +// GX_BGCHAROFFSET_ASSERT(offset); +// reg_GX_DISPCNT = (u32)((reg_GX_DISPCNT & ~REG_GX_DISPCNT_BGCHAROFFSET_MASK) | +// (offset << REG_GX_DISPCNT_BGCHAROFFSET_SHIFT)); +// } +// +// static inline void GX_SetVisiblePlane (int plane) +// { +// GX_PLANEMASK_ASSERT(plane); +// +// reg_GX_DISPCNT = (u32)((reg_GX_DISPCNT & ~REG_GX_DISPCNT_DISPLAY_MASK) | +// (plane << REG_GX_DISPCNT_DISPLAY_SHIFT)); +// } +// +// static inline int GX_GetVisiblePlane (void) +// { +// return (int)((reg_GX_DISPCNT & REG_GX_DISPCNT_DISPLAY_MASK) >> REG_GX_DISPCNT_DISPLAY_SHIFT); +// } +// +// static inline void GXS_SetVisiblePlane (int plane) +// { +// GX_PLANEMASK_ASSERT(plane); +// +// reg_GXS_DB_DISPCNT = (u32)((reg_GXS_DB_DISPCNT & ~REG_GXS_DB_DISPCNT_DISPLAY_MASK) | +// (plane << REG_GXS_DB_DISPCNT_DISPLAY_SHIFT)); +// } +// +// static inline int GXS_GetVisiblePlane (void) +// { +// return (int)((reg_GXS_DB_DISPCNT & REG_GXS_DB_DISPCNT_DISPLAY_MASK) +// >> REG_GXS_DB_DISPCNT_DISPLAY_SHIFT); +// } +// +// static inline void GX_SetVisibleWnd (int window) +// { +// GX_WNDMASK_ASSERT(window); +// +// reg_GX_DISPCNT = (u32)((reg_GX_DISPCNT & +// ~(REG_GX_DISPCNT_W0_MASK | +// REG_GX_DISPCNT_W1_MASK | +// REG_GX_DISPCNT_OW_MASK)) | (window << REG_GX_DISPCNT_W0_SHIFT)); +// } +// +// static inline int GX_GetVisibleWnd (void) +// { +// return (int)((reg_GX_DISPCNT & (REG_GX_DISPCNT_W0_MASK | +// REG_GX_DISPCNT_W1_MASK | +// REG_GX_DISPCNT_OW_MASK)) >> REG_GX_DISPCNT_W0_SHIFT); +// } +// +// static inline void GXS_SetVisibleWnd (int window) +// { +// GX_WNDMASK_ASSERT(window); +// +// reg_GXS_DB_DISPCNT = (u32)((reg_GXS_DB_DISPCNT & +// ~(REG_GXS_DB_DISPCNT_W0_MASK | +// REG_GXS_DB_DISPCNT_W1_MASK | +// REG_GXS_DB_DISPCNT_OW_MASK)) | +// (window << REG_GXS_DB_DISPCNT_W0_SHIFT)); +// } +// +// static inline int GXS_GetVisibleWnd (void) +// { +// return (int)((reg_GXS_DB_DISPCNT & (REG_GXS_DB_DISPCNT_W0_MASK | +// REG_GXS_DB_DISPCNT_W1_MASK | +// REG_GXS_DB_DISPCNT_OW_MASK)) +// >> REG_GXS_DB_DISPCNT_W0_SHIFT); +// } +// +// static inline void GX_SetOBJVRamModeChar (GXOBJVRamModeChar mode) +// { +// GX_OBJVRAMMODE_CHAR_ASSERT(mode); +// +// reg_GX_DISPCNT = (u32)(reg_GX_DISPCNT & +// ~(REG_GX_DISPCNT_EXOBJ_CH_MASK | REG_GX_DISPCNT_OBJMAP_CH_MASK) | mode); +// } +// +// static inline GXOBJVRamModeChar GX_GetOBJVRamModeChar (void) +// { +// return (GXOBJVRamModeChar)(reg_GX_DISPCNT & +// (REG_GX_DISPCNT_EXOBJ_CH_MASK | REG_GX_DISPCNT_OBJMAP_CH_MASK)); +// } +// +// static inline void GXS_SetOBJVRamModeChar (GXOBJVRamModeChar mode) +// { +// GXS_OBJVRAMMODE_CHAR_ASSERT(mode); +// +// reg_GXS_DB_DISPCNT = (u32)(reg_GXS_DB_DISPCNT & +// ~(REG_GXS_DB_DISPCNT_EXOBJ_CH_MASK | +// REG_GXS_DB_DISPCNT_OBJMAP_CH_MASK) | mode); +// } +// +// static inline GXOBJVRamModeChar GXS_GetOBJVRamModeChar (void) +// { +// return (GXOBJVRamModeChar)(reg_GXS_DB_DISPCNT & +// (REG_GXS_DB_DISPCNT_EXOBJ_CH_MASK | +// REG_GXS_DB_DISPCNT_OBJMAP_CH_MASK)); +// } +// +// static inline void GX_SetOBJVRamModeBmp (GXOBJVRamModeBmp mode) +// { +// GX_OBJVRAMMODE_BMP_ASSERT(mode); +// +// reg_GX_DISPCNT = (u32)(reg_GX_DISPCNT & +// ~(REG_GX_DISPCNT_EXOBJ_BM_MASK | REG_GX_DISPCNT_OBJMAP_BM_MASK) | mode); +// } +// +// static inline GXOBJVRamModeBmp GX_GetOBJVRamModeBmp (void) +// { +// return (GXOBJVRamModeBmp)(reg_GX_DISPCNT & +// (REG_GX_DISPCNT_EXOBJ_BM_MASK | REG_GX_DISPCNT_OBJMAP_BM_MASK)); +// } +// +// static inline void GXS_SetOBJVRamModeBmp (GXOBJVRamModeBmp mode) +// { +// GXS_OBJVRAMMODE_BMP_ASSERT(mode); +// reg_GXS_DB_DISPCNT = (u32)(reg_GXS_DB_DISPCNT & ~(REG_GXS_DB_DISPCNT_OBJMAP_BM_MASK) | mode); +// } +// +// static inline GXOBJVRamModeBmp GXS_GetOBJVRamModeBmp (void) +// { +// return (GXOBJVRamModeBmp)(reg_GXS_DB_DISPCNT & REG_GXS_DB_DISPCNT_OBJMAP_BM_MASK); +// } +// +// static inline void GX_BlankScr (BOOL blank) +// { +// SDK_WARNING((1 == 0), "GX_BlankScr is obsolete, please use GX_DispOn/GX_DispOff instead."); +// if (blank) { +// reg_GX_DISPCNT |= REG_GX_DISPCNT_BLANK_MASK; +// } else { +// reg_GX_DISPCNT &= ~REG_GX_DISPCNT_BLANK_MASK; +// } +// } +// +// static inline void GXS_DispOff (void) +// { +// reg_GXS_DB_DISPCNT &= ~REG_GXS_DB_DISPCNT_MODE_MASK; +// } +// +// static inline void GXS_DispOn (void) +// { +// reg_GXS_DB_DISPCNT |= REG_GXS_DB_DISPCNT_MODE_MASK; +// } +// +// static inline void GX_HBlankOBJProc (BOOL proc) +// { +// if (proc) { +// reg_GX_DISPCNT |= REG_GX_DISPCNT_OH_MASK; +// } else { +// reg_GX_DISPCNT &= ~REG_GX_DISPCNT_OH_MASK; +// } +// } +// +// static inline void GXS_HBlankOBJProc (BOOL proc) +// { +// if (proc) { +// reg_GXS_DB_DISPCNT |= REG_GXS_DB_DISPCNT_OH_MASK; +// } else { +// reg_GXS_DB_DISPCNT &= ~REG_GXS_DB_DISPCNT_OH_MASK; +// } +// } +// +// static inline void GX_SetMasterBrightness (int brightness) +// { +// GXx_SetMasterBrightness_(®_GX_MASTER_BRIGHT, brightness); +// } +// +// static inline int GX_GetMasterBrightness (void) +// { +// return GXx_GetMasterBrightness_(®_GX_MASTER_BRIGHT); +// } +// +// static inline void GXS_SetMasterBrightness (int brightness) +// { +// GXx_SetMasterBrightness_(®_GXS_DB_MASTER_BRIGHT, brightness); +// } +// +// static inline int GXS_GetMasterBrightness (void) +// { +// return GXx_GetMasterBrightness_(®_GXS_DB_MASTER_BRIGHT); +// } +// +// static inline s32 GX_IsHBlank (void) +// { +// return (reg_GX_DISPSTAT & REG_GX_DISPSTAT_HBLK_MASK); +// } +// +// static inline s32 GX_IsVBlank (void) +// { +// return (reg_GX_DISPSTAT & REG_GX_DISPSTAT_VBLK_MASK); +// } +// +// static inline s32 GX_IsVCountEq (void) +// { +// return (reg_GX_DISPSTAT & REG_GX_DISPSTAT_LYC_MASK); +// } +// +// static inline void GX_VCountEqIntr (BOOL enable) +// { +// if (enable) { +// reg_GX_DISPSTAT |= REG_GX_DISPSTAT_VQI_MASK; +// } else { +// reg_GX_DISPSTAT &= ~REG_GX_DISPSTAT_VQI_MASK; +// } +// } + +// TODO: check this later +// static inline s32 GX_GetVCount () +// { +// return reg_GX_VCOUNT; +// } + +// static inline void GX_SetVCount (s32 count) +// { +// static vu32 vblank_count; +// +// if(count < 202 || count > 211) { +// SDK_TFATAL_ERROR("V Counter out of range(%d). it must be 202 to 211.", count); +// } else if(vblank_count == *(vu32 *)HW_VBLANK_COUNT_BUF) { +// SDK_TFATAL_ERROR("Set V Count once a frame."); +// } else { +// OSIntrMode intr_mode; +// s32 current_count; +// +// intr_mode = EnableIrqFlag(); +// current_count = reg_GX_VCOUNT; +// +// if(current_count < 202 || current_count > 211) { +// SDK_TFATAL_ERROR("Current V Counter out of range(%d). it must be 202 to 211.", current_count); +// } else if(count > current_count) { +// SDK_TFATAL_ERROR("Cannot advance the V Counter"); +// } else { +// reg_GX_VCOUNT = (u16)count; +// vblank_count = *(vu32 *)HW_VBLANK_COUNT_BUF; +// } +// +// (void)SetIrqFlag(intr_mode); +// } +// } +// +// static inline s32 GX_GetVCountEqVal (void) +// { +// u16 val = reg_GX_DISPSTAT; +// return ((val >> 8) & 0x00ff) | ((val << 1) & 0x0100); +// } +// +// static inline void GX_SetPower (int gxbit_power) +// { +// GX_POWER_ASSERT(gxbit_power); +// reg_GX_POWCNT = (u16)((reg_GX_POWCNT & ~GX_POWER_ALL) | gxbit_power); +// } +// +// static inline GXPower GX_GetPower () +// { +// return (GXPower)(reg_GX_POWCNT & GX_POWER_ALL); +// } +// +// static inline void GXi_PowerLCD (BOOL enable) +// { +// if (enable) { +// reg_GX_POWCNT |= REG_GX_POWCNT_LCD_MASK; +// } else { +// reg_GX_POWCNT &= ~REG_GX_POWCNT_LCD_MASK; +// } +// } +// +// #define GX_PowerLCD(x) SDK_ERR("GX_PowerLCD() is discontinued. please use PM_SetLCDPower()\n") +// #define GX_PowerLCDTop(x) SDK_ERR("GX_PowerLCDTop() is discontinued. please use PM_SetLCDPower()\n") +// #define GX_PowerLCDBot(x) SDK_ERR("GX_PowerLCDBot() is discontinued. please use PM_SetLCDPower()\n") +// #define GX_POWER_LCD_TOP SDK_ERR("GX_POWER_LCD_TOP is discontinued. please use PM_SetLCDPower()\n") +// #define GX_POWER_LCD_BOT SDK_ERR("GX_POWER_LCD_BOT is discontinued. please use PM_SetLCDPower()\n") +// #define GX_POWER_LCD SDK_ERR("GX_POWER_LCD is discontinued. please use PM_SetLCDPower()\n") +// +// static inline void GX_Power2D (BOOL enable) +// { +// if (enable) { +// reg_GX_POWCNT |= (REG_GX_POWCNT_E2DG_MASK | REG_GX_POWCNT_E2DGB_MASK); +// } else { +// reg_GX_POWCNT &= ~(REG_GX_POWCNT_E2DG_MASK | REG_GX_POWCNT_E2DGB_MASK); +// } +// } +// +// static inline void GX_Power2DMain (BOOL enable) +// { +// if (enable) { +// reg_GX_POWCNT |= REG_GX_POWCNT_E2DG_MASK; +// } else { +// reg_GX_POWCNT &= ~REG_GX_POWCNT_E2DG_MASK; +// } +// } +// +// static inline void GX_Power2DSub (BOOL enable) +// { +// if (enable) { +// reg_GX_POWCNT |= REG_GX_POWCNT_E2DGB_MASK; +// } else { +// reg_GX_POWCNT &= ~REG_GX_POWCNT_E2DGB_MASK; +// } +// } +// +// static inline void GX_PowerRender (BOOL enable) +// { +// if (enable) { +// reg_GX_POWCNT |= REG_GX_POWCNT_RE_MASK; +// } else { +// reg_GX_POWCNT &= ~REG_GX_POWCNT_RE_MASK; +// } +// } +// +// static inline void GX_PowerGeometry (BOOL enable) +// { +// if (enable) { +// reg_GX_POWCNT |= REG_GX_POWCNT_GE_MASK; +// } else { +// reg_GX_POWCNT &= ~REG_GX_POWCNT_GE_MASK; +// } +// } +// +// static inline void GX_Power3D (BOOL enable) +// { +// if (enable) { +// reg_GX_POWCNT |= (REG_GX_POWCNT_GE_MASK | REG_GX_POWCNT_RE_MASK); +// } else { +// reg_GX_POWCNT &= ~(REG_GX_POWCNT_GE_MASK | REG_GX_POWCNT_RE_MASK); +// } +// } +// +// static inline void GX_SetDispSelect (GXDispSelect sel) +// { +// GX_DISP_SELECT_ASSERT(sel); +// +// reg_GX_POWCNT = (u16)((reg_GX_POWCNT & ~REG_GX_POWCNT_DSEL_MASK) | +// (sel << REG_GX_POWCNT_DSEL_SHIFT)); +// } +// +// static inline GXDispSelect GX_GetDispSelect (void) +// { +// return (GXDispSelect)((reg_GX_POWCNT & REG_GX_POWCNT_DSEL_MASK) >> REG_GX_POWCNT_DSEL_SHIFT); +// } +// +// static inline void GX_InitEx (u32 dma_no) +// { +// SDK_ASSERT(dma_no <= MI_DMA_MAX_NUM || dma_no == GX_DMA_NOT_USE); +// +// GXi_DmaId = dma_no; +// GX_Init(); +// } +// +// static inline u32 GX_GetDefaultDMA (void) +// { +// return GXi_DmaId; +// } +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/nitro/gx/gx_bgcnt.h b/lib/include/nitro/gx/gx_bgcnt.h new file mode 100644 index 00000000..cd2ca2c6 --- /dev/null +++ b/lib/include/nitro/gx/gx_bgcnt.h @@ -0,0 +1,1292 @@ +#ifndef NITRO_GX_BGCNT_H_ +#define NITRO_GX_BGCNT_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef union { + u16 raw; + struct { + u16 priority :2; + u16 charBase :4; + u16 mosaic :1; + u16 colorMode :1; + u16 screenBase :5; + u16 bgExtPltt :1; + u16 screenSize :2; + }; +} GXBg01Control; + +typedef union { + u16 raw; + struct { + u16 priority :2; + u16 charBase :4; + u16 mosaic :1; + u16 colorMode :1; + u16 screenBase :5; + u16 _reserve :1; + u16 screenSize :2; + }; +} GXBg23ControlText; + +typedef union { + u16 raw; + struct { + u16 priority :2; + u16 charBase :4; + u16 mosaic :1; + u16 _reserve :1; + u16 screenBase :5; + u16 areaOver :1; + u16 screenSize :2; + }; +} GXBg23ControlAffine; + +typedef union { + u16 raw; + struct { + u16 priority :2; + u16 _reserve1 :1; + u16 charBase :3; + u16 mosaic :1; + u16 _reserve2 :1; + u16 screenBase :5; + u16 areaOver :1; + u16 screenSize :2; + }; +} GXBg23Control256x16Pltt; + +typedef union { + u16 raw; + struct { + u16 priority :2; + u16 charBase :4; + u16 mosaic :1; + u16 _reserve :1; + u16 screenBase :5; + u16 areaOver :1; + u16 screenSize :2; + }; +} GXBg23Control256x16Affine; + +typedef union { + u16 raw; + struct { + u16 priority :2; + u16 _reserve1 :4; + u16 mosaic :1; + u16 _reserve2 :1; + u16 screenBase :5; + u16 areaOver :1; + u16 screenSize :2; + }; +} GXBg23Control256Bmp, GXBg23ControlDCBmp; + +typedef union { + u16 raw; + struct { + u16 priority :2; + u16 _reserve1 :4; + u16 mosaic :1; + u16 _reserve2 :6; + u16 areaOver :1; + u16 screenSize :2; + }; +} GXBg2ControlLargeBmp; + +typedef enum { + GX_BG_SCRSIZE_TEXT_256x256 = 0, + GX_BG_SCRSIZE_TEXT_512x256 = 1, + GX_BG_SCRSIZE_TEXT_256x512 = 2, + GX_BG_SCRSIZE_TEXT_512x512 = 3 +} GXBGScrSizeText; + +#define GX_BG_SCRSIZE_TEXT_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BG_SCRSIZE_TEXT_256x256, GX_BG_SCRSIZE_TEXT_512x512) + +typedef enum { + GX_BG_SCRSIZE_AFFINE_128x128 = 0, + GX_BG_SCRSIZE_AFFINE_256x256 = 1, + GX_BG_SCRSIZE_AFFINE_512x512 = 2, + GX_BG_SCRSIZE_AFFINE_1024x1024 = 3 +} GXBGScrSizeAffine; + +#define GX_BG_SCRSIZE_AFFINE_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BG_SCRSIZE_AFFINE_128x128, GX_BG_SCRSIZE_AFFINE_1024x1024) + +typedef enum { + GX_BG_SCRSIZE_256x16PLTT_128x128 = 0, + GX_BG_SCRSIZE_256x16PLTT_256x256 = 1, + GX_BG_SCRSIZE_256x16PLTT_512x512 = 2, + GX_BG_SCRSIZE_256x16PLTT_1024x1024 = 3 +} GXBGScrSize256x16Pltt; + +#define GX_BG_SCRSIZE_256x16PLTT_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BG_SCRSIZE_256x16PLTT_128x128, GX_BG_SCRSIZE_256x16PLTT_1024x1024) + +typedef enum { + GX_BG_SCRSIZE_256BMP_128x128 = 0, + GX_BG_SCRSIZE_256BMP_256x256 = 1, + GX_BG_SCRSIZE_256BMP_512x256 = 2, + GX_BG_SCRSIZE_256BMP_512x512 = 3 +} GXBGScrSize256Bmp; + +#define GX_BG_SCRSIZE_256BMP_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BG_SCRSIZE_256BMP_128x128, GX_BG_SCRSIZE_256BMP_512x512) + +typedef enum { + GX_BG_SCRSIZE_DCBMP_128x128 = 0, + GX_BG_SCRSIZE_DCBMP_256x256 = 1, + GX_BG_SCRSIZE_DCBMP_512x256 = 2, + GX_BG_SCRSIZE_DCBMP_512x512 = 3 +} GXBGScrSizeDcBmp; + +#define GX_BG_SCRSIZE_DCBMP_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BG_SCRSIZE_DCBMP_128x128, GX_BG_SCRSIZE_DCBMP_512x512) + +typedef enum { + GX_BG_SCRSIZE_LARGEBMP_512x1024 = 0, + GX_BG_SCRSIZE_LARGEBMP_1024x512 = 1 +} GXBGScrSizeLargeBmp; + +#define GX_BG_SCRSIZE_LARGEBMP_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BG_SCRSIZE_LARGEBMP_512x1024, GX_BG_SCRSIZE_LARGEBMP_1024x512) + +typedef enum { + GX_BG_COLORMODE_16 = 0, + GX_BG_COLORMODE_256 = 1 +} GXBGColorMode; + +#define GX_BG_COLORMODE_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BG_COLORMODE_16, GX_BG_COLORMODE_256) + +typedef enum { + GX_BG_AREAOVER_XLU = 0, + GX_BG_AREAOVER_REPEAT = 1 +} GXBGAreaOver; + +#define GX_BG_AREAOVER_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BG_AREAOVER_XLU, GX_BG_AREAOVER_REPEAT) + +typedef enum { + GX_BG_CHARBASE_0x00000 = 0, + GX_BG_CHARBASE_0x04000 = 1, + GX_BG_CHARBASE_0x08000 = 2, + GX_BG_CHARBASE_0x0c000 = 3, + GX_BG_CHARBASE_0x10000 = 4, + GX_BG_CHARBASE_0x14000 = 5, + GX_BG_CHARBASE_0x18000 = 6, + GX_BG_CHARBASE_0x1c000 = 7, + GX_BG_CHARBASE_0x20000 = 8, + GX_BG_CHARBASE_0x24000 = 9, + GX_BG_CHARBASE_0x28000 = 10, + GX_BG_CHARBASE_0x2c000 = 11, + GX_BG_CHARBASE_0x30000 = 12, + GX_BG_CHARBASE_0x34000 = 13, + GX_BG_CHARBASE_0x38000 = 14, + GX_BG_CHARBASE_0x3c000 = 15 +} GXBGCharBase; + +#define GX_BG_CHARBASE_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BG_CHARBASE_0x00000, GX_BG_CHARBASE_0x3c000) + +typedef enum { + GX_BG_SCRBASE_0x0000 = 0, + GX_BG_SCRBASE_0x0800 = 1, + GX_BG_SCRBASE_0x1000 = 2, + GX_BG_SCRBASE_0x1800 = 3, + GX_BG_SCRBASE_0x2000 = 4, + GX_BG_SCRBASE_0x2800 = 5, + GX_BG_SCRBASE_0x3000 = 6, + GX_BG_SCRBASE_0x3800 = 7, + GX_BG_SCRBASE_0x4000 = 8, + GX_BG_SCRBASE_0x4800 = 9, + GX_BG_SCRBASE_0x5000 = 10, + GX_BG_SCRBASE_0x5800 = 11, + GX_BG_SCRBASE_0x6000 = 12, + GX_BG_SCRBASE_0x6800 = 13, + GX_BG_SCRBASE_0x7000 = 14, + GX_BG_SCRBASE_0x7800 = 15, + GX_BG_SCRBASE_0x8000 = 16, + GX_BG_SCRBASE_0x8800 = 17, + GX_BG_SCRBASE_0x9000 = 18, + GX_BG_SCRBASE_0x9800 = 19, + GX_BG_SCRBASE_0xa000 = 20, + GX_BG_SCRBASE_0xa800 = 21, + GX_BG_SCRBASE_0xb000 = 22, + GX_BG_SCRBASE_0xb800 = 23, + GX_BG_SCRBASE_0xc000 = 24, + GX_BG_SCRBASE_0xc800 = 25, + GX_BG_SCRBASE_0xd000 = 26, + GX_BG_SCRBASE_0xd800 = 27, + GX_BG_SCRBASE_0xe000 = 28, + GX_BG_SCRBASE_0xe800 = 29, + GX_BG_SCRBASE_0xf000 = 30, + GX_BG_SCRBASE_0xf800 = 31 +} GXBGScrBase; + +#define GX_BG_SCRBASE_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BG_SCRBASE_0x0000, GX_BG_SCRBASE_0xf800) + +typedef enum { + GX_BG_BMPSCRBASE_0x00000 = 0, + GX_BG_BMPSCRBASE_0x04000 = 1, + GX_BG_BMPSCRBASE_0x08000 = 2, + GX_BG_BMPSCRBASE_0x0c000 = 3, + GX_BG_BMPSCRBASE_0x10000 = 4, + GX_BG_BMPSCRBASE_0x14000 = 5, + GX_BG_BMPSCRBASE_0x18000 = 6, + GX_BG_BMPSCRBASE_0x1c000 = 7, + GX_BG_BMPSCRBASE_0x20000 = 8, + GX_BG_BMPSCRBASE_0x24000 = 9, + GX_BG_BMPSCRBASE_0x28000 = 10, + GX_BG_BMPSCRBASE_0x2c000 = 11, + GX_BG_BMPSCRBASE_0x30000 = 12, + GX_BG_BMPSCRBASE_0x34000 = 13, + GX_BG_BMPSCRBASE_0x38000 = 14, + GX_BG_BMPSCRBASE_0x3c000 = 15, + GX_BG_BMPSCRBASE_0x40000 = 16, + GX_BG_BMPSCRBASE_0x44000 = 17, + GX_BG_BMPSCRBASE_0x48000 = 18, + GX_BG_BMPSCRBASE_0x4c000 = 19, + GX_BG_BMPSCRBASE_0x50000 = 20, + GX_BG_BMPSCRBASE_0x54000 = 21, + GX_BG_BMPSCRBASE_0x58000 = 22, + GX_BG_BMPSCRBASE_0x5c000 = 23, + GX_BG_BMPSCRBASE_0x60000 = 24, + GX_BG_BMPSCRBASE_0x64000 = 25, + GX_BG_BMPSCRBASE_0x68000 = 26, + GX_BG_BMPSCRBASE_0x6c000 = 27, + GX_BG_BMPSCRBASE_0x70000 = 28, + GX_BG_BMPSCRBASE_0x74000 = 29, + GX_BG_BMPSCRBASE_0x78000 = 30, + GX_BG_BMPSCRBASE_0x7c000 = 31 +} GXBGBmpScrBase; + +#define GX_BG_BMPSCRBASE_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BG_BMPSCRBASE_0x00000, GX_BG_BMPSCRBASE_0x7c000) + +typedef enum { + GX_BG_EXTPLTT_01 = 0, + GX_BG_EXTPLTT_23 = 1 +} GXBGExtPltt; + +#define GX_BG_EXTPLTT_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_BG_EXTPLTT_01, GX_BG_EXTPLTT_23) + +#define GX_BG_PRIORITY_ASSERT(x) SDK_MINMAX_ASSERT(x, 0, 3) + +typedef enum { + GX_BG_EXTMODE_256x16PLTT = (0 << REG_G2_BG2CNT_CHARBASE_SHIFT) | (0 << REG_G2_BG2CNT_COLORMODE_SHIFT), + GX_BG_EXTMODE_256BITMAP = (0 << REG_G2_BG2CNT_CHARBASE_SHIFT) | (1 << REG_G2_BG2CNT_COLORMODE_SHIFT), + GX_BG_EXTMODE_DCBITMAP = (1 << REG_G2_BG2CNT_CHARBASE_SHIFT) | (1 << REG_G2_BG2CNT_COLORMODE_SHIFT) +} GXBGExtMode; + +#if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL)) + +static void G2_SetBG0Control(GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, GXBGCharBase charBase, GXBGExtPltt bgExtPltt); + +static void G2_SetBG1Control(GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, GXBGCharBase charBase, GXBGExtPltt bgExtPltt); + +static void G2_SetBG2ControlText(GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, GXBGCharBase charBase); + +static void G2_SetBG2ControlAffine(GXBGScrSizeAffine screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase); + +#define G2_SetBG2Control256x16Pltt G2_SetBG2Control256x16Affine +static void G2_SetBG2Control256x16Affine(GXBGScrSize256x16Pltt screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase); + +static void G2_SetBG2Control256Bmp(GXBGScrSize256Bmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase); + +static void G2_SetBG2ControlDCBmp(GXBGScrSizeDcBmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase); + +static void G2_SetBG2ControlLargeBmp(GXBGScrSizeLargeBmp screenSize, GXBGAreaOver areaOver); + +static void G2_SetBG3ControlText(GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, GXBGCharBase charBase); + +static void G2_SetBG3ControlAffine(GXBGScrSizeAffine screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase); + +#define G2_SetBG3Control256x16Pltt G2_SetBG3Control256x16Affine + +static void G2_SetBG3Control256x16Affine(GXBGScrSize256x16Pltt screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase); + +static void G2_SetBG3Control256Bmp(GXBGScrSize256Bmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase); + +static void G2_SetBG3ControlDCBmp(GXBGScrSizeDcBmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase); + +static void G2_SetBG0Priority(int priority); +static void G2_SetBG1Priority(int priority); +static void G2_SetBG2Priority(int priority); +static void G2_SetBG3Priority(int priority); + +static void G2_BG0Mosaic(BOOL enable); +static void G2_BG1Mosaic(BOOL enable); +static void G2_BG2Mosaic(BOOL enable); +static void G2_BG3Mosaic(BOOL enable); + +void * G2_GetBG0ScrPtr(void); +void * G2_GetBG1ScrPtr(void); +void * G2_GetBG2ScrPtr(void); +void * G2_GetBG3ScrPtr(void); +void * G2_GetBG0CharPtr(void); +void * G2_GetBG1CharPtr(void); +void * G2_GetBG2CharPtr(void); +void * G2_GetBG3CharPtr(void); +static void * G2_GetOBJCharPtr(void); + +static void G2S_SetBG0Control(GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, GXBGCharBase charBase, GXBGExtPltt bgExtPltt); + +static void G2S_SetBG1Control(GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, GXBGCharBase charBase, GXBGExtPltt bgExtPltt); + +static void G2S_SetBG2ControlText(GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, GXBGCharBase charBase); + +static void G2S_SetBG2ControlAffine(GXBGScrSizeAffine screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase); + +#define G2S_SetBG2Control256x16Pltt G2S_SetBG2Control256x16Affine + +static void G2S_SetBG2Control256x16Affine(GXBGScrSize256x16Pltt screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase); + +static void G2S_SetBG2Control256Bmp(GXBGScrSize256Bmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase); + +static void G2S_SetBG2ControlDCBmp(GXBGScrSizeDcBmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase); + +static void G2S_SetBG3ControlText(GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, GXBGCharBase charBase); + +static void G2S_SetBG3ControlAffine(GXBGScrSizeAffine screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase); + +#define G2S_SetBG3Control256x16Pltt G2S_SetBG3Control256x16Affine + +static void G2S_SetBG3Control256x16Affine(GXBGScrSize256x16Pltt screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase); + +static void G2S_SetBG3Control256Bmp(GXBGScrSize256Bmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase); + +static void G2S_SetBG3ControlDCBmp(GXBGScrSizeDcBmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase); + +static void G2S_SetBG0Priority(int priority); +static void G2S_SetBG1Priority(int priority); +static void G2S_SetBG2Priority(int priority); +static void G2S_SetBG3Priority(int priority); + +static void G2S_BG0Mosaic(BOOL enable); +static void G2S_BG1Mosaic(BOOL enable); +static void G2S_BG2Mosaic(BOOL enable); +static void G2S_BG3Mosaic(BOOL enable); + +void * G2S_GetBG0ScrPtr(void); +void * G2S_GetBG1ScrPtr(void); +void * G2S_GetBG2ScrPtr(void); +void * G2S_GetBG3ScrPtr(void); +void * G2S_GetBG0CharPtr(void); +void * G2S_GetBG1CharPtr(void); +void * G2S_GetBG2CharPtr(void); +void * G2S_GetBG3CharPtr(void); +static void * G2S_GetOBJCharPtr(void); + +#define GX_BG0_2D_CHECK_WARNING \ + SDK_WARNING(!(reg_GX_DISPCNT & REG_GX_DISPCNT_BG02D3D_MASK), \ + "G2_SetBG0Control: BG #0 assigned to 3D now.") +#ifdef SDK_DEBUG +#define GX_BGMODE_WARNING1(name, mode1) \ + do { \ + u32 tmp = (reg_GX_DISPCNT & REG_GX_DISPCNT_BGMODE_MASK) >> REG_GX_DISPCNT_BGMODE_SHIFT; \ + SDK_WARNING(tmp == mode1, \ + #name ## ": BG mode should be %d", mode1); \ + (void)0; \ + } while (0) + +#define GX_BGMODE_WARNING2(name, mode1, mode2) \ + do { \ + u32 tmp = (reg_GX_DISPCNT & REG_GX_DISPCNT_BGMODE_MASK) >> REG_GX_DISPCNT_BGMODE_SHIFT; \ + SDK_WARNING(tmp == mode1 || tmp == mode2, \ + #name ## ": BG mode should be %d or %d", mode1, mode2); \ + (void)0; \ + } while (0) + +#define GX_BGMODE_WARNING3(name, mode1, mode2, mode3) \ + do { \ + u32 tmp = (reg_GX_DISPCNT & REG_GX_DISPCNT_BGMODE_MASK) >> REG_GX_DISPCNT_BGMODE_SHIFT; \ + SDK_WARNING(tmp == mode1 || tmp == mode2 || tmp == mode3, \ + #name ## ": BG mode should be %d, %d, or %d", mode1, mode2, mode3); \ + (void)0; \ + } while (0) + +#define GXS_BGMODE_WARNING1(name, mode1) \ + do { \ + u32 tmp = (reg_GXS_DB_DISPCNT & REG_GXS_DB_DISPCNT_BGMODE_MASK) >> REG_GXS_DB_DISPCNT_BGMODE_SHIFT; \ + SDK_WARNING(tmp == mode1, \ + #name ## ": BG mode should be %d", mode1); \ + (void)0; \ + } while (0) + +#define GXS_BGMODE_WARNING2(name, mode1, mode2) \ + do { \ + u32 tmp = (reg_GXS_DB_DISPCNT & REG_GXS_DB_DISPCNT_BGMODE_MASK) >> REG_GXS_DB_DISPCNT_BGMODE_SHIFT; \ + SDK_WARNING(tmp == mode1 || tmp == mode2, \ + #name ## ": BG mode should be %d or %d", mode1, mode2); \ + (void)0; \ + } while (0) + +#define GXS_BGMODE_WARNING3(name, mode1, mode2, mode3) \ + do { \ + u32 tmp = (reg_GXS_DB_DISPCNT & REG_GXS_DB_DISPCNT_BGMODE_MASK) >> REG_GXS_DB_DISPCNT_BGMODE_SHIFT; \ + SDK_WARNING(tmp == mode1 || tmp == mode2 || tmp == mode3, \ + #name ## ": BG mode should be %d, %d, or %d", mode1, mode2, mode3); \ + (void)0; \ + } while (0) + +#else + #define GX_BGMODE_WARNING1(name, mode1) ((void) 0) + #define GX_BGMODE_WARNING2(name, mode1, mode2) ((void) 0) + #define GX_BGMODE_WARNING3(name, mode1, mode2, mode3) ((void) 0) + #define GXS_BGMODE_WARNING1(name, mode1) ((void) 0) + #define GXS_BGMODE_WARNING2(name, mode1, mode2) ((void) 0) + #define GXS_BGMODE_WARNING3(name, mode1, mode2, mode3) ((void) 0) +#endif + +static inline void G2_SetBG0Control (GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, + GXBGCharBase charBase, GXBGExtPltt bgExtPltt) +{ + GX_BG_SCRSIZE_TEXT_ASSERT(screenSize); + GX_BG_COLORMODE_ASSERT(colorMode); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GX_BG_EXTPLTT_ASSERT(bgExtPltt); + GX_BG0_2D_CHECK_WARNING; + + reg_G2_BG0CNT = + (u16)((reg_G2_BG0CNT & (REG_G2_BG0CNT_PRIORITY_MASK | REG_G2_BG0CNT_MOSAIC_MASK)) | + (screenSize << REG_G2_BG0CNT_SCREENSIZE_SHIFT) | (colorMode << + REG_G2_BG0CNT_COLORMODE_SHIFT) | + (screenBase << REG_G2_BG0CNT_SCREENBASE_SHIFT) | (charBase << + REG_G2_BG0CNT_CHARBASE_SHIFT) | + (bgExtPltt << REG_G2_BG0CNT_BGPLTTSLOT_SHIFT)); +} + +static inline GXBg01Control G2_GetBG0Control (void) +{ + GX_BG0_2D_CHECK_WARNING; + return *(volatile GXBg01Control *)REG_BG0CNT_ADDR; +} + +static inline void G2S_SetBG0Control (GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, + GXBGCharBase charBase, GXBGExtPltt bgExtPltt) +{ + GX_BG_SCRSIZE_TEXT_ASSERT(screenSize); + GX_BG_COLORMODE_ASSERT(colorMode); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GX_BG_EXTPLTT_ASSERT(bgExtPltt); + + reg_G2S_DB_BG0CNT = + (u16)((reg_G2S_DB_BG0CNT & + (REG_G2S_DB_BG0CNT_PRIORITY_MASK | REG_G2S_DB_BG0CNT_MOSAIC_MASK)) | (screenSize << + REG_G2S_DB_BG0CNT_SCREENSIZE_SHIFT) + | (colorMode << REG_G2S_DB_BG0CNT_COLORMODE_SHIFT) | (screenBase << + REG_G2S_DB_BG0CNT_SCREENBASE_SHIFT) + | (charBase << REG_G2S_DB_BG0CNT_CHARBASE_SHIFT) | (bgExtPltt << + REG_G2S_DB_BG0CNT_BGPLTTSLOT_SHIFT)); +} + +static inline GXBg01Control G2S_GetBG0Control (void) +{ + return *(volatile GXBg01Control *)REG_DB_BG0CNT_ADDR; +} + +static inline void G2_SetBG1Control (GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, + GXBGCharBase charBase, GXBGExtPltt bgExtPltt) +{ + GX_BG_SCRSIZE_TEXT_ASSERT(screenSize); + GX_BG_COLORMODE_ASSERT(colorMode); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GX_BG_EXTPLTT_ASSERT(bgExtPltt); + + reg_G2_BG1CNT = + (u16)((reg_G2_BG1CNT & (REG_G2_BG1CNT_PRIORITY_MASK | REG_G2_BG1CNT_MOSAIC_MASK)) | + (screenSize << REG_G2_BG1CNT_SCREENSIZE_SHIFT) | (colorMode << + REG_G2_BG1CNT_COLORMODE_SHIFT) | + (screenBase << REG_G2_BG1CNT_SCREENBASE_SHIFT) | (charBase << + REG_G2_BG1CNT_CHARBASE_SHIFT) | + (bgExtPltt << REG_G2_BG1CNT_BGPLTTSLOT_SHIFT)); +} + +static inline GXBg01Control G2_GetBG1Control (void) +{ + return *(volatile GXBg01Control *)REG_BG1CNT_ADDR; +} + +static inline void G2S_SetBG1Control (GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, + GXBGCharBase charBase, GXBGExtPltt bgExtPltt) +{ + GX_BG_SCRSIZE_TEXT_ASSERT(screenSize); + GX_BG_COLORMODE_ASSERT(colorMode); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GX_BG_EXTPLTT_ASSERT(bgExtPltt); + + reg_G2S_DB_BG1CNT = + (u16)((reg_G2S_DB_BG1CNT & + (REG_G2S_DB_BG1CNT_PRIORITY_MASK | REG_G2S_DB_BG1CNT_MOSAIC_MASK)) | (screenSize << + REG_G2S_DB_BG1CNT_SCREENSIZE_SHIFT) + | (colorMode << REG_G2S_DB_BG1CNT_COLORMODE_SHIFT) | (screenBase << + REG_G2S_DB_BG1CNT_SCREENBASE_SHIFT) + | (charBase << REG_G2S_DB_BG1CNT_CHARBASE_SHIFT) | (bgExtPltt << + REG_G2S_DB_BG1CNT_BGPLTTSLOT_SHIFT)); +} + +static inline GXBg01Control G2S_GetBG1Control (void) +{ + return *(volatile GXBg01Control *)REG_DB_BG1CNT_ADDR; +} + +static inline GXBGExtMode G2_GetBG2ExtMode (void) +{ + GX_BGMODE_WARNING1(G2_GetBG2ExtMode, 5); + + return (GXBGExtMode)(reg_G2_BG2CNT & + (((reg_G2_BG2CNT & REG_G2_BG2CNT_COLORMODE_MASK) >> 5) | + REG_G2_BG2CNT_COLORMODE_MASK)); +} + +static inline GXBGExtMode G2S_GetBG2ExtMode (void) +{ + GXS_BGMODE_WARNING1(G2S_GetBG2ExtMode, 5); + + return (GXBGExtMode)(reg_G2S_DB_BG2CNT & + (((reg_G2S_DB_BG2CNT & REG_G2S_DB_BG2CNT_COLORMODE_MASK) >> 5) | + REG_G2S_DB_BG2CNT_COLORMODE_MASK)); +} + +static inline void G2_SetBG2ControlText (GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, GXBGCharBase charBase) +{ + GX_BG_SCRSIZE_TEXT_ASSERT(screenSize); + GX_BG_COLORMODE_ASSERT(colorMode); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GX_BGMODE_WARNING3(G2_SetBG2ControlText, 0, 1, 3); + + reg_G2_BG2CNT = + (u16)((reg_G2_BG2CNT & (REG_G2_BG2CNT_PRIORITY_MASK | REG_G2_BG2CNT_MOSAIC_MASK)) | + (screenSize << REG_G2_BG2CNT_SCREENSIZE_SHIFT) | (colorMode << + REG_G2_BG2CNT_COLORMODE_SHIFT) | + (screenBase << REG_G2_BG2CNT_SCREENBASE_SHIFT) | (charBase << + REG_G2_BG2CNT_CHARBASE_SHIFT)); +} + +static inline GXBg23ControlText G2_GetBG2ControlText (void) +{ + GX_BGMODE_WARNING3(G2_GetBG2ControlText, 0, 1, 3); + return *(volatile GXBg23ControlText *)REG_BG2CNT_ADDR; +} + +static inline void G2S_SetBG2ControlText (GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, GXBGCharBase charBase) +{ + GX_BG_SCRSIZE_TEXT_ASSERT(screenSize); + GX_BG_COLORMODE_ASSERT(colorMode); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GXS_BGMODE_WARNING3(G2S_SetBG2ControlText, 0, 1, 3); + + reg_G2S_DB_BG2CNT = + (u16)((reg_G2S_DB_BG2CNT & + (REG_G2S_DB_BG2CNT_PRIORITY_MASK | REG_G2S_DB_BG2CNT_MOSAIC_MASK)) | (screenSize << + REG_G2S_DB_BG2CNT_SCREENSIZE_SHIFT) + | (colorMode << REG_G2S_DB_BG2CNT_COLORMODE_SHIFT) | (screenBase << + REG_G2S_DB_BG2CNT_SCREENBASE_SHIFT) + | (charBase << REG_G2S_DB_BG2CNT_CHARBASE_SHIFT)); +} + +static inline GXBg23ControlText G2S_GetBG2ControlText (void) +{ + GXS_BGMODE_WARNING3(G2S_GetBG2ControlText, 0, 1, 3); + return *(volatile GXBg23ControlText *)REG_DB_BG2CNT_ADDR; +} + +static inline void G2_SetBG2ControlAffine (GXBGScrSizeAffine screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase) +{ + GX_BG_SCRSIZE_AFFINE_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GX_BGMODE_WARNING2(G2_SetBG2ControlAffine, 2, 4); + + reg_G2_BG2CNT = + (u16)((reg_G2_BG2CNT & (REG_G2_BG2CNT_PRIORITY_MASK | REG_G2_BG2CNT_MOSAIC_MASK)) | + (screenSize << REG_G2_BG2CNT_SCREENSIZE_SHIFT) | (screenBase << + REG_G2_BG2CNT_SCREENBASE_SHIFT) | + (charBase << REG_G2_BG2CNT_CHARBASE_SHIFT) | (areaOver << + REG_G2_BG2CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23ControlAffine G2_GetBG2ControlAffine (void) +{ + GX_BGMODE_WARNING2(G2_GetBG2ControlAffine, 2, 4); + return *(volatile GXBg23ControlAffine *)REG_BG2CNT_ADDR; +} + +static inline void G2S_SetBG2ControlAffine (GXBGScrSizeAffine screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase) +{ + GX_BG_SCRSIZE_AFFINE_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GXS_BGMODE_WARNING2(G2S_SetBG2ControlAffine, 2, 4); + + reg_G2S_DB_BG2CNT = + (u16)((reg_G2S_DB_BG2CNT & + (REG_G2S_DB_BG2CNT_PRIORITY_MASK | REG_G2S_DB_BG2CNT_MOSAIC_MASK)) | (screenSize << + REG_G2S_DB_BG2CNT_SCREENSIZE_SHIFT) + | (screenBase << REG_G2S_DB_BG2CNT_SCREENBASE_SHIFT) | (charBase << + REG_G2S_DB_BG2CNT_CHARBASE_SHIFT) + | (areaOver << REG_G2S_DB_BG2CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23ControlAffine G2S_GetBG2ControlAffine (void) +{ + GXS_BGMODE_WARNING2(G2S_GetBG2ControlAffine, 2, 4); + return *(volatile GXBg23ControlAffine *)REG_DB_BG2CNT_ADDR; +} + +static inline void G2_SetBG2Control256x16Affine (GXBGScrSize256x16Pltt screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase) +{ + GX_BG_SCRSIZE_256x16PLTT_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GX_BGMODE_WARNING1(G2_SetBG2Control256x16Affine, 5); + + reg_G2_BG2CNT = + (u16)((reg_G2_BG2CNT & (REG_G2_BG2CNT_PRIORITY_MASK | REG_G2_BG2CNT_MOSAIC_MASK)) | + (screenSize << REG_G2_BG2CNT_SCREENSIZE_SHIFT) | (charBase << + REG_G2_BG2CNT_CHARBASE_SHIFT) | + GX_BG_EXTMODE_256x16PLTT | (screenBase << REG_G2_BG2CNT_SCREENBASE_SHIFT) | (areaOver + << + REG_G2_BG2CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23Control256x16Pltt G2_GetBG2Control256x16Pltt (void) +{ + GX_BGMODE_WARNING1(G2_GetBG2Control256x16Pltt, 5); + return *(volatile GXBg23Control256x16Pltt *)REG_BG2CNT_ADDR; +} + +static inline GXBg23Control256x16Affine G2_GetBG2Control256x16Affine (void) +{ + GX_BGMODE_WARNING1(G2_GetBG2Control256x16Affine, 5); + return *(volatile GXBg23Control256x16Affine *)REG_BG2CNT_ADDR; +} + +static inline void G2S_SetBG2Control256x16Affine (GXBGScrSize256x16Pltt screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase) +{ + GX_BG_SCRSIZE_256x16PLTT_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GXS_BGMODE_WARNING1(G2S_SetBG2Control256x16Affine, 5); + + reg_G2S_DB_BG2CNT = + (u16)((reg_G2S_DB_BG2CNT & + (REG_G2S_DB_BG2CNT_PRIORITY_MASK | REG_G2S_DB_BG2CNT_MOSAIC_MASK)) | (screenSize << + REG_G2S_DB_BG2CNT_SCREENSIZE_SHIFT) + | (charBase << REG_G2S_DB_BG2CNT_CHARBASE_SHIFT) | GX_BG_EXTMODE_256x16PLTT | + (screenBase << REG_G2S_DB_BG2CNT_SCREENBASE_SHIFT) | (areaOver << + REG_G2S_DB_BG2CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23Control256x16Pltt G2S_GetBG2Control256x16Pltt (void) +{ + GXS_BGMODE_WARNING1(G2S_GetBG2Control256x16Pltt, 5); + return *(volatile GXBg23Control256x16Pltt *)REG_DB_BG2CNT_ADDR; +} + +static inline GXBg23Control256x16Affine G2S_GetBG2Control256x16Affine (void) +{ + GXS_BGMODE_WARNING1(G2S_GetBG2Control256x16Affine, 5); + return *(volatile GXBg23Control256x16Affine *)REG_DB_BG2CNT_ADDR; +} + +static inline void G2_SetBG2Control256Bmp (GXBGScrSize256Bmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) +{ + GX_BG_SCRSIZE_256BMP_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_BMPSCRBASE_ASSERT(screenBase); + GX_BGMODE_WARNING1(G2_SetBG2Control256Bmp, 5); + + reg_G2_BG2CNT = + (u16)((reg_G2_BG2CNT & (REG_G2_BG2CNT_PRIORITY_MASK | REG_G2_BG2CNT_MOSAIC_MASK)) | + (screenSize << REG_G2_BG2CNT_SCREENSIZE_SHIFT) | GX_BG_EXTMODE_256BITMAP | (screenBase + << + REG_G2_BG2CNT_SCREENBASE_SHIFT) + | (areaOver << REG_G2_BG2CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23Control256Bmp G2_GetBG2Control256Bmp (void) +{ + GX_BGMODE_WARNING1(G2_GetBG2Control256Bmp, 5); + return *(volatile GXBg23Control256Bmp *)REG_BG2CNT_ADDR; +} + +static inline void G2S_SetBG2Control256Bmp (GXBGScrSize256Bmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) +{ + GX_BG_SCRSIZE_256BMP_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_BMPSCRBASE_ASSERT(screenBase); + SDK_ASSERTMSG(screenSize != GX_BG_SCRSIZE_256BMP_512x512, + "SUB 2D engine does not support GX_BG_SCRSIZE_256BMP_512x512"); + GXS_BGMODE_WARNING1(G2S_SetBG2Control256Bmp, 5); + + reg_G2S_DB_BG2CNT = + (u16)((reg_G2S_DB_BG2CNT & + (REG_G2S_DB_BG2CNT_PRIORITY_MASK | REG_G2S_DB_BG2CNT_MOSAIC_MASK)) | (screenSize << + REG_G2S_DB_BG2CNT_SCREENSIZE_SHIFT) + | GX_BG_EXTMODE_256BITMAP | (screenBase << REG_G2S_DB_BG2CNT_SCREENBASE_SHIFT) | + (areaOver << REG_G2S_DB_BG2CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23Control256Bmp G2S_GetBG2Control256Bmp (void) +{ + GXS_BGMODE_WARNING1(G2S_GetBG2Control256Bmp, 5); + return *(volatile GXBg23Control256Bmp *)REG_DB_BG2CNT_ADDR; +} + +static inline void G2_SetBG2ControlDCBmp (GXBGScrSizeDcBmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) +{ + GX_BG_SCRSIZE_DCBMP_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_BMPSCRBASE_ASSERT(screenBase); + GX_BGMODE_WARNING1(G2_SetBG2ControlDCBmp, 5); + + reg_G2_BG2CNT = + (u16)((reg_G2_BG2CNT & (REG_G2_BG2CNT_PRIORITY_MASK | REG_G2_BG2CNT_MOSAIC_MASK)) | + (screenSize << REG_G2_BG2CNT_SCREENSIZE_SHIFT) | GX_BG_EXTMODE_DCBITMAP | (screenBase + << + REG_G2_BG2CNT_SCREENBASE_SHIFT) + | (areaOver << REG_G2_BG2CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23ControlDCBmp G2_GetBG2ControlDCBmp (void) +{ + GX_BGMODE_WARNING1(G2_SetBG2ControlDCBmp, 5); + return *(volatile GXBg23ControlDCBmp *)REG_BG2CNT_ADDR; +} + +static inline void G2S_SetBG2ControlDCBmp (GXBGScrSizeDcBmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) +{ + GX_BG_SCRSIZE_DCBMP_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_BMPSCRBASE_ASSERT(screenBase); + SDK_ASSERTMSG(screenSize != GX_BG_SCRSIZE_DCBMP_512x256, + "SUB 2D engine does not support GX_BG_SCRSIZE_DCBMP_512x256"); + SDK_ASSERTMSG(screenSize != GX_BG_SCRSIZE_DCBMP_512x512, + "SUB 2D engine does not support GX_BG_SCRSIZE_DCBMP_512x512"); + GXS_BGMODE_WARNING1(G2S_SetBG2ControlDCBmp, 5); + + reg_G2S_DB_BG2CNT = + (u16)((reg_G2S_DB_BG2CNT & + (REG_G2S_DB_BG2CNT_PRIORITY_MASK | REG_G2S_DB_BG2CNT_MOSAIC_MASK)) | (screenSize << + REG_G2S_DB_BG2CNT_SCREENSIZE_SHIFT) + | GX_BG_EXTMODE_DCBITMAP | (screenBase << REG_G2S_DB_BG2CNT_SCREENBASE_SHIFT) | + (areaOver << REG_G2S_DB_BG2CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23ControlDCBmp G2S_GetBG2ControlDCBmp (void) +{ + GXS_BGMODE_WARNING1(G2S_GetBG2ControlDCBmp, 5); + return *(volatile GXBg23ControlDCBmp *)REG_DB_BG2CNT_ADDR; +} + +static inline void G2_SetBG2ControlLargeBmp (GXBGScrSizeLargeBmp screenSize, GXBGAreaOver areaOver) +{ + GX_BG_SCRSIZE_LARGEBMP_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BGMODE_WARNING1(G2_SetBG2ControlLargeBmp, 6); + + reg_G2_BG2CNT = + (u16)((reg_G2_BG2CNT & (REG_G2_BG2CNT_PRIORITY_MASK | REG_G2_BG2CNT_MOSAIC_MASK)) | + (screenSize << REG_G2_BG2CNT_SCREENSIZE_SHIFT) | (areaOver << + REG_G2_BG2CNT_AREAOVER_SHIFT)); +} + +static inline GXBg2ControlLargeBmp G2_GetBG2ControlLargeBmp (void) +{ + GX_BGMODE_WARNING1(G2_GetBG2ControlLargeBmp, 6); + return *(volatile GXBg2ControlLargeBmp *)REG_BG2CNT_ADDR; +} + +static inline GXBGExtMode G2_GetBG3ExtMode (void) +{ + GX_BGMODE_WARNING3(G2_GetBG3ExtMode, 3, 4, 5); + + return (GXBGExtMode)(reg_G2_BG3CNT & + (((reg_G2_BG3CNT & REG_G2_BG3CNT_COLORMODE_MASK) >> 5) | + REG_G2_BG3CNT_COLORMODE_MASK)); +} + +static inline GXBGExtMode G2S_GetBG3ExtMode (void) +{ + GXS_BGMODE_WARNING3(G2S_GetBG3ExtMode, 3, 4, 5); + + return (GXBGExtMode)(reg_G2S_DB_BG3CNT & + (((reg_G2S_DB_BG3CNT & REG_G2S_DB_BG3CNT_COLORMODE_MASK) >> 5) | + REG_G2S_DB_BG3CNT_COLORMODE_MASK)); +} + +static inline void G2_SetBG3ControlText (GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, GXBGCharBase charBase) +{ + GX_BG_SCRSIZE_TEXT_ASSERT(screenSize); + GX_BG_COLORMODE_ASSERT(colorMode); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GX_BGMODE_WARNING1(G2_SetBG3ControlText, 0); + + reg_G2_BG3CNT = + (u16)((reg_G2_BG3CNT & (REG_G2_BG3CNT_PRIORITY_MASK | REG_G2_BG3CNT_MOSAIC_MASK)) | + (screenSize << REG_G2_BG3CNT_SCREENSIZE_SHIFT) | (colorMode << + REG_G2_BG3CNT_COLORMODE_SHIFT) | + (screenBase << REG_G2_BG3CNT_SCREENBASE_SHIFT) | (charBase << + REG_G2_BG3CNT_CHARBASE_SHIFT)); +} + +static inline GXBg23ControlText G2_GetBG3ControlText (void) +{ + return *(volatile GXBg23ControlText *)REG_BG3CNT_ADDR; +} + +static inline void G2S_SetBG3ControlText (GXBGScrSizeText screenSize, + GXBGColorMode colorMode, + GXBGScrBase screenBase, GXBGCharBase charBase) +{ + GX_BG_SCRSIZE_TEXT_ASSERT(screenSize); + GX_BG_COLORMODE_ASSERT(colorMode); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GXS_BGMODE_WARNING1(G2S_SetBG3ControlText, 0); + + reg_G2S_DB_BG3CNT = + (u16)((reg_G2S_DB_BG3CNT & + (REG_G2S_DB_BG3CNT_PRIORITY_MASK | REG_G2S_DB_BG3CNT_MOSAIC_MASK)) | (screenSize << + REG_G2S_DB_BG3CNT_SCREENSIZE_SHIFT) + | (colorMode << REG_G2S_DB_BG3CNT_COLORMODE_SHIFT) | (screenBase << + REG_G2S_DB_BG3CNT_SCREENBASE_SHIFT) + | (charBase << REG_G2S_DB_BG3CNT_CHARBASE_SHIFT)); +} + +static inline GXBg23ControlText G2S_GetBG3ControlText (void) +{ + return *(volatile GXBg23ControlText *)REG_DB_BG3CNT_ADDR; +} + +static inline void G2_SetBG3ControlAffine (GXBGScrSizeAffine screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase) +{ + GX_BG_SCRSIZE_AFFINE_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GX_BGMODE_WARNING2(G2_SetBG3ControlAffine, 1, 2); + + reg_G2_BG3CNT = + (u16)((reg_G2_BG3CNT & (REG_G2_BG3CNT_PRIORITY_MASK | REG_G2_BG3CNT_MOSAIC_MASK)) | + (screenSize << REG_G2_BG3CNT_SCREENSIZE_SHIFT) | (screenBase << + REG_G2_BG3CNT_SCREENBASE_SHIFT) | + (charBase << REG_G2_BG3CNT_CHARBASE_SHIFT) | (areaOver << + REG_G2_BG3CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23ControlAffine G2_GetBG3ControlAffine (void) +{ + return *(volatile GXBg23ControlAffine *)REG_BG3CNT_ADDR; +} + +static inline void G2S_SetBG3ControlAffine (GXBGScrSizeAffine screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase) +{ + GX_BG_SCRSIZE_AFFINE_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GXS_BGMODE_WARNING2(G2S_SetBG3ControlAffine, 1, 2); + + reg_G2S_DB_BG3CNT = + (u16)((reg_G2S_DB_BG3CNT & + (REG_G2S_DB_BG3CNT_PRIORITY_MASK | REG_G2S_DB_BG3CNT_MOSAIC_MASK)) | (screenSize << + REG_G2S_DB_BG3CNT_SCREENSIZE_SHIFT) + | (screenBase << REG_G2S_DB_BG3CNT_SCREENBASE_SHIFT) | (charBase << + REG_G2S_DB_BG3CNT_CHARBASE_SHIFT) + | (areaOver << REG_G2S_DB_BG3CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23ControlAffine G2S_GetBG3ControlAffine (void) +{ + return *(volatile GXBg23ControlAffine *)REG_DB_BG3CNT_ADDR; +} + +static inline void G2_SetBG3Control256x16Affine (GXBGScrSize256x16Pltt screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase) +{ + GX_BG_SCRSIZE_256x16PLTT_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GX_BGMODE_WARNING3(G2_SetBG3Control256x16Affine, 3, 4, 5); + + reg_G2_BG3CNT = + (u16)((reg_G2_BG3CNT & (REG_G2_BG3CNT_PRIORITY_MASK | REG_G2_BG3CNT_MOSAIC_MASK)) | + (screenSize << REG_G2_BG3CNT_SCREENSIZE_SHIFT) | (charBase << + REG_G2_BG3CNT_CHARBASE_SHIFT) | + GX_BG_EXTMODE_256x16PLTT | (screenBase << REG_G2_BG3CNT_SCREENBASE_SHIFT) | (areaOver + << + REG_G2_BG3CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23Control256x16Pltt G2_GetBG3Control256x16Pltt (void) +{ + return *(volatile GXBg23Control256x16Pltt *)REG_BG3CNT_ADDR; +} + +static inline GXBg23Control256x16Affine G2_GetBG3Control256x16Affine (void) +{ + return *(volatile GXBg23Control256x16Affine *)REG_BG3CNT_ADDR; +} + +static inline void G2S_SetBG3Control256x16Affine (GXBGScrSize256x16Pltt screenSize, + GXBGAreaOver areaOver, + GXBGScrBase screenBase, GXBGCharBase charBase) +{ + GX_BG_SCRSIZE_256x16PLTT_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_SCRBASE_ASSERT(screenBase); + GX_BG_CHARBASE_ASSERT(charBase); + GXS_BGMODE_WARNING3(G2S_SetBG3Control256x16Affine, 3, 4, 5); + + reg_G2S_DB_BG3CNT = + (u16)((reg_G2S_DB_BG3CNT & + (REG_G2S_DB_BG3CNT_PRIORITY_MASK | REG_G2S_DB_BG3CNT_MOSAIC_MASK)) | (screenSize << + REG_G2S_DB_BG3CNT_SCREENSIZE_SHIFT) + | (charBase << REG_G2S_DB_BG3CNT_CHARBASE_SHIFT) | GX_BG_EXTMODE_256x16PLTT | + (screenBase << REG_G2S_DB_BG3CNT_SCREENBASE_SHIFT) | (areaOver << + REG_G2S_DB_BG3CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23Control256x16Pltt G2S_GetBG3Control256x16Pltt (void) +{ + return *(volatile GXBg23Control256x16Pltt *)REG_DB_BG3CNT_ADDR; +} + +static inline GXBg23Control256x16Affine G2S_GetBG3Control256x16Affine (void) +{ + return *(volatile GXBg23Control256x16Affine *)REG_DB_BG3CNT_ADDR; +} + +static inline void G2_SetBG3Control256Bmp (GXBGScrSize256Bmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) +{ + GX_BG_SCRSIZE_256BMP_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_BMPSCRBASE_ASSERT(screenBase); + GX_BGMODE_WARNING3(G2_SetBG3Control256Bmp, 3, 4, 5); + + reg_G2_BG3CNT = + (u16)((reg_G2_BG3CNT & (REG_G2_BG3CNT_PRIORITY_MASK | REG_G2_BG3CNT_MOSAIC_MASK)) | + (screenSize << REG_G2_BG3CNT_SCREENSIZE_SHIFT) | GX_BG_EXTMODE_256BITMAP | (screenBase + << + REG_G2_BG3CNT_SCREENBASE_SHIFT) + | (areaOver << REG_G2_BG3CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23Control256Bmp G2_GetBG3Control256Bmp (void) +{ + return *(volatile GXBg23Control256Bmp *)REG_BG3CNT_ADDR; +} + +static inline void G2S_SetBG3Control256Bmp (GXBGScrSize256Bmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) +{ + GX_BG_SCRSIZE_256BMP_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_BMPSCRBASE_ASSERT(screenBase); + SDK_ASSERTMSG(screenSize != GX_BG_SCRSIZE_256BMP_512x512, + "SUB 2D engine does not support GX_BG_SCRSIZE_256BMP_512x512"); + GXS_BGMODE_WARNING3(G2S_SetBG3Control256Bmp, 3, 4, 5); + + reg_G2S_DB_BG3CNT = + (u16)((reg_G2S_DB_BG3CNT & + (REG_G2S_DB_BG3CNT_PRIORITY_MASK | REG_G2S_DB_BG3CNT_MOSAIC_MASK)) | (screenSize << + REG_G2S_DB_BG3CNT_SCREENSIZE_SHIFT) + | GX_BG_EXTMODE_256BITMAP | (screenBase << REG_G2S_DB_BG3CNT_SCREENBASE_SHIFT) | + (areaOver << REG_G2S_DB_BG3CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23Control256Bmp G2S_GetBG3Control256Bmp (void) +{ + return *(volatile GXBg23Control256Bmp *)REG_DB_BG3CNT_ADDR; +} + +static inline void G2_SetBG3ControlDCBmp (GXBGScrSizeDcBmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) +{ + GX_BG_SCRSIZE_DCBMP_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_BMPSCRBASE_ASSERT(screenBase); + GX_BGMODE_WARNING3(G2_SetBG3ControlDCBmp, 3, 4, 5); + + reg_G2_BG3CNT = + (u16)((reg_G2_BG3CNT & (REG_G2_BG3CNT_PRIORITY_MASK | REG_G2_BG3CNT_MOSAIC_MASK)) | + (screenSize << REG_G2_BG3CNT_SCREENSIZE_SHIFT) | GX_BG_EXTMODE_DCBITMAP | (screenBase + << + REG_G2_BG3CNT_SCREENBASE_SHIFT) + | (areaOver << REG_G2_BG3CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23ControlDCBmp G2_GetBG3ControlDCBmp (void) +{ + return *(volatile GXBg23ControlDCBmp *)REG_BG3CNT_ADDR; +} + +static inline void G2S_SetBG3ControlDCBmp (GXBGScrSizeDcBmp screenSize, + GXBGAreaOver areaOver, GXBGBmpScrBase screenBase) +{ + GX_BG_SCRSIZE_DCBMP_ASSERT(screenSize); + GX_BG_AREAOVER_ASSERT(areaOver); + GX_BG_BMPSCRBASE_ASSERT(screenBase); + GXS_BGMODE_WARNING3(G2S_SetBG3ControlDCBmp, 3, 4, 5); + + reg_G2S_DB_BG3CNT = + (u16)((reg_G2S_DB_BG3CNT & + (REG_G2S_DB_BG3CNT_PRIORITY_MASK | REG_G2S_DB_BG3CNT_MOSAIC_MASK)) | (screenSize << + REG_G2S_DB_BG3CNT_SCREENSIZE_SHIFT) + | GX_BG_EXTMODE_DCBITMAP | (screenBase << REG_G2S_DB_BG3CNT_SCREENBASE_SHIFT) | + (areaOver << REG_G2S_DB_BG3CNT_AREAOVER_SHIFT)); +} + +static inline GXBg23ControlDCBmp G2S_GetBG3ControlDCBmp (void) +{ + return *(volatile GXBg23ControlDCBmp *)REG_DB_BG3CNT_ADDR; +} + +static inline void G2_BG0Mosaic (BOOL enable) +{ + if (enable) { + reg_G2_BG0CNT |= REG_G2_BG0CNT_MOSAIC_MASK; + } else { + reg_G2_BG0CNT &= ~REG_G2_BG0CNT_MOSAIC_MASK; + } +} + +static inline void G2S_BG0Mosaic (BOOL enable) +{ + if (enable) { + reg_G2S_DB_BG0CNT |= REG_G2S_DB_BG0CNT_MOSAIC_MASK; + } else { + reg_G2S_DB_BG0CNT &= ~REG_G2S_DB_BG0CNT_MOSAIC_MASK; + } +} + +static inline void G2_BG1Mosaic (BOOL enable) +{ + if (enable) { + reg_G2_BG1CNT |= REG_G2_BG1CNT_MOSAIC_MASK; + } else { + reg_G2_BG1CNT &= ~REG_G2_BG1CNT_MOSAIC_MASK; + } +} + +static inline void G2S_BG1Mosaic (BOOL enable) +{ + if (enable) { + reg_G2S_DB_BG1CNT |= REG_G2S_DB_BG1CNT_MOSAIC_MASK; + } else { + reg_G2S_DB_BG1CNT &= ~REG_G2S_DB_BG1CNT_MOSAIC_MASK; + } +} + +static inline void G2_BG2Mosaic (BOOL enable) +{ + if (enable) { + reg_G2_BG2CNT |= REG_G2_BG2CNT_MOSAIC_MASK; + } else { + reg_G2_BG2CNT &= ~REG_G2_BG2CNT_MOSAIC_MASK; + } +} + +static inline void G2S_BG2Mosaic (BOOL enable) +{ + if (enable) { + reg_G2S_DB_BG2CNT |= REG_G2S_DB_BG2CNT_MOSAIC_MASK; + } else { + reg_G2S_DB_BG2CNT &= ~REG_G2S_DB_BG2CNT_MOSAIC_MASK; + } +} + +static inline void G2_BG3Mosaic (BOOL enable) +{ + if (enable) { + reg_G2_BG3CNT |= REG_G2_BG3CNT_MOSAIC_MASK; + } else { + reg_G2_BG3CNT &= ~REG_G2_BG3CNT_MOSAIC_MASK; + } +} + +static inline void G2S_BG3Mosaic (BOOL enable) +{ + if (enable) { + reg_G2S_DB_BG3CNT |= REG_G2S_DB_BG3CNT_MOSAIC_MASK; + } else { + reg_G2S_DB_BG3CNT &= ~REG_G2S_DB_BG3CNT_MOSAIC_MASK; + } +} + +static inline void G2_SetBG0Priority (int priority) +{ + GX_BG_PRIORITY_ASSERT(priority); + + reg_G2_BG0CNT = (u16)((reg_G2_BG0CNT & ~REG_G2_BG0CNT_PRIORITY_MASK) | + (priority << REG_G2_BG0CNT_PRIORITY_SHIFT)); +} + +static inline void G2S_SetBG0Priority (int priority) +{ + GX_BG_PRIORITY_ASSERT(priority); + + reg_G2S_DB_BG0CNT = (u16)((reg_G2S_DB_BG0CNT & ~REG_G2S_DB_BG0CNT_PRIORITY_MASK) | + (priority << REG_G2S_DB_BG0CNT_PRIORITY_SHIFT)); +} + +static inline void G2_SetBG1Priority (int priority) +{ + GX_BG_PRIORITY_ASSERT(priority); + + reg_G2_BG1CNT = (u16)((reg_G2_BG1CNT & ~REG_G2_BG1CNT_PRIORITY_MASK) | + (priority << REG_G2_BG1CNT_PRIORITY_SHIFT)); +} + +static inline void G2S_SetBG1Priority (int priority) +{ + GX_BG_PRIORITY_ASSERT(priority); + + reg_G2S_DB_BG1CNT = (u16)((reg_G2S_DB_BG1CNT & ~REG_G2S_DB_BG1CNT_PRIORITY_MASK) | + (priority << REG_G2S_DB_BG1CNT_PRIORITY_SHIFT)); +} + +static inline void G2_SetBG2Priority (int priority) +{ + GX_BG_PRIORITY_ASSERT(priority); + + reg_G2_BG2CNT = (u16)((reg_G2_BG2CNT & ~REG_G2_BG2CNT_PRIORITY_MASK) | + (priority << REG_G2_BG2CNT_PRIORITY_SHIFT)); +} + +static inline void G2S_SetBG2Priority (int priority) +{ + GX_BG_PRIORITY_ASSERT(priority); + + reg_G2S_DB_BG2CNT = (u16)((reg_G2S_DB_BG2CNT & ~REG_G2S_DB_BG2CNT_PRIORITY_MASK) | + (priority << REG_G2S_DB_BG2CNT_PRIORITY_SHIFT)); +} + +static inline void G2_SetBG3Priority (int priority) +{ + GX_BG_PRIORITY_ASSERT(priority); + + reg_G2_BG3CNT = (u16)((reg_G2_BG3CNT & ~REG_G2_BG3CNT_PRIORITY_MASK) | + (priority << REG_G2_BG3CNT_PRIORITY_SHIFT)); +} + +static inline void G2S_SetBG3Priority (int priority) +{ + GX_BG_PRIORITY_ASSERT(priority); + + reg_G2S_DB_BG3CNT = (u16)((reg_G2S_DB_BG3CNT & ~REG_G2S_DB_BG3CNT_PRIORITY_MASK) | + (priority << REG_G2S_DB_BG3CNT_PRIORITY_SHIFT)); +} + +static inline void * G2_GetOBJCharPtr (void) +{ + return (void *)HW_OBJ_VRAM; +} + +static inline void * G2S_GetOBJCharPtr (void) +{ + return (void *)HW_DB_OBJ_VRAM; +} + +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/nitro/gx/gx_vramcnt.h b/lib/include/nitro/gx/gx_vramcnt.h new file mode 100644 index 00000000..8e6ed5f2 --- /dev/null +++ b/lib/include/nitro/gx/gx_vramcnt.h @@ -0,0 +1,408 @@ +#ifndef NITRO_GX_VRAMCNT_H_ +#define NITRO_GX_VRAMCNT_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + GX_VRAM_A = OS_VRAM_BANK_ID_A, + GX_VRAM_B = OS_VRAM_BANK_ID_B, + GX_VRAM_C = OS_VRAM_BANK_ID_C, + GX_VRAM_D = OS_VRAM_BANK_ID_D, + GX_VRAM_E = OS_VRAM_BANK_ID_E, + GX_VRAM_F = OS_VRAM_BANK_ID_F, + GX_VRAM_G = OS_VRAM_BANK_ID_G, + GX_VRAM_H = OS_VRAM_BANK_ID_H, + GX_VRAM_I = OS_VRAM_BANK_ID_I, + GX_VRAM_ALL = OS_VRAM_BANK_ID_ALL +} GXVRam; + +typedef enum { + GX_VRAM_LCDC_NONE = 0x0000, + GX_VRAM_LCDC_A = GX_VRAM_A, + GX_VRAM_LCDC_B = GX_VRAM_B, + GX_VRAM_LCDC_C = GX_VRAM_C, + GX_VRAM_LCDC_D = GX_VRAM_D, + GX_VRAM_LCDC_E = GX_VRAM_E, + GX_VRAM_LCDC_F = GX_VRAM_F, + GX_VRAM_LCDC_G = GX_VRAM_G, + GX_VRAM_LCDC_H = GX_VRAM_H, + GX_VRAM_LCDC_I = GX_VRAM_I, + + GX_VRAM_LCDC_ALL = GX_VRAM_ALL +} GXVRamLCDC; + +#define GX_VRAM_LCDC_ASSERT(x) \ + SDK_MINMAX_ASSERT(x, GX_VRAM_LCDC_NONE, GX_VRAM_LCDC_ALL) + +typedef enum { + GX_VRAM_BG_NONE = 0x0000, + GX_VRAM_BG_16_F = GX_VRAM_F, + GX_VRAM_BG_16_G = GX_VRAM_G, + GX_VRAM_BG_32_FG = GX_VRAM_F | GX_VRAM_G, + GX_VRAM_BG_64_E = GX_VRAM_E, + GX_VRAM_BG_80_EF = GX_VRAM_E | GX_VRAM_F, + GX_VRAM_BG_96_EFG = GX_VRAM_E | GX_VRAM_F | GX_VRAM_G, + GX_VRAM_BG_128_A = GX_VRAM_A, + GX_VRAM_BG_128_B = GX_VRAM_B, + GX_VRAM_BG_128_C = GX_VRAM_C, + GX_VRAM_BG_128_D = GX_VRAM_D, + GX_VRAM_BG_256_AB = GX_VRAM_A | GX_VRAM_B, + GX_VRAM_BG_256_BC = GX_VRAM_B | GX_VRAM_C, + GX_VRAM_BG_256_CD = GX_VRAM_C | GX_VRAM_D, + GX_VRAM_BG_384_ABC = GX_VRAM_A | GX_VRAM_B | GX_VRAM_C, + GX_VRAM_BG_384_BCD = GX_VRAM_B | GX_VRAM_C | GX_VRAM_D, + GX_VRAM_BG_512_ABCD = GX_VRAM_A | GX_VRAM_B | GX_VRAM_C | GX_VRAM_D, + GX_VRAM_BG_80_EG = GX_VRAM_E | GX_VRAM_G, + GX_VRAM_BG_256_AC = GX_VRAM_A | GX_VRAM_C, + GX_VRAM_BG_256_AD = GX_VRAM_A | GX_VRAM_D, + GX_VRAM_BG_256_BD = GX_VRAM_B | GX_VRAM_D, + GX_VRAM_BG_384_ABD = GX_VRAM_A | GX_VRAM_B | GX_VRAM_D, + GX_VRAM_BG_384_ACD = GX_VRAM_A | GX_VRAM_C | GX_VRAM_D +} GXVRamBG; + +#define GX_VRAM_BG_ASSERT(x) \ + SDK_ASSERT((x) == GX_VRAM_BG_NONE || \ + (x) == GX_VRAM_BG_16_F || \ + (x) == GX_VRAM_BG_16_G || \ + (x) == GX_VRAM_BG_32_FG || \ + (x) == GX_VRAM_BG_64_E || \ + (x) == GX_VRAM_BG_80_EF || \ + (x) == GX_VRAM_BG_80_EG || \ + (x) == GX_VRAM_BG_96_EFG || \ + (x) == GX_VRAM_BG_128_A || \ + (x) == GX_VRAM_BG_128_B || \ + (x) == GX_VRAM_BG_128_C || \ + (x) == GX_VRAM_BG_128_D || \ + (x) == GX_VRAM_BG_256_AB || \ + (x) == GX_VRAM_BG_256_BC || \ + (x) == GX_VRAM_BG_256_CD || \ + (x) == GX_VRAM_BG_384_ABC || \ + (x) == GX_VRAM_BG_384_BCD || \ + (x) == GX_VRAM_BG_512_ABCD || \ + (x) == GX_VRAM_BG_256_AC || \ + (x) == GX_VRAM_BG_256_AD || \ + (x) == GX_VRAM_BG_256_BD || \ + (x) == GX_VRAM_BG_384_ABD || \ + (x) == GX_VRAM_BG_384_ACD) + +#define GX_VRAM_BG_ASSERT_EX_1(x) \ + SDK_ASSERT((x) == GX_VRAM_BG_16_F || \ + (x) == GX_VRAM_BG_16_G || \ + (x) == GX_VRAM_BG_32_FG || \ + (x) == GX_VRAM_BG_64_E || \ + (x) == GX_VRAM_BG_80_EF || \ + (x) == GX_VRAM_BG_80_EG || \ + (x) == GX_VRAM_BG_96_EFG) + +#define GX_VRAM_BG_ASSERT_EX_2(x) \ + SDK_ASSERT((x) == GX_VRAM_BG_NONE || \ + (x) == GX_VRAM_BG_128_A || \ + (x) == GX_VRAM_BG_128_B || \ + (x) == GX_VRAM_BG_128_C || \ + (x) == GX_VRAM_BG_128_D || \ + (x) == GX_VRAM_BG_256_AB || \ + (x) == GX_VRAM_BG_256_BC || \ + (x) == GX_VRAM_BG_256_CD || \ + (x) == GX_VRAM_BG_384_ABC || \ + (x) == GX_VRAM_BG_384_BCD || \ + (x) == GX_VRAM_BG_256_AC || \ + (x) == GX_VRAM_BG_256_AD || \ + (x) == GX_VRAM_BG_256_BD || \ + (x) == GX_VRAM_BG_384_ABD || \ + (x) == GX_VRAM_BG_384_ACD) + +typedef enum { + GX_VRAM_OBJ_NONE = 0x0000, + GX_VRAM_OBJ_16_F = GX_VRAM_F, + GX_VRAM_OBJ_16_G = GX_VRAM_G, + GX_VRAM_OBJ_32_FG = GX_VRAM_F | GX_VRAM_G, + GX_VRAM_OBJ_64_E = GX_VRAM_E, + GX_VRAM_OBJ_80_EF = GX_VRAM_E | GX_VRAM_F, + GX_VRAM_OBJ_80_EG = GX_VRAM_E | GX_VRAM_G, + GX_VRAM_OBJ_96_EFG = GX_VRAM_E | GX_VRAM_F | GX_VRAM_G, + GX_VRAM_OBJ_128_A = GX_VRAM_A, + GX_VRAM_OBJ_128_B = GX_VRAM_B, + GX_VRAM_OBJ_256_AB = GX_VRAM_A | GX_VRAM_B +} GXVRamOBJ; + +#define GX_VRAM_OBJ_ASSERT(x) \ + SDK_ASSERT((x) == GX_VRAM_OBJ_NONE || \ + (x) == GX_VRAM_OBJ_16_F || \ + (x) == GX_VRAM_OBJ_16_G || \ + (x) == GX_VRAM_OBJ_32_FG || \ + (x) == GX_VRAM_OBJ_64_E || \ + (x) == GX_VRAM_OBJ_80_EF || \ + (x) == GX_VRAM_OBJ_80_EG || \ + (x) == GX_VRAM_OBJ_96_EFG || \ + (x) == GX_VRAM_OBJ_128_A || \ + (x) == GX_VRAM_OBJ_128_B || \ + (x) == GX_VRAM_OBJ_256_AB) + +typedef enum { + GX_VRAM_ARM7_NONE = 0x0000, + GX_VRAM_ARM7_128_C = GX_VRAM_C, + GX_VRAM_ARM7_128_D = GX_VRAM_D, + GX_VRAM_ARM7_256_CD = GX_VRAM_C | GX_VRAM_D +} GXVRamARM7; + +#define GX_VRAM_ARM7_ASSERT(x) \ + SDK_ASSERT((x) == GX_VRAM_ARM7_NONE || \ + (x) == GX_VRAM_ARM7_128_C || \ + (x) == GX_VRAM_ARM7_128_D || \ + (x) == GX_VRAM_ARM7_256_CD) + +typedef enum { + GX_VRAM_TEX_NONE = 0x0000, + GX_VRAM_TEX_0_A = GX_VRAM_A, + GX_VRAM_TEX_0_B = GX_VRAM_B, + GX_VRAM_TEX_0_C = GX_VRAM_C, + GX_VRAM_TEX_0_D = GX_VRAM_D, + GX_VRAM_TEX_01_AB = GX_VRAM_A | GX_VRAM_B, + GX_VRAM_TEX_01_BC = GX_VRAM_B | GX_VRAM_C, + GX_VRAM_TEX_01_CD = GX_VRAM_C | GX_VRAM_D, + GX_VRAM_TEX_012_ABC = GX_VRAM_A | GX_VRAM_B | GX_VRAM_C, + GX_VRAM_TEX_012_BCD = GX_VRAM_B | GX_VRAM_C | GX_VRAM_D, + GX_VRAM_TEX_0123_ABCD = GX_VRAM_A | GX_VRAM_B | GX_VRAM_C | GX_VRAM_D, + GX_VRAM_TEX_01_AC = GX_VRAM_A | GX_VRAM_C, + GX_VRAM_TEX_01_AD = GX_VRAM_A | GX_VRAM_D, + GX_VRAM_TEX_01_BD = GX_VRAM_B | GX_VRAM_D, + GX_VRAM_TEX_012_ABD = GX_VRAM_A | GX_VRAM_B | GX_VRAM_D, + GX_VRAM_TEX_012_ACD = GX_VRAM_A | GX_VRAM_C | GX_VRAM_D +} GXVRamTex; + +#define GX_VRAM_TEX_ASSERT(x) \ + SDK_ASSERT((x) == GX_VRAM_TEX_NONE || \ + (x) == GX_VRAM_TEX_0_A || \ + (x) == GX_VRAM_TEX_0_B || \ + (x) == GX_VRAM_TEX_0_C || \ + (x) == GX_VRAM_TEX_0_D || \ + (x) == GX_VRAM_TEX_01_AB || \ + (x) == GX_VRAM_TEX_01_BC || \ + (x) == GX_VRAM_TEX_01_CD || \ + (x) == GX_VRAM_TEX_012_ABC || \ + (x) == GX_VRAM_TEX_012_BCD || \ + (x) == GX_VRAM_TEX_0123_ABCD || \ + (x) == GX_VRAM_TEX_01_AC || \ + (x) == GX_VRAM_TEX_01_AD || \ + (x) == GX_VRAM_TEX_01_BD || \ + (x) == GX_VRAM_TEX_012_ABD || \ + (x) == GX_VRAM_TEX_012_ACD) + +typedef enum { + GX_VRAM_CLEARIMAGE_NONE = 0x0000, + GX_VRAM_CLEARIMAGE_256_AB = GX_VRAM_A | GX_VRAM_B, + GX_VRAM_CLEARIMAGE_256_CD = GX_VRAM_C | GX_VRAM_D, + GX_VRAM_CLEARDEPTH_128_A = GX_VRAM_A, + GX_VRAM_CLEARDEPTH_128_B = GX_VRAM_B, + GX_VRAM_CLEARDEPTH_128_C = GX_VRAM_C, + GX_VRAM_CLEARDEPTH_128_D = GX_VRAM_D +} GXVRamClearImage; + +#define GX_VRAM_CLRIMG_ASSERT(x) \ + SDK_ASSERT((x) == GX_VRAM_CLEARIMAGE_NONE || \ + (x) == GX_VRAM_CLEARIMAGE_256_AB || \ + (x) == GX_VRAM_CLEARIMAGE_256_CD || \ + (x) == GX_VRAM_CLEARDEPTH_128_A || \ + (x) == GX_VRAM_CLEARDEPTH_128_B || \ + (x) == GX_VRAM_CLEARDEPTH_128_C || \ + (x) == GX_VRAM_CLEARDEPTH_128_D) + +typedef enum { + GX_VRAM_TEXPLTT_NONE = 0x0000, + GX_VRAM_TEXPLTT_0_F = GX_VRAM_F, + GX_VRAM_TEXPLTT_0_G = GX_VRAM_G, + GX_VRAM_TEXPLTT_01_FG = GX_VRAM_F | GX_VRAM_G, + GX_VRAM_TEXPLTT_0123_E = GX_VRAM_E, + GX_VRAM_TEXPLTT_01234_EF = GX_VRAM_E | GX_VRAM_F, + GX_VRAM_TEXPLTT_012345_EFG = GX_VRAM_E | GX_VRAM_F | GX_VRAM_G +} GXVRamTexPltt; + +#define GX_VRAM_TEXPLTT_ASSERT(x) \ + SDK_ASSERT((x) == GX_VRAM_TEXPLTT_NONE || \ + (x) == GX_VRAM_TEXPLTT_0_F || \ + (x) == GX_VRAM_TEXPLTT_0_G || \ + (x) == GX_VRAM_TEXPLTT_01_FG || \ + (x) == GX_VRAM_TEXPLTT_0123_E || \ + (x) == GX_VRAM_TEXPLTT_01234_EF || \ + (x) == GX_VRAM_TEXPLTT_012345_EFG) + +typedef enum { + GX_VRAM_BGEXTPLTT_NONE = 0x0000, + GX_VRAM_BGEXTPLTT_01_F = GX_VRAM_F, + GX_VRAM_BGEXTPLTT_23_G = GX_VRAM_G, + GX_VRAM_BGEXTPLTT_0123_E = GX_VRAM_E, + GX_VRAM_BGEXTPLTT_0123_FG = GX_VRAM_F | GX_VRAM_G +} GXVRamBGExtPltt; + +#define GX_VRAM_BGEXTPLTT_ASSERT(x) \ + SDK_ASSERT((x) == GX_VRAM_BGEXTPLTT_NONE || \ + (x) == GX_VRAM_BGEXTPLTT_01_F || \ + (x) == GX_VRAM_BGEXTPLTT_23_G || \ + (x) == GX_VRAM_BGEXTPLTT_0123_E || \ + (x) == GX_VRAM_BGEXTPLTT_0123_FG) + +#define GX_VRAM_OBJEXTPLTT_8_F GX_VRAM_OBJEXTPLTT_0_F +#define GX_VRAM_OBJEXTPLTT_8_G GX_VRAM_OBJEXTPLTT_0_G + +typedef enum { + GX_VRAM_OBJEXTPLTT_NONE = 0, + GX_VRAM_OBJEXTPLTT_0_F = GX_VRAM_F, + GX_VRAM_OBJEXTPLTT_0_G = GX_VRAM_G +} GXVRamOBJExtPltt; + +#define GX_VRAM_OBJEXTPLTT_ASSERT(x) \ + SDK_ASSERT((x) == GX_VRAM_OBJEXTPLTT_NONE || \ + (x) == GX_VRAM_OBJEXTPLTT_0_F || \ + (x) == GX_VRAM_OBJEXTPLTT_0_G) + +typedef enum { + GX_VRAM_SUB_BG_NONE = 0x0000, + GX_VRAM_SUB_BG_128_C = GX_VRAM_C, + GX_VRAM_SUB_BG_32_H = GX_VRAM_H, + GX_VRAM_SUB_BG_48_HI = GX_VRAM_H | GX_VRAM_I +} GXVRamSubBG; + +#define GX_VRAM_SUB_BG_ASSERT(x) \ + SDK_ASSERT((x) == GX_VRAM_SUB_BG_NONE || \ + (x) == GX_VRAM_SUB_BG_128_C || \ + (x) == GX_VRAM_SUB_BG_32_H || \ + (x) == GX_VRAM_SUB_BG_48_HI) + +typedef enum { + GX_VRAM_SUB_OBJ_NONE = 0x0000, + GX_VRAM_SUB_OBJ_128_D = GX_VRAM_D, + GX_VRAM_SUB_OBJ_16_I = GX_VRAM_I +} GXVRamSubOBJ; + +#define GX_VRAM_SUB_OBJ_ASSERT(x) \ + SDK_ASSERT((x) == GX_VRAM_SUB_OBJ_NONE || \ + (x) == GX_VRAM_SUB_OBJ_128_D || \ + (x) == GX_VRAM_SUB_OBJ_16_I) + +#define GX_VRAM_SUB_BGEXTPLTT_32_H GX_VRAM_SUB_BGEXTPLTT_0123_H + +typedef enum { + GX_VRAM_SUB_BGEXTPLTT_NONE = 0x0000, + GX_VRAM_SUB_BGEXTPLTT_0123_H = GX_VRAM_H +} GXVRamSubBGExtPltt; + +#define GX_VRAM_SUB_BGEXTPLTT_ASSERT(x) \ + SDK_ASSERT((x) == GX_VRAM_SUB_BGEXTPLTT_NONE || \ + (x) == GX_VRAM_SUB_BGEXTPLTT_0123_H) + +#define GX_VRAM_SUB_OBJEXTPLTT_16_I GX_VRAM_SUB_OBJEXTPLTT_0_I + +typedef enum { + GX_VRAM_SUB_OBJEXTPLTT_NONE = 0x0000, + GX_VRAM_SUB_OBJEXTPLTT_0_I = GX_VRAM_I +} GXVRamSubOBJExtPltt; + +#define GX_VRAM_SUB_OBJEXTPLTT_ASSERT(x) \ + SDK_ASSERT((x) == GX_VRAM_SUB_OBJEXTPLTT_NONE || \ + (x) == GX_VRAM_SUB_OBJEXTPLTT_0_I) + +#if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL)) + void GX_SetBankForBG(GXVRamBG bg); + BOOL GX_TrySetBankForBG(GXVRamBG bg); + void GX_SetBankForBGEx(GXVRamBG bg1, GXVRamBG bg2); + BOOL GX_TrySetBankForBGEx(GXVRamBG bg1, GXVRamBG bg2); + void GX_SetBankForOBJ(GXVRamOBJ obj); + BOOL GX_TrySetBankForOBJ(GXVRamOBJ obj); + void GX_SetBankForBGExtPltt(GXVRamBGExtPltt bgExtPltt); + BOOL GX_TrySetBankForBGExtPltt(GXVRamBGExtPltt bgExtPltt); + void GX_SetBankForOBJExtPltt(GXVRamOBJExtPltt objExtPltt); + BOOL GX_TrySetBankForOBJExtPltt(GXVRamOBJExtPltt objExtPltt); + void GX_SetBankForTex(GXVRamTex tex); + BOOL GX_TrySetBankForTex(GXVRamTex tex); + void GX_SetBankForTexPltt(GXVRamTexPltt texPltt); + BOOL GX_TrySetBankForTexPltt(GXVRamTexPltt texPltt); + void GX_SetBankForClearImage(GXVRamClearImage clrImg); + BOOL GX_TrySetBankForClearImage(GXVRamClearImage clrImg); + + GXVRamBG GX_GetBankForBG(void); + GXVRamOBJ GX_GetBankForOBJ(void); + GXVRamBGExtPltt GX_GetBankForBGExtPltt(void); + GXVRamOBJExtPltt GX_GetBankForOBJExtPltt(void); + GXVRamTex GX_GetBankForTex(void); + GXVRamTexPltt GX_GetBankForTexPltt(void); + GXVRamClearImage GX_GetBankForClearImage(void); + + GXVRamBG GX_ResetBankForBG(void); + GXVRamOBJ GX_ResetBankForOBJ(void); + GXVRamBGExtPltt GX_ResetBankForBGExtPltt(void); + GXVRamOBJExtPltt GX_ResetBankForOBJExtPltt(void); + GXVRamTex GX_ResetBankForTex(void); + GXVRamTexPltt GX_ResetBankForTexPltt(void); + GXVRamClearImage GX_ResetBankForClearImage(void); + + GXVRamBG GX_DisableBankForBG(void); + GXVRamOBJ GX_DisableBankForOBJ(void); + GXVRamBGExtPltt GX_DisableBankForBGExtPltt(void); + GXVRamOBJExtPltt GX_DisableBankForOBJExtPltt(void); + GXVRamTex GX_DisableBankForTex(void); + GXVRamTexPltt GX_DisableBankForTexPltt(void); + GXVRamClearImage GX_DisableBankForClearImage(void); + + u32 GX_GetSizeOfBG(void); + u32 GX_GetSizeOfOBJ(void); + u32 GX_GetSizeOfBGExtPltt(void); + u32 GX_GetSizeOfOBJExtPltt(void); + u32 GX_GetSizeOfTex(void); + u32 GX_GetSizeOfTexPltt(void); + u32 GX_GetSizeOfClearImage(void); + + void GX_SetBankForSubBG(GXVRamSubBG sub_bg); + BOOL GX_TrySetBankForSubBG(GXVRamSubBG sub_bg); + void GX_SetBankForSubOBJ(GXVRamSubOBJ sub_obj); + BOOL GX_TrySetBankForSubOBJ(GXVRamSubOBJ sub_obj); + void GX_SetBankForSubBGExtPltt(GXVRamSubBGExtPltt sub_bgExtPltt); + BOOL GX_TrySetBankForSubBGExtPltt(GXVRamSubBGExtPltt sub_bgExtPltt); + void GX_SetBankForSubOBJExtPltt(GXVRamSubOBJExtPltt sub_objExtPltt); + BOOL GX_TrySetBankForSubOBJExtPltt(GXVRamSubOBJExtPltt sub_objExtPltt); + + GXVRamSubBG GX_GetBankForSubBG(void); + GXVRamSubOBJ GX_GetBankForSubOBJ(void); + GXVRamSubBGExtPltt GX_GetBankForSubBGExtPltt(void); + GXVRamSubOBJExtPltt GX_GetBankForSubOBJExtPltt(void); + + GXVRamSubBG GX_ResetBankForSubBG(void); + GXVRamSubOBJ GX_ResetBankForSubOBJ(void); + GXVRamSubBGExtPltt GX_ResetBankForSubBGExtPltt(void); + GXVRamSubOBJExtPltt GX_ResetBankForSubOBJExtPltt(void); + + GXVRamSubBG GX_DisableBankForSubBG(void); + GXVRamSubOBJ GX_DisableBankForSubOBJ(void); + GXVRamSubBGExtPltt GX_DisableBankForSubBGExtPltt(void); + GXVRamSubOBJExtPltt GX_DisableBankForSubOBJExtPltt(void); + + u32 GX_GetSizeOfSubBG(void); + u32 GX_GetSizeOfSubOBJ(void); + u32 GX_GetSizeOfSubBGExtPltt(void); + u32 GX_GetSizeOfSubOBJExtPltt(void); + + void GX_SetBankForARM7(GXVRamARM7 arm7); + BOOL GX_TrySetBankForARM7(GXVRamARM7 arm7); + void GX_SetBankForLCDC(int lcdc); + BOOL GX_TrySetBankForLCDC(int lcdc); + + GXVRamARM7 GX_GetBankForARM7(void); + GXVRamLCDC GX_GetBankForLCDC(void); + + GXVRamARM7 GX_ResetBankForARM7(void); + + GXVRamARM7 GX_DisableBankForARM7(void); + GXVRamLCDC GX_DisableBankForLCDC(void); + + u32 GX_GetSizeOfARM7(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/nitro/gx/gxstate.h b/lib/include/nitro/gx/gxstate.h new file mode 100644 index 00000000..763a4d47 --- /dev/null +++ b/lib/include/nitro/gx/gxstate.h @@ -0,0 +1,114 @@ +#ifndef NITRO_GXSTATE_H_ +#define NITRO_GXSTATE_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + u16 lcdc; + u16 bg; + u16 obj; + u16 arm7; + u16 tex; + u16 texPltt; + u16 clrImg; + u16 bgExtPltt; + u16 objExtPltt; + u16 sub_bg; + u16 sub_obj; + u16 sub_bgExtPltt; + u16 sub_objExtPltt; +} GX_VRAMCnt_; + +typedef struct { + GX_VRAMCnt_ vramCnt; +} GX_State; + +extern GX_State gGXState; + +void GX_InitGXState(void); + +#ifdef SDK_DEBUG + void GX_StateCheck_VRAMCnt_(void); + void GX_RegionCheck_BG_(u32 first, u32 last); + void GX_RegionCheck_OBJ_(u32 first, u32 last); + void GX_RegionCheck_SubBG_(u32 first, u32 last); + void GX_RegionCheck_SubOBJ_(u32 first, u32 last); + void GX_RegionCheck_Tex_(GXVRamTex tex, u32 first, u32 last); + void GX_RegionCheck_TexPltt_(GXVRamTexPltt texPltt, u32 first, u32 last); +#endif + +#ifdef SDK_DEBUG + static inline void GX_StateCheck_VRAMCnt (void) + { + GX_StateCheck_VRAMCnt_(); + } + + static inline void GX_RegionCheck_BG (u32 first, u32 last) + { + GX_RegionCheck_BG_(first, last); + } + + static inline void GX_RegionCheck_OBJ (u32 first, u32 last) + { + GX_RegionCheck_OBJ_(first, last); + } + + static inline void GX_RegionCheck_SubBG (u32 first, u32 last) + { + GX_RegionCheck_SubBG_(first, last); + } + + static inline void GX_RegionCheck_SubOBJ (u32 first, u32 last) + { + GX_RegionCheck_SubOBJ_(first, last); + } + + static inline void GX_RegionCheck_Tex (GXVRamTex tex, u32 first, u32 last) + { + GX_RegionCheck_Tex_(tex, first, last); + } + + static inline void GX_RegionCheck_TexPltt (GXVRamTexPltt texPltt, u32 first, u32 last) + { + GX_RegionCheck_TexPltt_(texPltt, first, last); + } +#else + static inline void GX_StateCheck_VRAMCnt (void) + { + } + + static inline void GX_RegionCheck_BG (u32, u32) + { + } + + static inline void GX_RegionCheck_OBJ (u32, u32) + { + } + + static inline void GX_RegionCheck_SubBG (u32, u32) + { + } + + static inline void GX_RegionCheck_SubOBJ (u32, u32) + { + } + + static inline void GX_RegionCheck_Tex (GXVRamTex, u32, u32) + { + } + + static inline void GX_RegionCheck_TexPltt (GXVRamTexPltt, u32, u32) + { + } +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/main.lsf b/main.lsf index 707d2b58..7fdff36b 100644 --- a/main.lsf +++ b/main.lsf @@ -239,12 +239,12 @@ Static main Object lib/NitroSDK/src/fx/fx_atanidx.o Object lib/NitroSDK/src/fx/fx.o Object lib/NitroSDK/asm/gx.o - Object lib/NitroSDK/asm/gxstate.o + Object lib/NitroSDK/src/gx/gxstate.o Object lib/NitroSDK/asm/gx_vramcnt.o Object lib/NitroSDK/asm/gx_bgcnt.o Object lib/NitroSDK/src/gx/g2.o Object lib/NitroSDK/src/gx/g3imm.o - Object lib/NitroSDK/asm/g3x.o + Object lib/NitroSDK/src/gx/g3x.o Object lib/NitroSDK/src/gx/g3_util.o Object lib/NitroSDK/asm/gx_load2d.o Object lib/NitroSDK/asm/gx_load3d.o diff --git a/src/main_0200961C.c b/src/main_0200961C.c index 9a681a46..01aa1709 100644 --- a/src/main_0200961C.c +++ b/src/main_0200961C.c @@ -1,15 +1,6 @@ +#include "nitro.h" #include "main_0200961C.h" -extern void GX_DisableBankForBG(); -extern void GX_DisableBankForBGExtPltt(); -extern void GX_DisableBankForOBJ(); -extern void GX_DisableBankForOBJExtPltt(); -extern void GX_DisableBankForSubBG(); -extern void GX_DisableBankForSubBGExtPltt(); -extern void GX_DisableBankForSubOBJ(); -extern void GX_DisableBankForTex(); -extern void GX_DisableBankForTexPltt(); - void sub_0200961C(void) { GX_DisableBankForBG(); From 4540eced4e1d2fa5af4d0cc4b2cf2d491a9e1f35 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 13 Jul 2026 11:24:48 -0700 Subject: [PATCH 04/10] Labeled/decomped MI_SwapWord --- asm/include/main_02075600.inc | 2 +- lib/NitroSDK/asm/include/fx_vec.inc | 2 +- lib/NitroSDK/asm/include/g2.inc | 2 +- lib/NitroSDK/asm/include/gx.inc | 2 +- lib/NitroSDK/asm/include/gx_bgcnt.inc | 2 +- lib/NitroSDK/asm/include/gx_load2d.inc | 2 +- lib/NitroSDK/asm/include/mtx.inc | 2 +- lib/NitroSDK/asm/include/os_arena.inc | 2 +- lib/NitroSDK/asm/include/os_exception.inc | 2 +- lib/NitroSDK/asm/include/os_interrupt.inc | 2 +- lib/NitroSDK/asm/include/os_spinlock.inc | 2 +- lib/NitroSDK/asm/include/os_thread.inc | 2 +- lib/NitroSDK/asm/include/os_timer.inc | 2 +- lib/NitroSDK/asm/mi_memory_1.s | 16 +++++++++++----- lib/NitroSDK/asm/os_spinlock.s | 2 +- lib/NitroSDK/src/mi/mi_swap.c | 18 ++++++++++++++++++ lib/include/nitro/mi.h | 1 + lib/include/nitro/mi/swap.h | 18 ++++++++++++++++++ main.lsf | 2 +- 19 files changed, 63 insertions(+), 20 deletions(-) create mode 100644 lib/NitroSDK/src/mi/mi_swap.c create mode 100644 lib/include/nitro/mi/swap.h diff --git a/asm/include/main_02075600.inc b/asm/include/main_02075600.inc index f607492e..0d6311f6 100644 --- a/asm/include/main_02075600.inc +++ b/asm/include/main_02075600.inc @@ -32,7 +32,7 @@ .public _ll_udiv .public _s32_div_f .public _secure -.public AtomicExchange +.public MI_SwapWord .public CARD_Init .public ClearIrqFlag .public CP_SaveContext diff --git a/lib/NitroSDK/asm/include/fx_vec.inc b/lib/NitroSDK/asm/include/fx_vec.inc index 4f3b7c26..fc66d852 100644 --- a/lib/NitroSDK/asm/include/fx_vec.inc +++ b/lib/NitroSDK/asm/include/fx_vec.inc @@ -33,7 +33,7 @@ .public _ll_udiv .public _s32_div_f .public _secure -.public AtomicExchange +.public MI_SwapWord .public CARD_Init .public ClearIrqFlag .public CP_SaveContext diff --git a/lib/NitroSDK/asm/include/g2.inc b/lib/NitroSDK/asm/include/g2.inc index 53e3adea..03eb50dc 100644 --- a/lib/NitroSDK/asm/include/g2.inc +++ b/lib/NitroSDK/asm/include/g2.inc @@ -32,7 +32,7 @@ .public _ll_udiv .public _s32_div_f .public _secure -.public AtomicExchange +.public MI_SwapWord .public CARD_Init .public ClearIrqFlag .public CP_SaveContext diff --git a/lib/NitroSDK/asm/include/gx.inc b/lib/NitroSDK/asm/include/gx.inc index f255ab4d..3c21404c 100644 --- a/lib/NitroSDK/asm/include/gx.inc +++ b/lib/NitroSDK/asm/include/gx.inc @@ -32,7 +32,7 @@ .public _ll_udiv .public _s32_div_f .public _secure -.public AtomicExchange +.public MI_SwapWord .public CARD_Init .public ClearIrqFlag .public CP_SaveContext diff --git a/lib/NitroSDK/asm/include/gx_bgcnt.inc b/lib/NitroSDK/asm/include/gx_bgcnt.inc index 481b269c..16b15dba 100644 --- a/lib/NitroSDK/asm/include/gx_bgcnt.inc +++ b/lib/NitroSDK/asm/include/gx_bgcnt.inc @@ -33,7 +33,7 @@ .public _ll_udiv .public _s32_div_f .public _secure -.public AtomicExchange +.public MI_SwapWord .public CARD_Init .public ClearIrqFlag .public CP_SaveContext diff --git a/lib/NitroSDK/asm/include/gx_load2d.inc b/lib/NitroSDK/asm/include/gx_load2d.inc index 95285071..4a737da1 100644 --- a/lib/NitroSDK/asm/include/gx_load2d.inc +++ b/lib/NitroSDK/asm/include/gx_load2d.inc @@ -32,7 +32,7 @@ .public _ll_udiv .public _s32_div_f .public _secure -.public AtomicExchange +.public MI_SwapWord .public CARD_Init .public ClearIrqFlag .public CP_SaveContext diff --git a/lib/NitroSDK/asm/include/mtx.inc b/lib/NitroSDK/asm/include/mtx.inc index f577ce57..196b7002 100644 --- a/lib/NitroSDK/asm/include/mtx.inc +++ b/lib/NitroSDK/asm/include/mtx.inc @@ -32,7 +32,7 @@ .public _ll_udiv .public _s32_div_f .public _secure -.public AtomicExchange +.public MI_SwapWord .public CARD_Init .public ClearIrqFlag .public CP_SaveContext diff --git a/lib/NitroSDK/asm/include/os_arena.inc b/lib/NitroSDK/asm/include/os_arena.inc index 777583b8..2e7b366a 100644 --- a/lib/NitroSDK/asm/include/os_arena.inc +++ b/lib/NitroSDK/asm/include/os_arena.inc @@ -33,7 +33,7 @@ .public _ll_udiv .public _s32_div_f .public _secure -.public AtomicExchange +.public MI_SwapWord .public CARD_Init .public ClearIrqFlag .public CP_SaveContext diff --git a/lib/NitroSDK/asm/include/os_exception.inc b/lib/NitroSDK/asm/include/os_exception.inc index f6357b37..62219b5f 100644 --- a/lib/NitroSDK/asm/include/os_exception.inc +++ b/lib/NitroSDK/asm/include/os_exception.inc @@ -33,7 +33,7 @@ .public _ll_udiv .public _s32_div_f .public _secure -.public AtomicExchange +.public MI_SwapWord .public CARD_Init .public ClearIrqFlag .public CP_SaveContext diff --git a/lib/NitroSDK/asm/include/os_interrupt.inc b/lib/NitroSDK/asm/include/os_interrupt.inc index 3f192788..f0c6fb9a 100644 --- a/lib/NitroSDK/asm/include/os_interrupt.inc +++ b/lib/NitroSDK/asm/include/os_interrupt.inc @@ -33,7 +33,7 @@ .public _ll_udiv .public _s32_div_f .public _secure -.public AtomicExchange +.public MI_SwapWord .public CARD_Init .public ClearIrqFlag .public CP_SaveContext diff --git a/lib/NitroSDK/asm/include/os_spinlock.inc b/lib/NitroSDK/asm/include/os_spinlock.inc index 0a512bc7..4d1b4ac9 100644 --- a/lib/NitroSDK/asm/include/os_spinlock.inc +++ b/lib/NitroSDK/asm/include/os_spinlock.inc @@ -32,7 +32,7 @@ .public _ll_udiv .public _s32_div_f .public _secure -.public AtomicExchange +.public MI_SwapWord .public CARD_Init .public ClearIrqFlag .public CP_SaveContext diff --git a/lib/NitroSDK/asm/include/os_thread.inc b/lib/NitroSDK/asm/include/os_thread.inc index 6ff4aa31..e29d6737 100644 --- a/lib/NitroSDK/asm/include/os_thread.inc +++ b/lib/NitroSDK/asm/include/os_thread.inc @@ -33,7 +33,7 @@ .public _ll_udiv .public _s32_div_f .public _secure -.public AtomicExchange +.public MI_SwapWord .public CARD_Init .public ClearIrqFlag .public CP_SaveContext diff --git a/lib/NitroSDK/asm/include/os_timer.inc b/lib/NitroSDK/asm/include/os_timer.inc index 2b070647..367479f1 100644 --- a/lib/NitroSDK/asm/include/os_timer.inc +++ b/lib/NitroSDK/asm/include/os_timer.inc @@ -33,7 +33,7 @@ .public _ll_udiv .public _s32_div_f .public _secure -.public AtomicExchange +.public MI_SwapWord .public CARD_Init .public ClearIrqFlag .public CP_SaveContext diff --git a/lib/NitroSDK/asm/mi_memory_1.s b/lib/NitroSDK/asm/mi_memory_1.s index db587dc7..a9cf5243 100644 --- a/lib/NitroSDK/asm/mi_memory_1.s +++ b/lib/NitroSDK/asm/mi_memory_1.s @@ -3,9 +3,15 @@ .text - arm_func_start AtomicExchange -AtomicExchange: ; 0x0207C648 - .word 0xE1010090 - bx lr - arm_func_end AtomicExchange +; arm_func_start MI_SwapWord +;MI_SwapWord: ; 0x0207C648 +; .word 0xE1010090 +; bx lr +; arm_func_end MI_SwapWord + + arm_func_start MI_SwapWord +MI_SwapWord: ; 0x020D4BE0 + swp r0, r0, [r1] + bx lr + arm_func_end MI_SwapWord diff --git a/lib/NitroSDK/asm/os_spinlock.s b/lib/NitroSDK/asm/os_spinlock.s index 77e95729..d19df75f 100644 --- a/lib/NitroSDK/asm/os_spinlock.s +++ b/lib/NitroSDK/asm/os_spinlock.s @@ -157,7 +157,7 @@ _02078EF8: mov r5, r0 mov r0, sb mov r1, r8 - bl AtomicExchange + bl MI_SwapWord movs r4, r0 bne _02078F20 cmp r7, #0 diff --git a/lib/NitroSDK/src/mi/mi_swap.c b/lib/NitroSDK/src/mi/mi_swap.c new file mode 100644 index 00000000..77c1e8e6 --- /dev/null +++ b/lib/NitroSDK/src/mi/mi_swap.c @@ -0,0 +1,18 @@ +#include +#include + +#include + +asm u32 MI_SwapWord (register u32 setData, register vu32 * destp) +{ + swp r0, r0, [r1] + bx lr +} + +// asm u8 MI_SwapByte (register u32 setData, register vu8 * destp) +// { +// swpb r0, r0, [r1] +// bx lr +// } + +#include diff --git a/lib/include/nitro/mi.h b/lib/include/nitro/mi.h index 47e981b1..d6af156b 100644 --- a/lib/include/nitro/mi.h +++ b/lib/include/nitro/mi.h @@ -7,5 +7,6 @@ #include #include #include +#include #endif //NITRO_MI_H_ diff --git a/lib/include/nitro/mi/swap.h b/lib/include/nitro/mi/swap.h new file mode 100644 index 00000000..46f9ac4d --- /dev/null +++ b/lib/include/nitro/mi/swap.h @@ -0,0 +1,18 @@ +#ifndef NITRO_MI_SWAP_H_ +#define NITRO_MI_SWAP_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +u32 MI_SwapWord(u32 setData, volatile u32 * destp); +u8 MI_SwapByte(u32 setData, volatile u8 * destp); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/main.lsf b/main.lsf index 7fdff36b..2da2ffad 100644 --- a/main.lsf +++ b/main.lsf @@ -279,7 +279,7 @@ Static main Object lib/NitroSDK/src/mi/mi_wram.o Object lib/NitroSDK/src/mi/mi_dma.o Object lib/NitroSDK/src/mi/mi_memory.o - Object lib/NitroSDK/asm/mi_memory_1.o + Object lib/NitroSDK/src/mi/mi_swap.o Object lib/NitroSDK/src/mi/mi_uncompress.o Object lib/NitroSDK/src/mi/mi_dma_card.o Object lib/NitroSDK/src/mi/mi_init.o From 63fc9305bb8216b745b438ec0b7be053fcab7b87 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 13 Jul 2026 11:54:51 -0700 Subject: [PATCH 05/10] remove unneeded files --- lib/NitroSDK/asm/include/fx_cp.inc | 2 - lib/NitroSDK/asm/include/fx_vec.inc | 99 -------------------- lib/NitroSDK/asm/include/g2.inc | 124 ------------------------- lib/NitroSDK/asm/include/g3imm.inc | 3 - lib/NitroSDK/asm/include/g3x.inc | 10 -- lib/NitroSDK/asm/include/mi_memory.inc | 43 --------- lib/NitroSDK/asm/include/mtx.inc | 100 -------------------- lib/NitroSDK/asm/mi_memory_1.s | 17 ---- 8 files changed, 398 deletions(-) delete mode 100644 lib/NitroSDK/asm/include/fx_cp.inc delete mode 100644 lib/NitroSDK/asm/include/fx_vec.inc delete mode 100644 lib/NitroSDK/asm/include/g2.inc delete mode 100644 lib/NitroSDK/asm/include/g3imm.inc delete mode 100644 lib/NitroSDK/asm/include/g3x.inc delete mode 100644 lib/NitroSDK/asm/include/mi_memory.inc delete mode 100644 lib/NitroSDK/asm/include/mtx.inc delete mode 100644 lib/NitroSDK/asm/mi_memory_1.s diff --git a/lib/NitroSDK/asm/include/fx_cp.inc b/lib/NitroSDK/asm/include/fx_cp.inc deleted file mode 100644 index 3f59c932..00000000 --- a/lib/NitroSDK/asm/include/fx_cp.inc +++ /dev/null @@ -1,2 +0,0 @@ -#pragma once - diff --git a/lib/NitroSDK/asm/include/fx_vec.inc b/lib/NitroSDK/asm/include/fx_vec.inc deleted file mode 100644 index fc66d852..00000000 --- a/lib/NitroSDK/asm/include/fx_vec.inc +++ /dev/null @@ -1,99 +0,0 @@ -#pragma once - -.public _0200002B -.public _020B2B9C -.public _022B9208 -.public _022B958E -.public _022B9590 -.public _022B9592 -.public _022B9594 -.public _022B9596 -.public _022B9598 -.public _022B959A -.public _022B959C -.public _022B959E -.public _022B95A0 -.public _022B95A2 -.public _022B95A4 -.public _022B95E4 -.public _022B95E8 -.public _022B95EC -.public _022B9614 -.public _022B9618 -.public _022B961C -.public _022B9644 -.public _022B9670 -.public _022B967C -.public _022B973C -.public _022B98CC -.public _022B98F4 -.public _022B98F8 -.public _022B99BC -.public _ll_sdiv -.public _ll_udiv -.public _s32_div_f -.public _secure -.public MI_SwapWord -.public CARD_Init -.public ClearIrqFlag -.public CP_SaveContext -.public CPi_RestoreContext -.public CTRDG_Init -.public DseMem_Free -.public DTCM_BSS -.public EnableIrqFiqFlags -.public EnableIrqFlag -.public FX_AtanIdxTable_ -.public FX_Div -.public GetGameMode -.public GetProcessorMode -.public gGXState -.public GXi_DmaId -.public GXi_VRamLockId -.public MI_DmaCopy16 -.public MI_DmaCopy32 -.public MI_DmaCopy32Async -.public MI_DmaFill32 -.public MI_DmaFill32Async -.public MI_Init -.public MI_WaitDma -.public MTi_CpuClear32 -.public MTi_CpuCopy16 -.public MTi_CpuCopy32 -.public MTX_LookAt -.public MTX_OrthoW -.public OS_InitReset -.public OS_IRQTable -.public OS_VsNPrintfEx -.public OSi_ConsoleTypeCache -.public OSi_DebuggerHandler -.public OSi_DisplayExContext_Helper -.public OSi_ExContext -.public OSi_Initialized -.public OSi_InitVramExclusive -.public OSi_IsThreadInitialized -.public OSi_ThreadInfo -.public OSi_TimerReserved -.public OSi_UseAlarm -.public OSi_UseTick -.public PM_Init -.public PXI_Init -.public sClrImg -.public sDispMode -.public SDK_MAIN_ARENA_LO -.public SDK_SECTION_ARENA_DTCM_START -.public SDK_SECTION_ARENA_EX_START -.public SDK_SECTION_ARENA_ITCM_START -.public SetIrqFiqFlags -.public SetIrqFlag -.public sIsDispOn -.public sSubBGExtPltt -.public sTexPlttStartAddrTable -.public sTexStartAddrTable -.public sub_0206F808 -.public sub_0206FD88 -.public sub_0206FDE0 -.public SVC_WaitByLoop -.public THREAD_INFO_STRUCT -.public WaitForever2 -.public WaitForInterrupt diff --git a/lib/NitroSDK/asm/include/g2.inc b/lib/NitroSDK/asm/include/g2.inc deleted file mode 100644 index 03eb50dc..00000000 --- a/lib/NitroSDK/asm/include/g2.inc +++ /dev/null @@ -1,124 +0,0 @@ -#pragma once -.public _0200002B -.public _020B2B9C -.public _022B9208 -.public _022B958E -.public _022B9590 -.public _022B9592 -.public _022B9594 -.public _022B9596 -.public _022B9598 -.public _022B959A -.public _022B959C -.public _022B959E -.public _022B95A0 -.public _022B95A2 -.public _022B95A4 -.public _022B95E4 -.public _022B95E8 -.public _022B95EC -.public _022B9614 -.public _022B9618 -.public _022B961C -.public _022B9644 -.public _022B9670 -.public _022B967C -.public _022B973C -.public _022B98CC -.public _022B98F4 -.public _022B98F8 -.public _022B99BC -.public _ll_sdiv -.public _ll_udiv -.public _s32_div_f -.public _secure -.public MI_SwapWord -.public CARD_Init -.public ClearIrqFlag -.public CP_SaveContext -.public CPi_RestoreContext -.public CTRDG_Init -.public DseMem_Free -.public DTCM_BSS -.public EnableIrqFiqFlags -.public EnableIrqFlag -.public FX_AtanIdxTable_ -.public FX_Div -.public G2_GetBG0CharPtr -.public G2_GetBG1CharPtr -.public G2_GetBG1ScrPtr -.public G2_GetBG2CharPtr -.public G2_GetBG2ScrPtr -.public G2_GetBG3CharPtr -.public G2_GetBG3ScrPtr -.public G2S_GetBG0CharPtr -.public G2S_GetBG0ScrPtr -.public G2S_GetBG1CharPtr -.public G2S_GetBG1ScrPtr -.public GetGameMode -.public GetProcessorMode -.public gGXState -.public GX_HBlankIntr -.public GX_ResetBankForBGExtPltt -.public GX_ResetBankForOBJExtPltt -.public GX_ResetBankForSubBGExtPltt -.public GX_ResetBankForSubBGOBJExtPltt -.public GX_ResetBankForSubOBJExtPltt -.public GX_ResetBankForTex -.public GX_ResetBankForTexPltt -.public GX_SetBankForBGExtPltt -.public GX_SetBankForOBJExtPltt -.public GX_SetBankForSubBGExtPltt -.public GX_SetBankForSubBGOBJExtPltt -.public GX_SetBankForSubOBJExtPltt -.public GX_SetBankForTex -.public GX_SetBankForTexPltt -.public GXi_DmaId -.public GXi_VRamLockId -.public MI_DmaCopy16 -.public MI_DmaCopy32 -.public MI_DmaCopy32Async -.public MI_DmaFill32 -.public MI_DmaFill32Async -.public MI_Init -.public MI_WaitDma -.public MTi_CpuClear32 -.public MTi_CpuCopy16 -.public MTi_CpuCopy32 -.public MTX_LookAt -.public MTX_OrthoW -.public OS_InitReset -.public OS_IRQTable -.public OS_VsNPrintfEx -.public OSi_ConsoleTypeCache -.public OSi_DebuggerHandler -.public OSi_DisplayExContext_Helper -.public OSi_ExContext -.public OSi_Initialized -.public OSi_InitVramExclusive -.public OSi_IsThreadInitialized -.public OSi_ThreadInfo -.public OSi_TimerReserved -.public OSi_UseAlarm -.public OSi_UseTick -.public PM_Init -.public PXI_Init -.public sClrImg -.public sDispMode -.public SDK_MAIN_ARENA_LO -.public SDK_SECTION_ARENA_DTCM_START -.public SDK_SECTION_ARENA_EX_START -.public SDK_SECTION_ARENA_ITCM_START -.public SetIrqFiqFlags -.public SetIrqFlag -.public sIsDispOn -.public sSubBGExtPltt -.public sTexPlttStartAddrTable -.public sTexStartAddrTable -.public sub_0206F808 -.public sub_0206FD88 -.public sub_0206FDE0 -.public SVC_WaitByLoop -.public THREAD_INFO_STRUCT -.public WaitForever2 -.public WaitForInterrupt diff --git a/lib/NitroSDK/asm/include/g3imm.inc b/lib/NitroSDK/asm/include/g3imm.inc deleted file mode 100644 index d5770242..00000000 --- a/lib/NitroSDK/asm/include/g3imm.inc +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once -.public GX_SendFifo48B -.public GX_SendFifo64B diff --git a/lib/NitroSDK/asm/include/g3x.inc b/lib/NitroSDK/asm/include/g3x.inc deleted file mode 100644 index 71643d11..00000000 --- a/lib/NitroSDK/asm/include/g3x.inc +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once -.public G3_LoadMtx43 -.public G3_LoadMtx44 -.public GXi_DmaId -.public GXi_VRamLockId -.public MI_DmaFill32 -.public MI_DmaFill32Async -.public MTi_CpuClear32 -.public MTX_LookAt -.public MTX_OrthoW diff --git a/lib/NitroSDK/asm/include/mi_memory.inc b/lib/NitroSDK/asm/include/mi_memory.inc deleted file mode 100644 index af417d00..00000000 --- a/lib/NitroSDK/asm/include/mi_memory.inc +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once -.public _020AEBF8 -.public _020B2BB0 -.public _022B99EC -.public _022B9A44 -.public _022B9A80 -.public _022B9D00 -.public _022BAA20 -.public _022BB4E8 -.public sCalllackTable -.public FifoCtrlInit -.public _022BB568 -.public DC_FlushRange -.public DC_InvalidateRange -.public DC_StoreRange -.public EnableIrqFlag -.public FS_InitFile -.public MIi_DmaSetParams -.public MI_CpuCopy8 -.public MI_SetWramBank -.public MI_StopDma -.public MIi_CheckAnotherAutoDma -.public MIi_CheckDma0SourceAddress -.public MIi_DmaSetParams_NoInt -.public MIi_DmaSetParams_Wait -.public OS_EnableIrqMask -.public OS_InitMutex -.public OS_IsRunOnEmulator -.public OS_LockMutex -.public OS_ResetRequestIrqMask -.public OS_SetIrqFunction -.public OS_SleepThread -.public OS_SpinWait -.public OS_UnlockMutex -.public OS_WakeupThread -.public OSi_EnterDmaCallback -.public SetIrqFlag -.public SNDi_SharedWork -.public sReserveList -.public sSndMutex -.public MIi_DmaSetParams_wait_noInt -.public VolumeTable -.public WaitForever2 diff --git a/lib/NitroSDK/asm/include/mtx.inc b/lib/NitroSDK/asm/include/mtx.inc deleted file mode 100644 index 196b7002..00000000 --- a/lib/NitroSDK/asm/include/mtx.inc +++ /dev/null @@ -1,100 +0,0 @@ -#pragma once -.public _0200002B -.public _020B2B9C -.public _022B9208 -.public _022B958E -.public _022B9590 -.public _022B9592 -.public _022B9594 -.public _022B9596 -.public _022B9598 -.public _022B959A -.public _022B959C -.public _022B959E -.public _022B95A0 -.public _022B95A2 -.public _022B95A4 -.public _022B95E4 -.public _022B95E8 -.public _022B95EC -.public _022B9614 -.public _022B9618 -.public _022B961C -.public _022B9644 -.public _022B9670 -.public _022B967C -.public _022B973C -.public _022B98CC -.public _022B98F4 -.public _022B98F8 -.public _022B99BC -.public _ll_sdiv -.public _ll_udiv -.public _s32_div_f -.public _secure -.public MI_SwapWord -.public CARD_Init -.public ClearIrqFlag -.public CP_SaveContext -.public CPi_RestoreContext -.public CTRDG_Init -.public DseMem_Free -.public DTCM_BSS -.public EnableIrqFiqFlags -.public EnableIrqFlag -.public FX_AtanIdxTable_ -.public FX_GetDivResultFx64c -.public FX_InvAsync -.public GetGameMode -.public GetProcessorMode -.public gGXState -.public GXi_DmaId -.public GXi_VRamLockId -.public MI_DmaCopy16 -.public MI_DmaCopy32 -.public MI_DmaCopy32Async -.public MI_DmaFill32 -.public MI_DmaFill32Async -.public MI_Init -.public MI_WaitDma -.public MTi_CpuClear32 -.public MTi_CpuCopy16 -.public MTi_CpuCopy32 -.public OS_InitReset -.public OS_IRQTable -.public OS_VsNPrintfEx -.public OSi_ConsoleTypeCache -.public OSi_DebuggerHandler -.public OSi_DisplayExContext_Helper -.public OSi_ExContext -.public OSi_Initialized -.public OSi_InitVramExclusive -.public OSi_IsThreadInitialized -.public OSi_ThreadInfo -.public OSi_TimerReserved -.public OSi_UseAlarm -.public OSi_UseTick -.public PM_Init -.public PXI_Init -.public sClrImg -.public sDispMode -.public SDK_MAIN_ARENA_LO -.public SDK_SECTION_ARENA_DTCM_START -.public SDK_SECTION_ARENA_EX_START -.public SDK_SECTION_ARENA_ITCM_START -.public SetIrqFiqFlags -.public SetIrqFlag -.public sIsDispOn -.public sSubBGExtPltt -.public sTexPlttStartAddrTable -.public sTexStartAddrTable -.public sub_0206F808 -.public sub_0206FD88 -.public sub_0206FDE0 -.public SVC_WaitByLoop -.public THREAD_INFO_STRUCT -.public VEC_CrossProduct -.public VEC_DotProduct -.public VEC_Normalize -.public WaitForever2 -.public WaitForInterrupt diff --git a/lib/NitroSDK/asm/mi_memory_1.s b/lib/NitroSDK/asm/mi_memory_1.s deleted file mode 100644 index a9cf5243..00000000 --- a/lib/NitroSDK/asm/mi_memory_1.s +++ /dev/null @@ -1,17 +0,0 @@ - .include "asm/macros.inc" - .include "include/mi_memory.inc" - - .text - -; arm_func_start MI_SwapWord -;MI_SwapWord: ; 0x0207C648 -; .word 0xE1010090 -; bx lr -; arm_func_end MI_SwapWord - - arm_func_start MI_SwapWord -MI_SwapWord: ; 0x020D4BE0 - swp r0, r0, [r1] - bx lr - arm_func_end MI_SwapWord - From 41fed841e0fbfad03c983f83b61f5c2aea08f166 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 13 Jul 2026 18:31:24 -0700 Subject: [PATCH 06/10] move most of std_string to src --- common.mk | 2 +- lib/NitroSDK/asm/std_string.s | 100 --------------------- lib/NitroSDK/src/snd/snd_bank.c | 5 -- lib/NitroSDK/src/std/string.c | 144 ++++++++++++++++++++++++++++++ lib/include/nitro.h | 1 + lib/include/nitro/mi.h | 1 + lib/include/nitro/mi/byteAccess.h | 32 +++++++ lib/include/nitro/std.h | 6 ++ lib/include/nitro/std/string.h | 42 +++++++++ lib/include/nitro/types.h | 7 ++ main.lsf | 1 + 11 files changed, 235 insertions(+), 106 deletions(-) create mode 100644 lib/NitroSDK/src/std/string.c create mode 100644 lib/include/nitro/mi/byteAccess.h create mode 100644 lib/include/nitro/std.h create mode 100644 lib/include/nitro/std/string.h diff --git a/common.mk b/common.mk index 566343b8..79b2dff0 100644 --- a/common.mk +++ b/common.mk @@ -88,7 +88,7 @@ PRECOMPILE_OBJ_DIR := $(dir $(PRECOMPILE_OBJ)) PRECOMPILE_DEPFILE := $(BUILD_DIR)/precompile/global.d # Directories -NITROSDK_SRC_SUBDIRS := os mi snd fs gx fx rtc math +NITROSDK_SRC_SUBDIRS := os mi snd fs gx fx rtc math std LIB_SUBDIRS := DSE NitroSDK MSL_C SRC_SUBDIR := src diff --git a/lib/NitroSDK/asm/std_string.s b/lib/NitroSDK/asm/std_string.s index da673b3f..9dda43e7 100644 --- a/lib/NitroSDK/asm/std_string.s +++ b/lib/NitroSDK/asm/std_string.s @@ -3,106 +3,6 @@ .text - arm_func_start Std_CopyLString -Std_CopyLString: ; 0x02085244 - stmdb sp!, {r4, lr} - sub ip, r2, #1 - mov r4, r1 - cmp ip, #0 - mov lr, #0 - ble _02085280 -_0208525C: - ldrsb r3, [r4] - strb r3, [r0, lr] - ldrsb r3, [r4] - cmp r3, #0 - beq _02085280 - add lr, lr, #1 - cmp lr, ip - add r4, r4, #1 - blt _0208525C -_02085280: - sub r3, r2, #1 - cmp lr, r3 - blt _02085298 - cmp r2, #0 - movne r2, #0 - strneb r2, [r0, lr] -_02085298: - mov r0, r1 - bl Std_GetStringLength - ldmia sp!, {r4, pc} - arm_func_end Std_CopyLString - - arm_func_start Std_GetStringLength -Std_GetStringLength: ; 0x020852A4 - ldrsb r1, [r0] - mov r2, #0 - cmp r1, #0 - beq _020852C4 -_020852B4: - add r2, r2, #1 - ldrsb r1, [r0, r2] - cmp r1, #0 - bne _020852B4 -_020852C4: - mov r0, r2 - bx lr - arm_func_end Std_GetStringLength - - arm_func_start Std_CompareString__020852CC -Std_CompareString__020852CC: ; 0x020852CC - b _020852D8 -_020852D0: - add r0, r0, #1 - add r1, r1, #1 -_020852D8: - ldrsb r3, [r1] - ldrsb r2, [r0] - cmp r2, r3 - bne _020852F0 - cmp r2, #0 - bne _020852D0 -_020852F0: - sub r0, r2, r3 - bx lr - arm_func_end Std_CompareString__020852CC - - arm_func_start Std_CompareNString -Std_CompareNString: ; 0x020852F8 - stmdb sp!, {r3, lr} - cmp r2, #0 - beq _02085330 - cmp r2, #0 - mov lr, #0 - ble _02085330 -_02085310: - ldrb ip, [r0, lr] - ldrb r3, [r1, lr] - cmp ip, r3 - subne r0, ip, r3 - ldmneia sp!, {r3, pc} - add lr, lr, #1 - cmp lr, r2 - blt _02085310 -_02085330: - mov r0, #0 - ldmia sp!, {r3, pc} - arm_func_end Std_CompareNString - - arm_func_start Std_TsScanf -Std_TsScanf: ; 0x02085338 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3, lr} - add r2, sp, #0xc - bic r2, r2, #3 - ldr r1, [sp, #0xc] - add r2, r2, #4 - bl Std_TvsScanf - ldmia sp!, {r3, lr} - add sp, sp, #0x10 - bx lr - arm_func_end Std_TsScanf arm_func_start Stdi_IsSpace Stdi_IsSpace: ; 0x02085360 diff --git a/lib/NitroSDK/src/snd/snd_bank.c b/lib/NitroSDK/src/snd/snd_bank.c index 215fe1f9..bb810dbc 100644 --- a/lib/NitroSDK/src/snd/snd_bank.c +++ b/lib/NitroSDK/src/snd/snd_bank.c @@ -1,10 +1,5 @@ #include -static u8 MI_ReadByte (const void * address) -{ - return *(u8 *)address; -} - #ifdef _MSC_VER #pragma warning(disable : 4018) #pragma warning(disable : 4311) diff --git a/lib/NitroSDK/src/std/string.c b/lib/NitroSDK/src/std/string.c new file mode 100644 index 00000000..68c12ee6 --- /dev/null +++ b/lib/NitroSDK/src/std/string.c @@ -0,0 +1,144 @@ +#include + +#ifndef SDK_FINALROM + char * Std_CopyString (char * destp, const char * srcp) + { + char * retval = destp; + + SDK_ASSERT(destp && srcp); + + while (*srcp) { + *destp++ = (char)*srcp++; + } + + *destp = '\0'; + + return retval; + } + + int Std_CopyLStringZeroFill (char * destp, const char * srcp, int n) + { + int i; + const char * s = srcp; + + SDK_ASSERT(destp && srcp && n >= 0); + + for (i = 0; i < n - 1; i++) { + destp[i] = (char)*s; + if (*s) { + s++; + } + } + + destp[i] = '\0'; + + return Std_GetStringLength(srcp); + } +#endif + +int Std_CopyLString (char * destp, const char * srcp, int siz) +{ + int i; + const char * s = srcp; + + SDK_ASSERT(destp && srcp && siz >= 0); + + for (i = 0; i < siz - 1; i++) { + destp[i] = (char)*s; + if (*s) { + s++; + } else { + break; + } + } + + if ((i >= siz - 1) && (siz != 0)) { + destp[i] = '\0'; + } + + return Std_GetStringLength(srcp); +} + +#ifndef SDK_FINALROM + char * Std_SearchString (const char * srcp, const char * str) + { + int i; + int n; + + SDK_ASSERT(srcp && str); + + for (i = 0; srcp[i]; i++) { + n = 0; + while (str[n] && srcp[i + n] == str[n]) { + n++; + } + + if (str[n] == '\0') { + return (char *)&srcp[i]; + } + } + + return NULL; + } +#endif + +int Std_GetStringLength (const char * str) +{ + int n = 0; + while (str[n]) { + n++; + } + return n; +} + +#ifndef SDK_FINALROM + char * Std_ConcatenateString (char * str1, const char * str2) + { + int n = Std_GetStringLength(str1); + (void)Std_CopyString(&str1[n], str2); + return str1; + } +#endif + +int Std_CompareString__020852CC (const char * str1, const char * str2) +{ + while (*str1 == *str2 && *str1) { + str1++; + str2++; + } + + return (*str1 - *str2); +} + +int Std_CompareNString (const char * str1, const char * str2, int len) +{ + if (len) { + int i; + for (i = 0; i < len; ++i) { + int c = (int)(MI_ReadByte(str1 + i)); + int d = (int)(MI_ReadByte(str2 + i)); + if (c != d) { + return (int)(c - d); + } + } + } + + return 0; +} + +#ifndef SDK_FINALROM + int Std_CompareLString (const char * str1, const char * str2) + { + return Std_CompareNString(str1, str2, Std_GetStringLength(str2)); + } +#endif + +SDK_WEAK_SYMBOL int Std_TsScanf (const char * src, const char * fmt, ...) +{ + int ret; + va_list va; + va_start(va, fmt); + ret = Std_TvsScanf(src, fmt, va); + va_end(va); + return ret; +} diff --git a/lib/include/nitro.h b/lib/include/nitro.h index 85980b59..85dc763c 100644 --- a/lib/include/nitro.h +++ b/lib/include/nitro.h @@ -11,5 +11,6 @@ #include #include #include +#include #endif //NITRO_H_ diff --git a/lib/include/nitro/mi.h b/lib/include/nitro/mi.h index d6af156b..37ca1755 100644 --- a/lib/include/nitro/mi.h +++ b/lib/include/nitro/mi.h @@ -8,5 +8,6 @@ #include #include #include +#include #endif //NITRO_MI_H_ diff --git a/lib/include/nitro/mi/byteAccess.h b/lib/include/nitro/mi/byteAccess.h new file mode 100644 index 00000000..3c870e63 --- /dev/null +++ b/lib/include/nitro/mi/byteAccess.h @@ -0,0 +1,32 @@ +#ifndef NITRO_MI_BYTEACCESS_H_ +#define NITRO_MI_BYTEACCESS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifdef SDK_TEG + u8 MI_ReadByte(const void * address); +#else + static inline u8 MI_ReadByte (const void * address) + { + return *(u8 *)address; + } +#endif + +#ifdef SDK_TEG + void MI_WriteByte(void * address, u8 value); +#else + static inline void MI_WriteByte (void * address, u8 value) + { + *(u8 *)address = value; + } +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/nitro/std.h b/lib/include/nitro/std.h new file mode 100644 index 00000000..4ad59b0e --- /dev/null +++ b/lib/include/nitro/std.h @@ -0,0 +1,6 @@ +#ifndef NITRO_STD_H_ +#define NITRO_STD_H_ + +#include + +#endif //NITRO_STD_H_ diff --git a/lib/include/nitro/std/string.h b/lib/include/nitro/std/string.h new file mode 100644 index 00000000..fb7ac41a --- /dev/null +++ b/lib/include/nitro/std/string.h @@ -0,0 +1,42 @@ +#ifndef NITRO_STD_STRING_H_ +#define NITRO_STD_STRING_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#define STD_StrCpy Std_CopyString +#define STD_StrLCpy Std_CopyLString +#define STD_StrStr Std_SearchString +#define STD_StrLen Std_GetStringLength +#define STD_StrCat Std_ConcatenateString +#define STD_StrCmp Std_CompareString__020852CC +#define STD_StrNCmp Std_CompareNString +#define STD_StrLCmp Std_CompareLString + +extern char * Std_CopyString(char * destp, const char * srcp); +extern int Std_CopyLStringZeroFill(char * destp, const char * srcp, int n); +extern int Std_CopyLString(char * destp, const char * srcp, int siz); +extern char * Std_SearchString(const char * srcp, const char * str); +extern int Std_GetStringLength(const char * str); +extern char * Std_ConcatenateString(char * str1, const char * str2); +extern int Std_CompareString__020852CC(const char * str1, const char * str2); +extern int Std_CompareNString(const char * str1, const char * str2, int len); +extern int Std_CompareLString(const char * str1, const char * str2); +extern int Std_TsScanf(const char * src, const char * fmt, ...); +extern int Std_TvsScanf(const char * src, const char * fmt, va_list vlist); +extern int Std_TSPrintf(char * dst, const char * fmt, ...); +// extern int Std_TVSPrintf(char * dst, const char * fmt, va_list vlist); +// extern int Std_TSNPrintf(char * dst, size_t len, const char * fmt, ...); +// extern int Std_TVSNPrintf(char * dst, size_t len, const char * fmt, va_list vlist); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/nitro/types.h b/lib/include/nitro/types.h index c849fa7b..e77c9c44 100644 --- a/lib/include/nitro/types.h +++ b/lib/include/nitro/types.h @@ -56,5 +56,12 @@ typedef int BOOL; #define SDK_INLINE static inline #define SDK_DECL_INLINE static +#if defined(SDK_CW) || defined(__MWERKS__) + #define SDK_WEAK_SYMBOL __declspec(weak) +#elif defined(SDK_PRODG) + #define SDK_WEAK_SYMBOL +#endif + + #endif //SDK_ASM #endif //NITRO_TYPES_H_ diff --git a/main.lsf b/main.lsf index 2da2ffad..6f484ca6 100644 --- a/main.lsf +++ b/main.lsf @@ -322,6 +322,7 @@ Static main Object lib/NitroSDK/src/math/math.o Object lib/NitroSDK/src/math/math_dgt.o Object lib/NitroSDK/asm/math_crc.o + Object lib/NitroSDK/src/std/string.o Object lib/NitroSDK/asm/std_string.o Object lib/NitroSDK/src/os/os_printf_1.o Object lib/NitroSDK/asm/os_printf.o From 1259190e3649b822261e7e6f662a3883d4307979 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 18 Jul 2026 09:27:28 -0700 Subject: [PATCH 07/10] little itcm work --- asm/itcm.s | 205 --------------------------------- asm/itcm_01FFB62C.s | 22 ---- asm/os_reset_itcm.s | 209 ++++++++++++++++++++++++++++++++++ include/dungeon_ai_movement.h | 2 + main.lsf | 2 +- src/dungeon_ai_movement.c | 12 ++ 6 files changed, 224 insertions(+), 228 deletions(-) delete mode 100644 asm/itcm_01FFB62C.s create mode 100644 asm/os_reset_itcm.s diff --git a/asm/itcm.s b/asm/itcm.s index 20ab796c..c7b1375d 100644 --- a/asm/itcm.s +++ b/asm/itcm.s @@ -1935,208 +1935,3 @@ _01FF97C0: .word OSi_ThreadInfo _01FF97C4: .word CP_SaveContext _01FF97C8: .word CPi_RestoreContext arm_func_end ReturnFromInterrupt - - arm_func_start OSi_DoResetSystem -OSi_DoResetSystem: ; 0x01FF97CC - stmdb sp!, {r3, lr} - ldr r0, _01FF97F8 ; =OSi_IsInitReset -_01FF97D4: - ldrh r1, [r0] - cmp r1, #0 - beq _01FF97D4 - ldr r0, _01FF97FC ; =0x04000208 - mov r1, #0 - strh r1, [r0] - bl OSi_ReloadRomData - bl OSi_DoBoot - ldmia sp!, {r3, pc} - .align 2, 0 -_01FF97F8: .word OSi_IsInitReset -_01FF97FC: .word 0x04000208 - arm_func_end OSi_DoResetSystem - - arm_func_start OSi_DoBoot -OSi_DoBoot: ; 0x01FF9800 - mov ip, #0x4000000 - str ip, [ip, #0x208] - ldr r1, _01FF98AC ; =OS_IRQTable - add r1, r1, #0x3fc0 - add r1, r1, #0x3c - mov r0, #0 - str r0, [r1] - ldr r1, _01FF98B0 ; =0x04000180 -_01FF9820: - ldrh r0, [r1] - and r0, r0, #0xf - cmp r0, #1 - bne _01FF9820 - mov r0, #0x100 - strh r0, [r1] - mov r0, #0 - ldr r3, _01FF98B4 ; =0x027FFD9C - ldr r4, [r3] - ldr r1, _01FF98B8 ; =0x027FFD80 - mov r2, #0x80 - bl OSi_CpuClear32 - str r4, [r3] - ldr r1, _01FF98BC ; =0x027FFF80 - mov r2, #0x18 - bl OSi_CpuClear32 - ldr r1, _01FF98C0 ; =0x027FFF98 - strh r0, [r1] - ldr r1, _01FF98C4 ; =0x027FFF9C - mov r2, #0x64 - bl OSi_CpuClear32 - ldr r1, _01FF98B0 ; =0x04000180 -_01FF9878: - ldrh r0, [r1] - and r0, r0, #0xf - cmp r0, #1 - beq _01FF9878 - mov r0, #0 - strh r0, [r1] - ldr r3, _01FF98C8 ; =0x027FFE00 - ldr ip, [r3, #0x24] - mov lr, ip - ldr fp, _01FF98BC ; =0x027FFF80 - ldmia fp, {r0, r1, r2, r3, r4, r5, r6, r7, r8, sb, sl} - mov fp, #0 - bx ip - .align 2, 0 -_01FF98AC: .word OS_IRQTable -_01FF98B0: .word 0x04000180 -_01FF98B4: .word 0x027FFD9C -_01FF98B8: .word 0x027FFD80 -_01FF98BC: .word 0x027FFF80 -_01FF98C0: .word 0x027FFF98 -_01FF98C4: .word 0x027FFF9C -_01FF98C8: .word 0x027FFE00 - arm_func_end OSi_DoBoot - - arm_func_start OSi_CpuClear32 -OSi_CpuClear32: ; 0x01FF98CC - add ip, r1, r2 -_01FF98D0: - cmp r1, ip - blt _01FF98DC - b _01FF98E0 -_01FF98DC: - stmia r1!, {r0} -_01FF98E0: - blt _01FF98D0 - bx lr - arm_func_end OSi_CpuClear32 - - arm_func_start OSi_ReloadRomData -OSi_ReloadRomData: ; 0x01FF98E8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - ldr r1, _01FF9988 ; =0x027FFC2C - ldr r4, [r1] - cmp r4, #0x8000 - blo _01FF990C - mov r0, r4 - add r1, r1, #0x1d4 - mov r2, #0x160 - bl OSi_ReadCardRom32 -_01FF990C: - ldr r0, _01FF998C ; =0x027FFE20 - ldr r5, [r0] - ldr r6, [r0, #8] - ldr r7, [r0, #0xc] - ldr r8, [r0, #0x10] - ldr sb, [r0, #0x18] - ldr sl, [r0, #0x1c] - bl EnableIrqFlag - mov fp, r0 - bl DC_StoreAll - bl DC_InvalidateAll - mov r0, fp - bl SetIrqFlag - bl IC_InvalidateAll - bl DC_WaitWriteBufferEmpty - add r5, r5, r4 - cmp r5, #0x8000 - bhs _01FF9964 - rsb r0, r5, #0x8000 - add r6, r6, r0 - sub r7, r7, r0 - mov r5, #0x8000 -_01FF9964: - mov r0, r5 - mov r1, r6 - mov r2, r7 - bl OSi_ReadCardRom32 - mov r1, sb - mov r2, sl - add r0, r8, r4 - bl OSi_ReadCardRom32 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_01FF9988: .word 0x027FFC2C -_01FF998C: .word 0x027FFE20 - arm_func_end OSi_ReloadRomData - - arm_func_start OSi_ReadCardRom32 -OSi_ReadCardRom32: ; 0x01FF9990 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - ldr r4, _01FF9A54 ; =0x027FFE60 - ldr r3, _01FF9A58 ; =0x000001FF - ldr r5, [r4] - and r4, r0, r3 - bic r3, r5, #0x7000000 - ldr r5, _01FF9A5C ; =0x040001A4 - orr r3, r3, #0xa1000000 - rsb ip, r4, #0 -_01FF99B4: - ldr r4, [r5] - tst r4, #0x80000000 - bne _01FF99B4 - ldr r7, _01FF9A60 ; =0x040001A1 - mov r4, #0x80 - strb r4, [r7] - cmp ip, r2 - add r0, r0, ip - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - ldr r4, _01FF9A64 ; =0x04100010 - mov sb, r0, lsr #8 - mov r6, #0xb7 - mov r5, #0 -_01FF99E8: - strb r6, [r7, #7] - mov lr, r0, lsr #0x18 - strb lr, [r7, #8] - mov lr, r0, lsr #0x10 - strb lr, [r7, #9] - strb sb, [r7, #0xa] - strb r0, [r7, #0xb] - strb r5, [r7, #0xc] - strb r5, [r7, #0xd] - strb r5, [r7, #0xe] - str r3, [r7, #3] -_01FF9A14: - ldr r8, [r7, #3] - tst r8, #0x800000 - beq _01FF9A38 - cmp ip, #0 - ldr lr, [r4] - blt _01FF9A34 - cmp ip, r2 - strlt lr, [r1, ip] -_01FF9A34: - add ip, ip, #4 -_01FF9A38: - tst r8, #0x80000000 - bne _01FF9A14 - cmp ip, r2 - add sb, sb, #2 - add r0, r0, #0x200 - blt _01FF99E8 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_01FF9A54: .word 0x027FFE60 -_01FF9A58: .word 0x000001FF -_01FF9A5C: .word 0x040001A4 -_01FF9A60: .word 0x040001A1 -_01FF9A64: .word 0x04100010 - arm_func_end OSi_ReadCardRom32 - diff --git a/asm/itcm_01FFB62C.s b/asm/itcm_01FFB62C.s deleted file mode 100644 index 6b8d4358..00000000 --- a/asm/itcm_01FFB62C.s +++ /dev/null @@ -1,22 +0,0 @@ - .include "asm/macros.inc" - .include "itcm_01FFB62C.inc" - - .section .itcm,4,1,4 - - arm_func_start sub_01FFB62C -sub_01FFB62C: ; 0x01FFB62C - ldr r3, [r0, #0xb4] - mov r2, #0 - strb r2, [r3, #0x7c] - ldrh r1, [r0, #4] - strh r1, [r3, #0x8c] - ldrh r0, [r0, #6] - strh r0, [r3, #0x8e] - str r2, [r3, #0x84] - strh r2, [r3, #0x80] - bx lr - arm_func_end sub_01FFB62C - - .global _01FFB654 -_01FFB654: - .byte 0x05, 0x03, 0x00, 0x00 diff --git a/asm/os_reset_itcm.s b/asm/os_reset_itcm.s new file mode 100644 index 00000000..b884b755 --- /dev/null +++ b/asm/os_reset_itcm.s @@ -0,0 +1,209 @@ + .include "asm/macros.inc" + .include "itcm.inc" + + .section .itcm,4,1,4 + + arm_func_start OSi_DoResetSystem +OSi_DoResetSystem: ; 0x01FF97CC + stmdb sp!, {r3, lr} + ldr r0, _01FF97F8 ; =OSi_IsInitReset +_01FF97D4: + ldrh r1, [r0] + cmp r1, #0 + beq _01FF97D4 + ldr r0, _01FF97FC ; =0x04000208 + mov r1, #0 + strh r1, [r0] + bl OSi_ReloadRomData + bl OSi_DoBoot + ldmia sp!, {r3, pc} + .align 2, 0 +_01FF97F8: .word OSi_IsInitReset +_01FF97FC: .word 0x04000208 + arm_func_end OSi_DoResetSystem + + arm_func_start OSi_DoBoot +OSi_DoBoot: ; 0x01FF9800 + mov ip, #0x4000000 + str ip, [ip, #0x208] + ldr r1, _01FF98AC ; =OS_IRQTable + add r1, r1, #0x3fc0 + add r1, r1, #0x3c + mov r0, #0 + str r0, [r1] + ldr r1, _01FF98B0 ; =0x04000180 +_01FF9820: + ldrh r0, [r1] + and r0, r0, #0xf + cmp r0, #1 + bne _01FF9820 + mov r0, #0x100 + strh r0, [r1] + mov r0, #0 + ldr r3, _01FF98B4 ; =0x027FFD9C + ldr r4, [r3] + ldr r1, _01FF98B8 ; =0x027FFD80 + mov r2, #0x80 + bl OSi_CpuClear32 + str r4, [r3] + ldr r1, _01FF98BC ; =0x027FFF80 + mov r2, #0x18 + bl OSi_CpuClear32 + ldr r1, _01FF98C0 ; =0x027FFF98 + strh r0, [r1] + ldr r1, _01FF98C4 ; =0x027FFF9C + mov r2, #0x64 + bl OSi_CpuClear32 + ldr r1, _01FF98B0 ; =0x04000180 +_01FF9878: + ldrh r0, [r1] + and r0, r0, #0xf + cmp r0, #1 + beq _01FF9878 + mov r0, #0 + strh r0, [r1] + ldr r3, _01FF98C8 ; =0x027FFE00 + ldr ip, [r3, #0x24] + mov lr, ip + ldr fp, _01FF98BC ; =0x027FFF80 + ldmia fp, {r0, r1, r2, r3, r4, r5, r6, r7, r8, sb, sl} + mov fp, #0 + bx ip + .align 2, 0 +_01FF98AC: .word OS_IRQTable +_01FF98B0: .word 0x04000180 +_01FF98B4: .word 0x027FFD9C +_01FF98B8: .word 0x027FFD80 +_01FF98BC: .word 0x027FFF80 +_01FF98C0: .word 0x027FFF98 +_01FF98C4: .word 0x027FFF9C +_01FF98C8: .word 0x027FFE00 + arm_func_end OSi_DoBoot + + arm_func_start OSi_CpuClear32 +OSi_CpuClear32: ; 0x01FF98CC + add ip, r1, r2 +_01FF98D0: + cmp r1, ip + blt _01FF98DC + b _01FF98E0 +_01FF98DC: + stmia r1!, {r0} +_01FF98E0: + blt _01FF98D0 + bx lr + arm_func_end OSi_CpuClear32 + + arm_func_start OSi_ReloadRomData +OSi_ReloadRomData: ; 0x01FF98E8 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + ldr r1, _01FF9988 ; =0x027FFC2C + ldr r4, [r1] + cmp r4, #0x8000 + blo _01FF990C + mov r0, r4 + add r1, r1, #0x1d4 + mov r2, #0x160 + bl OSi_ReadCardRom32 +_01FF990C: + ldr r0, _01FF998C ; =0x027FFE20 + ldr r5, [r0] + ldr r6, [r0, #8] + ldr r7, [r0, #0xc] + ldr r8, [r0, #0x10] + ldr sb, [r0, #0x18] + ldr sl, [r0, #0x1c] + bl EnableIrqFlag + mov fp, r0 + bl DC_StoreAll + bl DC_InvalidateAll + mov r0, fp + bl SetIrqFlag + bl IC_InvalidateAll + bl DC_WaitWriteBufferEmpty + add r5, r5, r4 + cmp r5, #0x8000 + bhs _01FF9964 + rsb r0, r5, #0x8000 + add r6, r6, r0 + sub r7, r7, r0 + mov r5, #0x8000 +_01FF9964: + mov r0, r5 + mov r1, r6 + mov r2, r7 + bl OSi_ReadCardRom32 + mov r1, sb + mov r2, sl + add r0, r8, r4 + bl OSi_ReadCardRom32 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_01FF9988: .word 0x027FFC2C +_01FF998C: .word 0x027FFE20 + arm_func_end OSi_ReloadRomData + + arm_func_start OSi_ReadCardRom32 +OSi_ReadCardRom32: ; 0x01FF9990 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r4, _01FF9A54 ; =0x027FFE60 + ldr r3, _01FF9A58 ; =0x000001FF + ldr r5, [r4] + and r4, r0, r3 + bic r3, r5, #0x7000000 + ldr r5, _01FF9A5C ; =0x040001A4 + orr r3, r3, #0xa1000000 + rsb ip, r4, #0 +_01FF99B4: + ldr r4, [r5] + tst r4, #0x80000000 + bne _01FF99B4 + ldr r7, _01FF9A60 ; =0x040001A1 + mov r4, #0x80 + strb r4, [r7] + cmp ip, r2 + add r0, r0, ip + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r4, _01FF9A64 ; =0x04100010 + mov sb, r0, lsr #8 + mov r6, #0xb7 + mov r5, #0 +_01FF99E8: + strb r6, [r7, #7] + mov lr, r0, lsr #0x18 + strb lr, [r7, #8] + mov lr, r0, lsr #0x10 + strb lr, [r7, #9] + strb sb, [r7, #0xa] + strb r0, [r7, #0xb] + strb r5, [r7, #0xc] + strb r5, [r7, #0xd] + strb r5, [r7, #0xe] + str r3, [r7, #3] +_01FF9A14: + ldr r8, [r7, #3] + tst r8, #0x800000 + beq _01FF9A38 + cmp ip, #0 + ldr lr, [r4] + blt _01FF9A34 + cmp ip, r2 + strlt lr, [r1, ip] +_01FF9A34: + add ip, ip, #4 +_01FF9A38: + tst r8, #0x80000000 + bne _01FF9A14 + cmp ip, r2 + add sb, sb, #2 + add r0, r0, #0x200 + blt _01FF99E8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_01FF9A54: .word 0x027FFE60 +_01FF9A58: .word 0x000001FF +_01FF9A5C: .word 0x040001A4 +_01FF9A60: .word 0x040001A1 +_01FF9A64: .word 0x04100010 + arm_func_end OSi_ReadCardRom32 + diff --git a/include/dungeon_ai_movement.h b/include/dungeon_ai_movement.h index 71ea5ca2..83b01535 100644 --- a/include/dungeon_ai_movement.h +++ b/include/dungeon_ai_movement.h @@ -15,4 +15,6 @@ void AiMovement(struct entity *monster, bool8 show_run_away_effect); // Calculates the target position of an AI-controlled monster and stores it in the monster's ai_target_pos field bool8 CalculateAiTargetPos(struct entity *monster); +void sub_01FFB62C(struct entity *entity); + #endif //PMDSKY_DUNGEON_AI_MOVEMENT_H diff --git a/main.lsf b/main.lsf index 6f484ca6..5f3359fe 100644 --- a/main.lsf +++ b/main.lsf @@ -341,10 +341,10 @@ Autoload ITCM { Address 0x01FF8000 Object asm/itcm.o (.itcm) + Object asm/os_reset_itcm.o (.itcm) Object lib/NitroSDK/src/mi/mi_dma.o (.itcm) Object asm/itcm_1.o (.itcm) Object src/dungeon_ai_movement.o (.itcm) - Object asm/itcm_01FFB62C.o (.itcm) Object src/dungeon_ai_itcm.o (.itcm) Object asm/itcm_01FFBD20.o (.itcm) } diff --git a/src/dungeon_ai_movement.c b/src/dungeon_ai_movement.c index 3a7da914..a380216a 100644 --- a/src/dungeon_ai_movement.c +++ b/src/dungeon_ai_movement.c @@ -1816,3 +1816,15 @@ bool8 CalculateAiTargetPos(struct entity *monster) pokemon_info->ai_target.ai_target_pos.y = monster->pos.y + DIRECTIONS_XY[target_facing_dir].y; return TRUE; } + +void sub_01FFB62C(struct entity *entity) { + struct monster *mon = entity->info; + + mon->ai_target.ai_objective = AI_UNKNOWN; + mon->ai_target.ai_target_pos.x = *(u16 *)&entity->pos.x; + mon->ai_target.ai_target_pos.y = *(u16 *)&entity->pos.y; + mon->ai_target.ai_target = 0; + mon->ai_target.ai_target_spawn_genid = 0; +} + +enum type_id _01FFB654[4] = { TYPE_ELECTRIC, TYPE_WATER, TYPE_NONE, TYPE_NONE}; From f5f90cb7a194d658401cd58599b19cbcae9e1e41 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 23 Jul 2026 16:47:54 -0700 Subject: [PATCH 08/10] Match LightningRodStormDrainCheck thanks to @taxicat1 and other funcs --- asm/itcm_01FFBD20.s | 237 -------------------------------------- include/dungeon.h | 18 ++- include/dungeon_ai_itcm.h | 5 + main.lsf | 1 - src/dungeon_ai_itcm.c | 113 ++++++++++++++++++ 5 files changed, 125 insertions(+), 249 deletions(-) delete mode 100644 asm/itcm_01FFBD20.s diff --git a/asm/itcm_01FFBD20.s b/asm/itcm_01FFBD20.s deleted file mode 100644 index 717420f6..00000000 --- a/asm/itcm_01FFBD20.s +++ /dev/null @@ -1,237 +0,0 @@ - .include "asm/macros.inc" - .include "itcm_01FFBD20.inc" - - .section .itcm,4,1,4 - - arm_func_start sub_01FFBD20 -sub_01FFBD20: ; 0x01FFBD20 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r6, r1 - mov r7, r0 - mov r0, r6 - bl IsMonster__0231A9D4 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - ldr r5, [r6, #0xb4] - ldrb r0, [r5, #6] - cmp r0, #0 - beq _01FFBD5C - ldrb r0, [r5, #8] - cmp r0, #0 - moveq r3, #1 - beq _01FFBD60 -_01FFBD5C: - mov r3, #0 -_01FFBD60: - ldr r1, _01FFBDF0 ; =DUNGEON_PTR - mov r0, r6 - ldr r2, [r1] - mov r1, #0x32 -#ifdef JAPAN - add r2, r2, #0x1840 - add r2, r2, #0x18000 -#else - add r2, r2, #0xe4 - add r2, r2, #0x19800 -#endif - add r4, r2, r3, lsl #4 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _01FFBDB0 - ldr r0, [r4] - cmp r0, #0 - bne _01FFBDB0 - mov r0, r7 - mov r1, r6 - bl sub_01FFBF78 - cmp r0, #0 - strne r6, [r4] - ldrne r0, [r5, #0xb0] - strne r0, [r4, #4] -_01FFBDB0: - mov r0, r6 - mov r1, #0x7a - bl AbilityIsActiveVeneer - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - ldr r0, [r4, #8] - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r7 - mov r1, r6 - bl sub_01FFBF78 - cmp r0, #0 - strne r6, [r4, #8] - ldrne r0, [r5, #0xb0] - strne r0, [r4, #0xc] - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_01FFBDF0: .word DUNGEON_PTR - arm_func_end sub_01FFBD20 - - arm_func_start sub_01FFBDF4 -sub_01FFBDF4: ; 0x01FFBDF4 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r0 - bl ov29_0231B008 - mov r0, r7 - bl EntityIsValid__02319F8C - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - ldr r4, _01FFBE58 ; =DUNGEON_PTR - mov r5, #0 -_01FFBE18: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r6, [r0, #0xad4] -#else - ldr r6, [r0, #0xb78] -#endif - mov r0, r6 - bl EntityIsValid__02319F8C - cmp r0, #0 - cmpne r7, r6 - beq _01FFBE48 - mov r0, r7 - mov r1, r6 - bl sub_01FFBD20 -_01FFBE48: - add r5, r5, #1 - cmp r5, #0x14 - blt _01FFBE18 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_01FFBE58: .word DUNGEON_PTR - arm_func_end sub_01FFBDF4 - - arm_func_start LightningRodStormDrainCheck -LightningRodStormDrainCheck: ; 0x01FFBE5C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov sl, r0 - mov sb, r1 - mov r8, r2 - mov r7, r3 - mov r5, #0 - ldr r4, _01FFBF70 ; =_01FFB654 - ldr fp, _01FFBF74 ; =DUNGEON_PTR - b _01FFBF60 -_01FFBE80: - ldr r1, [fp] - mov r0, sl -#ifdef JAPAN - add r1, r1, #0x1840 - add r1, r1, #0x18000 -#else - add r1, r1, #0xe4 - add r1, r1, #0x19800 -#endif - add r6, r1, r5, lsl #4 - mov r1, #0x53 - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _01FFBF5C - mov r0, sl - mov r1, r8 - bl GetMoveTypeForMonster - ldrb r1, [r4, r7] - cmp r1, r0 - bne _01FFBF5C - mov r0, sl - mov r1, r8 - mov r2, #0 - bl GetEntityMoveTargetAndRange - and r0, r0, #0xf0 - cmp r0, #0x70 - beq _01FFBF5C - ldr r0, [r6, r7, lsl #3] - bl IsMonster__0231A9D4 - cmp r0, #0 - beq _01FFBF4C - ldr r0, [r6, r7, lsl #3] - add r1, r6, r7, lsl #3 - ldr r2, [r1, #4] - ldr r1, [r0, #0xb4] - ldr r1, [r1, #0xb0] - cmp r2, r1 - bne _01FFBF4C - mov r1, sl - mov r2, #1 - mov r3, #0 - bl GetTreatmentBetweenMonsters - cmp r0, #1 - bne _01FFBF4C - ldr r0, [sb, #0xb4] - ldr r2, [r6, r7, lsl #3] -#ifdef JAPAN - ldrb r0, [r0, #0x10a] - ldr r1, [r2, #0xb4] - cmp r0, #0 - ldreqb r0, [r1, #0x10a] -#else - ldrb r0, [r0, #0x10b] - ldr r1, [r2, #0xb4] - cmp r0, #0 - ldreqb r0, [r1, #0x10b] -#endif - cmpeq r0, #0 - beq _01FFBF44 - cmp sb, r2 - bne _01FFBF4C -_01FFBF44: - mov r0, #1 - b _01FFBF50 -_01FFBF4C: - mov r0, #0 -_01FFBF50: - cmp r0, #0 - ldrne r0, [r6, r7, lsl #3] - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_01FFBF5C: - add r5, r5, #1 -_01FFBF60: - cmp r5, #2 - blt _01FFBE80 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_01FFBF70: .word _01FFB654 -_01FFBF74: .word DUNGEON_PTR - arm_func_end LightningRodStormDrainCheck - - arm_func_start sub_01FFBF78 -sub_01FFBF78: ; 0x01FFBF78 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x10 - mov r6, r0 - mov r5, r1 - mov r4, #0 - bl ResetAiCanAttackInDirection - mov r0, r6 - mov r1, r5 - bl CanSeeTarget - cmp r0, #0 - beq _01FFBFD8 - add r0, sp, #8 - mov r1, r4 - bl InitMove - add r0, sp, #8 - str r0, [sp] - mov ip, #1 - mov r2, r6 - mov r3, r5 - mov r0, r4 - mov r1, #0x30 - str ip, [sp, #4] - bl TryAddTargetToAiTargetList - mov r4, r0 -_01FFBFD8: - cmp r4, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - add sp, sp, #0x10 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end sub_01FFBF78 - ; 0x01FFBFF0 diff --git a/include/dungeon.h b/include/dungeon.h index bb2ded90..c929a9af 100644 --- a/include/dungeon.h +++ b/include/dungeon.h @@ -32,6 +32,11 @@ struct monster_slots { struct entity* wild_pokemon[DUNGEON_MAX_WILD_POKEMON]; }; +struct monster_id_struct { + struct entity *entity; + u32 entity_id; // 0x198E8: statuses::unique_id from that monster? +}; + struct weather { enum weather_id weather; // 0x0: current weather // 0x1: Default weather on the floor that will be reverted to if the current weather is @@ -1615,17 +1620,8 @@ struct dungeon { struct entity entities[149]; // 0x12DCC / 0x2A4 : All the entities in a dungeon // 0x198E4: An ally monster related to storm drain/lightning rod and maybe other checks? - struct entity* unk_ally_monster1; - u32 unk_ally_monster_unique_id1; // 0x198E8: statuses::unique_id from that monster? - // 0x198EC: An ally monster related to storm drain/lightning rod and maybe other checks? - struct entity* unk_ally_monster2; - u32 unk_ally_monster_unique_id2; // 0x198F0: statuses::unique_id from that monster? - // 0x198F4: An enemy monster related to storm drain/lightning rod and maybe other checks? - struct entity* unk_enemy_monster1; - u32 unk_enemy_monster_unique_id1; // 0x198F8: statuses::unique_id from that monster? - // 0x198FC: An enemy monster related to storm drain/lightning rod and maybe other checks? - struct entity* unk_enemy_monster2; - u32 unk_enemy_monster_unique_id2; // 0x19900: statuses::unique_id from that monster? + struct monster_id_struct storm_drain_lightning_rod[4]; // 0 = ally, 1 = enemy + // 0x19904: Pointer to the monster that will snatch the effect of a move. struct entity* snatch_monster; // 0x19908: Pointer to the entity to be spawned by the effect of Illuminate diff --git a/include/dungeon_ai_itcm.h b/include/dungeon_ai_itcm.h index 3e863c9c..e650413c 100644 --- a/include/dungeon_ai_itcm.h +++ b/include/dungeon_ai_itcm.h @@ -7,4 +7,9 @@ // Determines if an AI-controlled monster will use a move and which one it will use. void ChooseAiMove(struct entity *monster); +void sub_01FFBD20(struct entity *monster, struct entity *target); +void sub_01FFBDF4(struct entity *monster); +struct entity *LightningRodStormDrainCheck(struct entity *monster, struct entity* target, struct move *move, s32 arg3); +bool8 sub_01FFBF78(struct entity *pokemon, struct entity *target); + #endif //PMDSKY_DUNGEON_AI_ITCM_H diff --git a/main.lsf b/main.lsf index 5f3359fe..cacd3729 100644 --- a/main.lsf +++ b/main.lsf @@ -346,7 +346,6 @@ Autoload ITCM Object asm/itcm_1.o (.itcm) Object src/dungeon_ai_movement.o (.itcm) Object src/dungeon_ai_itcm.o (.itcm) - Object asm/itcm_01FFBD20.o (.itcm) } Autoload DTCM diff --git a/src/dungeon_ai_itcm.c b/src/dungeon_ai_itcm.c index 67d4a0cb..a143c109 100644 --- a/src/dungeon_ai_itcm.c +++ b/src/dungeon_ai_itcm.c @@ -6,6 +6,7 @@ #include "dungeon_ai_attack.h" #include "dungeon_ai_parameters.h" #include "dungeon_ai_targeting.h" +#include "dungeon_ai_targeting_1.h" #include "dungeon_capabilities_3.h" #include "dungeon_capabilities_4.h" #include "dungeon_logic_5.h" @@ -17,11 +18,15 @@ #include "dungeon_pokemon_attributes.h" #include "dungeon_pokemon_attributes_1.h" #include "dungeon_util_static.h" +#include "dungeon_visibility.h" #include "fixed_room_data.h" #include "main_0201398C.h" #include "moves_1.h" #include "overlay_29_022EBC50.h" #include "overlay_29_02338350.h" +#include "overlay_29_0231A9D4.h" +#include "overlay_29_0231ACAC.h" +#include "targeting.h" #ifdef SDK_ARM9 #include @@ -785,6 +790,114 @@ _01FFBD0C: } #endif +extern bool8 sub_01FFBF78(struct entity *pokemon, struct entity *target); +extern void ov29_0231B008(); + +void sub_01FFBD20(struct entity *monster, struct entity *target) +{ + s32 index; + struct monster_id_struct* temp_r4; + struct monster* info; + + if (!IsMonster__0231A9D4(target)) return; + + info = GetEntInfo(target); + if (info->is_not_team_member && !info->is_ally) + { + index = 1; + } else { + index = 0; + } + + temp_r4 = &DUNGEON_PTR[0]->storm_drain_lightning_rod[index * 2]; + if ((AbilityIsActiveVeneer(target, ABILITY_LIGHTNINGROD)) && (temp_r4->entity == NULL) && (sub_01FFBF78(monster, target))) + { + temp_r4->entity = target; + temp_r4->entity_id = info->unique_id; + } + + if (!AbilityIsActiveVeneer(target, ABILITY_STORM_DRAIN)) return; + + temp_r4++; + if (temp_r4->entity != NULL) return; + + if (sub_01FFBF78(monster, target)) + { + temp_r4->entity = target; + temp_r4->entity_id = info->unique_id; + } +} + +void sub_01FFBDF4(struct entity *monster) +{ + ov29_0231B008(); + + if (!EntityIsValid__02319F8C(monster)) return; + + for(s32 index = 0; index < DUNGEON_MAX_POKEMON; index++) + { + struct entity *target = DUNGEON_PTR[0]->active_monster_ptrs[index]; + if ((EntityIsValid__02319F8C(target)) && (monster != target)) + { + sub_01FFBD20(monster, target); + } + } +} + +extern enum type_id _01FFB654[4]; + +struct entity *LightningRodStormDrainCheck(struct entity *monster, struct entity* target, struct move *move, s32 arg3) +{ + s32 index; + struct monster_id_struct* temp_r6; + s32 var_r0; + + for(index = 0; index < 2; index++) + { + temp_r6 = &DUNGEON_PTR[0]->storm_drain_lightning_rod[index * 2]; + if ((!AbilityIsActiveVeneer(monster, ABILITY_MOLD_BREAKER)) && + (_01FFB654[arg3] == GetMoveTypeForMonster(monster, move)) && + ((GetEntityMoveTargetAndRange(monster, move, 0) & 0xF0) != 0x70) + ) { + if ((IsMonster__0231A9D4(temp_r6[arg3].entity)) && + (temp_r6[arg3].entity_id == GetEntInfo(temp_r6[arg3].entity)->unique_id) && + (GetTreatmentBetweenMonsters(temp_r6[arg3].entity, monster, TRUE, FALSE) == TREATMENT_TREAT_AS_ENEMY) + ) { + struct monster* info1 = GetEntInfo(target); + struct monster* info2 = GetEntInfo(temp_r6[arg3].entity); + + if ((!info1->two_turn_move_invincible && !info2->two_turn_move_invincible) || target == temp_r6[arg3].entity) { + var_r0 = 1; + } else { + goto _branch_0; + } + } else { +_branch_0: + var_r0 = 0; + } + if (var_r0 != 0) { + return temp_r6[arg3].entity; + } + } + } + + return 0; +} + +bool8 sub_01FFBF78(struct entity *pokemon, struct entity *target) +{ + struct move move; + s32 result; + + result = FALSE; + ResetAiCanAttackInDirection(); + if (CanSeeTarget(pokemon, target)) { + InitMove(&move, MOVE_NOTHING); + result = TryAddTargetToAiTargetList(0, 0x30, pokemon, target, &move, TRUE); + } + return result != 0; +} + #ifdef SDK_ARM9 #include #endif //SDK_ARM9 From 14bdd0ab84fd6d980aa262e0c46aa89a47ed56ac Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 23 Jul 2026 18:00:33 -0700 Subject: [PATCH 09/10] decomp few DSE funcs --- lib/DSE/asm/main_02071CC8.s | 92 --------------------------------- lib/DSE/include/dc_envelope.h | 44 +--------------- lib/DSE/include/dse.h | 5 ++ lib/DSE/include/main_02071BF4.h | 8 +++ lib/DSE/include/main_02071E34.h | 1 + lib/DSE/src/dc_envelope.c | 5 +- lib/DSE/src/main_02071BF4.c | 52 +++++++++++++++++++ lib/DSE/src/main_02071E34.c | 5 ++ src/main_0206C98C.c | 6 +-- 9 files changed, 79 insertions(+), 139 deletions(-) diff --git a/lib/DSE/asm/main_02071CC8.s b/lib/DSE/asm/main_02071CC8.s index 46e641f8..71c162f8 100644 --- a/lib/DSE/asm/main_02071CC8.s +++ b/lib/DSE/asm/main_02071CC8.s @@ -3,92 +3,6 @@ .text - arm_func_start DseTrackEvent_RestoreEnvelopeDefaults -DseTrackEvent_RestoreEnvelopeDefaults: ; 0x02071CC8 - stmdb sp!, {r4, lr} - mov r4, r0 - add r0, r3, #0x64 - bl SoundEnvelopeParameters_Reset - mov r0, r4 - ldmia sp!, {r4, pc} - arm_func_end DseTrackEvent_RestoreEnvelopeDefaults - - arm_func_start DseTrackEvent_SetEnvelopeAttackBegin -DseTrackEvent_SetEnvelopeAttackBegin: ; 0x02071CE0 - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r1, [r4] - add r0, r3, #0x64 - strb r1, [r3, #0x6c] - bl SoundEnvelopeParameters_CheckValidity - add r0, r4, #1 - ldmia sp!, {r4, pc} - arm_func_end DseTrackEvent_SetEnvelopeAttackBegin - - arm_func_start DseTrackEvent_SetEnvelopeAttackTime -DseTrackEvent_SetEnvelopeAttackTime: ; 0x02071D00 - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r1, [r4] - add r0, r3, #0x64 - strb r1, [r3, #0x6d] - bl SoundEnvelopeParameters_CheckValidity - add r0, r4, #1 - ldmia sp!, {r4, pc} - arm_func_end DseTrackEvent_SetEnvelopeAttackTime - - arm_func_start DseTrackEvent_SetEnvelopeHoldTime -DseTrackEvent_SetEnvelopeHoldTime: ; 0x02071D20 - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r1, [r4] - add r0, r3, #0x64 - strb r1, [r3, #0x70] - bl SoundEnvelopeParameters_CheckValidity - add r0, r4, #1 - ldmia sp!, {r4, pc} - arm_func_end DseTrackEvent_SetEnvelopeHoldTime - - arm_func_start DseTrackEvent_SetEnvelopeDecayTimeAndSustainLevel -DseTrackEvent_SetEnvelopeDecayTimeAndSustainLevel: ; 0x02071D40 - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r0, [r4] - cmp r0, #0xff - strneb r0, [r3, #0x6e] - ldrb r0, [r4, #1] - cmp r0, #0xff - strneb r0, [r3, #0x6f] - add r0, r3, #0x64 - bl SoundEnvelopeParameters_CheckValidity - add r0, r4, #2 - ldmia sp!, {r4, pc} - arm_func_end DseTrackEvent_SetEnvelopeDecayTimeAndSustainLevel - - arm_func_start DseTrackEvent_SetEnvelopeSustainTime -DseTrackEvent_SetEnvelopeSustainTime: ; 0x02071D70 - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r1, [r4] - add r0, r3, #0x64 - strb r1, [r3, #0x71] - bl SoundEnvelopeParameters_CheckValidity - add r0, r4, #1 - ldmia sp!, {r4, pc} - arm_func_end DseTrackEvent_SetEnvelopeSustainTime - - arm_func_start DseTrackEvent_SetEnvelopeReleaseTime -DseTrackEvent_SetEnvelopeReleaseTime: ; 0x02071D90 - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r1, [r4] - add r0, r3, #0x64 - strb r1, [r3, #0x72] - bl SoundEnvelopeParameters_CheckValidity - add r0, r4, #1 - ldmia sp!, {r4, pc} - arm_func_end DseTrackEvent_SetEnvelopeReleaseTime - arm_func_start DseTrackEvent_SetNoteDurationMultiplier DseTrackEvent_SetNoteDurationMultiplier: ; 0x02071DB0 ldrb r1, [r0], #1 @@ -140,9 +54,3 @@ DseTrackEvent_SetOptionalVolume: ; 0x02071E20 strb r1, [r3, #0x58] bx lr arm_func_end DseTrackEvent_SetOptionalVolume - - arm_func_start DseTrackEvent_Dummy2Bytes -DseTrackEvent_Dummy2Bytes: ; 0x02071E2C - add r0, r0, #2 - bx lr - arm_func_end DseTrackEvent_Dummy2Bytes diff --git a/lib/DSE/include/dc_envelope.h b/lib/DSE/include/dc_envelope.h index 3a9d1ea1..22b09dd0 100644 --- a/lib/DSE/include/dc_envelope.h +++ b/lib/DSE/include/dc_envelope.h @@ -1,6 +1,8 @@ #ifndef PMDSKY_DC_ENVELOPE_H #define PMDSKY_DC_ENVELOPE_H +#include "dse.h" + #define ENVELOPE_STATE_OFF ((u8)0x00) #define ENVELOPE_STATE_CONST ((u8)0x01) #define ENVELOPE_STATE_DONE ((u8)0x02) @@ -11,48 +13,6 @@ #define ENVELOPE_STATE_RELEASE ((u8)0x07) #define ENVELOPE_STATE_RELEASE_END ((u8)0x08) -struct sound_envelope_parameters -{ - u8 use_envelope; - u8 slide_time_multiplier; - u16 unknown; - u32 unknown_2; - //+0x08 - u8 attack_begin; - u8 attack_time; - u8 decay_time; - u8 sustain_level; - u8 hold_time; - u8 sustain_time; - u8 release_time; - u8 unknown_3; - //+0x10 -}; - -struct sound_envelope -{ - struct sound_envelope_parameters parameters; - //+0x10 - s32 current_volume; - s32 volume_delta; - s32 ticks_left; - u8 state; - u8 target_volume; - u8 update_volume; - //+0x20 -}; - -struct driver_work { - u8 fill0[0x27]; - s16 usec_per_sound_driver_tick; - u8 fill1[0x6c8]; - void* heap_start; - void* heap_end; - void* heap_size; -}; - -extern struct driver_work DRIVER_WORK; - void SoundEnvelope_Reset(struct sound_envelope *envelope); void SoundEnvelopeParameters_Reset(struct sound_envelope_parameters *parameters); void SoundEnvelopeParameters_CheckValidity(struct sound_envelope_parameters *parameters); diff --git a/lib/DSE/include/dse.h b/lib/DSE/include/dse.h index ef0d8861..0ddede90 100644 --- a/lib/DSE/include/dse.h +++ b/lib/DSE/include/dse.h @@ -60,16 +60,19 @@ struct sound_envelope_parameters { u8 sustain_time; u8 release_time; u8 unk_0xf; + //+0x10 }; struct sound_envelope { struct sound_envelope_parameters parameters; + //+0x10 s32 current_volume; s32 volume_delta; s32 ticks_left; u8 state; u8 target_volume; u8 update_volume; + //+0x20 }; struct dse_track { @@ -461,4 +464,6 @@ struct dse_driver_work { void* loading_bank_pcm_data; }; +extern struct dse_driver_work DRIVER_WORK; + #endif //PMDSKY_DSE_H diff --git a/lib/DSE/include/main_02071BF4.h b/lib/DSE/include/main_02071BF4.h index 1d470470..2adaf5ce 100644 --- a/lib/DSE/include/main_02071BF4.h +++ b/lib/DSE/include/main_02071BF4.h @@ -6,5 +6,13 @@ u8* DseTrackEvent_Dummy1Byte(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); u8* DseTrackEvent_SetInstrument(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); u8* DseTrackEvent_SongVolumeFade(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_RestoreEnvelopeDefaults(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_SetEnvelopeAttackBegin(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_SetEnvelopeAttackTime(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_SetEnvelopeHoldTime(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_SetEnvelopeDecayTimeAndSustainLevel(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_SetEnvelopeSustainTime(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_SetEnvelopeReleaseTime(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); + #endif //PMDSKY_MAIN_02071BF4_H diff --git a/lib/DSE/include/main_02071E34.h b/lib/DSE/include/main_02071E34.h index cd7af4fc..83b3321b 100644 --- a/lib/DSE/include/main_02071E34.h +++ b/lib/DSE/include/main_02071E34.h @@ -3,6 +3,7 @@ #include "dse.h" +u8* DseTrackEvent_Dummy2Bytes(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); u8* DseTrackEvent_SetTuning(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); #endif //PMDSKY_MAIN_02071E34_H diff --git a/lib/DSE/src/dc_envelope.c b/lib/DSE/src/dc_envelope.c index 5efbfeb7..676c6031 100644 --- a/lib/DSE/src/dc_envelope.c +++ b/lib/DSE/src/dc_envelope.c @@ -1,4 +1,5 @@ #include "dc_envelope.h" +#include "dse.h" extern u16 MUSIC_DURATION_LOOKUP_TABLE_1[128]; extern u32 MUSIC_DURATION_LOOKUP_TABLE_2[128]; @@ -102,11 +103,11 @@ void SoundEnvelope_SetSlide(struct sound_envelope *envelope, s32 target_volume, if (slide_time_multiplier == 0) { - envelope->ticks_left = MUSIC_DURATION_LOOKUP_TABLE_2[msec_tab_index] * 1000 / DRIVER_WORK.usec_per_sound_driver_tick; + envelope->ticks_left = MUSIC_DURATION_LOOKUP_TABLE_2[msec_tab_index] * 1000 / DRIVER_WORK.microseconds_per_driver_tick; } else { - envelope->ticks_left = slide_time_multiplier * MUSIC_DURATION_LOOKUP_TABLE_1[msec_tab_index] * 1000 / DRIVER_WORK.usec_per_sound_driver_tick; + envelope->ticks_left = slide_time_multiplier * MUSIC_DURATION_LOOKUP_TABLE_1[msec_tab_index] * 1000 / DRIVER_WORK.microseconds_per_driver_tick; } if (envelope->ticks_left != 0) diff --git a/lib/DSE/src/main_02071BF4.c b/lib/DSE/src/main_02071BF4.c index f27c1b40..462ffdf8 100644 --- a/lib/DSE/src/main_02071BF4.c +++ b/lib/DSE/src/main_02071BF4.c @@ -1,4 +1,5 @@ #include "main_02071BF4.h" +#include "dc_envelope.h" extern struct dse_driver_work DRIVER_WORK; @@ -56,3 +57,54 @@ u8* DseTrackEvent_SongVolumeFade(u8 *ptr_next_byte, struct dse_sequence *sequenc (sequence->volume).ticks_remaining = (short)uVar4; return ptr_next_byte + 3; } + +u8* DseTrackEvent_RestoreEnvelopeDefaults(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + SoundEnvelopeParameters_Reset(&channel->envelope_override); + return ptr_next_byte; +} + +u8* DseTrackEvent_SetEnvelopeAttackBegin(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + channel->envelope_override.attack_begin = *ptr_next_byte; + SoundEnvelopeParameters_CheckValidity(&channel->envelope_override); + return ptr_next_byte + 1; +} + +u8* DseTrackEvent_SetEnvelopeAttackTime(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + channel->envelope_override.attack_time = *ptr_next_byte; + SoundEnvelopeParameters_CheckValidity(&channel->envelope_override); + return ptr_next_byte + 1; +} + +u8* DseTrackEvent_SetEnvelopeHoldTime(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + channel->envelope_override.hold_time = *ptr_next_byte; + SoundEnvelopeParameters_CheckValidity(&channel->envelope_override); + return ptr_next_byte + 1; +} + +u8* DseTrackEvent_SetEnvelopeDecayTimeAndSustainLevel(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + + if(ptr_next_byte[0] != 0xFF) channel->envelope_override.decay_time = ptr_next_byte[0]; + if(ptr_next_byte[1] != 0xFF) channel->envelope_override.sustain_level = ptr_next_byte[1]; + + SoundEnvelopeParameters_CheckValidity(&channel->envelope_override); + return ptr_next_byte + 2; +} + +u8* DseTrackEvent_SetEnvelopeSustainTime(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + channel->envelope_override.sustain_time = *ptr_next_byte; + SoundEnvelopeParameters_CheckValidity(&channel->envelope_override); + return ptr_next_byte + 1; +} + +u8* DseTrackEvent_SetEnvelopeReleaseTime(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + channel->envelope_override.release_time = *ptr_next_byte; + SoundEnvelopeParameters_CheckValidity(&channel->envelope_override); + return ptr_next_byte + 1; +} diff --git a/lib/DSE/src/main_02071E34.c b/lib/DSE/src/main_02071E34.c index bb35b940..ba4ef7b7 100644 --- a/lib/DSE/src/main_02071E34.c +++ b/lib/DSE/src/main_02071E34.c @@ -2,6 +2,11 @@ #define IME (*(vu16*)0x4000208) +u8* DseTrackEvent_Dummy2Bytes(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + return ptr_next_byte + 2; +} + u8* DseTrackEvent_SetTuning(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) { s16 tune = *(s8*)ptr_next_byte<<8; diff --git a/src/main_0206C98C.c b/src/main_0206C98C.c index 58ec9cf6..763a558e 100644 --- a/src/main_0206C98C.c +++ b/src/main_0206C98C.c @@ -1,9 +1,9 @@ #include "main_0206C98C.h" -#include "dc_envelope.h" +#include "dse.h" void DseMem_Quit(void) { - DRIVER_WORK.heap_start=0; + DRIVER_WORK.heap_node_list=0; DRIVER_WORK.heap_end=0; DRIVER_WORK.heap_size=0; } @@ -13,4 +13,4 @@ void* DseMem_AllocateUser(u32 size, u32 alignment) DseMem_Allocate(size,alignment,0x72657375); } -void* DseMem_Allocate(u32 size, u32 alignment, u32 label); \ No newline at end of file +void* DseMem_Allocate(u32 size, u32 alignment, u32 label); From 25a790db5e9bcd60f60cabac6edbd533326c49b2 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 24 Jul 2026 19:31:21 -0700 Subject: [PATCH 10/10] more dse decomp --- lib/DSE/asm/main_02071AC0.s | 16 ------- lib/DSE/asm/main_02071CC8.s | 56 ------------------------ lib/DSE/include/main_02071BF4.h | 8 ++++ lib/DSE/include/main_02071E34.h | 9 ---- lib/DSE/src/main_02071BF4.c | 76 +++++++++++++++++++++++++++++++++ lib/DSE/src/main_02071E34.c | 28 ------------ main.lsf | 2 - 7 files changed, 84 insertions(+), 111 deletions(-) delete mode 100644 lib/DSE/asm/main_02071CC8.s delete mode 100644 lib/DSE/include/main_02071E34.h delete mode 100644 lib/DSE/src/main_02071E34.c diff --git a/lib/DSE/asm/main_02071AC0.s b/lib/DSE/asm/main_02071AC0.s index c1355086..589a7a4c 100644 --- a/lib/DSE/asm/main_02071AC0.s +++ b/lib/DSE/asm/main_02071AC0.s @@ -91,19 +91,3 @@ DseTrackEvent_SetBankMsb: ; 0x02071B8C add r0, r4, #1 ldmia sp!, {r4, pc} arm_func_end DseTrackEvent_SetBankMsb - - arm_func_start DseTrackEvent_SetBankLsb -DseTrackEvent_SetBankLsb: ; 0x02071BBC - stmdb sp!, {r4, lr} - mov r4, r0 - ldrh r2, [r3, #0xe] - ldrb r1, [r4] - mov r0, r3 - bic r2, r2, #0xff - add r1, r2, r1 - mov r1, r1, lsl #0x10 - mov r1, r1, lsr #0x10 - bl DseChannel_SetBank - add r0, r4, #1 - ldmia sp!, {r4, pc} - arm_func_end DseTrackEvent_SetBankLsb diff --git a/lib/DSE/asm/main_02071CC8.s b/lib/DSE/asm/main_02071CC8.s deleted file mode 100644 index 71c162f8..00000000 --- a/lib/DSE/asm/main_02071CC8.s +++ /dev/null @@ -1,56 +0,0 @@ - .include "asm/macros.inc" - .include "include/main_02071CC8.inc" - - .text - - arm_func_start DseTrackEvent_SetNoteDurationMultiplier -DseTrackEvent_SetNoteDurationMultiplier: ; 0x02071DB0 - ldrb r1, [r0], #1 - strb r1, [r2, #5] - bx lr - arm_func_end DseTrackEvent_SetNoteDurationMultiplier - - arm_func_start DseTrackEvent_ForceLfoEnvelopeLevel -DseTrackEvent_ForceLfoEnvelopeLevel: ; 0x02071DBC - stmdb sp!, {r4, lr} - mov r4, r0 - ldrsb r1, [r4] - mov r0, r3 - bl DseChannel_SetLfoConstEnvelopeLevel - add r0, r4, #1 - ldmia sp!, {r4, pc} - arm_func_end DseTrackEvent_ForceLfoEnvelopeLevel - - arm_func_start DseTrackEvent_SetHoldNotes -DseTrackEvent_SetHoldNotes: ; 0x02071DD8 - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r1, [r4] - ldr r0, [r2, #0x54] - cmp r1, #0x40 - ldrb r1, [r0, #4] - orrhs r1, r1, #1 - strhsb r1, [r0, #4] - bhs _02071E08 - bic r1, r1, #1 - strb r1, [r0, #4] - bl DseVoice_ReleaseHeld -_02071E08: - add r0, r4, #1 - ldmia sp!, {r4, pc} - arm_func_end DseTrackEvent_SetHoldNotes - - arm_func_start DseTrackEvent_SetFlagBit1Unknown -DseTrackEvent_SetFlagBit1Unknown: ; 0x02071E10 - ldrb r1, [r3, #4] - orr r1, r1, #2 - strb r1, [r3, #4] - bx lr - arm_func_end DseTrackEvent_SetFlagBit1Unknown - - arm_func_start DseTrackEvent_SetOptionalVolume -DseTrackEvent_SetOptionalVolume: ; 0x02071E20 - ldrb r1, [r0], #1 - strb r1, [r3, #0x58] - bx lr - arm_func_end DseTrackEvent_SetOptionalVolume diff --git a/lib/DSE/include/main_02071BF4.h b/lib/DSE/include/main_02071BF4.h index 2adaf5ce..6942343a 100644 --- a/lib/DSE/include/main_02071BF4.h +++ b/lib/DSE/include/main_02071BF4.h @@ -3,6 +3,7 @@ #include "dse.h" +u8* DseTrackEvent_SetBankLsb(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); u8* DseTrackEvent_Dummy1Byte(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); u8* DseTrackEvent_SetInstrument(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); u8* DseTrackEvent_SongVolumeFade(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); @@ -13,6 +14,13 @@ u8* DseTrackEvent_SetEnvelopeHoldTime(u8 *ptr_next_byte, struct dse_sequence *se u8* DseTrackEvent_SetEnvelopeDecayTimeAndSustainLevel(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); u8* DseTrackEvent_SetEnvelopeSustainTime(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); u8* DseTrackEvent_SetEnvelopeReleaseTime(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_SetNoteDurationMultiplier(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_ForceLfoEnvelopeLevel(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_SetHoldNotes(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_SetFlagBit1Unknown(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_SetOptionalVolume(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_Dummy2Bytes(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); +u8* DseTrackEvent_SetTuning(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); #endif //PMDSKY_MAIN_02071BF4_H diff --git a/lib/DSE/include/main_02071E34.h b/lib/DSE/include/main_02071E34.h deleted file mode 100644 index 83b3321b..00000000 --- a/lib/DSE/include/main_02071E34.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef PMDSKY_MAIN_02071E34_H -#define PMDSKY_MAIN_02071E34_H - -#include "dse.h" - -u8* DseTrackEvent_Dummy2Bytes(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); -u8* DseTrackEvent_SetTuning(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel); - -#endif //PMDSKY_MAIN_02071E34_H diff --git a/lib/DSE/src/main_02071BF4.c b/lib/DSE/src/main_02071BF4.c index 462ffdf8..11434deb 100644 --- a/lib/DSE/src/main_02071BF4.c +++ b/lib/DSE/src/main_02071BF4.c @@ -1,12 +1,23 @@ #include "main_02071BF4.h" #include "dc_envelope.h" +#define IME (*(vu16*)0x4000208) + extern struct dse_driver_work DRIVER_WORK; extern u32 DseChannel_SetInstrument(struct dse_channel *channel, u16 instrument_index); +extern void DseChannel_SetLfoConstEnvelopeLevel(struct dse_channel *channel, s8 envelope_level); +void DseChannel_SetBank(struct dse_channel*, u16); +extern void DseVoice_ReleaseHeld(struct dse_channel *); extern u32 _u32_div_f(u32 dividend, u32 divisor); extern u32 _s32_div_f(s32 dividend, s32 divisor); +u8* DseTrackEvent_SetBankLsb(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + DseChannel_SetBank(channel, (u16) ((channel->swd_id & ~0xFF) + *ptr_next_byte)); + return ptr_next_byte + 1; +} + u8* DseTrackEvent_Dummy1Byte(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) { return ptr_next_byte + 1; @@ -108,3 +119,68 @@ u8* DseTrackEvent_SetEnvelopeReleaseTime(u8 *ptr_next_byte, struct dse_sequence SoundEnvelopeParameters_CheckValidity(&channel->envelope_override); return ptr_next_byte + 1; } + +u8* DseTrackEvent_SetNoteDurationMultiplier(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + track->note_duration_multiplier = ptr_next_byte[0]; + return ptr_next_byte + 1; +} + +u8* DseTrackEvent_ForceLfoEnvelopeLevel(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + DseChannel_SetLfoConstEnvelopeLevel(channel, (s8)ptr_next_byte[0]); + return ptr_next_byte + 1; +} + +u8* DseTrackEvent_SetHoldNotes(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + + struct dse_channel* track_channel = track->channel; + + if ((u32) *ptr_next_byte >= 0x40) { + track_channel->channel_flags |= 1; + } else { + track_channel->channel_flags &= ~1; + DseVoice_ReleaseHeld(track_channel); + } + return ptr_next_byte + 1; +} + +u8* DseTrackEvent_SetFlagBit1Unknown(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + channel->channel_flags |= 2; + return ptr_next_byte; + +} + +u8* DseTrackEvent_SetOptionalVolume(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + + channel->optional_volume = ptr_next_byte[0]; + return ptr_next_byte + 1; +} + +u8* DseTrackEvent_Dummy2Bytes(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + return ptr_next_byte + 2; +} + +u8* DseTrackEvent_SetTuning(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) +{ + s16 tune = *(s8*)ptr_next_byte<<8; + channel->tuning = tune; + + channel->bend_final = tune + (s16)(channel->bend.current >> 0x10) + channel->container->bend; + u16 old_ime = IME; + IME = 0; + struct dse_voice *voice = channel->voice_list; + if(voice) { + do { + voice->update_flags = voice->update_flags | 0x10; + voice = voice->next_in_channel_allocation_list; + } while(voice); + } + u16 unused = IME; + IME = old_ime; + return ptr_next_byte + 1; +} diff --git a/lib/DSE/src/main_02071E34.c b/lib/DSE/src/main_02071E34.c deleted file mode 100644 index ba4ef7b7..00000000 --- a/lib/DSE/src/main_02071E34.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "main_02071E34.h" - -#define IME (*(vu16*)0x4000208) - -u8* DseTrackEvent_Dummy2Bytes(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) -{ - return ptr_next_byte + 2; -} - -u8* DseTrackEvent_SetTuning(u8 *ptr_next_byte, struct dse_sequence *sequence, struct dse_track *track, struct dse_channel *channel) -{ - s16 tune = *(s8*)ptr_next_byte<<8; - channel->tuning = tune; - - channel->bend_final = tune + (s16)(channel->bend.current >> 0x10) + channel->container->bend; - u16 old_ime = IME; - IME = 0; - struct dse_voice *voice = channel->voice_list; - if(voice) { - do { - voice->update_flags = voice->update_flags | 0x10; - voice = voice->next_in_channel_allocation_list; - } while(voice); - } - u16 unused = IME; - IME = old_ime; - return ptr_next_byte + 1; -} diff --git a/main.lsf b/main.lsf index cacd3729..09ef6d15 100644 --- a/main.lsf +++ b/main.lsf @@ -222,8 +222,6 @@ Static main Object lib/DSE/src/main_02071A98.o Object lib/DSE/asm/main_02071AC0.o Object lib/DSE/src/main_02071BF4.o - Object lib/DSE/asm/main_02071CC8.o - Object lib/DSE/src/main_02071E34.o Object lib/DSE/asm/main_02071EB4.o Object lib/DSE/src/dc_envelope.o Object lib/DSE/src/dc_lfo.o