arm9 card_spi (fully decomp arm9 card)

This commit is contained in:
red031000
2020-10-20 21:53:42 +01:00
parent 4fd265a65d
commit 887b952f44
5 changed files with 142 additions and 227 deletions

View File

@@ -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

View File

@@ -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),

View 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

View File

@@ -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
View 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;
}
}
}