mirror of
https://github.com/pret/pokediamond.git
synced 2026-08-26 02:34:39 -05:00
arm9 card_spi (fully decomp arm9 card)
This commit is contained in:
@@ -1,225 +0,0 @@
|
||||
.include "asm/macros.inc"
|
||||
.include "global.inc"
|
||||
|
||||
.extern cardi_common
|
||||
|
||||
.text
|
||||
|
||||
arm_func_start CARDi_IdentifyBackupCore
|
||||
CARDi_IdentifyBackupCore: ; 0x020D6A60
|
||||
stmdb sp!, {r4-r5,lr}
|
||||
sub sp, sp, #0x4
|
||||
ldr r1, _020D6D60 ; =cardi_common
|
||||
mov r5, r0
|
||||
ldr r4, [r1, #0x0]
|
||||
mov r1, #0x0
|
||||
add r0, r4, #0x18
|
||||
mov r2, #0x48
|
||||
bl MI_CpuFill8
|
||||
_020D6A84: ; 0x020D6A84
|
||||
cmp r5, #0x0
|
||||
str r5, [r4, #0x4]
|
||||
mov r0, #0x3f
|
||||
addeq sp, sp, #0x4
|
||||
str r0, [r4, #0x4c]
|
||||
ldmeqia sp!, {r4-r5,lr}
|
||||
bxeq lr
|
||||
mov r0, r5, asr #0x8
|
||||
and r0, r0, #0xff
|
||||
mov r2, #0x1
|
||||
mov r3, r2, lsl r0
|
||||
and r1, r5, #0xff
|
||||
str r3, [r4, #0x18]
|
||||
mov r0, #0xff
|
||||
strb r0, [r4, #0x48]
|
||||
cmp r1, #0x1
|
||||
bne _020D6B80
|
||||
cmp r3, #0x200
|
||||
beq _020D6AE4
|
||||
cmp r3, #0x2000
|
||||
beq _020D6B04
|
||||
cmp r3, #0x10000
|
||||
beq _020D6B28
|
||||
b _020D6D38
|
||||
_020D6AE4:
|
||||
mov r0, #0x10
|
||||
str r0, [r4, #0x20]
|
||||
str r2, [r4, #0x24]
|
||||
mov r0, #0x5
|
||||
str r0, [r4, #0x28]
|
||||
mov r0, #0xf0
|
||||
strb r0, [r4, #0x48]
|
||||
b _020D6B48
|
||||
_020D6B04:
|
||||
mov r0, #0x20
|
||||
str r0, [r4, #0x20]
|
||||
mov r0, #0x2
|
||||
str r0, [r4, #0x24]
|
||||
mov r0, #0x5
|
||||
str r0, [r4, #0x28]
|
||||
mov r0, #0x0
|
||||
strb r0, [r4, #0x48]
|
||||
b _020D6B48
|
||||
_020D6B28:
|
||||
mov r0, #0x80
|
||||
str r0, [r4, #0x20]
|
||||
mov r0, #0x2
|
||||
str r0, [r4, #0x24]
|
||||
mov r0, #0xa
|
||||
str r0, [r4, #0x28]
|
||||
mov r0, #0x0
|
||||
strb r0, [r4, #0x48]
|
||||
_020D6B48:
|
||||
ldr r0, [r4, #0x20]
|
||||
add sp, sp, #0x4
|
||||
str r0, [r4, #0x1c]
|
||||
ldr r0, [r4, #0x4c]
|
||||
orr r0, r0, #0x40
|
||||
str r0, [r4, #0x4c]
|
||||
ldr r0, [r4, #0x4c]
|
||||
orr r0, r0, #0x100
|
||||
str r0, [r4, #0x4c]
|
||||
ldr r0, [r4, #0x4c]
|
||||
orr r0, r0, #0x200
|
||||
str r0, [r4, #0x4c]
|
||||
ldmia sp!, {r4-r5,lr}
|
||||
bx lr
|
||||
_020D6B80:
|
||||
cmp r1, #0x2
|
||||
bne _020D6CD8
|
||||
cmp r3, #0x100000
|
||||
bhi _020D6BB8
|
||||
cmp r3, #0x100000
|
||||
bhs _020D6BD8
|
||||
cmp r3, #0x40000
|
||||
bhi _020D6BAC
|
||||
cmp r3, #0x40000
|
||||
beq _020D6BD8
|
||||
b _020D6D38
|
||||
_020D6BAC:
|
||||
cmp r3, #0x80000
|
||||
beq _020D6BD8
|
||||
b _020D6D38
|
||||
_020D6BB8:
|
||||
cmp r3, #0x200000
|
||||
bhi _020D6BCC
|
||||
cmp r3, #0x200000
|
||||
beq _020D6C10
|
||||
b _020D6D38
|
||||
_020D6BCC:
|
||||
cmp r3, #0x800000
|
||||
beq _020D6C48
|
||||
b _020D6D38
|
||||
_020D6BD8:
|
||||
mov r0, #0x19
|
||||
str r0, [r4, #0x2c]
|
||||
mov r1, #0x12c
|
||||
str r1, [r4, #0x30]
|
||||
ldr r0, _020D6D64 ; =0x00001388
|
||||
str r1, [r4, #0x44]
|
||||
str r0, [r4, #0x3c]
|
||||
ldr r0, [r4, #0x4c]
|
||||
orr r0, r0, #0x80
|
||||
str r0, [r4, #0x4c]
|
||||
ldr r0, [r4, #0x4c]
|
||||
orr r0, r0, #0x400
|
||||
str r0, [r4, #0x4c]
|
||||
b _020D6C7C
|
||||
_020D6C10:
|
||||
mov r1, #0x3e8
|
||||
ldr r0, _020D6D68 ; =0x00000BB8
|
||||
str r1, [r4, #0x3c]
|
||||
ldr r1, _020D6D6C ; =0x00004268
|
||||
str r0, [r4, #0x40]
|
||||
ldr r0, _020D6D70 ; =0x00009C40
|
||||
str r1, [r4, #0x34]
|
||||
str r0, [r4, #0x38]
|
||||
mov r0, #0x0
|
||||
strb r0, [r4, #0x48]
|
||||
ldr r0, [r4, #0x4c]
|
||||
orr r0, r0, #0x1000
|
||||
str r0, [r4, #0x4c]
|
||||
b _020D6C7C
|
||||
_020D6C48:
|
||||
mov r1, #0x3e8
|
||||
ldr r0, _020D6D68 ; =0x00000BB8
|
||||
str r1, [r4, #0x3c]
|
||||
ldr r1, _020D6D74 ; =0x000109A0
|
||||
str r0, [r4, #0x40]
|
||||
ldr r0, _020D6D78 ; =0x00027100
|
||||
str r1, [r4, #0x34]
|
||||
str r0, [r4, #0x38]
|
||||
mov r0, #0x0
|
||||
strb r0, [r4, #0x48]
|
||||
ldr r0, [r4, #0x4c]
|
||||
orr r0, r0, #0x1000
|
||||
str r0, [r4, #0x4c]
|
||||
_020D6C7C:
|
||||
mov r0, #0x10000
|
||||
str r0, [r4, #0x1c]
|
||||
mov r0, #0x100
|
||||
str r0, [r4, #0x20]
|
||||
mov r0, #0x3
|
||||
str r0, [r4, #0x24]
|
||||
mov r0, #0x5
|
||||
str r0, [r4, #0x28]
|
||||
ldr r0, [r4, #0x4c]
|
||||
add sp, sp, #0x4
|
||||
orr r0, r0, #0x40
|
||||
str r0, [r4, #0x4c]
|
||||
ldr r0, [r4, #0x4c]
|
||||
orr r0, r0, #0x100
|
||||
str r0, [r4, #0x4c]
|
||||
ldr r0, [r4, #0x4c]
|
||||
orr r0, r0, #0x200
|
||||
str r0, [r4, #0x4c]
|
||||
ldr r0, [r4, #0x4c]
|
||||
orr r0, r0, #0x800
|
||||
str r0, [r4, #0x4c]
|
||||
ldmia sp!, {r4-r5,lr}
|
||||
bx lr
|
||||
_020D6CD8:
|
||||
cmp r1, #0x3
|
||||
bne _020D6D38
|
||||
cmp r3, #0x2000
|
||||
beq _020D6CF0
|
||||
cmp r3, #0x8000
|
||||
bne _020D6D38
|
||||
_020D6CF0:
|
||||
str r3, [r4, #0x20]
|
||||
str r3, [r4, #0x1c]
|
||||
mov r0, #0x2
|
||||
str r0, [r4, #0x24]
|
||||
mov r0, #0x0
|
||||
strb r0, [r4, #0x48]
|
||||
ldr r0, [r4, #0x4c]
|
||||
add sp, sp, #0x4
|
||||
orr r0, r0, #0x40
|
||||
str r0, [r4, #0x4c]
|
||||
ldr r0, [r4, #0x4c]
|
||||
orr r0, r0, #0x100
|
||||
str r0, [r4, #0x4c]
|
||||
ldr r0, [r4, #0x4c]
|
||||
orr r0, r0, #0x200
|
||||
str r0, [r4, #0x4c]
|
||||
ldmia sp!, {r4-r5,lr}
|
||||
bx lr
|
||||
_020D6D38:
|
||||
mov r1, #0x0
|
||||
str r1, [r4, #0x4]
|
||||
str r1, [r4, #0x18]
|
||||
ldr r0, _020D6D60 ; =cardi_common
|
||||
mov r1, #0x3
|
||||
ldr r0, [r0, #0x0]
|
||||
str r1, [r0, #0x0]
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {r4-r5,lr}
|
||||
bx lr
|
||||
.balign 4
|
||||
_020D6D60: .word cardi_common
|
||||
_020D6D64: .word 0x00001388
|
||||
_020D6D68: .word 0x00000BB8
|
||||
_020D6D6C: .word 0x00004268
|
||||
_020D6D70: .word 0x00009C40
|
||||
_020D6D74: .word 0x000109A0
|
||||
_020D6D78: .word 0x00027100
|
||||
@@ -14,10 +14,12 @@
|
||||
#define CARD_THREAD_PRIORITY_DEFAULT 4
|
||||
|
||||
#define CARD_BACKUP_TYPE_DEVICE_SHIFT 0
|
||||
#define CARD_BACKUP_TYPE_DEVICE_MASK 0xFF
|
||||
#define CARD_BACKUP_TYPE_DEVICE_EEPROM 1
|
||||
#define CARD_BACKUP_TYPE_DEVICE_FLASH 2
|
||||
#define CARD_BACKUP_TYPE_DEVICE_FRAM 3
|
||||
#define CARD_BACKUP_TYPE_SIZEBIT_SHIFT 8
|
||||
#define CARD_BACKUP_TYPE_SIZEBIT_MASK 0xFF
|
||||
#define CARD_BACKUP_TYPE_VENDER_SHIFT 16
|
||||
#define CARD_BACKUP_TYPE_DEFINE(type, size, vender) \
|
||||
(((CARD_BACKUP_TYPE_DEVICE_ ## type) << CARD_BACKUP_TYPE_DEVICE_SHIFT) | \
|
||||
@@ -28,6 +30,15 @@
|
||||
#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))
|
||||
|
||||
#define CARD_BACKUP_CAPS_AVAILABLE (u32)(CARD_BACKUP_CAPS_READ - 1)
|
||||
#define CARD_BACKUP_CAPS_READ (u32)(1 << CARD_REQ_READ_BACKUP)
|
||||
#define CARD_BACKUP_CAPS_WRITE (u32)(1 << CARD_REQ_WRITE_BACKUP)
|
||||
#define CARD_BACKUP_CAPS_PROGRAM (u32)(1 << CARD_REQ_PROGRAM_BACKUP)
|
||||
#define CARD_BACKUP_CAPS_VERIFY (u32)(1 << CARD_REQ_VERIFY_BACKUP)
|
||||
#define CARD_BACKUP_CAPS_ERASE_PAGE (u32)(1 << CARD_REQ_ERASE_PAGE_BACKUP)
|
||||
#define CARD_BACKUP_CAPS_ERASE_SECTOR (u32)(1 << CARD_REQ_ERASE_SECTOR_BACKUP)
|
||||
#define CARD_BACKUP_CAPS_ERASE_CHIP (u32)(1 << CARD_REQ_ERASE_CHIP_BACKUP)
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CARD_BACKUP_TYPE_EEPROM_4KBITS = CARD_BACKUP_TYPE_DEFINE(EEPROM, 9, 0),
|
||||
|
||||
8
arm9/lib/include/CARD_spi.h
Normal file
8
arm9/lib/include/CARD_spi.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef POKEDIAMOND_CARD_SPI_H
|
||||
#define POKEDIAMOND_CARD_SPI_H
|
||||
|
||||
#include "CARD_common.h"
|
||||
|
||||
void CARDi_IdentifyBackupCore(CARDBackupType type);
|
||||
|
||||
#endif //POKEDIAMOND_CARD_SPI_H
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "function_target.h"
|
||||
#include "CARD_common.h"
|
||||
#include "CARD_request.h"
|
||||
#include "CARD_spi.h"
|
||||
#include "OS_cache.h"
|
||||
#include "MI_memory.h"
|
||||
#include "OS_terminate_proc.h"
|
||||
@@ -10,8 +11,6 @@
|
||||
extern void OSi_ReferSymbol(void *symbol);
|
||||
extern char _SDK_NintendoBackup[];
|
||||
|
||||
extern void CARDi_IdentifyBackupCore(CARDBackupType type);
|
||||
|
||||
extern CARDiCommon cardi_common;
|
||||
|
||||
static void CARDi_RequestStreamCommandCore(CARDiCommon *p);
|
||||
|
||||
122
arm9/lib/src/CARD_spi.c
Normal file
122
arm9/lib/src/CARD_spi.c
Normal file
@@ -0,0 +1,122 @@
|
||||
#include "function_target.h"
|
||||
#include "nitro/types.h"
|
||||
#include "CARD_common.h"
|
||||
#include "MI_memory.h"
|
||||
|
||||
extern CARDiCommon cardi_common;
|
||||
|
||||
ARM_FUNC void CARDi_IdentifyBackupCore(CARDBackupType type)
|
||||
{
|
||||
CARDiCommandArg *const p = cardi_common.cmd;
|
||||
|
||||
MI_CpuFill8(&p->spec, 0, sizeof(p->spec));
|
||||
p->type = type;
|
||||
p->spec.caps = CARD_BACKUP_CAPS_AVAILABLE;
|
||||
if (type != CARD_BACKUP_TYPE_NOT_USE)
|
||||
{
|
||||
const u32 size = (u32)(1 << ((type >> CARD_BACKUP_TYPE_SIZEBIT_SHIFT) & CARD_BACKUP_TYPE_SIZEBIT_MASK));
|
||||
|
||||
const s32 device = ((type >> CARD_BACKUP_TYPE_DEVICE_SHIFT) & CARD_BACKUP_TYPE_DEVICE_MASK);
|
||||
|
||||
p->spec.total_size = size;
|
||||
p->spec.initial_status = 0xFF;
|
||||
if (device == CARD_BACKUP_TYPE_DEVICE_EEPROM)
|
||||
{
|
||||
switch (size)
|
||||
{
|
||||
default:
|
||||
goto invalid_type;
|
||||
case 0x000200: //CARD_BACKUP_TYPE_EEPROM_4KBITS
|
||||
p->spec.page_size = 0x10;
|
||||
p->spec.addr_width = 1;
|
||||
p->spec.program_page = 5;
|
||||
p->spec.initial_status = 0xF0;
|
||||
break;
|
||||
case 0x002000: //CARD_BACKUP_TYPE_EEPROM_64KIBTS
|
||||
p->spec.page_size = 0x0020;
|
||||
p->spec.addr_width = 2;
|
||||
p->spec.program_page = 5;
|
||||
p->spec.initial_status = 0x00;
|
||||
break;
|
||||
case 0x010000: //CARD_BACKUP_TYPE_EEPROM_512KBITS
|
||||
p->spec.page_size = 0x0080;
|
||||
p->spec.addr_width = 2;
|
||||
p->spec.program_page = 10;
|
||||
p->spec.initial_status = 0x00;
|
||||
break;
|
||||
}
|
||||
p->spec.sect_size = p->spec.page_size;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_READ;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_PROGRAM;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_VERIFY;
|
||||
}
|
||||
else if (device == CARD_BACKUP_TYPE_DEVICE_FLASH)
|
||||
{
|
||||
switch (size)
|
||||
{
|
||||
default:
|
||||
goto invalid_type;
|
||||
case 0x040000: //CARD_BACKUP_TYPE_FLASH_2MBITS
|
||||
case 0x080000: //CARD_BACKUP_TYPE_FLASH_4MBITS
|
||||
case 0x100000: //CARD_BACKUP_TYPE_FLASH_8MBITS
|
||||
p->spec.write_page = 25;
|
||||
p->spec.write_page_total = 300;
|
||||
p->spec.erase_page = 300;
|
||||
p->spec.erase_sector = 5000;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_WRITE;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_ERASE_PAGE;
|
||||
break;
|
||||
case 0x200000: //CARD_BACKUP_TYPE_FLASH_16MBITS
|
||||
p->spec.erase_sector = 1000;
|
||||
p->spec.erase_sector_total = 3000;
|
||||
p->spec.erase_chip = 17000;
|
||||
p->spec.erase_chip_total = 40000;
|
||||
p->spec.initial_status = 0x00;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_ERASE_CHIP;
|
||||
break;
|
||||
case 0x800000: //CARD_BACKUP_TYPE_FLASH_64MBITS
|
||||
p->spec.erase_sector = 1000;
|
||||
p->spec.erase_sector_total = 3000;
|
||||
p->spec.erase_chip = 68000;
|
||||
p->spec.erase_chip_total = 160000;
|
||||
p->spec.initial_status = 0x00;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_ERASE_CHIP;
|
||||
break;
|
||||
}
|
||||
p->spec.sect_size = 0x010000;
|
||||
p->spec.page_size = 0x0100;
|
||||
p->spec.addr_width = 3;
|
||||
p->spec.program_page = 5;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_READ;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_PROGRAM;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_VERIFY;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_ERASE_SECTOR;
|
||||
}
|
||||
else if (device == CARD_BACKUP_TYPE_DEVICE_FRAM)
|
||||
{
|
||||
switch (size)
|
||||
{
|
||||
default:
|
||||
goto invalid_type;
|
||||
case 0x002000: //CARD_BACKUP_TYPE_FRAM_64KBITS
|
||||
case 0x008000: //CARD_BACKUP_TYPE_FRAM_64KBITS
|
||||
break;
|
||||
}
|
||||
p->spec.page_size = size;
|
||||
p->spec.sect_size = size;
|
||||
p->spec.addr_width = 2;
|
||||
p->spec.initial_status = 0x00;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_READ;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_PROGRAM;
|
||||
p->spec.caps |= CARD_BACKUP_CAPS_VERIFY;
|
||||
}
|
||||
else
|
||||
{
|
||||
invalid_type:
|
||||
p->type = CARD_BACKUP_TYPE_NOT_USE;
|
||||
p->spec.total_size = 0;
|
||||
cardi_common.cmd->result = CARD_RESULT_UNSUPPORTED;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user