summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/CARD_rom.s601
-rw-r--r--arm9/lib/include/CARD_common.h6
-rw-r--r--arm9/lib/include/CARD_rom.h71
-rw-r--r--arm9/lib/include/FSi_util.h2
-rw-r--r--arm9/lib/include/MI_dma.h2
-rw-r--r--arm9/lib/include/OS_interrupt.h1
-rw-r--r--arm9/lib/include/registers.h1
-rw-r--r--arm9/lib/src/CARD_rom.c280
-rw-r--r--arm9/lib/src/OS_init.c2
9 files changed, 357 insertions, 609 deletions
diff --git a/arm9/asm/CARD_rom.s b/arm9/asm/CARD_rom.s
deleted file mode 100644
index 77fe7534..00000000
--- a/arm9/asm/CARD_rom.s
+++ /dev/null
@@ -1,601 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .extern OSi_ThreadInfo
- .extern cardi_common
-
- .section .data
-
- .global UNK_02106A50
-UNK_02106A50: ; 0x02106A50
- .word 0x027FFE00
-
- .section .bss
-
- .global UNK_021D5BE0
-UNK_021D5BE0: ; 0x021D5BE0
- .space 0x20
-
- .global UNK_021D5C00
-UNK_021D5C00: ; 0x021D5C00
- .space 0x220
-
- .text
-
- arm_func_start CARDi_GetRomAccessor
-CARDi_GetRomAccessor: ; 0x020D7210
- ldr r0, _020D7218 ; =CARDi_ReadCard
- bx lr
- .balign 4
-_020D7218: .word CARDi_ReadCard
-
- arm_func_start CARD_WaitRomAsync
-CARD_WaitRomAsync: ; 0x020D721C
- ldr ip, _020D7224 ; =CARDi_WaitAsync
- bx r12
- .balign 4
-_020D7224: .word CARDi_WaitAsync
-
- arm_func_start CARD_Init
-CARD_Init: ; 0x020D7228
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr ip, _020D72A0 ; =cardi_common
- ldr r0, [r12, #0x114]
- cmp r0, #0x0
- addne sp, sp, #0x4
- ldmneia sp!, {lr}
- bxne lr
- mov r0, #0x1
- str r0, [r12, #0x114]
- mov r3, #0x0
- str r3, [r12, #0x24]
- ldr r0, [r12, #0x24]
- mvn r1, #0x0
- str r0, [r12, #0x20]
- ldr r2, [r12, #0x20]
- ldr r0, _020D72A4 ; =UNK_021D5BE0
- str r2, [r12, #0x1c]
- str r1, [r12, #0x28]
- str r3, [r12, #0x38]
- str r3, [r12, #0x3c]
- str r3, [r0, #0x0]
- bl CARDi_InitCommon
- bl CARDi_GetRomAccessor
- ldr r1, _020D72A8 ; =UNK_021D5C00
- str r0, [r1, #0x0]
- bl CARD_InitPulledOutCallback
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020D72A0: .word cardi_common
-_020D72A4: .word UNK_021D5BE0
-_020D72A8: .word UNK_021D5C00
-
- arm_func_start CARDi_ReadRom
-CARDi_ReadRom: ; 0x020D72AC
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x4
- ldr r6, _020D73C0 ; =cardi_common
- mov r10, r0
- mov r9, r1
- mov r8, r2
- mov r7, r3
- ldr fp, _020D73C4 ; =UNK_021D5C00
- bl CARD_CheckEnabled
- bl OS_DisableInterrupts
- ldr r1, [r6, #0x114]
- mov r5, r0
- ands r0, r1, #0x4
- beq _020D72FC
- add r4, r6, #0x10c
-_020D72E8:
- mov r0, r4
- bl OS_SleepThread
- ldr r0, [r6, #0x114]
- ands r0, r0, #0x4
- bne _020D72E8
-_020D72FC:
- ldr r1, [r6, #0x114]
- ldr r0, [sp, #0x28]
- orr r1, r1, #0x4
- str r1, [r6, #0x114]
- ldr r1, [sp, #0x2c]
- str r0, [r6, #0x38]
- mov r0, r5
- str r1, [r6, #0x3c]
- bl OS_RestoreInterrupts
- ldr r0, _020D73C8 ; =UNK_021D5BE0
- str r10, [r6, #0x28]
- ldr r0, [r0, #0x0]
- cmp r10, #0x3
- add r0, r9, r0
- str r0, [r6, #0x1c]
- str r8, [r6, #0x20]
- str r7, [r6, #0x24]
- bhi _020D734C
- mov r0, r10
- bl MI_StopDma
-_020D734C:
- mov r0, r11
- bl CARDi_TryReadCardDma
-_020D7354: ; 0x020D7354
- cmp r0, #0x0
- beq _020D7380
- ldr r0, [sp, #0x30]
- cmp r0, #0x0
- addne sp, sp, #0x4
- ldmneia sp!, {r4-r11,lr}
- bxne lr
- bl CARD_WaitRomAsync
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
-_020D7380:
- ldr r0, [sp, #0x30]
- cmp r0, #0x0
- beq _020D73A0
- ldr r0, _020D73CC ; =CARDi_ReadRomSyncCore
- bl CARDi_SetTask
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
-_020D73A0:
- ldr r1, _020D73D0 ; =OSi_ThreadInfo
- mov r0, r6
- ldr r1, [r1, #0x4]
- str r1, [r6, #0x104]
- bl CARDi_ReadRomSyncCore
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
- .balign 4
-_020D73C0: .word cardi_common
-_020D73C4: .word UNK_021D5C00
-_020D73C8: .word UNK_021D5BE0
-_020D73CC: .word CARDi_ReadRomSyncCore
-_020D73D0: .word OSi_ThreadInfo
-
- arm_func_start CARDi_ReadRomSyncCore
-CARDi_ReadRomSyncCore: ; 0x020D73D4
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- ldr r4, _020D7478 ; =UNK_021D5C00
- mov r0, r4
- bl CARDi_ReadFromCache
-_020D73E8: ; 0x020D73E8
- cmp r0, #0x0
- beq _020D73FC
- ldr r1, [r4, #0x0]
- mov r0, r4
- blx r1
-_020D73FC:
- ldr r7, _020D747C ; =cardi_common
- bl CARDi_ReadRomIDCore
- bl CARDi_CheckPulledOutCore
-_020D7408: ; 0x020D7408
- ldr r0, [r7, #0x0]
- mov r1, #0x0
- str r1, [r0, #0x0]
- ldr r6, [r7, #0x38]
- ldr r5, [r7, #0x3c]
- bl OS_DisableInterrupts
- ldr r1, [r7, #0x114]
- mov r4, r0
- bic r0, r1, #0x4c
- str r0, [r7, #0x114]
- add r0, r7, #0x10c
- bl OS_WakeupThread
- ldr r0, [r7, #0x114]
- ands r0, r0, #0x10
- beq _020D744C
- add r0, r7, #0x44
- bl OS_WakeupThreadDirect
-_020D744C:
- mov r0, r4
- bl OS_RestoreInterrupts
-_020D7454: ; 0x020D7454
- cmp r6, #0x0
- addeq sp, sp, #0x4
- ldmeqia sp!, {r4-r7,lr}
- bxeq lr
- mov r0, r5
- blx r6
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
- .balign 4
-_020D7478: .word UNK_021D5C00
-_020D747C: .word cardi_common
-
- arm_func_start CARDi_ReadRomIDCore
-CARDi_ReadRomIDCore: ; 0x020D7480
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- mov r0, #0xb8000000
- mov r1, #0x0
- bl CARDi_SetRomOp
- ldr r1, _020D74DC ; =UNK_02106A50
- mov r0, #0x2000
- ldr r1, [r1, #0x0]
- rsb r0, r0, #0x0
- ldr r2, [r1, #0x60]
- ldr r1, _020D74E0 ; =0x040001A4
- bic r2, r2, #0x7000000
- orr r2, r2, #0xa7000000
- and r0, r2, r0
- str r0, [r1, #0x0]
-_020D74BC:
- ldr r0, [r1, #0x0]
- ands r0, r0, #0x800000
- beq _020D74BC
- ldr r0, _020D74E4 ; =0x04100010
- ldr r0, [r0, #0x0]
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020D74DC: .word UNK_02106A50
-_020D74E0: .word 0x040001A4
-_020D74E4: .word 0x04100010
-
- arm_func_start CARDi_ReadCard
-CARDi_ReadCard: ; 0x020D74E8
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x4
- mov r10, r0
- ldr sb, _020D75DC ; =cardi_common
- add r7, r10, #0x20
- ldr r5, _020D75E0 ; =0x04100010
- ldr r6, _020D75E4 ; =0x040001A4
- mov r11, #0x0
- mov r0, #0x200
- rsb r4, r0, #0x0
-_020D7510:
- ldr r0, [r9, #0x1c]
- and r1, r0, r4
- cmp r1, r0
- bne _020D7538
- ldr r8, [r9, #0x20]
- ands r0, r8, #0x3
- bne _020D7538
- ldr r0, [r9, #0x24]
- cmp r0, #0x200
- bhs _020D7540
-_020D7538:
- mov r8, r7
- str r1, [r10, #0x8]
-_020D7540:
- mov r0, r1, lsr #0x8
- orr r0, r0, #0xb7000000
- mov r1, r1, lsl #0x18
- bl CARDi_SetRomOp
- ldr r1, [r10, #0x4]
- mov r0, r11
- str r1, [r6, #0x0]
-_020D755C:
- ldr r2, [r6, #0x0]
- ands r1, r2, #0x800000
- beq _020D7578
- ldr r1, [r5, #0x0]
- cmp r0, #0x200
- strcc r1, [r8, r0, lsl #0x2]
- addcc r0, r0, #0x1
-_020D7578:
- ands r1, r2, #0x80000000
- bne _020D755C
- ldr r0, [r9, #0x20]
- cmp r8, r0
- bne _020D75C0
- ldr r2, [r9, #0x1c]
- ldr r1, [r9, #0x20]
- ldr r0, [r9, #0x24]
- add r2, r2, #0x200
- add r1, r1, #0x200
- subs r0, r0, #0x200
- str r2, [r9, #0x1c]
- str r1, [r9, #0x20]
- str r0, [r9, #0x24]
- bne _020D7510
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
-_020D75C0:
- mov r0, r10
- bl CARDi_ReadFromCache
-_020D75C8: ; 0x020D75C8
- cmp r0, #0x0
- bne _020D7510
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
- .balign 4
-_020D75DC: .word cardi_common
-_020D75E0: .word 0x04100010
-_020D75E4: .word 0x040001A4
-
- arm_func_start CARDi_TryReadCardDma
-CARDi_TryReadCardDma:
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x4
- ldr fp, _020D7748 ; =cardi_common
- mov r7, #0x0
- ldr r9, [r11, #0x20]
- mov r10, r0
- mov r6, r7
- mov r5, r7
- mov r1, r7
- ands r4, r9, #0x1f
- ldr r8, [r11, #0x24]
- bne _020D7624
- ldr r0, [r11, #0x28]
- cmp r0, #0x3
- movls r1, #0x1
-_020D7624:
- cmp r1, #0x0
- beq _020D7678
- bl OS_GetDTCMAddress
- ldr r1, _020D774C ; =0x01FF8000
- add r2, r9, r8
- cmp r2, r1
- mov r3, #0x1
- mov r1, #0x0
- bls _020D7650
- cmp r9, #0x2000000
- movcc r1, r3
-_020D7650:
- cmp r1, #0x0
- bne _020D7670
- cmp r0, r2
- bhs _020D766C
- add r0, r0, #0x4000
- cmp r0, r9
- bhi _020D7670
-_020D766C:
- mov r3, #0x0
-_020D7670:
- cmp r3, #0x0
- moveq r5, #0x1
-_020D7678:
- cmp r5, #0x0
- beq _020D7694
- ldr r1, [r11, #0x1c]
- ldr r0, _020D7750 ; =0x000001FF
- orr r1, r1, r8
- ands r0, r1, r0
- moveq r6, #0x1
-_020D7694:
- cmp r6, #0x0
- beq _020D76A4
- cmp r8, #0x0
- movne r7, #0x1
-_020D76A4:
- ldr r0, _020D7754 ; =UNK_02106A50
- cmp r7, #0x0
- ldr r0, [r0, #0x0]
- ldr r0, [r0, #0x60]
- bic r0, r0, #0x7000000
- orr r0, r0, #0xa1000000
- str r0, [r10, #0x4]
- beq _020D7738
- bl OS_DisableInterrupts
- mov r5, r0
- mov r0, r9
- mov r1, r8
- bl IC_InvalidateRange
-_020D76D8: ; 0x020D76D8
- cmp r4, #0x0
- beq _020D7700
- sub r9, r9, r4
- mov r0, r9
- mov r1, #0x20
- bl DC_StoreRange
- add r0, r9, r8
- mov r1, #0x20
- bl DC_StoreRange
- add r8, r8, #0x20
-_020D7700:
- mov r0, r9
- mov r1, r8
- bl DC_InvalidateRange
- bl DC_WaitWriteBufferEmpty
- ldr r1, _020D7758 ; =CARDi_OnReadCard
- mov r0, #0x80000
- bl OS_SetIrqFunction
- mov r0, #0x80000
- bl OS_ResetRequestIrqMask
- mov r0, #0x80000
- bl OS_EnableIrqMask
- mov r0, r5
- bl OS_RestoreInterrupts
- bl CARDi_SetCardDma
-_020D7738:
- mov r0, r7
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
- .balign 4
-_020D7748: .word cardi_common
-_020D774C: .word 0x01FF8000
-_020D7750: .word 0x000001FF
-_020D7754: .word UNK_02106A50
-_020D7758: .word CARDi_OnReadCard
-
- arm_func_start CARDi_OnReadCard
-CARDi_OnReadCard: ; 0x020D775C
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- ldr r0, _020D7838 ; =cardi_common
- ldr r0, [r0, #0x28]
- bl MI_StopDma
- ldr r0, _020D7838 ; =cardi_common
- ldr r3, [r0, #0x1c]
- ldr r2, [r0, #0x20]
- ldr r1, [r0, #0x24]
- add r3, r3, #0x200
- add r2, r2, #0x200
- subs r1, r1, #0x200
- str r3, [r0, #0x1c]
- str r2, [r0, #0x20]
- str r1, [r0, #0x24]
- bne _020D7828
- mov r0, #0x80000
- bl OS_DisableIrqMask
- mov r0, #0x80000
- bl OS_ResetRequestIrqMask
- ldr r7, _020D7838 ; =cardi_common
- bl CARDi_ReadRomIDCore
- bl CARDi_CheckPulledOutCore
-_020D77B8: ; 0x020D77B8
- ldr r0, [r7, #0x0]
- mov r1, #0x0
- str r1, [r0, #0x0]
- ldr r6, [r7, #0x38]
- ldr r5, [r7, #0x3c]
- bl OS_DisableInterrupts
- ldr r1, [r7, #0x114]
- mov r4, r0
- bic r0, r1, #0x4c
- str r0, [r7, #0x114]
- add r0, r7, #0x10c
- bl OS_WakeupThread
- ldr r0, [r7, #0x114]
- ands r0, r0, #0x10
- beq _020D77FC
- add r0, r7, #0x44
- bl OS_WakeupThreadDirect
-_020D77FC:
- mov r0, r4
- bl OS_RestoreInterrupts
-_020D7804: ; 0x020D7804
- cmp r6, #0x0
- addeq sp, sp, #0x4
- ldmeqia sp!, {r4-r7,lr}
- bxeq lr
- mov r0, r5
- blx r6
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
-_020D7828:
- bl CARDi_SetCardDma
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
- .balign 4
-_020D7838: .word cardi_common
-
- arm_func_start CARDi_SetCardDma
-CARDi_SetCardDma: ; 0x020D783C
- stmdb sp!, {r4,lr}
- ldr r4, _020D7884 ; =cardi_common
- ldr r1, _020D7888 ; =0x04100010
- ldr r0, [r4, #0x28]
- ldr r2, [r4, #0x20]
- mov r3, #0x200
- bl MIi_CardDmaCopy32
- ldr r1, [r4, #0x1c]
- mov r0, r1, lsr #0x8
- orr r0, r0, #0xb7000000
- mov r1, r1, lsl #0x18
- bl CARDi_SetRomOp
- ldr r0, _020D788C ; =UNK_021D5C00
- ldr r1, _020D7890 ; =0x040001A4
- ldr r0, [r0, #0x4]
- str r0, [r1, #0x0]
- ldmia sp!, {r4,lr}
- bx lr
- .balign 4
-_020D7884: .word cardi_common
-_020D7888: .word 0x04100010
-_020D788C: .word UNK_021D5C00
-_020D7890: .word 0x040001A4
-
- arm_func_start CARDi_SetRomOp
-CARDi_SetRomOp: ; 0x020D7894
- ldr r3, _020D790C ; =0x040001A4
-_020D7898:
- ldr r2, [r3, #0x0]
- ands r2, r2, #0x80000000
- bne _020D7898
- ldr r3, _020D7910 ; =0x040001A1
- mov r12, #0xc0
- ldr r2, _020D7914 ; =0x040001A8
- strb r12, [r3, #0x0]
- mov r12, r0, lsr #0x18
- ldr r3, _020D7918 ; =0x040001A9
- strb r12, [r2, #0x0]
- mov r12, r0, lsr #0x10
- ldr r2, _020D791C ; =0x040001AA
- strb r12, [r3, #0x0]
- mov r12, r0, lsr #0x8
- ldr r3, _020D7920 ; =0x040001AB
- strb r12, [r2, #0x0]
- ldr r2, _020D7924 ; =0x040001AC
- strb r0, [r3, #0x0]
- mov r3, r1, lsr #0x18
- ldr r0, _020D7928 ; =0x040001AD
- strb r3, [r2, #0x0]
- mov r3, r1, lsr #0x10
- ldr r2, _020D792C ; =0x040001AE
- strb r3, [r0, #0x0]
- mov r3, r1, lsr #0x8
- ldr r0, _020D7930 ; =0x040001AF
- strb r3, [r2, #0x0]
- strb r1, [r0, #0x0]
- bx lr
- .balign 4
-_020D790C: .word 0x040001A4
-_020D7910: .word 0x040001A1
-_020D7914: .word 0x040001A8
-_020D7918: .word 0x040001A9
-_020D791C: .word 0x040001AA
-_020D7920: .word 0x040001AB
-_020D7924: .word 0x040001AC
-_020D7928: .word 0x040001AD
-_020D792C: .word 0x040001AE
-_020D7930: .word 0x040001AF
-
- arm_func_start CARDi_ReadFromCache
-CARDi_ReadFromCache:
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4
- ldr r5, _020D79C8 ; =cardi_common
- mov r1, #0x200
- ldr r3, [r5, #0x1c]
- rsb r1, r1, #0x0
- ldr r2, [r0, #0x8]
- and r3, r3, r1
- cmp r3, r2
- bne _020D79AC
- ldr r2, [r5, #0x1c]
- ldr r1, [r5, #0x24]
- sub r3, r2, r3
- rsb r4, r3, #0x200
- cmp r4, r1
- movhi r4, r1
- add r0, r0, #0x20
- ldr r1, [r5, #0x20]
- mov r2, r4
- add r0, r0, r3
- bl MI_CpuCopy8
- ldr r0, [r5, #0x1c]
- add r0, r0, r4
- str r0, [r5, #0x1c]
- ldr r0, [r5, #0x20]
- add r0, r0, r4
- str r0, [r5, #0x20]
- ldr r0, [r5, #0x24]
- sub r0, r0, r4
- str r0, [r5, #0x24]
-_020D79AC:
- ldr r0, [r5, #0x24]
- cmp r0, #0x0
- movne r0, #0x1
- moveq r0, #0x0
- add sp, sp, #0x4
- ldmia sp!, {r4-r5,lr}
- bx lr
- .balign 4
-_020D79C8: .word cardi_common
diff --git a/arm9/lib/include/CARD_common.h b/arm9/lib/include/CARD_common.h
index 7730ffa4..95274fd2 100644
--- a/arm9/lib/include/CARD_common.h
+++ b/arm9/lib/include/CARD_common.h
@@ -24,6 +24,10 @@
((size) << CARD_BACKUP_TYPE_SIZEBIT_SHIFT) | \
((vender) << CARD_BACKUP_TYPE_VENDER_SHIFT))
+#define ALIGN_MASK(a) ((a) - 1)
+#define CARD_ALIGN_HI_BIT(n) (((u32)(n)) & ~ALIGN_MASK(CARD_ROM_PAGE_SIZE))
+#define CARD_ALIGN_LO_BIT(n) (((u32)(n)) & ALIGN_MASK(CARD_ROM_PAGE_SIZE))
+
typedef enum
{
CARD_BACKUP_TYPE_EEPROM_4KBITS = CARD_BACKUP_TYPE_DEFINE(EEPROM, 9, 0),
@@ -209,8 +213,6 @@ void CARD_UnlockBackup(u16 lock_id);
#define CARD_RETRY_COUNT_MAX 10
-void CARD_Init(void);
-
extern BOOL PXI_SendWordByFifo(u32 param1, u32 data, u32 param2);
static inline void CARDi_SendPxi(u32 data)
diff --git a/arm9/lib/include/CARD_rom.h b/arm9/lib/include/CARD_rom.h
index b96c527b..e72d653f 100644
--- a/arm9/lib/include/CARD_rom.h
+++ b/arm9/lib/include/CARD_rom.h
@@ -1,9 +1,31 @@
-#ifndef NITRO_CARD_ROM_H_
-#define NITRO_CARD_ROM_H_
+#ifndef POKEDIAMOND_CARD_ROM_H
+#define POKEDIAMOND_CARD_ROM_H
#include "nitro/types.h"
#include "MI_exMemory.h"
#include "MI_dma.h"
+#include "CARD_common.h"
+#include "OS_tcm.h"
+
+#define CARD_ROM_PAGE_SIZE 512
+
+#define CARDMST_SEL_ROM 0x00
+#define CARDMST_IF_ENABLE 0x40
+#define CARDMST_ENABLE 0x80
+
+#define CARD_DATA_READY 0x00800000
+#define CARD_COMMAND_PAGE 0x01000000
+#define CARD_COMMAND_ID 0x07000000
+#define CARD_COMMAND_MASK 0x07000000
+#define CARD_RESET_HI 0x20000000
+#define CARD_READ_MODE 0x00000000
+#define CARD_START 0x80000000
+#define CARD_LATENCY1_MASK 0x00001FFF
+
+#define MROMOP_G_READ_PAGE 0xB7000000
+#define MROMOP_G_READ_ID 0xB8000000
+
+extern CARDiCommon cardi_common;
typedef struct
{
@@ -12,6 +34,15 @@ typedef struct
}
CARDRomRegion;
+typedef struct CARDRomStat
+{
+ void (*read_func) (struct CARDRomStat *);
+ u32 ctrl;
+ u8 *cache_page;
+ u32 dummy[5];
+ u8 cache_buf[CARD_ROM_PAGE_SIZE];
+} CARDRomStat;
+
static inline const CARDRomRegion * CARD_GetRomRegionOVT(MIProcessor target)
{
return (target == MI_PROCESSOR_ARM9)
@@ -19,7 +50,14 @@ static inline const CARDRomRegion * CARD_GetRomRegionOVT(MIProcessor target)
: (const CARDRomRegion *)((const u8 *)HW_ROM_HEADER_BUF + 0x58);
}
-void CARDi_ReadRom(u32 dma, const void * src, void * dst, u32 len, MIDmaCallback done_cb, void * arg, BOOL is_async);
+BOOL CARDi_TryReadCardDma(CARDRomStat *p);
+void CARDi_ReadCard(CARDRomStat *p);
+u32 CARDi_ReadRomIDCore(void);
+void CARDi_CheckPulledOutCore(u32 id);
+void CARDi_ReadRom(u32 dma, const void *src, void *dst, u32 len, MIDmaCallback callback, void *arg, BOOL is_async);
+void CARD_Init(void);
+void CARD_WaitRomAsync(void);
+void (*CARDi_GetRomAccessor(void)) (CARDRomStat *);
static inline void CARD_ReadRomAsync(u32 dma, const void * src, void * dst, u32 len, MIDmaCallback callback, void * arg)
{
@@ -34,4 +72,29 @@ static inline const CARDRomRegion * CARD_GetRomRegionFAT() {
return (const CARDRomRegion *)((const u8 *)HW_ROM_HEADER_BUF + 0x48);
}
-#endif //NITRO_CARD_ROM_H_
+static inline void CARDi_ReadEnd(void)
+{
+ CARDiCommon *const p = &cardi_common;
+ CARDi_CheckPulledOutCore(CARDi_ReadRomIDCore());
+ p->cmd->result = CARD_RESULT_SUCCESS;
+ CARDi_EndTask(p, TRUE);
+}
+
+static inline BOOL CARDi_IsInTcm(u32 buf, u32 len)
+{
+ const u32 i = (u32)HW_ITCM;
+ const u32 d = OS_GetDTCMAddress();
+ return ((i < buf + len) && (i + HW_ITCM_SIZE > buf)) ||
+ ((d < buf + len) && (d + HW_DTCM_SIZE > buf));
+}
+
+extern u32 cardi_rom_header_addr;
+
+static inline u32 CARDi_GetRomFlag(u32 flag)
+{
+ const u32 rom_ctrl = *(vu32 *)(cardi_rom_header_addr + 0x60);
+ return (u32)((rom_ctrl & ~CARD_COMMAND_MASK) | flag |
+ CARD_READ_MODE | CARD_START | CARD_RESET_HI);
+}
+
+#endif //POKEDIAMOND_CARD_ROM_H
diff --git a/arm9/lib/include/FSi_util.h b/arm9/lib/include/FSi_util.h
index 6e96681e..2357b446 100644
--- a/arm9/lib/include/FSi_util.h
+++ b/arm9/lib/include/FSi_util.h
@@ -1,7 +1,7 @@
#ifndef NITRO_FSI_UTIL_H_
#define NITRO_FSI_UTIL_H_
-#define ALIGN_MASK(a) ((u32)((a) - 1))
+#include "CARD_common.h"
#define ALIGN_BYTE(n, a) (((u32)(n) + ALIGN_MASK(a)) & ~ALIGN_MASK(a))
diff --git a/arm9/lib/include/MI_dma.h b/arm9/lib/include/MI_dma.h
index aafc798b..8ce3f417 100644
--- a/arm9/lib/include/MI_dma.h
+++ b/arm9/lib/include/MI_dma.h
@@ -7,6 +7,8 @@
typedef void (*MIDmaCallback)(void *);
+#define MI_DMA_MAX_NUM 3
+
#define REG_ADDR_DMA0CNT 0x40000b8
#define REG_ADDR_DMA0_CLR_DATA 0x40000e0
diff --git a/arm9/lib/include/OS_interrupt.h b/arm9/lib/include/OS_interrupt.h
index 08417872..3d139079 100644
--- a/arm9/lib/include/OS_interrupt.h
+++ b/arm9/lib/include/OS_interrupt.h
@@ -12,6 +12,7 @@
#define OS_IE_V_COUNT (1UL << REG_OS_IE_VE_SHIFT)
#define OS_IE_TIMER0 (1UL << REG_OS_IE_T0_SHIFT)
#define OS_IE_TIMER1 (1UL << REG_OS_IE_T1_SHIFT)
+#define OS_IE_CARD_DATA (1UL << REG_OS_IE_MC_SHIFT)
extern OSIrqFunction OS_IRQTable[];
extern OSIrqCallbackInfo OSi_IrqCallbackInfo[8];
diff --git a/arm9/lib/include/registers.h b/arm9/lib/include/registers.h
index dc1b4fdb..44a21bf0 100644
--- a/arm9/lib/include/registers.h
+++ b/arm9/lib/include/registers.h
@@ -350,6 +350,7 @@
#define REG_OS_IE_VE_SHIFT 2
#define REG_OS_IE_T0_SHIFT 3
#define REG_OS_IE_T1_SHIFT 4
+#define REG_OS_IE_MC_SHIFT 19
#define REG_OS_TM0CNT_H_I_MASK 0x0040
#define REG_OS_TM0CNT_H_E_MASK 0x0080
diff --git a/arm9/lib/src/CARD_rom.c b/arm9/lib/src/CARD_rom.c
new file mode 100644
index 00000000..6d6b1ff8
--- /dev/null
+++ b/arm9/lib/src/CARD_rom.c
@@ -0,0 +1,280 @@
+#include "function_target.h"
+#include "nitro/types.h"
+#include "CARD_pullOut.h"
+#include "CARD_rom.h"
+#include "MI_dma_card.h"
+#include "MI_memory.h"
+#include "OS_cache.h"
+#include "OS_interrupt.h"
+
+extern u32 cardi_rom_base;
+u32 cardi_rom_base;
+u32 cardi_rom_header_addr = HW_ROM_HEADER_BUF;
+
+CARDRomStat rom_stat ALIGN(32);
+
+static BOOL CARDi_ReadFromCache(CARDRomStat *p);
+static void CARDi_SetRomOp(u32 cmd1, u32 cmd2);
+static void CARDi_SetCardDma(void);
+static void CARDi_OnReadCard(void);
+static void CARDi_ReadRomSyncCore(CARDiCommon *c);
+
+static inline BOOL CARDi_OnReadPageDirect(CARDRomStat *arg)
+{
+#pragma unused(arg)
+ CARDiCommon *p = &cardi_common;
+ p->src += CARD_ROM_PAGE_SIZE;
+ p->dst += CARD_ROM_PAGE_SIZE;
+ p->len -= CARD_ROM_PAGE_SIZE;
+ return (p->len > 0);
+}
+
+ARM_FUNC static BOOL CARDi_ReadFromCache(CARDRomStat *p)
+{
+ CARDiCommon *c = &cardi_common;
+ const u32 cur_page = CARD_ALIGN_HI_BIT(c->src);
+ if (cur_page == (u32)p->cache_page)
+ {
+ const u32 mod = c->src - cur_page;
+ u32 len = CARD_ROM_PAGE_SIZE - mod;
+ if (len > c->len)
+ {
+ len = c->len;
+ }
+ MI_CpuCopy8(p->cache_buf + mod, (void *)c->dst, len);
+ c->src += len;
+ c->dst += len;
+ c->len -= len;
+ }
+ return (c->len > 0);
+}
+
+ARM_FUNC static void CARDi_SetRomOp(u32 cmd1, u32 cmd2)
+{
+ while ((reg_CARD_CNT & CARD_START) != 0) {}
+
+ reg_CARD_MASTERCNT = CARDMST_SEL_ROM | CARDMST_ENABLE | CARDMST_IF_ENABLE;
+ {
+ vu8 *const p_cmd = &reg_CARD_CMD;
+ p_cmd[0] = (u8)(cmd1 >> (8 * 3));
+ p_cmd[1] = (u8)(cmd1 >> (8 * 2));
+ p_cmd[2] = (u8)(cmd1 >> (8 * 1));
+ p_cmd[3] = (u8)(cmd1 >> (8 * 0));
+ p_cmd[4] = (u8)(cmd2 >> (8 * 3));
+ p_cmd[5] = (u8)(cmd2 >> (8 * 2));
+ p_cmd[6] = (u8)(cmd2 >> (8 * 1));
+ p_cmd[7] = (u8)(cmd2 >> (8 * 0));
+ }
+}
+
+static inline void CARDi_SetRomOpReadPage1(u32 src)
+{
+ CARDi_SetRomOp((u32)(MROMOP_G_READ_PAGE | (src >> 8)), (u32)(src << 24));
+}
+
+ARM_FUNC static void CARDi_SetCardDma(void)
+{
+ CARDiCommon *const c = &cardi_common;
+ CARDRomStat *const p = &rom_stat;
+ MIi_CardDmaCopy32(c->dma, (const void *)&reg_CARD_DATA, (void *)c->dst, CARD_ROM_PAGE_SIZE);
+ CARDi_SetRomOpReadPage1(c->src);
+ reg_CARD_CNT = p->ctrl;
+}
+
+ARM_FUNC static void CARDi_OnReadCard(void)
+{
+ CARDRomStat *const p = &rom_stat;
+ CARDiCommon *const c = &cardi_common;
+ MI_StopDma(c->dma);
+ if (!CARDi_OnReadPageDirect(p))
+ {
+ (void)OS_DisableIrqMask(OS_IE_CARD_DATA);
+ (void)OS_ResetRequestIrqMask(OS_IE_CARD_DATA);
+ CARDi_ReadEnd();
+ }
+ else
+ {
+ CARDi_SetCardDma();
+ }
+}
+
+ARM_FUNC BOOL CARDi_TryReadCardDma(CARDRomStat *p)
+{
+ CARDiCommon *const c = &cardi_common;
+ const u32 dst = c->dst;
+ u32 len = c->len;
+ const BOOL is_async = !(dst & 31) &&
+ (c->dma <= MI_DMA_MAX_NUM) &&
+ !CARDi_IsInTcm(dst, len) &&
+ !CARD_ALIGN_LO_BIT(c->src | len) &&
+ (len > 0);
+ p->ctrl = CARDi_GetRomFlag(CARD_COMMAND_PAGE);
+ if (is_async)
+ {
+ OSIntrMode bak_psr = OS_DisableInterrupts();
+ IC_InvalidateRange((void *)dst, len);
+ {
+ u32 pos = dst;
+ u32 mod = (dst & (HW_CACHE_LINE_SIZE - 1));
+ if (mod)
+ {
+ pos -= mod;
+ DC_StoreRange((void *)(pos), HW_CACHE_LINE_SIZE);
+ DC_StoreRange((void *)(pos + len), HW_CACHE_LINE_SIZE);
+ len += HW_CACHE_LINE_SIZE;
+ }
+ DC_InvalidateRange((void *)pos, len);
+ DC_WaitWriteBufferEmpty();
+ }
+ (void)OS_SetIrqFunction(OS_IE_CARD_DATA, CARDi_OnReadCard);
+ (void)OS_ResetRequestIrqMask(OS_IE_CARD_DATA);
+ (void)OS_EnableIrqMask(OS_IE_CARD_DATA);
+ (void)OS_RestoreInterrupts(bak_psr);
+ CARDi_SetCardDma();
+ }
+ return is_async;
+}
+
+ARM_FUNC void CARDi_ReadCard(CARDRomStat *p)
+{
+ CARDiCommon *const c = &cardi_common;
+ while (TRUE)
+ {
+ const u32 len = CARD_ROM_PAGE_SIZE;
+ u32 src = CARD_ALIGN_HI_BIT(c->src);
+ u32 dst;
+ if ((src != c->src) || ((c->dst & 3) != 0) || (c->len < len))
+ {
+ dst = (u32)p->cache_buf;
+ p->cache_page = (void *)src;
+ }
+ else
+ {
+ dst = c->dst;
+ }
+
+ CARDi_SetRomOpReadPage1(src);
+ {
+ u32 pos = 0;
+ reg_CARD_CNT = p->ctrl;
+ while (TRUE)
+ {
+ const u32 ctrl = reg_CARD_CNT;
+ if ((ctrl & CARD_DATA_READY) != 0)
+ {
+ u32 data = reg_CARD_DATA;
+ if (pos < len)
+ {
+ ((u32 *)dst)[pos++] = data;
+ }
+ }
+ if (!(ctrl & CARD_START))
+ {
+ break;
+ }
+ }
+ }
+ if (dst == c->dst)
+ {
+ if (!CARDi_OnReadPageDirect(p))
+ {
+ break;
+ }
+ }
+ else
+ {
+ if (!CARDi_ReadFromCache(p))
+ {
+ break;
+ }
+ }
+ }
+}
+
+ARM_FUNC u32 CARDi_ReadRomIDCore(void)
+{
+ CARDi_SetRomOp(MROMOP_G_READ_ID, 0);
+ reg_CARD_CNT = (u32)(CARDi_GetRomFlag(CARD_COMMAND_ID) & ~CARD_LATENCY1_MASK);
+ while (!(reg_CARD_CNT & CARD_DATA_READY)) {}
+ return reg_CARD_DATA;
+}
+
+ARM_FUNC static void CARDi_ReadRomSyncCore(CARDiCommon *c)
+{
+#pragma unused(c)
+ CARDRomStat *const p = &rom_stat;
+
+ if (CARDi_ReadFromCache(p))
+ {
+ (*p->read_func) (p);
+ }
+ CARDi_ReadEnd();
+}
+
+ARM_FUNC void CARDi_ReadRom(u32 dma, const void *src, void *dst, u32 len, MIDmaCallback callback, void *arg, BOOL is_async)
+{
+ CARDRomStat *const p = &rom_stat;
+ CARDiCommon *const c = &cardi_common;
+
+ CARD_CheckEnabled();
+
+ CARDi_WaitTask(c, callback, arg);
+
+ c->dma = dma;
+ c->src = (u32)((u32)src + cardi_rom_base);
+ c->dst = (u32)dst;
+ c->len = (u32)len;
+ if (dma <= MI_DMA_MAX_NUM)
+ {
+ MI_StopDma(dma);
+ }
+
+ if (CARDi_TryReadCardDma(p))
+ {
+ if (!is_async)
+ {
+ CARD_WaitRomAsync();
+ }
+ }
+ else if (is_async)
+ {
+ CARDi_SetTask(CARDi_ReadRomSyncCore);
+ }
+ else
+ {
+ c->cur_th = OS_GetCurrentThread();
+ CARDi_ReadRomSyncCore(c);
+ }
+}
+
+ARM_FUNC void CARD_Init(void)
+{
+ CARDiCommon *const p = &cardi_common;
+
+ if (!p->flag)
+ {
+ p->flag = CARD_STAT_INIT;
+ p->src = p->dst = p->len = 0;
+ p->dma = (u32)~0;
+ p->callback = NULL;
+ p->callback_arg = NULL;
+
+ cardi_rom_base = 0;
+
+ CARDi_InitCommon();
+
+ rom_stat.read_func = CARDi_GetRomAccessor();
+
+ CARD_InitPulledOutCallback();
+ }
+}
+
+ARM_FUNC void CARD_WaitRomAsync(void)
+{
+ (void)CARDi_WaitAsync();
+}
+
+ARM_FUNC void (*CARDi_GetRomAccessor(void)) (CARDRomStat *)
+{
+ return CARDi_ReadCard;
+}
diff --git a/arm9/lib/src/OS_init.c b/arm9/lib/src/OS_init.c
index 83e8a7d9..d1465625 100644
--- a/arm9/lib/src/OS_init.c
+++ b/arm9/lib/src/OS_init.c
@@ -2,9 +2,9 @@
#include "OS_init.h"
#include "MI_init.h"
#include "PXI_init.h"
+#include "CARD_rom.h"
extern void CTRDG_Init(void);
-extern void CARD_Init(void);
extern void PM_Init(void);
ARM_FUNC void OS_Init(void) {