summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--arm9/arm9.lsf2
-rw-r--r--arm9/asm/CTRDG.s670
-rw-r--r--arm9/asm/CTRDG_proc.s14
-rw-r--r--arm9/lib/include/CTRDG_common.h137
-rw-r--r--arm9/lib/include/MI_dma.h3
-rw-r--r--arm9/lib/include/MI_exMemory.h40
-rw-r--r--arm9/lib/include/MI_memory.h5
-rw-r--r--arm9/lib/include/OS_protectionRegion.h4
-rw-r--r--arm9/lib/include/OS_spinLock.h6
-rw-r--r--arm9/lib/include/consts.h7
-rw-r--r--arm9/lib/include/mmap.h3
-rw-r--r--arm9/lib/include/syscall.h13
-rw-r--r--arm9/lib/src/CTRDG_common.c349
14 files changed, 568 insertions, 687 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4ef6e929..e21a731a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,7 +18,7 @@ file(GLOB_RECURSE SOURCES RELATIVE ${CMAKE_SOURCE_DIR} "*.c" "*.cpp")
add_executable(PokeDiamond ${SOURCES})
target_include_directories(PokeDiamond PRIVATE include include-mw arm9/lib/include arm7/lib/include arm9/modules/05/include arm9/modules/21/include arm9/modules/59/include arm9/modules/63/include)
-add_executable(calcrom .travis/calcrom/calcrom.cpp)
+add_executable(calcrom .github/calcrom/calcrom.cpp)
target_include_directories(calcrom PRIVATE /usr/local/include)
add_executable(knarc tools/knarc/Source.cpp tools/knarc/Narc.cpp tools/knarc/fnmatch.c)
diff --git a/arm9/arm9.lsf b/arm9/arm9.lsf
index 5468430a..33661a6b 100644
--- a/arm9/arm9.lsf
+++ b/arm9/arm9.lsf
@@ -452,7 +452,7 @@ Static arm9
Object WM_ds.o
Object WM_ks.o
Object WM_etc.o
- Object CTRDG.o
+ Object CTRDG_common.o
Object CTRDG_proc.o
Object CTRDG_backup.o
Object CTRDG_flash_common.o
diff --git a/arm9/asm/CTRDG.s b/arm9/asm/CTRDG.s
deleted file mode 100644
index dc60582b..00000000
--- a/arm9/asm/CTRDG.s
+++ /dev/null
@@ -1,670 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global UNK_021D6940
-UNK_021D6940: ; 0x021D6940
- .space 0x4
-
- .global UNK_021D6944
-UNK_021D6944: ; 0x021D6944
- .space 0x4
-
- .text
-
- arm_func_start CTRDG_CheckEnabled
-CTRDG_CheckEnabled:
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- bl CTRDG_IsOptionCartridge
- cmp r0, #0x0
- addne sp, sp, #0x4
- ldmneia sp!, {lr}
- bxne lr
- bl CTRDG_IsEnabled
- cmp r0, #0x0
- addne sp, sp, #0x4
- ldmneia sp!, {lr}
- bxne lr
- bl OS_Terminate
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start CTRDG_Enable
-CTRDG_Enable: ; 0x020DB15C
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4
- mov r5, r0
- bl OS_DisableInterrupts
- ldr r1, _020DB1AC ; =UNK_021D6940
- mov r4, r0
- str r5, [r1, #0x0]
- bl CTRDG_IsOptionCartridge
- cmp r0, #0x0
- bne _020DB198
- cmp r5, #0x0
- movne r1, #0x1000
- moveq r1, #0x5000
- mov r0, #0xf000
- bl OS_SetDPermissionsForProtectionRegion
-_020DB198:
- mov r0, r4
- bl OS_RestoreInterrupts
- add sp, sp, #0x4
- ldmia sp!, {r4-r5,lr}
- bx lr
- .balign 4
-_020DB1AC: .word UNK_021D6940
-
- arm_func_start CTRDG_IsEnabled
-CTRDG_IsEnabled:
- ldr r0, _020DB1BC ; =UNK_021D6940
- ldr r0, [r0, #0x0]
- bx lr
- .balign 4
-_020DB1BC: .word UNK_021D6940
-
- arm_func_start CTRDGi_AccessCommon
-CTRDGi_AccessCommon: ; 0x020DB1C0
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r7, r0
- mov r6, r1
- mov r5, r2
- mov r4, r3
- bl CTRDG_IsExisting
- cmp r0, #0x0
- addeq sp, sp, #0x4
- moveq r0, #0x0
- ldmeqia sp!, {r4-r7,lr}
- bxeq lr
- bl CTRDG_CheckEnabled
- ldr r0, _020DB2BC ; =UNK_021D6944
- ldrh r0, [r0, #0x2]
- bl OS_LockCartridge
- cmp r4, #0x21
- bhi _020DB240
- cmp r4, #0x21
- bhs _020DB270
- cmp r4, #0x11
- bhi _020DB234
- cmp r4, #0x10
- blo _020DB294
- cmp r4, #0x10
- beq _020DB290
- cmp r4, #0x11
- beq _020DB260
- b _020DB294
-_020DB234:
- cmp r4, #0x20
- streqh r6, [r7, #0x0]
- b _020DB294
-_020DB240:
- cmp r4, #0x40
- bhi _020DB254
- cmp r4, #0x40
- streq r6, [r7, #0x0]
- b _020DB294
-_020DB254:
- cmp r4, #0x41
- beq _020DB280
- b _020DB294
-_020DB260:
- cmp r5, #0x0
- ldrneb r0, [r7, #0x0]
- strneb r0, [r5, #0x0]
- b _020DB294
-_020DB270:
- cmp r5, #0x0
- ldrneh r0, [r7, #0x0]
- strneh r0, [r5, #0x0]
- b _020DB294
-_020DB280:
- cmp r5, #0x0
- ldrne r0, [r7, #0x0]
- strne r0, [r5, #0x0]
- b _020DB294
-_020DB290:
- strb r6, [r7, #0x0]
-_020DB294:
- ldr r0, _020DB2BC ; =UNK_021D6944
- ldrh r0, [r0, #0x2]
- bl OS_UnLockCartridge
- bl CTRDG_IsExisting
- cmp r0, #0x0
- movne r0, #0x1
- moveq r0, #0x0
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
- .balign 4
-_020DB2BC: .word UNK_021D6944
-
- arm_func_start CTRDG_Read32
-CTRDG_Read32: ; 0x020DB2C0
- ldr ip, _020DB2D4 ; =CTRDGi_AccessCommon
- mov r2, r1
- mov r1, #0x0
- mov r3, #0x41
- bx r12
- .balign 4
-_020DB2D4: .word CTRDGi_AccessCommon
-
- arm_func_start CTRDGi_CopyCommon
-CTRDGi_CopyCommon: ; 0x020DB2D8
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r7, r0
- mov r6, r1
- mov r5, r2
- mov r4, r3
- bl CTRDG_IsExisting
- cmp r0, #0x0
- addeq sp, sp, #0x4
- moveq r0, #0x0
- ldmeqia sp!, {r4-r7,lr}
- bxeq lr
- bl CTRDG_CheckEnabled
- ldr r0, _020DB42C ; =UNK_021D6944
- ldrh r0, [r0, #0x2]
- bl OS_LockCartridge
- ldr r0, [sp, #0x18]
- ands r0, r0, #0x1
- bne _020DB338
- mov r0, r7
- bl MI_StopDma
- mov r0, r5
- mov r1, r4
- bl DC_FlushRange
-_020DB338:
- ldr r0, [sp, #0x18]
- cmp r0, #0x11
- bhi _020DB36C
- cmp r0, #0x10
- blo _020DB360
- cmp r0, #0x10
- beq _020DB38C
- cmp r0, #0x11
- beq _020DB3BC
- b _020DB404
-_020DB360:
- cmp r0, #0x1
- beq _020DB3E4
- b _020DB404
-_020DB36C:
- cmp r0, #0x20
- bhi _020DB380
- cmp r0, #0x20
- beq _020DB3A4
- b _020DB404
-_020DB380:
- cmp r0, #0x21
- beq _020DB3D0
- b _020DB404
-_020DB38C:
- mov r0, r7
- mov r1, r6
- mov r2, r5
- mov r3, r4
- bl MI_DmaCopy16
- b _020DB404
-_020DB3A4:
- mov r0, r7
- mov r1, r6
- mov r2, r5
- mov r3, r4
- bl MI_DmaCopy32
- b _020DB404
-_020DB3BC:
- mov r0, r6
- mov r1, r5
- mov r2, r4
- bl MIi_CpuCopy16
- b _020DB404
-_020DB3D0:
- mov r0, r6
- mov r1, r5
- mov r2, r4
- bl MIi_CpuCopy32
- b _020DB404
-_020DB3E4:
- cmp r4, #0x0
- mov r1, #0x0
- bls _020DB404
-_020DB3F0:
- ldrb r0, [r6], #0x1
- add r1, r1, #0x1
- cmp r1, r4
- strb r0, [r5], #0x1
- blo _020DB3F0
-_020DB404:
- ldr r0, _020DB42C ; =UNK_021D6944
- ldrh r0, [r0, #0x2]
- bl OS_UnLockCartridge
- bl CTRDG_IsExisting
- cmp r0, #0x0
- movne r0, #0x1
- moveq r0, #0x0
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
- .balign 4
-_020DB42C: .word UNK_021D6944
-
- arm_func_start CTRDG_CpuCopy32
-CTRDG_CpuCopy32: ; 0x020DB430
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- mov lr, r1
- mov r3, r2
- mov r12, #0x21
- mov r1, r0
- mov r2, lr
- mov r0, #0x0
- str r12, [sp, #0x0]
- bl CTRDGi_CopyCommon
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start CTRDG_CpuCopy16
-CTRDG_CpuCopy16: ; 0x020DB464
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- mov lr, r1
- mov r3, r2
- mov r12, #0x11
- mov r1, r0
- mov r2, lr
- mov r0, #0x0
- str r12, [sp, #0x0]
- bl CTRDGi_CopyCommon
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start CTRDG_CpuCopy8
-CTRDG_CpuCopy8: ; 0x020DB498
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- mov lr, r1
- mov r3, r2
- cmp lr, #0x8000000
- blo _020DB4DC
- ldr r2, _020DB500 ; =0x0A010000
- cmp lr, r2
- bhs _020DB4DC
- mov r12, #0x1
- mov r2, r0
- mov r0, #0x0
- str r12, [sp, #0x0]
- bl CTRDGi_CopyCommon
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-_020DB4DC:
- mov r12, #0x1
- mov r1, r0
- mov r2, lr
- mov r0, #0x0
- str r12, [sp, #0x0]
- bl CTRDGi_CopyCommon
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020DB500: .word 0x0A010000
-
- arm_func_start CTRDGi_SendtoPxi
-CTRDGi_SendtoPxi: ; 0x020DB504
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r7, r0
- mov r1, r7
- mov r0, #0xd
- mov r2, #0x0
- bl PXI_SendWordByFifo
- cmp r0, #0x0
- addeq sp, sp, #0x4
- ldmeqia sp!, {r4-r7,lr}
- bxeq lr
- mov r6, #0x1
- mov r5, #0xd
- mov r4, #0x0
-_020DB53C:
- mov r0, r6
- bl SVC_WaitByLoop
- mov r0, r5
- mov r1, r7
- mov r2, r4
- bl PXI_SendWordByFifo
- cmp r0, #0x0
- bne _020DB53C
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
-
- arm_func_start CTRDGi_UnlockByProcessor
-CTRDGi_UnlockByProcessor: ; 0x020DB568
- stmdb sp!, {r4,lr}
- mov r4, r1
- ldr r1, [r4, #0x0]
- cmp r1, #0x0
- bne _020DB580
- bl OS_UnLockCartridge
-_020DB580:
- ldr r0, [r4, #0x4]
- bl OS_RestoreInterrupts
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start CTRDGi_LockByProcessor
-CTRDGi_LockByProcessor: ; 0x020DB590
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r7, r0
- mov r6, r1
- ldr r5, _020DB60C ; =0x027FFFE8
- mov r4, #0x1
-_020DB5A8:
- bl OS_DisableInterrupts
- str r0, [r6, #0x4]
- mov r0, r5
- bl OS_ReadOwnerOfLockWord
- and r0, r0, #0x40
- str r0, [r6, #0x0]
- ldr r0, [r6, #0x0]
- cmp r0, #0x0
- addne sp, sp, #0x4
- ldmneia sp!, {r4-r7,lr}
- bxne lr
- mov r0, r7
- bl OS_TryLockCartridge
- cmp r0, #0x0
- addeq sp, sp, #0x4
- ldmeqia sp!, {r4-r7,lr}
- bxeq lr
- ldr r0, [r6, #0x4]
- bl OS_RestoreInterrupts
- mov r0, r4
- bl SVC_WaitByLoop
- b _020DB5A8
-_020DB600: ; 0x020DB600
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
- .balign 4
-_020DB60C: .word 0x027FFFE8
-
- arm_func_start CTRDGi_RestoreAccessCycle
-CTRDGi_RestoreAccessCycle: ; 0x020DB610
- ldr r3, _020DB640 ; =0x04000204
- ldr r2, [r0, #0x0]
- ldrh r1, [r3, #0x0]
- bic r1, r1, #0xc
- orr r1, r1, r2, lsl #0x2
- strh r1, [r3, #0x0]
- ldrh r1, [r3, #0x0]
- ldr r2, [r0, #0x4]
- bic r0, r1, #0x10
- orr r0, r0, r2, lsl #0x4
- strh r0, [r3, #0x0]
- bx lr
- .balign 4
-_020DB640: .word 0x04000204
-
- arm_func_start CTRDGi_ChangeLatestAccessCycle
-CTRDGi_ChangeLatestAccessCycle: ; 0x020DB644
- ldr r2, _020DB688 ; =0x04000204
- ldrh r1, [r2, #0x0]
- and r1, r1, #0xc
- mov r1, r1, asr #0x2
- str r1, [r0, #0x0]
- ldrh r1, [r2, #0x0]
- and r1, r1, #0x10
- mov r1, r1, asr #0x4
- str r1, [r0, #0x4]
- ldrh r0, [r2, #0x0]
- bic r0, r0, #0xc
- orr r0, r0, #0xc
- strh r0, [r2, #0x0]
- ldrh r0, [r2, #0x0]
- bic r0, r0, #0x10
- strh r0, [r2, #0x0]
- bx lr
- .balign 4
-_020DB688: .word 0x04000204
-
- arm_func_start CTRDG_IsExisting
-CTRDG_IsExisting:
- stmdb sp!, {r4,lr}
- sub sp, sp, #0x10
- ldr r2, _020DB798 ; =0x027FFC30
- ldr r0, _020DB79C ; =0x0000FFFF
- ldrh r1, [r2, #0x0]
- mov r4, #0x1
- cmp r1, r0
- addeq sp, sp, #0x10
- moveq r0, #0x0
- ldmeqia sp!, {r4,lr}
- bxeq lr
- ldrb r0, [r2, #0x5]
- mov r0, r0, lsl #0x1e
- mov r0, r0, lsr #0x1f
- cmp r0, #0x1
- addeq sp, sp, #0x10
- moveq r0, #0x0
- ldmeqia sp!, {r4,lr}
- bxeq lr
- ldr r0, _020DB7A0 ; =UNK_021D6944
- add r1, sp, #0x0
- ldrh r0, [r0, #0x2]
- bl CTRDGi_LockByProcessor
- add r0, sp, #0x8
- bl CTRDGi_ChangeLatestAccessCycle
- mov r0, #0x8000000
- ldrb r2, [r0, #0xb2]
- cmp r2, #0x96
- bne _020DB714
- ldr r1, _020DB798 ; =0x027FFC30
- ldrh r0, [r0, #0xbe]
- ldrh r1, [r1, #0x0]
- cmp r1, r0
- bne _020DB75C
-_020DB714:
- cmp r2, #0x96
- beq _020DB734
- ldr r1, _020DB798 ; =0x027FFC30
- ldr r0, _020DB7A4 ; =0x0801FFFE
- ldrh r1, [r1, #0x0]
- ldrh r0, [r0, #0x0]
- cmp r1, r0
- bne _020DB75C
-_020DB734:
- ldr r2, _020DB798 ; =0x027FFC30
- mov r0, #0x8000000
- ldr r1, [r2, #0x8]
- ldr r0, [r0, #0xac]
- cmp r1, r0
- beq _020DB770
- ldrb r0, [r2, #0x5]
- mov r0, r0, lsl #0x1f
- movs r0, r0, lsr #0x1f
- beq _020DB770
-_020DB75C:
- ldr r1, _020DB798 ; =0x027FFC30
- mov r4, #0x0
- ldrb r0, [r1, #0x5]
- orr r0, r0, #0x2
- strb r0, [r1, #0x5]
-_020DB770:
- add r0, sp, #0x8
- bl CTRDGi_RestoreAccessCycle
- ldr r0, _020DB7A0 ; =UNK_021D6944
- add r1, sp, #0x0
- ldrh r0, [r0, #0x2]
- bl CTRDGi_UnlockByProcessor
- mov r0, r4
- add sp, sp, #0x10
- ldmia sp!, {r4,lr}
- bx lr
- .balign 4
-_020DB798: .word 0x027FFC30
-_020DB79C: .word 0x0000FFFF
-_020DB7A0: .word UNK_021D6944
-_020DB7A4: .word 0x0801FFFE
-
- arm_func_start CTRDG_IsPulledOut
-CTRDG_IsPulledOut: ; 0x020DB7A8
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr r2, _020DB800 ; =0x027FFC30
- ldr r0, _020DB804 ; =0x0000FFFF
- ldrh r1, [r2, #0x0]
- cmp r1, r0
- addeq sp, sp, #0x4
- moveq r0, #0x0
- ldmeqia sp!, {lr}
- bxeq lr
- ldrb r0, [r2, #0x5]
- mov r0, r0, lsl #0x1e
- movs r0, r0, lsr #0x1f
- bne _020DB7E4
- bl CTRDG_IsExisting
-_020DB7E4:
- ldr r0, _020DB800 ; =0x027FFC30
- ldrb r0, [r0, #0x5]
- mov r0, r0, lsl #0x1e
- mov r0, r0, lsr #0x1f
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020DB800: .word 0x027FFC30
-_020DB804: .word 0x0000FFFF
-
- arm_func_start CTRDGi_GetAgbMakerCodeAtInit
-CTRDGi_GetAgbMakerCodeAtInit: ; 0x020DB808
- stmdb sp!, {r4,lr}
- mov r4, #0x0
- bl CTRDGi_IsAgbCartridgeAtInit
- cmp r0, #0x0
- ldrne r0, _020DB82C ; =0x027FFC30
- ldrneh r4, [r0, #0x6]
- mov r0, r4
- ldmia sp!, {r4,lr}
- bx lr
- .balign 4
-_020DB82C: .word 0x027FFC30
-
- arm_func_start CTRDG_GetAgbMakerCode
-CTRDG_GetAgbMakerCode: ; 0x020DB830
- stmdb sp!, {r4,lr}
- mov r4, #0x0
- bl CTRDG_IsExisting
- cmp r0, #0x0
- beq _020DB84C
- bl CTRDGi_GetAgbMakerCodeAtInit
- mov r4, r0
-_020DB84C:
- mov r0, r4
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start CTRDGi_GetAgbGameCodeAtInit
-CTRDGi_GetAgbGameCodeAtInit: ; 0x020DB858
- stmdb sp!, {r4,lr}
- mov r4, #0x0
- bl CTRDGi_IsAgbCartridgeAtInit
- cmp r0, #0x0
- ldrne r0, _020DB87C ; =0x027FFC30
- ldrne r4, [r0, #0x8]
- mov r0, r4
- ldmia sp!, {r4,lr}
- bx lr
- .balign 4
-_020DB87C: .word 0x027FFC30
-
- arm_func_start CTRDG_GetAgbGameCode
-CTRDG_GetAgbGameCode: ; 0x020DB880
- stmdb sp!, {r4,lr}
- mov r4, #0x0
- bl CTRDG_IsExisting
- cmp r0, #0x0
- beq _020DB89C
- bl CTRDGi_GetAgbGameCodeAtInit
- mov r4, r0
-_020DB89C:
- mov r0, r4
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start CTRDGi_IsAgbCartridgeAtInit
-CTRDGi_IsAgbCartridgeAtInit:
- ldr r0, _020DB8BC ; =0x027FFC30
- ldrb r0, [r0, #0x5]
- mov r0, r0, lsl #0x1f
- mov r0, r0, lsr #0x1f
- bx lr
- .balign 4
-_020DB8BC: .word 0x027FFC30
-
- arm_func_start CTRDG_IsOptionCartridge
-CTRDG_IsOptionCartridge:
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- bl CTRDG_IsExisting
- cmp r0, #0x0
- beq _020DB8EC
- bl CTRDGi_IsAgbCartridgeAtInit
- cmp r0, #0x0
- addeq sp, sp, #0x4
- moveq r0, #0x1
- ldmeqia sp!, {lr}
- bxeq lr
-_020DB8EC:
- mov r0, #0x0
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start CTRDG_IsAgbCartridge
-CTRDG_IsAgbCartridge: ; 0x020DB8FC
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- bl CTRDG_IsExisting
- cmp r0, #0x0
- beq _020DB928
- bl CTRDGi_IsAgbCartridgeAtInit
- cmp r0, #0x0
- addne sp, sp, #0x4
- movne r0, #0x1
- ldmneia sp!, {lr}
- bxne lr
-_020DB928:
- mov r0, #0x0
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start CTRDGi_InitCommon
-CTRDGi_InitCommon: ; 0x020DB938
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr r1, _020DB970 ; =UNK_021D6944
- mov r3, #0x0
- ldr r2, _020DB974 ; =0x05000001
- add r0, sp, #0x0
- str r3, [sp, #0x0]
- bl SVC_CpuSet
- bl OS_GetLockID
- ldr r1, _020DB970 ; =UNK_021D6944
- strh r0, [r1, #0x2]
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020DB970: .word UNK_021D6944
-_020DB974: .word 0x05000001
diff --git a/arm9/asm/CTRDG_proc.s b/arm9/asm/CTRDG_proc.s
index 3351aa2b..f9e981d0 100644
--- a/arm9/asm/CTRDG_proc.s
+++ b/arm9/asm/CTRDG_proc.s
@@ -1,7 +1,7 @@
.include "asm/macros.inc"
.include "global.inc"
- .extern UNK_021D6944
+ .extern CTRDGi_Work
.section .bss
@@ -104,7 +104,7 @@ CTRDGi_CallbackForInitModuleInfo: ; 0x020DBA2C
sub sp, sp, #0x4
and r0, r1, #0x3f
cmp r0, #0x1
- ldreq r0, _020DBA64 ; =UNK_021D6944
+ ldreq r0, _020DBA64 ; =CTRDGi_Work
moveq r1, #0x1
streqh r1, [r0, #0x0]
addeq sp, sp, #0x4
@@ -115,7 +115,7 @@ CTRDGi_CallbackForInitModuleInfo: ; 0x020DBA2C
ldmia sp!, {lr}
bx lr
.balign 4
-_020DBA64: .word UNK_021D6944
+_020DBA64: .word CTRDGi_Work
arm_func_start CTRDGi_InitModuleInfo
CTRDGi_InitModuleInfo: ; 0x020DBA68
@@ -140,7 +140,7 @@ CTRDGi_InitModuleInfo: ; 0x020DBA68
ldr r3, _020DBC58 ; =0x04000208
mov r2, #0x1
ldrh r4, [r3, #0x0]
- ldr r1, _020DBC5C ; =UNK_021D6944
+ ldr r1, _020DBC5C ; =CTRDGi_Work
mov r6, r0
strh r2, [r3, #0x0]
ldrh r0, [r1, #0x2]
@@ -173,7 +173,7 @@ CTRDGi_InitModuleInfo: ; 0x020DBA68
orr r1, r1, r5, lsl #0xf
strh r1, [r2, #0x0]
bl CTRDGi_RestoreAccessCycle
- ldr r0, _020DBC5C ; =UNK_021D6944
+ ldr r0, _020DBC5C ; =CTRDGi_Work
add r1, sp, #0x0
ldrh r0, [r0, #0x2]
bl CTRDGi_UnlockByProcessor
@@ -227,7 +227,7 @@ _020DBBDC:
mov r0, r0, lsl #0x6
orr r0, r0, #0x1
bl CTRDGi_SendtoPxi
- ldr r5, _020DBC5C ; =UNK_021D6944
+ ldr r5, _020DBC5C ; =CTRDGi_Work
ldrh r0, [r5, #0x0]
cmp r0, #0x1
beq _020DBC30
@@ -251,7 +251,7 @@ _020DBC30:
_020DBC50: .word UNK_021D6948
_020DBC54: .word 0x04000300
_020DBC58: .word 0x04000208
-_020DBC5C: .word UNK_021D6944
+_020DBC5C: .word CTRDGi_Work
_020DBC60: .word 0x04000204
_020DBC64: .word UNK_021D6960
_020DBC68: .word 0x08000080
diff --git a/arm9/lib/include/CTRDG_common.h b/arm9/lib/include/CTRDG_common.h
index 32049f3c..2d37c6f8 100644
--- a/arm9/lib/include/CTRDG_common.h
+++ b/arm9/lib/include/CTRDG_common.h
@@ -1,8 +1,137 @@
-#ifndef NITRO_CTRDG_COMMON_H_
-#define NITRO_CTRDG_COMMON_H_
+#ifndef POKEDIAMOND_CTRDG_COMMON_H
+#define POKEDIAMOND_CTRDG_COMMON_H
-#include "nitro/types.h"
+#include "consts.h"
+#include "OS_spinLock.h"
+#include "OS_system.h"
+#include "MI_exMemory.h"
+typedef struct CTRDGWork
+{
+ vu16 subpInitialized;
+ u16 lockID;
+
+} CTRDGWork;
+
+typedef struct CTRDGModuleID
+{
+ union
+ {
+ struct
+ {
+ u8 bitID;
+ u8 numberID:5;
+ u8 :2;
+ u8 disableExLsiID:1;
+ };
+ u16 raw;
+ };
+} CTRDGModuleID;
+
+typedef struct CTRDGModuleInfo
+{
+ CTRDGModuleID moduleID;
+ u8 exLsiID[3];
+ u8 isAgbCartridge:1;
+ u8 detectPullOut:1;
+ u8 :0; //??
+ u16 makerCode;
+ u32 gameCode;
+} CTRDGModuleInfo;
+
+typedef struct CTRDGLockByProc
+{
+ BOOL locked;
+ OSIntrMode irq;
+} CTRDGLockByProc;
+
+typedef struct CTRDGHeader
+{
+ u32 startAddress;
+ u8 nintendoLogo[0x9c];
+
+ u8 titleName[12];
+ u32 gameCode;
+ u16 makerCode;
+
+ u8 isRomCode;
+
+ u8 machineCode;
+ u8 deviceType;
+
+ u8 exLsiID[3];
+
+ u8 reserved[4];
+ u8 softVersion;
+ u8 complement;
+
+ u16 moduleID;
+} CTRDGHeader;
+
+typedef struct CTRDGRomCycle
+{
+ MICartridgeRomCycle1st c1;
+ MICartridgeRomCycle2nd c2;
+} CTRDGRomCycle;
+
+#define CTRDGi_GetModuleInfoAddr() ((CTRDGModuleInfo *)HW_CTRDG_MODULE_INFO_BUF)
+#define CTRDGi_GetHeaderAddr() ((CTRDGHeader *)HW_CTRDG_ROM)
+#define CTRDGi_GetModuleIDImageAddr() ((u16 *)(HW_CTRDG_ROM + 0x0001fffe))
+
+#define CTRDG_IS_ROM_CODE 0x96
+#define CTRDG_LOCKED_BY_MYPROC_FLAG OS_MAINP_LOCKED_FLAG
+
+#define CTRDGi_FORWARD_TYPE_DMA 0x00000000
+#define CTRDGi_FORWARD_TYPE_CPU 0x00000001
+#define CTRDGi_FORWARD_TYPE_MASK 0x00000001
+
+#define CTRDGi_FORWARD_WIDTH_8 0x00000000
+#define CTRDGi_FORWARD_WIDTH_16 0x00000010
+#define CTRDGi_FORWARD_WIDTH_32 0x00000020
+
+#define CTRDGi_FORWARD_DMA16 (CTRDGi_FORWARD_TYPE_DMA | CTRDGi_FORWARD_WIDTH_16)
+#define CTRDGi_FORWARD_DMA32 (CTRDGi_FORWARD_TYPE_DMA | CTRDGi_FORWARD_WIDTH_32)
+#define CTRDGi_FORWARD_CPU8 (CTRDGi_FORWARD_TYPE_CPU | CTRDGi_FORWARD_WIDTH_8)
+#define CTRDGi_FORWARD_CPU16 (CTRDGi_FORWARD_TYPE_CPU | CTRDGi_FORWARD_WIDTH_16)
+#define CTRDGi_FORWARD_CPU32 (CTRDGi_FORWARD_TYPE_CPU | CTRDGi_FORWARD_WIDTH_32)
+
+#define CTRDGi_ACCESS_DIR_WRITE 0x00000000
+#define CTRDGi_ACCESS_DIR_READ 0x00000001
+
+#define CTRDGi_ACCESS_WIDTH_8 0x00000010
+#define CTRDGi_ACCESS_WIDTH_16 0x00000020
+#define CTRDGi_ACCESS_WIDTH_32 0x00000040
+
+#define CTRDGi_ACCESS_WRITE8 (CTRDGi_ACCESS_DIR_WRITE | CTRDGi_ACCESS_WIDTH_8)
+#define CTRDGi_ACCESS_WRITE16 (CTRDGi_ACCESS_DIR_WRITE | CTRDGi_ACCESS_WIDTH_16)
+#define CTRDGi_ACCESS_WRITE32 (CTRDGi_ACCESS_DIR_WRITE | CTRDGi_ACCESS_WIDTH_32)
+#define CTRDGi_ACCESS_READ8 (CTRDGi_ACCESS_DIR_READ | CTRDGi_ACCESS_WIDTH_8)
+#define CTRDGi_ACCESS_READ16 (CTRDGi_ACCESS_DIR_READ | CTRDGi_ACCESS_WIDTH_16)
+#define CTRDGi_ACCESS_READ32 (CTRDGi_ACCESS_DIR_READ | CTRDGi_ACCESS_WIDTH_32)
+
+void CTRDGi_InitCommon(void);
+BOOL CTRDG_IsAgbCartridge(void);
+BOOL CTRDG_IsOptionCartridge(void);
+BOOL CTRDGi_IsAgbCartridgeAtInit(void);
+u32 CTRDG_GetAgbGameCode(void);
+u32 CTRDGi_GetAgbGameCodeAtInit(void);
+u16 CTRDG_GetAgbMakerCode(void);
+u16 CTRDGi_GetAgbMakerCodeAtInit(void);
BOOL CTRDG_IsPulledOut(void);
+BOOL CTRDG_IsExisting(void);
+void CTRDGi_ChangeLatestAccessCycle(CTRDGRomCycle *r);
+void CTRDGi_RestoreAccessCycle(CTRDGRomCycle *r);
+void CTRDGi_LockByProcessor(u16 lockID, CTRDGLockByProc *info);
+void CTRDGi_UnlockByProcessor(u16 lockID, CTRDGLockByProc *info);
+void CTRDGi_SendtoPxi(u32 data);
+BOOL CTRDG_CpuCopy8(const void *src, void *dest, u32 size);
+BOOL CTRDG_CpuCopy16(const void *src, void *dest, u32 size);
+BOOL CTRDG_CpuCopy32(const void *src, void *dest, u32 size);
+BOOL CTRDGi_CopyCommon(u32 dmaNo, const void *src, void *dest, u32 size, u32 forwardType);
+BOOL CTRDG_Read32(const u32 *address, u32 *rdata);
+BOOL CTRDGi_AccessCommon(void *address, u32 data, void *rdata, u32 accessType);
+BOOL CTRDG_IsEnabled(void);
+void CTRDG_Enable(BOOL enable);
+void CTRDG_CheckEnabled(void);
-#endif //NITRO_CTRDG_COMMON_H_
+#endif //POKEDIAMOND_CTRDG_COMMON_H
diff --git a/arm9/lib/include/MI_dma.h b/arm9/lib/include/MI_dma.h
index 8ce3f417..99d1cb84 100644
--- a/arm9/lib/include/MI_dma.h
+++ b/arm9/lib/include/MI_dma.h
@@ -21,6 +21,9 @@ typedef void (*MIDmaCallback)(void *);
#define MI_DMA_SRC_FIX (2UL << 23)
#define MI_DMA_SRC_INC (0UL << 23)
+#define MI_DMA_16BIT_BUS (0UL << 26)
+#define MI_DMA_32BIT_BUS (1UL << 26)
+
#define MIi_DMA_TIMING_ANY (u32)(~0)
#define MI_DMA_TIMING_H_BLANK (2UL << 27)
diff --git a/arm9/lib/include/MI_exMemory.h b/arm9/lib/include/MI_exMemory.h
index 8bd355ac..df46b008 100644
--- a/arm9/lib/include/MI_exMemory.h
+++ b/arm9/lib/include/MI_exMemory.h
@@ -1,5 +1,5 @@
-#ifndef NITRO_MI_EXMEMORY_H_
-#define NITRO_MI_EXMEMORY_H_
+#ifndef POKEDIAMOND_MI_EXMEMORY_H
+#define POKEDIAMOND_MI_EXMEMORY_H
#include "consts.h"
@@ -8,6 +8,20 @@ typedef enum {
MI_PROCESSOR_ARM7 = 1
} MIProcessor;
+typedef enum
+{
+ MI_CTRDG_ROMCYCLE1_10 = 0,
+ MI_CTRDG_ROMCYCLE1_8 = 1,
+ MI_CTRDG_ROMCYCLE1_6 = 2,
+ MI_CTRDG_ROMCYCLE1_18 = 3
+} MICartridgeRomCycle1st;
+
+typedef enum
+{
+ MI_CTRDG_ROMCYCLE2_6 = 0,
+ MI_CTRDG_ROMCYCLE2_4 = 1
+} MICartridgeRomCycle2nd;
+
static inline void MIi_SetCardProcessor(MIProcessor proc)
{
reg_MI_EXMEMCNT =
@@ -20,4 +34,24 @@ static inline void MIi_SetCartridgeProcessor(MIProcessor proc)
(u16)((reg_MI_EXMEMCNT & ~0x0080) | (proc << 7));
}
-#endif //NITRO_MI_EXMEMORY_H_
+static inline MICartridgeRomCycle1st MI_GetCartridgeRomCycle1st(void)
+{
+ return (MICartridgeRomCycle1st)((reg_MI_EXMEMCNT & 0xc) >> 2);
+}
+
+static inline MICartridgeRomCycle2nd MI_GetCartridgeRomCycle2nd(void)
+{
+ return (MICartridgeRomCycle2nd)((reg_MI_EXMEMCNT & 0x10) >> 4);
+}
+
+static inline void MI_SetCartridgeRomCycle1st(MICartridgeRomCycle1st c1)
+{
+ reg_MI_EXMEMCNT = (u16)((reg_MI_EXMEMCNT & ~0xc) | (c1 << 2));
+}
+
+static inline void MI_SetCartridgeRomCycle2nd(MICartridgeRomCycle2nd c2)
+{
+ reg_MI_EXMEMCNT = (u16)((reg_MI_EXMEMCNT & ~0x10) | (c2 << 4));
+}
+
+#endif //POKEDIAMOND_MI_EXMEMORY_H
diff --git a/arm9/lib/include/MI_memory.h b/arm9/lib/include/MI_memory.h
index 450e5e58..339ff9b8 100644
--- a/arm9/lib/include/MI_memory.h
+++ b/arm9/lib/include/MI_memory.h
@@ -45,6 +45,11 @@ static inline void MI_CpuCopy16(const void *src, void *dest, u32 size)
MIi_CpuCopy16(src, dest, size);
}
+static inline void MI_CpuCopy32(const void *src, void *dest, u32 size)
+{
+ MIi_CpuCopy32(src, dest, size);
+}
+
static inline void MI_CpuFillFast(void *dest, u32 data, u32 size)
{
MIi_CpuClearFast(data, dest, size);
diff --git a/arm9/lib/include/OS_protectionRegion.h b/arm9/lib/include/OS_protectionRegion.h
index 9b65258d..00b7ae63 100644
--- a/arm9/lib/include/OS_protectionRegion.h
+++ b/arm9/lib/include/OS_protectionRegion.h
@@ -41,4 +41,8 @@ static inline u32 OSi_CalcPRParam(u32 address, u32 size, OSiProtectionRegionBase
OS_SetProtectionRegion##regionNo(OSi_CalcPRParam(address, HW_C6_PR_##sizeStr, OSi_PR_BASE_MASK_##sizeStr) \
| 1)
+#define OS_PR3_ACCESS_MASK (HW_C5_PERMIT_MASK << HW_C5_PR3_SFT)
+#define OS_PR3_ACCESS_RW (HW_C5_PERMIT_RW << HW_C5_PR3_SFT)
+#define OS_PR3_ACCESS_RO (HW_C5_PERMIT_RO << HW_C5_PR3_SFT)
+
#endif //POKEDIAMOND_OS_PROTECTIONREGION_H
diff --git a/arm9/lib/include/OS_spinLock.h b/arm9/lib/include/OS_spinLock.h
index c26e3b9f..09c2cf2c 100644
--- a/arm9/lib/include/OS_spinLock.h
+++ b/arm9/lib/include/OS_spinLock.h
@@ -5,7 +5,11 @@
#include "nitro/OS_spinLock_shared.h"
#include "syscall.h"
-#define OS_LOCK_ID_ERROR (-3)
+#define OS_ReadOwnerOfLockCartridge() OS_ReadOwnerOfLockWord( (OSLockWord *)HW_CTRDG_LOCK_BUF )
+#define OS_MAINP_LOCKED_FLAG 0x40
+#define OS_LOCK_SUCCESS 0
+
+#define OS_LOCK_ID_ERROR (-3)
static inline void OSi_WaitByLoop(void)
{
diff --git a/arm9/lib/include/consts.h b/arm9/lib/include/consts.h
index 095a15df..a41f22ae 100644
--- a/arm9/lib/include/consts.h
+++ b/arm9/lib/include/consts.h
@@ -6,6 +6,13 @@
#include "registers.h"
#include "systemWork.h"
+#define HW_C5_PERMIT_MASK 0xf
+
+#define HW_C5_PERMIT_RO 5
+#define HW_C5_PERMIT_RW 1
+
+#define HW_C5_PR3_SFT 12
+
#define HW_C6_PR_4KB 0x16
#define HW_C6_PR_8KB 0x18
#define HW_C6_PR_16KB 0x1a
diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h
index de5a8057..69e9c696 100644
--- a/arm9/lib/include/mmap.h
+++ b/arm9/lib/include/mmap.h
@@ -34,6 +34,7 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_BOOT_CHECK_INFO_BUF (HW_MAIN_MEM + 0x007ffc00)
#define HW_RESET_PARAMETER_BUF (HW_MAIN_MEM + 0x007ffc20)
#define HW_ROM_BASE_OFFSET_BUF (HW_MAIN_MEM + 0x007ffc2c)
+#define HW_CTRDG_MODULE_INFO_BUF (HW_MAIN_MEM + 0x007ffc30)
#define HW_ROM_HEADER_BUF (HW_MAIN_MEM + 0x007ffe00) // ROM registration area data buffer
#define HW_RED_RESERVED (HW_MAIN_MEM + 0x007ff800) // Some kind of reserved data for shared memory
#define HW_MAIN_MEM_EX_END (HW_MAIN_MEM + HW_MAIN_MEM_EX_SIZE)
@@ -93,6 +94,8 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_DB_OAM_END 0x07000800
#define HW_DB_OAM_SIZE (HW_DB_OAM_END-HW_DB_OAM)
+#define HW_CTRDG_RAM_END 0x0a010000
+
#define HW_DTCM_SYSRV_OFS_INTR_VECTOR 0x3c
#define HW_RESET_VECTOR 0xffff0000
diff --git a/arm9/lib/include/syscall.h b/arm9/lib/include/syscall.h
index 427134a7..8e7962df 100644
--- a/arm9/lib/include/syscall.h
+++ b/arm9/lib/include/syscall.h
@@ -1,6 +1,19 @@
#ifndef POKEDIAMOND_ARM9_SYSCALL_H
#define POKEDIAMOND_ARM9_SYSCALL_H
+#include "consts.h"
+#include "MI_dma.h"
+
+void SVC_CpuSet(const void *srcp, void *destp, u32 dmaCntData);
+
+#define SVC_CpuClear( data, destp, size, bit ) \
+do{ \
+ vu##bit tmp = (vu##bit )(data); \
+ SVC_CpuSet((u8 *)&(tmp), (u8 *)(destp), ( \
+ MI_DMA_SRC_FIX | \
+ MI_DMA_##bit##BIT_BUS | ((size)/((bit)/8) & 0x1fffff))); \
+} while(0)
+
void SVC_WaitByLoop(u32 ct);
#endif //POKEDIAMOND_ARM9_SYSCALL_H
diff --git a/arm9/lib/src/CTRDG_common.c b/arm9/lib/src/CTRDG_common.c
new file mode 100644
index 00000000..3d80cf24
--- /dev/null
+++ b/arm9/lib/src/CTRDG_common.c
@@ -0,0 +1,349 @@
+#include "CTRDG_common.h"
+#include "function_target.h"
+#include "syscall.h"
+#include "OS_cache.h"
+#include "OS_protectionRegion.h"
+#include "OS_terminate_proc.h"
+#include "PXI_fifo.h"
+#include "MI_dma.h"
+#include "MI_memory.h"
+
+CTRDGWork CTRDGi_Work;
+
+static BOOL CTRDGi_EnableFlag = FALSE;
+
+ARM_FUNC void CTRDGi_InitCommon(void)
+{
+ SVC_CpuClear(0, &CTRDGi_Work, sizeof(CTRDGi_Work), 32);
+
+ CTRDGi_Work.lockID = (u16)OS_GetLockID();
+}
+
+ARM_FUNC BOOL CTRDG_IsAgbCartridge(void)
+{
+ return (CTRDG_IsExisting() && CTRDGi_IsAgbCartridgeAtInit());
+}
+
+ARM_FUNC BOOL CTRDG_IsOptionCartridge(void)
+{
+ return (CTRDG_IsExisting() && !CTRDGi_IsAgbCartridgeAtInit());
+}
+
+ARM_FUNC BOOL CTRDGi_IsAgbCartridgeAtInit(void)
+{
+ CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr();
+
+ return cip->isAgbCartridge;
+}
+
+ARM_FUNC u32 CTRDG_GetAgbGameCode(void)
+{
+ u32 ret = 0;
+
+ if (CTRDG_IsExisting())
+ {
+ ret = CTRDGi_GetAgbGameCodeAtInit();
+ }
+
+ return ret;
+}
+
+ARM_FUNC u32 CTRDGi_GetAgbGameCodeAtInit(void)
+{
+ CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr();
+ u32 ret = 0;
+
+ if (CTRDGi_IsAgbCartridgeAtInit())
+ {
+ ret = cip->gameCode;
+ }
+
+ return ret;
+}
+
+ARM_FUNC u16 CTRDG_GetAgbMakerCode(void)
+{
+ u16 ret = 0;
+
+ if (CTRDG_IsExisting())
+ {
+ ret = CTRDGi_GetAgbMakerCodeAtInit();
+ }
+
+ return ret;
+}
+
+ARM_FUNC u16 CTRDGi_GetAgbMakerCodeAtInit(void)
+{
+ CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr();
+ u16 ret = 0;
+
+ if (CTRDGi_IsAgbCartridgeAtInit())
+ {
+ ret = cip->makerCode;
+ }
+
+ return ret;
+}
+
+ARM_FUNC BOOL CTRDG_IsPulledOut(void)
+{
+ CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr();
+
+ if (cip->moduleID.raw == 0xffff)
+ {
+ return FALSE;
+ }
+
+ if (!cip->detectPullOut)
+ {
+ (void)CTRDG_IsExisting();
+ }
+
+ return cip->detectPullOut;
+}
+
+ARM_FUNC BOOL CTRDG_IsExisting(void)
+{
+ BOOL ret = TRUE;
+ CTRDGLockByProc lockInfo;
+
+ CTRDGHeader *chp = CTRDGi_GetHeaderAddr();
+ CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr();
+
+ if (cip->moduleID.raw == 0xffff)
+ {
+ return FALSE;
+ }
+
+ if (cip->detectPullOut == TRUE)
+ {
+ return FALSE;
+ }
+
+ CTRDGi_LockByProcessor(CTRDGi_Work.lockID, &lockInfo);
+
+ CTRDGRomCycle rc;
+
+ CTRDGi_ChangeLatestAccessCycle(&rc);
+ u8 isRomCode = chp->isRomCode;
+
+ if ((isRomCode == CTRDG_IS_ROM_CODE && cip->moduleID.raw != chp->moduleID)
+ || (isRomCode != CTRDG_IS_ROM_CODE && cip->moduleID.raw != *CTRDGi_GetModuleIDImageAddr())
+ || ((cip->gameCode != chp->gameCode) && cip->isAgbCartridge))
+ {
+ cip->detectPullOut = TRUE;
+ ret = FALSE;
+ }
+
+ CTRDGi_RestoreAccessCycle(&rc);
+
+ CTRDGi_UnlockByProcessor(CTRDGi_Work.lockID, &lockInfo);
+
+ return ret;
+}
+
+ARM_FUNC void CTRDGi_ChangeLatestAccessCycle(CTRDGRomCycle *r)
+{
+ r->c1 = MI_GetCartridgeRomCycle1st();
+ r->c2 = MI_GetCartridgeRomCycle2nd();
+
+ MI_SetCartridgeRomCycle1st(MI_CTRDG_ROMCYCLE1_18);
+ MI_SetCartridgeRomCycle2nd(MI_CTRDG_ROMCYCLE2_6);
+}
+
+ARM_FUNC void CTRDGi_RestoreAccessCycle(CTRDGRomCycle *r)
+{
+ MI_SetCartridgeRomCycle1st(r->c1);
+ MI_SetCartridgeRomCycle2nd(r->c2);
+}
+
+ARM_FUNC void CTRDGi_LockByProcessor(u16 lockID, CTRDGLockByProc *info)
+{
+ while (TRUE)
+ {
+ info->irq = OS_DisableInterrupts();
+ if (((info->locked = OS_ReadOwnerOfLockCartridge() & CTRDG_LOCKED_BY_MYPROC_FLAG) != 0)
+ || (OS_TryLockCartridge(lockID) == OS_LOCK_SUCCESS))
+ {
+ break;
+ }
+ (void)OS_RestoreInterrupts(info->irq);
+
+ SVC_WaitByLoop(1);
+ }
+}
+
+ARM_FUNC void CTRDGi_UnlockByProcessor(u16 lockID, CTRDGLockByProc *info)
+{
+ if (!info->locked)
+ {
+ (void)OS_UnLockCartridge(lockID);
+ }
+
+ (void)OS_RestoreInterrupts(info->irq);
+}
+
+ARM_FUNC void CTRDGi_SendtoPxi(u32 data)
+{
+ while (PXI_SendWordByFifo(PXI_FIFO_TAG_CTRDG, data, FALSE) != PXI_FIFO_SUCCESS)
+ {
+ SVC_WaitByLoop(1);
+ }
+}
+
+ARM_FUNC BOOL CTRDG_CpuCopy8(const void *src, void *dest, u32 size)
+{
+ if (HW_CTRDG_ROM <= (u32)dest && (u32)dest < HW_CTRDG_RAM_END)
+ {
+ return CTRDGi_CopyCommon(0, (const void *)dest, (void *)src, size, CTRDGi_FORWARD_CPU8);
+ }
+ else
+ {
+ return CTRDGi_CopyCommon(0, src, dest, size, CTRDGi_FORWARD_CPU8);
+ }
+}
+
+ARM_FUNC BOOL CTRDG_CpuCopy16(const void *src, void *dest, u32 size)
+{
+ return CTRDGi_CopyCommon(0, src, dest, size, CTRDGi_FORWARD_CPU16);
+}
+
+ARM_FUNC BOOL CTRDG_CpuCopy32(const void *src, void *dest, u32 size)
+{
+ return CTRDGi_CopyCommon(0, src, dest, size, CTRDGi_FORWARD_CPU32);
+}
+
+ARM_FUNC BOOL CTRDGi_CopyCommon(u32 dmaNo, const void *src, void *dest, u32 size, u32 forwardType)
+{
+ if (!CTRDG_IsExisting())
+ {
+ return FALSE;
+ }
+
+ CTRDG_CheckEnabled();
+
+ (void)OS_LockCartridge(CTRDGi_Work.lockID);
+
+ if ((forwardType & CTRDGi_FORWARD_TYPE_MASK) == CTRDGi_FORWARD_TYPE_DMA)
+ {
+ MI_StopDma(dmaNo);
+ DC_FlushRange(dest, size);
+ }
+
+ switch (forwardType)
+ {
+ case CTRDGi_FORWARD_DMA16:
+ MI_DmaCopy16(dmaNo, src, dest, size);
+ break;
+ case CTRDGi_FORWARD_DMA32:
+ MI_DmaCopy32(dmaNo, src, dest, size);
+ break;
+ case CTRDGi_FORWARD_CPU16:
+ MI_CpuCopy16(src, dest, size);
+ break;
+ case CTRDGi_FORWARD_CPU32:
+ MI_CpuCopy32(src, dest, size);
+ break;
+
+ case CTRDGi_FORWARD_CPU8:
+ u8 *dest8 = (u8 *)dest;
+ u8 *src8 = (u8 *)src;
+ for (s32 n = 0; n < size; n++)
+ {
+ *dest8++ = *src8++;
+ }
+ break;
+ }
+
+ (void)OS_UnLockCartridge(CTRDGi_Work.lockID);
+
+ if (!CTRDG_IsExisting())
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+ARM_FUNC BOOL CTRDG_Read32(const u32 *address, u32 *rdata)
+{
+ return CTRDGi_AccessCommon((void *)address, 0, rdata, CTRDGi_ACCESS_READ32);
+}
+
+ARM_FUNC BOOL CTRDGi_AccessCommon(void *address, u32 data, void *rdata, u32 accessType)
+{
+ if (!CTRDG_IsExisting())
+ {
+ return FALSE;
+ }
+
+ CTRDG_CheckEnabled();
+
+ (void)OS_LockCartridge(CTRDGi_Work.lockID);
+
+ switch (accessType)
+ {
+ case CTRDGi_ACCESS_READ8:
+ if (rdata)
+ {
+ *(u8 *)rdata = *(u8 *)address;
+ }
+ break;
+ case CTRDGi_ACCESS_READ16:
+ if (rdata)
+ {
+ *(u16 *)rdata = *(u16 *)address;
+ }
+ break;
+ case CTRDGi_ACCESS_READ32:
+ if (rdata)
+ {
+ *(u32 *)rdata = *(u32 *)address;
+ }
+ break;
+ case CTRDGi_ACCESS_WRITE8:
+ *(u8 *)address = (u8)data;
+ break;
+ case CTRDGi_ACCESS_WRITE16:
+ *(u16 *)address = (u16)data;
+ break;
+ case CTRDGi_ACCESS_WRITE32:
+ *(u32 *)address = (u32)data;
+ break;
+ }
+
+ (void)OS_UnLockCartridge(CTRDGi_Work.lockID);
+
+ if (!CTRDG_IsExisting())
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+ARM_FUNC BOOL CTRDG_IsEnabled(void)
+{
+ return CTRDGi_EnableFlag;
+}
+
+ARM_FUNC void CTRDG_Enable(BOOL enable)
+{
+ OSIntrMode bak_cpsr = OS_DisableInterrupts();
+ CTRDGi_EnableFlag = enable;
+ if (!CTRDG_IsOptionCartridge())
+ {
+ u32 acc = (u32)(enable ? OS_PR3_ACCESS_RW : OS_PR3_ACCESS_RO);
+ (void)OS_SetDPermissionsForProtectionRegion(OS_PR3_ACCESS_MASK, acc);
+ }
+ (void)OS_RestoreInterrupts(bak_cpsr);
+}
+
+ARM_FUNC void CTRDG_CheckEnabled(void)
+{
+ if (!CTRDG_IsOptionCartridge() && !CTRDG_IsEnabled())
+ {
+ OS_Terminate();
+ }
+}