mirror of
https://github.com/ApacheThunder/GBA-Exploader.git
synced 2025-06-18 11:35:38 -04:00
2196 lines
74 KiB
C++
2196 lines
74 KiB
C++
#include <nds.h>
|
|
#include <fat.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include "gba_patch.h"
|
|
#include "GBA_ini.h"
|
|
|
|
#define PATCH_VER 5
|
|
|
|
u32 PatchVer;
|
|
u32 SaveType;
|
|
u8 SaveVer[28];
|
|
u32 SaveSize;
|
|
int PatchCnt;
|
|
int PatchCntS;
|
|
u32 PatchType[28];
|
|
u32 PatchAddr[28];
|
|
|
|
u8 *RemainPtr;
|
|
u32 RemainByte;
|
|
|
|
|
|
static int _type_chk(u32 *pbuf, u32 c, u32 ofs)
|
|
{
|
|
switch(pbuf[c]) {
|
|
case 0x53414C46: // FLASH
|
|
if(pbuf[c + 1] == 0x5F4D3148) { // FLASH1M_V
|
|
SaveType = 5;
|
|
PatchType[0] = 0x50;
|
|
PatchAddr[0] = ofs + c * 4;
|
|
strcpy((char*)SaveVer, (const char *)(pbuf + c));
|
|
SaveSize = 0x20000; // 128KB
|
|
c += 2;
|
|
break;
|
|
}
|
|
if((pbuf[c + 1] & 0x0000FFFF) == 0x00005F48) { // FLASH_V
|
|
SaveType = 4;
|
|
PatchType[0] = 0x40;
|
|
PatchAddr[0] = ofs + c * 4;
|
|
strcpy((char*)SaveVer, (const char *)(pbuf + c));
|
|
SaveSize = 0x10000; // 64KB
|
|
c += 2;
|
|
break;
|
|
}
|
|
if(pbuf[c + 1] == 0x32313548) { // FLASH512_V
|
|
SaveType = 3;
|
|
PatchType[0] = 0x30;
|
|
PatchAddr[0] = ofs + c * 4;
|
|
strcpy((char*)SaveVer, (const char *)(pbuf + c));
|
|
SaveSize = 0x10000; // 64KB
|
|
c += 2;
|
|
break;
|
|
}
|
|
break;
|
|
case 0x52504545: // EEPROM
|
|
if((pbuf[c + 1] & 0x00FFFFFF) == 0x005F4D4F) {
|
|
if(PatchType[1] == 0x81) {
|
|
SaveType = 8;
|
|
PatchType[0] = 0x80;
|
|
strcpy((char*)SaveVer, "FaMini");
|
|
strcpy((char*)(SaveVer+6), (const char *)(pbuf + c) + 6);
|
|
} else {
|
|
SaveType = 2;
|
|
PatchType[0] = 0x20;
|
|
strcpy((char*)SaveVer, (const char *)(pbuf + c));
|
|
}
|
|
PatchAddr[0] = ofs + c * 4;
|
|
SaveSize = 0x2000; // 8KB
|
|
c += 2;
|
|
}
|
|
break;
|
|
case 0x4D415253: // SRAM
|
|
if((pbuf[c + 1] & 0x000000FF) == 0x0000005F) {
|
|
SaveType = 1;
|
|
PatchType[0] = 0x10;
|
|
PatchAddr[0] = ofs + c * 4;
|
|
strcpy((char*)SaveVer, (const char *)(pbuf + c));
|
|
SaveSize = 0x8000; // 32KB
|
|
c += 2;
|
|
}
|
|
break;
|
|
}
|
|
return c;
|
|
}
|
|
|
|
static int _eeprom_chk(u32 *pbuf, u32 c, u32 ofs, u32 size)
|
|
{
|
|
if(pbuf[c] == 0xB0A2B570 &&
|
|
pbuf[c + 1] == 0x04001C0D &&
|
|
pbuf[c + 2] == 0x48030C03 &&
|
|
pbuf[c + 3] == 0x88806800 &&
|
|
pbuf[c + 4] == 0xD3054283) {
|
|
PatchType[PatchCnt] = 0x21; // eeprom 120/121/122/124/126 read
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 4;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xB0A9B530 &&
|
|
pbuf[c + 1] == 0x04001C0D &&
|
|
pbuf[c + 2] == 0x48030C04 &&
|
|
pbuf[c + 3] == 0x88806800 &&
|
|
pbuf[c + 4] == 0xD3054284) {
|
|
PatchType[PatchCnt] = 0x22; // eeprom 120/121/122 write
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 4;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] ==0xB0ACB5F0 &&
|
|
pbuf[c + 1] == 0x04001C0D &&
|
|
pbuf[c + 2] == 0x06120C01 &&
|
|
pbuf[c + 3] == 0x48030E17 &&
|
|
pbuf[c + 4] == 0x88806800 &&
|
|
pbuf[c + 5] == 0xD3054281) {
|
|
PatchType[PatchCnt] = 0x23; // eeprom 124 write
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 5;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] ==0x4647B5F0 &&
|
|
pbuf[c + 1] == 0xB0ACB480 &&
|
|
pbuf[c + 2] == 0x04001C0E &&
|
|
pbuf[c + 3] == 0x06120C05 &&
|
|
pbuf[c + 4] == 0x46900E12 &&
|
|
pbuf[c + 5] == 0x68004803 &&
|
|
pbuf[c + 6] == 0x42858880 &&
|
|
pbuf[c + 7] == 0x4802D306) {
|
|
PatchType[PatchCnt] = 0x24; // eeprom 126 write
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 7;
|
|
return c;
|
|
}
|
|
|
|
|
|
if(pbuf[c] == 0x6839480E &&
|
|
pbuf[c + 1] == 0x480E6001 &&
|
|
pbuf[c + 2] == 0x60016879 &&
|
|
pbuf[c + 3] == 0x1C39480D) {
|
|
PatchType[PatchCnt] = 0x25; // eeprom v111 code1
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0x20D0E027 &&
|
|
pbuf[c + 1] == 0x88010500 &&
|
|
pbuf[c + 2] == 0x1C082201 &&
|
|
pbuf[c + 3] == 0x1C024010) {
|
|
PatchType[PatchCnt] = 0x26; // eeprom v111 code2
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
|
|
PatchType[PatchCnt] = 0x27; // eeprom v111 code3
|
|
PatchAddr[PatchCnt] = ((size + 0xFFFFF) / 0x100000) * 0x100000 - 0x100;
|
|
// eeprom111_pad = 0x08000001 + PatchAddr[PatchCnt];
|
|
PatchCnt++;
|
|
return c;
|
|
}
|
|
|
|
|
|
return c;
|
|
}
|
|
|
|
|
|
static int _fmini_chk(u32 *pbuf, u32 c, u32 ofs)
|
|
{
|
|
if(PatchCnt == 1 &&
|
|
pbuf[c] ==0xE92D0003 &&
|
|
pbuf[c + 1] == 0xEF110000 &&
|
|
pbuf[c + 2] == 0xE8BD8001) {
|
|
PatchType[PatchCnt] = 0x81;
|
|
PatchAddr[PatchCnt] = ofs + (c + 1) * 4;
|
|
PatchCnt++;
|
|
c += 2;
|
|
return c;
|
|
}
|
|
|
|
/***
|
|
if(PatchCnt == 1 &&
|
|
pbuf[c] == 0xE24D1C0B &&
|
|
pbuf[c + 1] == 0xE8B00030 &&
|
|
pbuf[c + 2] == 0xE92D0003) {
|
|
PatchType[PatchCnt] = 0x81; // V_122
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 2;
|
|
return c;
|
|
}
|
|
**/
|
|
|
|
if(pbuf[c] == 0x00011410 &&
|
|
pbuf[c + 1] == 0x9FC04000 &&
|
|
pbuf[c + 2] == 0xA0B82CE5 &&
|
|
pbuf[c + 3] == 0xC0BB00E1) {
|
|
if(pbuf[c - 1] == 0x00003032)
|
|
PatchType[PatchCnt] = 0x82; // swi 0x00110000 R0=0x060000F8
|
|
else PatchType[PatchCnt] = 0x83; // swi 0x00110000 R0=0x060000EC
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
if(pbuf[c] == 0x00011010 &&
|
|
pbuf[c + 1] == 0x9FC04000 &&
|
|
pbuf[c + 2] == 0xA0B82CE5 &&
|
|
pbuf[c + 3] == 0xC0BB00E1) {
|
|
PatchType[PatchCnt] = 0x82; // swi 0x00110000 R0=0x060000F8 Vol.1
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0x00020810 &&
|
|
pbuf[c + 1] == 0x9F904800 &&
|
|
pbuf[c + 2] == 0xA0A829E5 &&
|
|
pbuf[c + 3] == 0x90BA00E1) {
|
|
|
|
PatchType[PatchCnt] = 0x84; // swi 0x00110000 V_122
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0x00022810 &&
|
|
pbuf[c + 1] == 0x9F904800 &&
|
|
pbuf[c + 2] == 0xA0A829E5 &&
|
|
pbuf[c + 3] == 0x90BA00E1) {
|
|
|
|
PatchType[PatchCnt] = 0x82; // swi 0x00110000 V_122
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
|
|
/*************************************************
|
|
|
|
// 0x08 -> 0x04
|
|
// 17
|
|
//7F 10 DB 08
|
|
//E0 8F E2 10
|
|
//00 1F FC E5
|
|
//00 00 8E E5
|
|
//FF 10 EB 20
|
|
// 7F 10 DB 04
|
|
|
|
//DB 08 FF E0 8F E2 10 00 1F E5 00 F3 00 8E E5 FF 10 EB 20 03
|
|
//DB 04 FF E0
|
|
|
|
//00 10 DB 08 7F 11 D7 10 00 1F E5 00 00 8E CF E5 FF 10 EB 20
|
|
//00 10 DB 04 7F
|
|
|
|
//00 10 DF 08 11 DB 10 00 1F E5 F9 00 00 8E E5 FF 10 EF 20 03
|
|
//00 10 DF 04
|
|
|
|
if(pbuf[c] == 0xD71108BF &&
|
|
pbuf[c + 1] == 0xE51F0010 &&
|
|
pbuf[c + 2] == 0x8EE70000 &&
|
|
pbuf[c + 3] == 0xEB10FFE5 &&
|
|
pbuf[c + 4] == 0x000A0320) {
|
|
PatchType[PatchCnt] = 0x83;
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 4;
|
|
return c;
|
|
}
|
|
|
|
// 17
|
|
if(pbuf[c] == 0x08DB107F &&
|
|
pbuf[c + 1] == 0x10E28FE0 &&
|
|
pbuf[c + 2] == 0xE5FC1F00 &&
|
|
pbuf[c + 3] == 0xE58E0000 &&
|
|
pbuf[c + 4] == 0x20EB10FF) {
|
|
PatchType[PatchCnt] = 0x83;
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 4;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xFF8FE008 &&
|
|
pbuf[c + 1] == 0x1F0010E2 &&
|
|
pbuf[c + 2] == 0x8E0000E5 &&
|
|
pbuf[c + 3] == 0x10FFE5CF &&
|
|
pbuf[c + 4] == 0x0A03200F) {
|
|
PatchType[PatchCnt] = 0x83; // Disk system
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 4;
|
|
return c;
|
|
}
|
|
|
|
// 0x08 -> 0xE8
|
|
//
|
|
//A1 AF 08 A9
|
|
//53 40 12 AF
|
|
//C0 20 11 E2
|
|
//9C 7F 14 1B
|
|
//1F 04 1A 40
|
|
//A1 AF E8 A9
|
|
|
|
//AF 08 A9 DF 3B 13 0F C0 20 11 E2 9F 7B 14 1B 1F 94 1A 40 20
|
|
//AF E8 A9 DF
|
|
|
|
//40 A1 08 A3 0F BE 17 13 0F C0 20 11 E2 BB 14 1B 7E 1E A8 1A
|
|
//40 A1 E8 A3
|
|
|
|
//08 A3 0F 25 7C 13 0F C0 20 11 E2 C3 14 1B 1E A8 FD 1A 40 20
|
|
//E8 A3 0F 25
|
|
|
|
//A1 08 AA 3B 29 7C 12 97 C0 20 11 E2 C3 15 23 1F D8 FD 1A 40
|
|
//A1 E8 AA 3B
|
|
|
|
//08 5F A3 0F 15 13 0F C0 20 11 E2 BB 3F 14 1B 1E A8 1A 40 20
|
|
//E8 5F A3 0F
|
|
|
|
//04 40 A1 08 14 1F BB DD 09 FF CD E5 0A EC 8D E2 88 E0 FF 8E
|
|
//04 40 A1 E8
|
|
|
|
if(pbuf[c] == 0x08A14004 &&
|
|
pbuf[c + 1] == 0x1D43A95F &&
|
|
pbuf[c + 2] == 0x20C00F13 &&
|
|
pbuf[c + 3] == 0x3FD7E211 &&
|
|
pbuf[c + 4] == 0x041F1B14) {
|
|
PatchType[PatchCnt] = 0x84;
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 4;
|
|
return c;
|
|
}
|
|
// 17
|
|
if(pbuf[c] == 0xA908AFA1 &&
|
|
pbuf[c + 1] == 0xAF124053 &&
|
|
pbuf[c + 2] == 0xE21120C0 &&
|
|
pbuf[c + 3] == 0x1B147F9C &&
|
|
pbuf[c + 4] == 0x401A041F) {
|
|
PatchType[PatchCnt] = 0x84;
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 4;
|
|
return c;
|
|
}
|
|
*****************************************/
|
|
|
|
return c;
|
|
}
|
|
|
|
|
|
static int _flash512_chk(u32 *pbuf, u32 c, u32 ofs)
|
|
{
|
|
|
|
if(pbuf[c] == 0xB0A0B5F0 &&
|
|
pbuf[c + 1] == 0x1C161C0D &&
|
|
pbuf[c + 2] == 0x04031C1F &&
|
|
pbuf[c + 3] == 0x4A0F0C1C) {
|
|
PatchType[PatchCnt] = 0x31; // FLASH512_V13 code1
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xFD88F7FF &&
|
|
pbuf[c + 1] ==0x0C030400 &&
|
|
pbuf[c + 2] == 0x24014A03 &&
|
|
pbuf[c + 3] == 0x0000E007) {
|
|
PatchType[PatchCnt] = 0x32; // FLASH512_V13 code3 (52:FLASH1M_V102 code2)
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xB090B570 &&
|
|
pbuf[c + 1] == 0x88294D15 &&
|
|
pbuf[c + 2] == 0x40314E15 &&
|
|
pbuf[c + 3] == 0x68004815) {
|
|
PatchType[PatchCnt] = 0x33; // FLASH512_V13 code4 (47:FLASH_V123-6 code3)
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0x4646B570 &&
|
|
pbuf[c + 1] == 0xB090B440 &&
|
|
pbuf[c + 2] == 0x0C030400 &&
|
|
pbuf[c + 3] == 0xD83B2B0F) {
|
|
PatchType[PatchCnt] = 0x34; // FLASH512_V13 code5 (48:FLASH_V123-6 code4)
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xB090B5F0 &&
|
|
pbuf[c + 1] == 0x04001C0F &&
|
|
pbuf[c + 2] == 0x48030C04 &&
|
|
pbuf[c + 3] == 0x89406800 &&
|
|
pbuf[c + 4] == 0xD3054284 &&
|
|
pbuf[c + 5] == 0xE0414801) {
|
|
PatchType[PatchCnt] = 0x35; // FLASH512_V13 code2
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 5;
|
|
return c;
|
|
}
|
|
|
|
return c;
|
|
}
|
|
|
|
static int _flash1M_chk(u32 *pbuf, u32 c, u32 ofs)
|
|
{
|
|
if(pbuf[c] == 0x0E000600 &&
|
|
pbuf[c + 1] == 0x21AA4B05 &&
|
|
pbuf[c + 2] == 0x4A057019) {
|
|
PatchType[PatchCnt] = 0x51; // FLASH1M_V102,V103 code1
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 2;
|
|
return c;
|
|
}
|
|
|
|
|
|
|
|
//01 35 06 4A
|
|
//AA 20 10 70
|
|
//05 49 55 20
|
|
//08 70 90 20
|
|
//10 70 10 A9
|
|
//03 4A 10 1C
|
|
if(pbuf[c] == 0x4A063501 &&
|
|
pbuf[c + 1] == 0x701020AA &&
|
|
pbuf[c + 2] == 0x20554905 &&
|
|
pbuf[c + 3] == 0x20907008 &&
|
|
pbuf[c + 4] == 0xA9107010 &&
|
|
pbuf[c + 5] == 0x1C104A03) {
|
|
PatchType[PatchCnt] = 0x52; // FLASH1M_V103 code2
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 5;
|
|
return c;
|
|
}
|
|
|
|
|
|
//0 04 0C E0 20
|
|
//00 05 01 F0
|
|
//D3 F8 00 06
|
|
//00 0E 04 43
|
|
//07 49 AA 20
|
|
//08 70 07 4A
|
|
//55 20 10 70
|
|
//F0 20 08 70
|
|
//08 70 10 A9
|
|
//04 4A 10 1C
|
|
if(pbuf[c] == 0x20E00C04 &&
|
|
pbuf[c + 1] == 0xF0010500 &&
|
|
pbuf[c + 2] == 0x0600F8D3 &&
|
|
pbuf[c + 3] == 0x43040E00 &&
|
|
pbuf[c + 4] == 0x20AA4907 &&
|
|
pbuf[c + 5] == 0x4A077008 &&
|
|
pbuf[c + 6] == 0x70102055 &&
|
|
pbuf[c + 7] == 0x700820F0 &&
|
|
pbuf[c + 8] == 0xA9107008) {
|
|
PatchType[PatchCnt] = 0x53; // FLASH1M_V103 code3
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 8;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xF000480C &&
|
|
pbuf[c + 1] == 0x0600FBFD &&
|
|
pbuf[c + 2] == 0x20E00C04 &&
|
|
pbuf[c + 3] == 0xF0000500 &&
|
|
pbuf[c + 4] == 0x0600FBF7 &&
|
|
pbuf[c + 5] == 0x43040E00 &&
|
|
pbuf[c + 6] == 0x20AA4907 &&
|
|
pbuf[c + 7] == 0x4A077008) {
|
|
PatchType[PatchCnt] = 0x5A; // FLASH1M_V102
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 7;
|
|
return c;
|
|
}
|
|
|
|
|
|
if(pbuf[c] == 0xFD88F7FF &&
|
|
pbuf[c + 1] ==0x0C030400 &&
|
|
pbuf[c + 2] == 0x24014A03 &&
|
|
pbuf[c + 3] == 0x0000E007) {
|
|
PatchType[PatchCnt] = 0x54; // FLASH1M_V102 code2,V103 code4
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xB090B570 &&
|
|
pbuf[c + 1] ==0x88294D15 &&
|
|
pbuf[c + 2] == 0x40314E15 &&
|
|
pbuf[c + 3] == 0x68004815 &&
|
|
pbuf[c + 4] == 0x43018A00) {
|
|
PatchType[PatchCnt] = 0x55; // FLASH1M_V103 code5
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 4;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xB090B5F0 &&
|
|
pbuf[c + 1] == 0x0C060400 &&
|
|
pbuf[c + 2] == 0x68004803 &&
|
|
pbuf[c + 3] == 0x42868940 &&
|
|
pbuf[c + 4] == 0x4802D306) {
|
|
// pbuf[c + 5] == 0x0000E052) {
|
|
PatchType[PatchCnt] = 0x56; // FLASH1M_V102 code3, V103 code6
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 4;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0x4C0AB510 &&
|
|
pbuf[c + 1] == 0x702222AA &&
|
|
pbuf[c + 2] == 0x22554B09 &&
|
|
pbuf[c + 3] == 0x22A0701A &&
|
|
pbuf[c + 4] == 0x78027022 &&
|
|
pbuf[c + 5] == 0x4B07700A &&
|
|
pbuf[c + 6] == 0x681B7802 &&
|
|
pbuf[c + 7] == 0xF0002001) {
|
|
PatchType[PatchCnt] = 0x57; // FLASH1M_V102 code4
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 7;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xB090B5F0 &&
|
|
pbuf[c + 1] == 0x04011C0E &&
|
|
pbuf[c + 2] == 0x06120C0C &&
|
|
pbuf[c + 3] == 0x4D180E17 &&
|
|
pbuf[c + 4] == 0x68406828 &&
|
|
pbuf[c + 5] == 0xD2374286) {
|
|
PatchType[PatchCnt] = 0x58; // FLASH1M_V103 code7
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 5;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xB090B5F0 &&
|
|
pbuf[c + 1] == 0x04001C0F &&
|
|
pbuf[c + 2] == 0x48030C04 &&
|
|
pbuf[c + 3] == 0x89406800 &&
|
|
pbuf[c + 4] == 0xD3054284 &&
|
|
pbuf[c + 5] == 0xE0404801) {
|
|
PatchType[PatchCnt] = 0x59; // FLASH1M_V102 code5, V103 code8
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 5;
|
|
return c;
|
|
}
|
|
|
|
return c;
|
|
}
|
|
|
|
|
|
static int _flash_chk(u32 *pbuf, u32 c, u32 ofs)
|
|
{
|
|
|
|
// FLASH_V120 ******** 0020, 0067
|
|
|
|
if(pbuf[c] == 0xB093B590 &&
|
|
pbuf[c + 1] == 0x1D39466F &&
|
|
pbuf[c + 2] == 0xF0001C08 &&
|
|
pbuf[c + 3] == 0x1D38F9B7 &&
|
|
pbuf[c + 4] == 0x64791C41 &&
|
|
pbuf[c + 5] == 0x21AA4809 &&
|
|
pbuf[c + 6] == 0x48097001 &&
|
|
pbuf[c + 7] == 0x70012155) {
|
|
PatchType[PatchCnt] = 0x41; // FLASH_V120 code1
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 7;
|
|
return c;
|
|
}
|
|
|
|
|
|
if(pbuf[c] == 0xB093B590 &&
|
|
pbuf[c + 1] == 0x1D39466F &&
|
|
pbuf[c + 2] == 0xF0001C08 &&
|
|
pbuf[c + 3] == 0x1D38F9AF &&
|
|
pbuf[c + 4] == 0x64791C41 &&
|
|
pbuf[c + 5] == 0x21AA4809 &&
|
|
pbuf[c + 6] == 0x48097001 &&
|
|
pbuf[c + 7] == 0x70012155) {
|
|
PatchType[PatchCnt] = 0x42; // FLASH_V121 code1
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 7;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xB092B580 &&
|
|
pbuf[c + 1] == 0x481F466F &&
|
|
pbuf[c + 2] == 0x880A491E &&
|
|
pbuf[c + 3] == 0x1C114B1E &&
|
|
pbuf[c + 4] == 0x4B1E4019 &&
|
|
pbuf[c + 5] == 0x8A12681A &&
|
|
pbuf[c + 6] == 0x1C0A4311 &&
|
|
pbuf[c + 7] == 0x481C8002) {
|
|
PatchType[PatchCnt] = 0x43; // FLASH_V120-V121 code2
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 7;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xB094B580 &&
|
|
pbuf[c + 1] == 0x1C39466F &&
|
|
pbuf[c + 2] == 0x1C388008 &&
|
|
pbuf[c + 3] == 0x290F8801 &&
|
|
pbuf[c + 4] == 0x4801D904 &&
|
|
pbuf[c + 5] == 0x0000E056 &&
|
|
pbuf[c + 6] == 0x000080FF &&
|
|
pbuf[c + 7] == 0x49234823) {
|
|
PatchType[PatchCnt] = 0x44; // FLASH_V120-V121 code3
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 7;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xB094B580 &&
|
|
pbuf[c + 1] == 0x6079466F &&
|
|
pbuf[c + 2] == 0x80081C39 &&
|
|
pbuf[c + 3] == 0x88011C38 &&
|
|
pbuf[c + 4] == 0xD903290F &&
|
|
pbuf[c + 5] == 0xe0734800 &&
|
|
pbuf[c + 6] == 0x000080FF &&
|
|
pbuf[c + 7] == 0x88011C38) {
|
|
PatchType[PatchCnt] = 0x45; // FLASH_V120-V121 code4
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 7;
|
|
return c;
|
|
}
|
|
|
|
|
|
|
|
if(pbuf[c] == 0xFFAAF7FF &&
|
|
pbuf[c + 1] == 0x0C030400 &&
|
|
pbuf[c + 2] == 0x24014A03 &&
|
|
pbuf[c + 3] == 0x0000E007) {
|
|
PatchType[PatchCnt] = 0x46; // FLASH_V123-6 code1
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xB0A0B5F0 &&
|
|
pbuf[c + 1] == 0x1C161C0D &&
|
|
pbuf[c + 2] == 0x04001C1F &&
|
|
pbuf[c + 3] == 0x4A080C04) {
|
|
PatchType[PatchCnt] = 0x47; // FLASH_V123-6 code12
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xB090B570 &&
|
|
pbuf[c + 1] == 0x88294D15 &&
|
|
pbuf[c + 2] == 0x40314E15 &&
|
|
pbuf[c + 3] == 0x68004815) {
|
|
PatchType[PatchCnt] = 0x48; // FLASH_V123-6 code13
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0x4646B570 &&
|
|
pbuf[c + 1] == 0xB090B440 &&
|
|
pbuf[c + 2] == 0x0C030400 &&
|
|
pbuf[c + 3] == 0xD83B2B0F) {
|
|
PatchType[PatchCnt] = 0x49; // FLASH_V123-6 code14
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
if(pbuf[c] == 0xB090B5F0 &&
|
|
pbuf[c + 1] == 0x04001C0F &&
|
|
pbuf[c + 2] == 0x2C0F0C04 &&
|
|
pbuf[c + 3] == 0x4801D904) {
|
|
PatchType[PatchCnt] = 0x4A; // FLASH_V123-6 code5
|
|
PatchAddr[PatchCnt] = ofs + c * 4;
|
|
PatchCnt++;
|
|
c += 3;
|
|
return c;
|
|
}
|
|
|
|
return c;
|
|
}
|
|
|
|
|
|
extern "C" {
|
|
void dsp_bar(int mod, int per);
|
|
}
|
|
|
|
static bool _get_sign(char *name, char *sign)
|
|
{
|
|
int ln;
|
|
|
|
sprintf(sign, "%s/%s", ini.sign_dir, name);
|
|
ln = strlen(sign) - 3;
|
|
if(sign[ln] != 'G' && sign[ln] != 'g')
|
|
return false;
|
|
|
|
|
|
sign[ln+0] = 's';
|
|
sign[ln+1] = 'g';
|
|
sign[ln+2] = 'n';
|
|
sign[ln+3] = 0;
|
|
return true;
|
|
}
|
|
|
|
|
|
void gba_check_int(char *name)
|
|
{
|
|
FILE *sign;
|
|
u8 buf[512];
|
|
int i;
|
|
|
|
PatchCntS = 1;
|
|
RemainByte = 0;
|
|
|
|
PatchVer = 0;
|
|
SaveType = 0;
|
|
SaveSize = 0;
|
|
SaveVer[0] = 0;
|
|
PatchCnt = 1;
|
|
PatchType[0] = 0;
|
|
PatchAddr[0] = 0;
|
|
|
|
if(!(_get_sign(name, (char *)buf))) {
|
|
SaveType = 1;
|
|
SaveSize = 0x10000;
|
|
PatchVer = PATCH_VER;
|
|
return;
|
|
}
|
|
|
|
sign = fopen((char *)buf, "rb");
|
|
if(sign == NULL) return;
|
|
|
|
fread(buf, 1, 256, sign);
|
|
fclose(sign);
|
|
|
|
PatchVer = *((u32*)(buf + 0));
|
|
PatchCnt = *((u32*)(buf + 4));
|
|
if(PatchVer != PATCH_VER || PatchCnt < 1 || PatchCnt > 28) {
|
|
PatchVer = 0;
|
|
PatchCnt = 1;
|
|
return;
|
|
}
|
|
SaveType = *((u32*)(buf + 8));
|
|
SaveSize = *((u32*)(buf + 12));
|
|
for(i = 0; i < 16; i++)
|
|
SaveVer[i] = buf[i + 16];
|
|
for(i = 0; i < PatchCnt; i++) {
|
|
PatchType[i] = *((u32*)(buf + 32 + i * 8));
|
|
PatchAddr[i] = *((u32*)(buf + 36 + i * 8));
|
|
}
|
|
}
|
|
|
|
u32 gba_check_Ram1(u8 *buf, u32 bufsize, u32 size, u32 ofs)
|
|
{
|
|
u32 i, ii;
|
|
u32 *pbuf;
|
|
u32 oldtype;
|
|
|
|
|
|
// if(SaveType != 0)
|
|
// return(SaveSize);
|
|
if(PatchVer == PATCH_VER)
|
|
return(SaveSize);
|
|
|
|
pbuf = (u32*)buf;
|
|
if(PatchCnt > 1)
|
|
oldtype = PatchType[PatchCnt-1]/0x10;
|
|
else oldtype = 0;
|
|
|
|
i = ofs;
|
|
for(ii = 0; ii < bufsize / 4; ii++) {
|
|
ii = _type_chk(pbuf, ii, i);
|
|
if(SaveType == 8) break;
|
|
|
|
if(oldtype == 0 || oldtype == 2) {
|
|
ii = _eeprom_chk(pbuf, ii, i, size);
|
|
if(oldtype == 0)
|
|
oldtype = PatchType[PatchCnt-1]/0x10;
|
|
}
|
|
|
|
if(oldtype == 0 || oldtype == 3) {
|
|
ii = _flash512_chk(pbuf, ii, i);
|
|
if(oldtype == 0)
|
|
oldtype = PatchType[PatchCnt-1]/0x10;
|
|
}
|
|
|
|
if(oldtype == 0 || oldtype == 4) {
|
|
ii = _flash_chk(pbuf, ii, i);
|
|
if(oldtype == 0)
|
|
oldtype = PatchType[PatchCnt-1]/0x10;
|
|
}
|
|
|
|
if(oldtype == 0 || oldtype == 5) {
|
|
ii = _flash1M_chk(pbuf, ii, i);
|
|
if(oldtype == 0)
|
|
oldtype = PatchType[PatchCnt-1]/0x10;
|
|
}
|
|
|
|
if(oldtype == 0 || oldtype == 8) {
|
|
ii = _fmini_chk(pbuf, ii, i);
|
|
if(oldtype == 0)
|
|
oldtype = PatchType[PatchCnt-1]/0x10;
|
|
}
|
|
}
|
|
return(SaveSize);
|
|
}
|
|
|
|
|
|
static void _ReadPSram(uint32 address, u8* data , uint32 size )
|
|
{
|
|
u32 i;
|
|
u16* pData = (u16*)data;
|
|
u16* sData = (u16*)address;
|
|
|
|
for(i = 0; i < size / 2; i++)
|
|
pData[i] = sData[i];
|
|
}
|
|
|
|
void gba_check_Ram2(u32 exp, u8 *buf, u32 bufsize, u32 size)
|
|
{
|
|
u32 i, ii;
|
|
u32 *pbuf;
|
|
int cnt;
|
|
|
|
|
|
if(SaveType == 0) { // UNKNOWN Famicom Mini
|
|
if(PatchCnt > 2 && PatchType[1] == 0x81 && PatchType[2] == 0x84) {
|
|
SaveType = 8;
|
|
PatchCnt = 3;
|
|
strcpy((char*)SaveVer, "FaMini");
|
|
}
|
|
}
|
|
|
|
if(SaveType == 8) {
|
|
PatchType[PatchCnt] = 0x86; // Patch
|
|
PatchAddr[PatchCnt] = 0x100000 - 0x800;
|
|
PatchCnt++;
|
|
}
|
|
|
|
if(SaveType < 2 || PatchCnt <= 1 || SaveType == PatchType[1]/0x10)
|
|
return;
|
|
|
|
pbuf = (u32*)buf;
|
|
PatchCnt = 1;
|
|
for(i = 0; i < size; i += bufsize, exp += bufsize) {
|
|
_ReadPSram(exp, buf, bufsize+0x400);
|
|
// dmaCopy((void *)exp, buf, bufsize);
|
|
// dmaCopyWords(3, buf, (void *)exp, 0x100000);
|
|
cnt = PatchCnt;
|
|
for(ii = 0; ii < bufsize / 4; ii++) {
|
|
if(SaveType == 2) {
|
|
ii = _eeprom_chk(pbuf, ii, i, size);
|
|
}
|
|
|
|
if(SaveType == 3) {
|
|
ii = _flash512_chk(pbuf, ii, i);
|
|
}
|
|
|
|
if(SaveType == 4) {
|
|
ii = _flash_chk(pbuf, ii, i);
|
|
}
|
|
|
|
if(SaveType == 5) {
|
|
ii = _flash1M_chk(pbuf, ii, i);
|
|
}
|
|
}
|
|
// if(PatchCnt > 1 && cnt == PatchCnt)
|
|
// break;
|
|
}
|
|
}
|
|
|
|
|
|
u32 gba_check(FILE *gbaFile, u32 size, u8 *buf, u32 bufsize)
|
|
{
|
|
u32 i, ii;
|
|
u32 *pbuf;
|
|
u32 oldtype;
|
|
int cnt;
|
|
|
|
|
|
// if(SaveType != 0)
|
|
// return(SaveSize);
|
|
if(PatchVer == PATCH_VER)
|
|
return(SaveSize);
|
|
|
|
dsp_bar(3, -1);
|
|
|
|
pbuf = (u32*)buf;
|
|
SaveType = 0;
|
|
SaveSize = 0;
|
|
SaveVer[0] = 0;
|
|
PatchCnt = 1;
|
|
PatchCntS = 1;
|
|
PatchType[0] = 0;
|
|
RemainByte = 0;
|
|
|
|
oldtype = 0;
|
|
|
|
for(i = 0; i < size; i += bufsize) {
|
|
fseek(gbaFile, i, SEEK_SET);
|
|
fread(buf, 1, bufsize + 512, gbaFile);
|
|
|
|
dsp_bar(3, i * 100 / size);
|
|
|
|
for(ii = 0; ii < bufsize / 4; ii++) {
|
|
|
|
if(SaveType == 0) {
|
|
ii = _type_chk(pbuf, ii, i);
|
|
}
|
|
if(SaveType == 8) break;
|
|
|
|
if(oldtype == 0 || oldtype == 2) {
|
|
ii = _eeprom_chk(pbuf, ii, i, size);
|
|
if(oldtype == 0)
|
|
oldtype = PatchType[PatchCnt-1]/0x10;
|
|
}
|
|
|
|
if(oldtype == 0 || oldtype == 3) {
|
|
ii = _flash512_chk(pbuf, ii, i);
|
|
if(oldtype == 0)
|
|
oldtype = PatchType[PatchCnt-1]/0x10;
|
|
}
|
|
|
|
if(oldtype == 0 || oldtype == 4) {
|
|
ii = _flash_chk(pbuf, ii, i);
|
|
if(oldtype == 0)
|
|
oldtype = PatchType[PatchCnt-1]/0x10;
|
|
}
|
|
|
|
if(oldtype == 0 || oldtype == 5) {
|
|
ii = _flash1M_chk(pbuf, ii, i);
|
|
if(oldtype == 0)
|
|
oldtype = PatchType[PatchCnt-1]/0x10;
|
|
}
|
|
|
|
if(oldtype == 0 || oldtype == 8) {
|
|
ii = _fmini_chk(pbuf, ii, i);
|
|
if(oldtype == 0)
|
|
oldtype = PatchType[PatchCnt-1]/0x10;
|
|
}
|
|
}
|
|
if(SaveType == 0) { // UNKNOWN Famicom Mini
|
|
if(PatchCnt > 2 && PatchType[1] == 0x81 && PatchType[2] == 0x84) {
|
|
SaveType = 8;
|
|
PatchCnt = 3;
|
|
strcpy((char*)SaveVer, "FaMini");
|
|
}
|
|
}
|
|
if(SaveType == 8) {
|
|
PatchType[PatchCnt] = 0x86; // Patch
|
|
PatchAddr[PatchCnt] = 0x100000 - 0x800;
|
|
PatchCnt++;
|
|
break;
|
|
}
|
|
}
|
|
fseek(gbaFile, 0, SEEK_SET);
|
|
|
|
if(SaveType < 2 || PatchCnt <= 1 || SaveType == PatchType[1]/0x10) {
|
|
dsp_bar(-1, 100);
|
|
return(SaveSize);
|
|
}
|
|
|
|
|
|
PatchCnt = 1;
|
|
for(i = 0; i < size; i += bufsize) {
|
|
fseek(gbaFile, i, SEEK_SET);
|
|
fread(buf, 1, bufsize + 512, gbaFile);
|
|
|
|
dsp_bar(3, i * 100 / size);
|
|
|
|
cnt = PatchCnt;
|
|
for(ii = 0; ii < bufsize / 4; ii++) {
|
|
if(SaveType == 2) {
|
|
ii = _eeprom_chk(pbuf, ii, i, size);
|
|
}
|
|
|
|
if(SaveType == 3) {
|
|
ii = _flash512_chk(pbuf, ii, i);
|
|
}
|
|
|
|
if(SaveType == 4) {
|
|
ii = _flash_chk(pbuf, ii, i);
|
|
}
|
|
|
|
if(SaveType == 5) {
|
|
ii = _flash1M_chk(pbuf, ii, i);
|
|
}
|
|
|
|
}
|
|
// if(PatchCnt > 1 && cnt == PatchCnt)
|
|
// break;
|
|
}
|
|
fseek(gbaFile, 0, SEEK_SET);
|
|
dsp_bar(-1, 100);
|
|
|
|
return(SaveSize);
|
|
}
|
|
|
|
|
|
static const u8 patch_eeprom_1[] = {
|
|
0x00, 0x04, // LSL R0, R0, #0x10
|
|
0x0a, 0x1c, // ADD R2, R1, #0
|
|
0x40, 0x0b, // LSR R0, R0, #0xD
|
|
0xe0, 0x21, 0x09, 0x05, // MOVL R1, 0xE000000
|
|
0x41, 0x18, // ADD R1, R0, R1
|
|
0x07, 0x31, // ADD R1, #7
|
|
0x00, 0x23, // MOV R3, #0
|
|
// jmpl:
|
|
0x08, 0x78, // LDRB R0, [R1]
|
|
0x10, 0x70, // STRB R0, [R2]
|
|
0x01, 0x33, // ADD R3, #1
|
|
0x01, 0x32, // ADD R2, #1
|
|
0x01, 0x39, // SUB R1, #1
|
|
0x07, 0x2b, // CMP R3, #7
|
|
0xf8, 0xd9, // BLS jmpl
|
|
0x00, 0x20, // MOV R0, #0
|
|
0x70, 0x47 // BX LR
|
|
};
|
|
static const u8 patch_eeprom_2[] = {
|
|
0x00, 0x04, // LSL R0, R0, #0x10
|
|
0x0a, 0x1c, // ADD R2, R1, #0
|
|
0x40, 0x0b, // LSR R0, R0, #0xD
|
|
0xe0, 0x21, 0x09, 0x05, // MOVL R1, 0xE000000
|
|
0x41, 0x18, // ADD R1, R0, R1
|
|
0x07, 0x31, // ADD R1, #7
|
|
0x00, 0x23, // MOV R3, #0
|
|
// jmpl:
|
|
0x10, 0x78, // LDRB R0, [R2]
|
|
0x08, 0x70, // STRB R0, [R1]
|
|
0x01, 0x33, // ADD R3, #1
|
|
0x01, 0x32, // ADD R2, #1
|
|
0x01, 0x39, // SUB R1, #1
|
|
0x07, 0x2b, // CMP R3, #7
|
|
0xf8, 0xd9, // BLS jmpl
|
|
0x00, 0x20, // MOV R0, #0
|
|
0x70, 0x47 // BX LR
|
|
};
|
|
|
|
static u8 patch_eeprom111_1[] = {
|
|
0x00, 0x48, // ldr r0, [pc, #0]
|
|
0x00, 0x47, // bx r0
|
|
0x01, 0xFF, 0x3F, 0x08 // dcd 0x083FFF01 eeprom111_pad
|
|
};
|
|
static const u8 patch_eeprom111_2[] = {
|
|
0x27, 0xE0,
|
|
0xE0, 0x20 // mov r0, #0xE0
|
|
};
|
|
static const u8 patch_eeprom111_3[] = {
|
|
0x39, 0x68, // ldr r1, [r7, #0]
|
|
0x27, 0x48, // ldr r0, =0x0D000000
|
|
0x81, 0x42, // cmp r1, r0
|
|
0x23, 0xD0, // beq $00000050
|
|
0x89, 0x1C, // add r1, r1, #2
|
|
0x08, 0x88, // ldrh r0, [r1, #0]
|
|
0x01, 0x28, // cmp r0, #1
|
|
0x02, 0xD1, // bne $00000016
|
|
0x24, 0x48, 0x78, 0x60,
|
|
0x33, 0xE0, 0x00, 0x23,
|
|
0x00, 0x22, 0x89, 0x1C,
|
|
0x10, 0xB4, 0x01, 0x24,
|
|
0x08, 0x68, 0x20, 0x40,
|
|
0x5B, 0x00, 0x03, 0x43,
|
|
0x89, 0x1C, 0x52, 0x1C,
|
|
0x06, 0x2A, 0xF7, 0xD1,
|
|
0x10, 0xBC, 0x39, 0x60,
|
|
0xDB, 0x01, 0x02, 0x20,
|
|
0x00, 0x02, 0x1B, 0x18,
|
|
0x0E, 0x20, 0x00, 0x06,
|
|
0x1B, 0x18, 0x7B, 0x60,
|
|
0x39, 0x1C, 0x08, 0x31,
|
|
0x08, 0x88, 0x09, 0x38,
|
|
0x08, 0x80, 0x16, 0xE0,
|
|
0x15, 0x49, 0x00, 0x23,
|
|
0x00, 0x22, 0x10, 0xB4,
|
|
0x01, 0x24, 0x08, 0x68,
|
|
0x20, 0x40, 0x5B, 0x00,
|
|
0x03, 0x43, 0x89, 0x1C,
|
|
0x52, 0x1C, 0x06, 0x2A,
|
|
0xF7, 0xD1, 0x10, 0xBC,
|
|
0xDB, 0x01, 0x02, 0x20,
|
|
0x00, 0x02, 0x1B, 0x18,
|
|
0x0E, 0x20, 0x00, 0x06,
|
|
0x1B, 0x18, 0x08, 0x3B,
|
|
0x3B, 0x60, 0x0B, 0x48,
|
|
0x39, 0x68, 0x01, 0x60,
|
|
0x0A, 0x48, 0x79, 0x68,
|
|
0x01, 0x60, 0x0A, 0x48,
|
|
0x39, 0x1C, 0x08, 0x31,
|
|
0x0A, 0x88, 0x80, 0x21,
|
|
0x09, 0x06, 0x0A, 0x43,
|
|
0x02, 0x60, 0x07, 0x48,
|
|
0x00, 0x47, // bx r0
|
|
0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x0D, // dcd 0x0D000000
|
|
0x00, 0x00, 0x00, 0x0E, // dcd 0x0E000000
|
|
0x04, 0x00, 0x00, 0x0E, // dcd 0x0E000004
|
|
0xD4, 0x00, 0x00, 0x04, // dcd 0x040000D4
|
|
0xD8, 0x00, 0x00, 0x04, // dcd 0x040000D8
|
|
0xDC, 0x00, 0x00, 0x04, // dcd 0x040000DC
|
|
0x8D, 0x66, 0x0B, 0x08 // dcd 0x080B668D
|
|
};
|
|
|
|
//static const u8 patch_fmini_1[] = {
|
|
// 0xEA, 0x00
|
|
//};
|
|
|
|
/**********
|
|
static const u8 patch_fmini_2[] = {
|
|
0xBF, 0x04, 0x11, 0xD7
|
|
};
|
|
|
|
static const u8 patch_fmini_3[] = {
|
|
0x04, 0x40, 0xA1, 0xE8
|
|
};
|
|
|
|
static const u8 patch_fmini_4[] = {
|
|
0x04, 0xE0, 0x8F, 0xFF
|
|
};
|
|
*********/
|
|
|
|
static u8 patch_fmini_5[] = {
|
|
|
|
//0x38, 0x00, 0x9F, 0xE5, 0x00, 0x00, 0x11, 0xEF, 0x1C, 0x03, 0x9F, 0xE5, 0x1C, 0x13, 0x9F, 0xE5, 0x00, 0x10, 0x80, 0xE5, 0x0C, 0x00, 0x2D, 0xE9, 0x14, 0x03, 0x9F, 0xE5, 0x20, 0x10, 0x8F, 0xE2, 0x50, 0x20, 0x8F, 0xE2, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0x0C, 0x00, 0xBD, 0xE8, 0x01, 0x80, 0xBD, 0xE8, 0x11, 0xFF, 0x2F, 0xE1, 0x38, 0x63, 0x00, 0x08, 0x1F, 0x00, 0x2D, 0xE9, 0x1C, 0x00, 0x9F, 0xE5, 0x1C, 0x10, 0x9F, 0xE5, 0x1C, 0x20, 0x9F, 0xE5, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0x1F, 0x00, 0xBD, 0xE8, 0x00, 0x86, 0xB5, 0xE8, 0xF8, 0x00, 0x00, 0x06, 0x7C, 0xF8, 0x0F, 0x08, 0x88, 0xF8, 0x0F, 0x08, 0x00, 0x00, 0xA0, 0xE1, 0x00, 0xB0, 0x9F, 0xE5, 0x1B, 0xFF, 0x2F, 0xE1, 0x8C, 0xF8, 0x0F, 0x08, 0x00, 0x00, 0xA0, 0xE1, 0x07, 0x00, 0x83, 0xE8, 0x07, 0x00, 0xB5, 0xE8, 0x00, 0x00, 0x30, 0xE3, 0xFB, 0xFF, 0xFF, 0x1A, 0x94, 0x02, 0x9F, 0xE5, 0x06, 0xBA, 0x80, 0xE2, 0x7E, 0x1F, 0x8F, 0xE2, 0x0B, 0x00, 0x50, 0xE1, 0x24, 0x00, 0x00, 0xAA, 0xB2, 0x20, 0xD0, 0xE0, 0xB0, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB2, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB4, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB6, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xED, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB8, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBA, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBC, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBE, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xDD, 0xFF, 0xFF, 0x1A, 0x10, 0x00, 0x40, 0xE2, 0x00, 0x32, 0x9F, 0xE5, 0xB2, 0x30, 0xC0, 0xE0, 0xB2, 0x30, 0xC0, 0xE0, 0xB2, 0x30, 0xC0, 0xE0, 0xEC, 0x01, 0x9F, 0xE5, 0x59, 0x1F, 0x8F, 0xE2, 0x0B, 0x00, 0x50, 0xE1, 0x50, 0x00, 0x00, 0xAA, 0xB2, 0x20, 0xD0, 0xE0, 0xB0, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB2, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB4, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB6, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xED, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB8, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBA, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBC, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBE, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xDD, 0xFF, 0xFF, 0x1A, 0x10, 0x00, 0x40, 0xE2, 0xF4, 0x10, 0x8F, 0xE2, 0x47, 0x2F, 0x8F, 0xE2, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0xCC, 0x10, 0x8F, 0xE2, 0x0B, 0x00, 0x50, 0xE1, 0x26, 0x00, 0x00, 0xAA, 0xB2, 0x20, 0xD0, 0xE0, 0xB0, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB2, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB4, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB6, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xED, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB8, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBA, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBC, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBE, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xDD, 0xFF, 0xFF, 0x1A, 0x10, 0x00, 0x40, 0xE2, 0x78, 0x10, 0x8F, 0xE2, 0xA0, 0x20, 0x8F, 0xE2, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0x34, 0x22, 0x1F, 0xE5, 0x10, 0x20, 0x82, 0xE2, 0x12, 0xFF, 0x2F, 0xE1, 0x34, 0x70, 0x74, 0x70, 0x30, 0x78, 0x00, 0x28, 0x13, 0xD1, 0x70, 0x78, 0x00, 0x28, 0x10, 0xD1, 0x70, 0xB5, 0xA2, 0xB0, 0x0D, 0x1C, 0x00, 0x04, 0x03, 0x0C, 0x03, 0x48, 0x00, 0x68, 0x80, 0x88, 0xF0, 0xB5, 0xAC, 0xB0, 0x0D, 0x1C, 0x00, 0x04, 0x01, 0x0C, 0x12, 0x06, 0x17, 0x0E, 0x03, 0x48, 0xC0, 0x00, 0x0E, 0x22, 0x12, 0x06, 0x80, 0x18, 0x02, 0x78, 0x0A, 0x70, 0x42, 0x78, 0x4A, 0x70, 0x82, 0x78, 0x8A, 0x70, 0xC2, 0x78, 0xCA, 0x70, 0x02, 0x79, 0x0A, 0x71, 0x42, 0x79, 0x4A, 0x71, 0x82, 0x79, 0x8A, 0x71, 0xC2, 0x79, 0xCA, 0x71, 0x00, 0x20, 0x70, 0x47, 0xC0, 0x00, 0x0E, 0x22, 0x12, 0x06, 0x80, 0x18, 0x0A, 0x78, 0x02, 0x70, 0x4A, 0x78, 0x42, 0x70, 0x8A, 0x78, 0x82, 0x70, 0xCA, 0x78, 0xC2, 0x70, 0x0A, 0x79, 0x02, 0x71, 0x4A, 0x79, 0x42, 0x71, 0x8A, 0x79, 0x82, 0x71, 0xCA, 0x79, 0xC2, 0x71, 0x00, 0x20, 0x70, 0x47, 0xB8, 0x74, 0x00, 0x03, 0x15, 0x00, 0x00, 0xEA, 0x14, 0x75, 0x00, 0x03, 0x00, 0x00, 0x03, 0x02, 0x01, 0x20, 0x00, 0x00
|
|
0x38, 0x00, 0x9F, 0xE5, 0x00, 0x00, 0x11, 0xEF, 0x1C, 0x03, 0x9F, 0xE5, 0x1C, 0x13, 0x9F, 0xE5, 0x00, 0x10, 0x80, 0xE5, 0x0C, 0x00, 0x2D, 0xE9, 0x14, 0x03, 0x9F, 0xE5, 0x20, 0x10, 0x8F, 0xE2, 0x50, 0x20, 0x8F, 0xE2, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0x0C, 0x00, 0xBD, 0xE8, 0x01, 0x80, 0xBD, 0xE8, 0x11, 0xFF, 0x2F, 0xE1, 0x38, 0x63, 0x00, 0x08, 0x1F, 0x00, 0x2D, 0xE9, 0x1C, 0x00, 0x9F, 0xE5, 0x1C, 0x10, 0x9F, 0xE5, 0x1C, 0x20, 0x9F, 0xE5, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0x1F, 0x00, 0xBD, 0xE8, 0x00, 0x86, 0xB5, 0xE8, 0xF8, 0x00, 0x00, 0x06, 0x7C, 0xF8, 0x0F, 0x08, 0x88, 0xF8, 0x0F, 0x08, 0x00, 0x00, 0xA0, 0xE1, 0x00, 0xB0, 0x9F, 0xE5, 0x1B, 0xFF, 0x2F, 0xE1, 0x8C, 0xF8, 0x0F, 0x08, 0x00, 0x00, 0xA0, 0xE1, 0x07, 0x00, 0x83, 0xE8, 0x07, 0x00, 0xB5, 0xE8, 0x00, 0x00, 0x30, 0xE3, 0xFB, 0xFF, 0xFF, 0x1A, 0x94, 0x02, 0x9F, 0xE5, 0x06, 0xBA, 0x80, 0xE2, 0x7E, 0x1F, 0x8F, 0xE2, 0x0B, 0x00, 0x50, 0xE1, 0x24, 0x00, 0x00, 0xAA, 0xB2, 0x20, 0xD0, 0xE0, 0xB0, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB2, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB4, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB6, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xED, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB8, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBA, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBC, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBE, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xDD, 0xFF, 0xFF, 0x1A, 0x10, 0x00, 0x40, 0xE2, 0x00, 0x32, 0x9F, 0xE5, 0xB2, 0x30, 0xC0, 0xE0, 0xB2, 0x30, 0xC0, 0xE0, 0xB2, 0x30, 0xC0, 0xE0, 0xEC, 0x01, 0x9F, 0xE5, 0x59, 0x1F, 0x8F, 0xE2, 0x0B, 0x00, 0x50, 0xE1, 0x50, 0x00, 0x00, 0xAA, 0xB2, 0x20, 0xD0, 0xE0, 0xB0, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB2, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB4, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB6, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xED, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB8, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBA, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBC, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBE, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xDD, 0xFF, 0xFF, 0x1A, 0x10, 0x00, 0x40, 0xE2, 0xF4, 0x10, 0x8F, 0xE2, 0x47, 0x2F, 0x8F, 0xE2, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0xCC, 0x10, 0x8F, 0xE2, 0x0B, 0x00, 0x50, 0xE1, 0x26, 0x00, 0x00, 0xAA, 0xB2, 0x20, 0xD0, 0xE0, 0xB0, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB2, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB4, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB6, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xED, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB8, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBA, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBC, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBE, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xDD, 0xFF, 0xFF, 0x1A, 0x10, 0x00, 0x40, 0xE2, 0x78, 0x10, 0x8F, 0xE2, 0xA0, 0x20, 0x8F, 0xE2, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0x34, 0x22, 0x1F, 0xE5, 0x10, 0x20, 0x82, 0xE2, 0x12, 0xFF, 0x2F, 0xE1, 0x34, 0x70, 0x74, 0x70, 0x30, 0x78, 0x00, 0x28, 0x13, 0xD1, 0x70, 0x78, 0x00, 0x28, 0x10, 0xD1, 0x70, 0xB5, 0xA2, 0xB0, 0x0D, 0x1C, 0x00, 0x04, 0x03, 0x0C, 0x03, 0x48, 0x00, 0x68, 0x80, 0x88, 0xF0, 0xB5, 0xAC, 0xB0, 0x0D, 0x1C, 0x00, 0x04, 0x01, 0x0C, 0x12, 0x06, 0x17, 0x0E, 0x03, 0x48, 0xC0, 0x00, 0x0E, 0x22, 0x12, 0x06, 0x80, 0x18, 0x02, 0x78, 0xCA, 0x71, 0x42, 0x78, 0x8A, 0x71, 0x82, 0x78, 0x4A, 0x71, 0xC2, 0x78, 0x0A, 0x71, 0x02, 0x79, 0xCA, 0x70, 0x42, 0x79, 0x8A, 0x70, 0x82, 0x79, 0x4A, 0x70, 0xC2, 0x79, 0x0A, 0x70, 0x00, 0x20, 0x70, 0x47, 0xC0, 0x00, 0x0E, 0x22, 0x12, 0x06, 0x80, 0x18, 0x0A, 0x78, 0xC2, 0x71, 0x4A, 0x78, 0x82, 0x71, 0x8A, 0x78, 0x42, 0x71, 0xCA, 0x78, 0x02, 0x71, 0x0A, 0x79, 0xC2, 0x70, 0x4A, 0x79, 0x82, 0x70, 0x8A, 0x79, 0x42, 0x70, 0xCA, 0x79, 0x02, 0x70, 0x00, 0x20, 0x70, 0x47, 0xB8, 0x74, 0x00, 0x03, 0x15, 0x00, 0x00, 0xEA, 0x14, 0x75, 0x00, 0x03, 0x00, 0x00, 0x03, 0x02, 0x01, 0x20, 0x00, 0x00
|
|
|
|
};
|
|
static u8 patch_fmini_6[] = {
|
|
|
|
//0x38, 0x00, 0x9F, 0xE5, 0x00, 0x00, 0x11, 0xEF, 0x30, 0x02, 0x9F, 0xE5, 0x30, 0x12, 0x9F, 0xE5, 0x00, 0x10, 0x80, 0xE5, 0x0C, 0x00, 0x2D, 0xE9, 0x28, 0x02, 0x9F, 0xE5, 0x20, 0x10, 0x8F, 0xE2, 0x38, 0x20, 0x8F, 0xE2, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0x0C, 0x00, 0xBD, 0xE8, 0x01, 0x80, 0xBD, 0xE8, 0x11, 0xFF, 0x2F, 0xE1, 0x1C, 0x01, 0x00, 0x08, 0x08, 0x90, 0x95, 0xE5, 0x06, 0x04, 0x59, 0xE3, 0x01, 0x00, 0x00, 0xBA, 0x04, 0xA0, 0x9F, 0xE5, 0x1A, 0xFF, 0x2F, 0xE1, 0x00, 0x86, 0xB5, 0xE8, 0x64, 0xF8, 0x0F, 0x08, 0x00, 0x00, 0xA0, 0xE1, 0x0F, 0x00, 0x2D, 0xE9, 0xDC, 0x01, 0x9F, 0xE5, 0x03, 0xA9, 0x80, 0xE2, 0x16, 0x1E, 0x8F, 0xE2, 0x0A, 0x00, 0x50, 0xE1, 0x50, 0x00, 0x00, 0xAA, 0xB2, 0x20, 0xD0, 0xE0, 0xB0, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB2, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB4, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB6, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xED, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB8, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBA, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBC, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBE, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xDD, 0xFF, 0xFF, 0x1A, 0x10, 0x00, 0x40, 0xE2, 0x43, 0x1F, 0x8F, 0xE2, 0x4D, 0x2F, 0x8F, 0xE2, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0xA8, 0x10, 0x8F, 0xE2, 0x0A, 0x00, 0x50, 0xE1, 0x26, 0x00, 0x00, 0xAA, 0xB2, 0x20, 0xD0, 0xE0, 0xB0, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB2, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB4, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB6, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xED, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB8, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBA, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBC, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBE, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xDD, 0xFF, 0xFF, 0x1A, 0x10, 0x00, 0x40, 0xE2, 0x38, 0x10, 0x8F, 0xE2, 0x60, 0x20, 0x8F, 0xE2, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0x0F, 0x00, 0xBD, 0xE8, 0x00, 0x86, 0xB5, 0xE8, 0x70, 0xB5, 0xA2, 0xB0, 0x0D, 0x1C, 0x00, 0x04, 0x03, 0x0C, 0x03, 0x48, 0x00, 0x68, 0x80, 0x88, 0x30, 0xB5, 0xA9, 0xB0, 0x0D, 0x1C, 0x00, 0x04, 0x04, 0x0C, 0x03, 0x48, 0x00, 0x68, 0x80, 0x88, 0xC0, 0x00, 0x0E, 0x22, 0x12, 0x06, 0x80, 0x18, 0x02, 0x78, 0x0A, 0x70, 0x42, 0x78, 0x4A, 0x70, 0x82, 0x78, 0x8A, 0x70, 0xC2, 0x78, 0xCA, 0x70, 0x02, 0x79, 0x0A, 0x71, 0x42, 0x79, 0x4A, 0x71, 0x82, 0x79, 0x8A, 0x71, 0xC2, 0x79, 0xCA, 0x71, 0x00, 0x20, 0x70, 0x47, 0xC0, 0x00, 0x0E, 0x22, 0x12, 0x06, 0x80, 0x18, 0x0A, 0x78, 0x02, 0x70, 0x4A, 0x78, 0x42, 0x70, 0x8A, 0x78, 0x82, 0x70, 0xCA, 0x78, 0xC2, 0x70, 0x0A, 0x79, 0x02, 0x71, 0x4A, 0x79, 0x42, 0x71, 0x8A, 0x79, 0x82, 0x71, 0xCA, 0x79, 0xC2, 0x71, 0x00, 0x20, 0x70, 0x47, 0x0C, 0x75, 0x00, 0x03, 0x3E, 0x00, 0x00, 0xEA, 0x0C, 0x76, 0x00, 0x03, 0x00, 0x40, 0x00, 0x03
|
|
0x38, 0x00, 0x9F, 0xE5, 0x00, 0x00, 0x11, 0xEF, 0x30, 0x02, 0x9F, 0xE5, 0x30, 0x12, 0x9F, 0xE5, 0x00, 0x10, 0x80, 0xE5, 0x0C, 0x00, 0x2D, 0xE9, 0x28, 0x02, 0x9F, 0xE5, 0x20, 0x10, 0x8F, 0xE2, 0x38, 0x20, 0x8F, 0xE2, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0x0C, 0x00, 0xBD, 0xE8, 0x01, 0x80, 0xBD, 0xE8, 0x11, 0xFF, 0x2F, 0xE1, 0x1C, 0x01, 0x00, 0x08, 0x08, 0x90, 0x95, 0xE5, 0x06, 0x04, 0x59, 0xE3, 0x01, 0x00, 0x00, 0xBA, 0x04, 0xA0, 0x9F, 0xE5, 0x1A, 0xFF, 0x2F, 0xE1, 0x00, 0x86, 0xB5, 0xE8, 0x64, 0xF8, 0x0F, 0x08, 0x00, 0x00, 0xA0, 0xE1, 0x0F, 0x00, 0x2D, 0xE9, 0xDC, 0x01, 0x9F, 0xE5, 0x03, 0xA9, 0x80, 0xE2, 0x16, 0x1E, 0x8F, 0xE2, 0x0A, 0x00, 0x50, 0xE1, 0x50, 0x00, 0x00, 0xAA, 0xB2, 0x20, 0xD0, 0xE0, 0xB0, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB2, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB4, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB6, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xED, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB8, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBA, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBC, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBE, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xDD, 0xFF, 0xFF, 0x1A, 0x10, 0x00, 0x40, 0xE2, 0x43, 0x1F, 0x8F, 0xE2, 0x4D, 0x2F, 0x8F, 0xE2, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0xA8, 0x10, 0x8F, 0xE2, 0x0A, 0x00, 0x50, 0xE1, 0x26, 0x00, 0x00, 0xAA, 0xB2, 0x20, 0xD0, 0xE0, 0xB0, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB2, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB4, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xF1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB6, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xED, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xB8, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE9, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBA, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE5, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBC, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xE1, 0xFF, 0xFF, 0x1A, 0xB2, 0x20, 0xD0, 0xE0, 0xBE, 0x30, 0xD1, 0xE1, 0x03, 0x00, 0x52, 0xE1, 0xDD, 0xFF, 0xFF, 0x1A, 0x10, 0x00, 0x40, 0xE2, 0x38, 0x10, 0x8F, 0xE2, 0x60, 0x20, 0x8F, 0xE2, 0x04, 0x30, 0x91, 0xE4, 0x04, 0x30, 0x80, 0xE4, 0x02, 0x00, 0x51, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, 0x0F, 0x00, 0xBD, 0xE8, 0x00, 0x86, 0xB5, 0xE8, 0x70, 0xB5, 0xA2, 0xB0, 0x0D, 0x1C, 0x00, 0x04, 0x03, 0x0C, 0x03, 0x48, 0x00, 0x68, 0x80, 0x88, 0x30, 0xB5, 0xA9, 0xB0, 0x0D, 0x1C, 0x00, 0x04, 0x04, 0x0C, 0x03, 0x48, 0x00, 0x68, 0x80, 0x88, 0xC0, 0x00, 0x0E, 0x22, 0x12, 0x06, 0x80, 0x18, 0x02, 0x78, 0xCA, 0x71, 0x42, 0x78, 0x8A, 0x71, 0x82, 0x78, 0x4A, 0x71, 0xC2, 0x78, 0x0A, 0x71, 0x02, 0x79, 0xCA, 0x70, 0x42, 0x79, 0x8A, 0x70, 0x82, 0x79, 0x4A, 0x70, 0xC2, 0x79, 0x0A, 0x70, 0x00, 0x20, 0x70, 0x47, 0xC0, 0x00, 0x0E, 0x22, 0x12, 0x06, 0x80, 0x18, 0x0A, 0x78, 0xC2, 0x71, 0x4A, 0x78, 0x82, 0x71, 0x8A, 0x78, 0x42, 0x71, 0xCA, 0x78, 0x02, 0x71, 0x0A, 0x79, 0xC2, 0x70, 0x4A, 0x79, 0x82, 0x70, 0x8A, 0x79, 0x42, 0x70, 0xCA, 0x79, 0x02, 0x70, 0x00, 0x20, 0x70, 0x47, 0x0C, 0x75, 0x00, 0x03, 0x3E, 0x00, 0x00, 0xEA, 0x0C, 0x76, 0x00, 0x03, 0x00, 0x40, 0x00, 0x03
|
|
|
|
};
|
|
|
|
|
|
static u8 patch_flash1M_1[] = {
|
|
0x00, 0xb5, // PUSH {LR}
|
|
0x00, 0xf0, 0x55, 0xfb, // BL Savel V103:0x00,0xF0,0x5B,0xFB,
|
|
0x02, 0xbc, // POP {R1}
|
|
0x08, 0x47 // BX R1
|
|
};
|
|
|
|
static const u8 patch_flash1M_1E[] = {
|
|
0x05, 0x4B,
|
|
0x1B, 0x78,
|
|
0x05, 0x4B,
|
|
0x1B, 0x78,
|
|
0x05, 0x4B,
|
|
0x1B, 0x78,
|
|
0xE0, 0x23,
|
|
0x1B, 0x05,
|
|
0x0C, 0x30,
|
|
0x18, 0x70,
|
|
0x1A, 0x78,
|
|
0x70, 0x47,
|
|
0x55, 0x55, 0x00, 0x0E,
|
|
0xAA, 0x2A, 0x00, 0x0E,
|
|
0x55, 0xB0, 0x00, 0x0E
|
|
};
|
|
|
|
|
|
static const u8 patch_flash1M_2[] = {
|
|
0x01, 0x35, // add r5, #1
|
|
0x06, 0x4a, // ldr r2, [pc, #24] ($001b0118)
|
|
0xaa, 0x20, // mov r0, #170
|
|
0x10, 0x78, // ## ldrb r0, [r2, #0]
|
|
0x05, 0x49, // ldr r1, [pc, #20] ($001b011c)
|
|
0x55, 0x20, // mov r0, #85
|
|
0x08, 0x78, // ## ldrb r0, [r1, #0]
|
|
0x90, 0x20, // mov r0, #144
|
|
0x10, 0x78, // ## ldrb r0, [r2, #0]
|
|
// 0x10, 0xa9, // add r1, sp, #64
|
|
// 0x03, 0x4a, // ldr r2, [pc, #12] ($001b0120)
|
|
// 0x10, 0x1c, // mov r0, r2 (add r0, r2, #0)
|
|
};
|
|
|
|
static const u8 patch_flash1M_3[] = {
|
|
0x04, 0x0c, // lsr r4, r0, #16
|
|
0xe0, 0x20, // mov r0, #224
|
|
0x00, 0x05, // lsl r0, r0, #20
|
|
|
|
0x1b, 0x24, // ##mov r4, #27
|
|
0x24, 0x01, // ##lsl r4, r4, #4
|
|
0x24, 0x01, // ##lsl r4, r4, #4
|
|
0x24, 0x20, // ##mov r0, #50
|
|
0x04, 0x43, // orr r4, r0
|
|
0x07, 0x49, // ldr r1, [pc, #28] ($001b0168)
|
|
0xaa, 0x20, // mov r0, #170
|
|
0x08, 0x78, // ##ldrb r0, [r1, #0]
|
|
0x07, 0x4a, // ldr r2, [pc, #28] ($001b016c)
|
|
0x55, 0x20, // mov r0, #85
|
|
0x10, 0x78, // ##ldrb r0, [r2, #0]
|
|
0xf0, 0x20, // mov r0, #240
|
|
0x08, 0x78, // ##ldrb r0, [r1, #0]
|
|
0x08, 0x78, // ##ldrb r0, [r1, #0]
|
|
};
|
|
|
|
static const u8 patch_flash1M_3E[] = {
|
|
0x0C, 0x48,
|
|
0x13, 0x20,
|
|
0x13, 0x20,
|
|
0x00, 0x06,
|
|
0x04, 0x0C,
|
|
0xE0, 0x20,
|
|
0x00, 0x05,
|
|
0x62, 0x20,
|
|
0x62, 0x20,
|
|
0x00, 0x06,
|
|
0x00, 0x0E,
|
|
0x04, 0x43,
|
|
0x07, 0x49,
|
|
0xAA, 0x20,
|
|
0x00, 0x00,
|
|
0x07, 0x4A,
|
|
0x55, 0x20,
|
|
0x00, 0x00,
|
|
0xF0, 0x20,
|
|
0x00, 0x00,
|
|
0x00, 0x00
|
|
};
|
|
|
|
static const u8 patch_flash1M_4[] = {
|
|
0x13, 0x23, 0x1b, 0x02, // MOVL R3, 0x1300
|
|
0x62, 0x20, // MOV R0, #0x62
|
|
0x03, 0x43 // ORR R3, R0
|
|
};
|
|
|
|
static const u8 patch_flash1M_5[] = {
|
|
0x00, 0xB5, // PUSH {LR}
|
|
0x00, 0x20, // MOV R0, #0
|
|
0x02, 0xBC, // POP {R1}
|
|
0x08, 0x47 // BX R1
|
|
};
|
|
|
|
static const u8 patch_flash1M_5E[] = {
|
|
0x70, 0xB5, 0x90, 0xB0,
|
|
0x15, 0x4D, 0x29, 0x88,
|
|
0x15, 0x4E, 0x31, 0x40,
|
|
0x15, 0x48, 0x00, 0x68,
|
|
0x00, 0x8A, 0x01, 0x43,
|
|
0x29, 0x80, 0x0E, 0x21,
|
|
0x09, 0x06, 0xFF, 0x24,
|
|
0x80, 0x22, 0x13, 0x4B,
|
|
0x52, 0x02, 0x01, 0x3A,
|
|
0x8C, 0x54, 0xFC, 0xD1,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00
|
|
};
|
|
|
|
static u8 patch_flash1M_6[] = {
|
|
0x00, 0xb5, // PUSH {LR}
|
|
0x00, 0x20, // MOV R0, #0
|
|
0x02, 0xbc, // POP {R1}
|
|
0x08, 0x47, // BX R1
|
|
// Savel:
|
|
0x70, 0xb4, // PUSH {R4-R6}
|
|
0x0a, 0x49, // LDR R1, =0x9FE0000
|
|
0xd2, 0x22, 0x12, 0x02, // MOVL R2, 0xD200
|
|
0x0a, 0x80, // STRH R2, [R1]
|
|
0x09, 0x49, // LDR R1, =0x8000000
|
|
0x15, 0x23, 0x1b, 0x02, // MOVL R3, 0x1500
|
|
0x0b, 0x80, // STRH R3, [R1]
|
|
0x08, 0x49, // LDR R1, =0x8020000
|
|
0x0a, 0x80, // STRH R2, [R1]
|
|
0x08, 0x49, // LDR R1, =0x8040000
|
|
0x0b, 0x80, // STRH R3, [R1]
|
|
0x08, 0x49, // LDR R1, =0x9C00000
|
|
0x00, 0x01, // LSL R0, R0, #4
|
|
0x32, 0x30, // NOR:ADD R0, #0x10 PSRAM:ADD R0, #0x32
|
|
0x08, 0x80, // STRH R0, [R1]
|
|
0x07, 0x49, // LDR R1, =0x9FC0000
|
|
0x0b, 0x80, // STRH R3, [R1]
|
|
0x70, 0xbc, // POP {R4-R6}
|
|
0x70, 0x47, // BX LR
|
|
0x00, // DCB 0
|
|
0x00, // DCB 0
|
|
0x00,0x00,0xfe,0x09, // DCD 0x9FE0000
|
|
0x00,0x00,0x00,0x08, // DCD 0x8000000
|
|
0x00,0x00,0x02,0x08, // DCD 0x8020000
|
|
0x00,0x00,0x04,0x08, // DCD 0x8040000
|
|
0x00,0x00,0xc0,0x09, // DCD 0x9C00000
|
|
0x00,0x00,0xfc,0x09 // DCD 0x9FC0000
|
|
};
|
|
|
|
static const u8 patch_flash1M_6E[] = {
|
|
0x00, 0xb5, // push {lr}
|
|
0x00, 0x20, // mov r0, #0
|
|
0x02, 0xbc, // pop {r1}
|
|
0x08, 0x47, // bx r1
|
|
// Savel:
|
|
0x05, 0x49, // LDR R1, =0xE005555
|
|
0x0a, 0x78, // ldrb r2, [r1, #0]
|
|
0x05, 0x49, // LDR R1, =0xE002AAA
|
|
0x0a, 0x78, // ldrb r2, [r1, #0]
|
|
0x05, 0x49, // LDR R1, =0xE00B055
|
|
0x0a, 0x78, // ldrb r2, [r1, #0]
|
|
0x05, 0x49, // LDR R1, =0xE000000
|
|
0x00, 0x30, // add r0, #8
|
|
0x08, 0x70, // strb r0, [r1, #0]
|
|
0x0a, 0x78, // ldrb r2, [r1, #0]
|
|
0x70, 0x47, // bx lr
|
|
0x00, // DCB 0
|
|
0x00, // DCB 0
|
|
0x55, 0x55, 0x00, 0x0E, // DCD 0xE005555
|
|
0xAA, 0x2A, 0x00, 0x0E, // DCD 0xE002AAA
|
|
0x55, 0xB0, 0x00, 0x0E, // DCD 0xE00B055
|
|
0x00, 0x00, 0x00, 0x0E, // DCD 0xE000000
|
|
};
|
|
|
|
static const u8 patch_flash1M_6E2[] = {
|
|
0xF0, 0xB5, 0x90, 0xB0,
|
|
0x00, 0x04, 0x06, 0x0C,
|
|
0x03, 0x48, 0x00, 0x68,
|
|
0x40, 0x89, 0x86, 0x42,
|
|
0x06, 0xD3, 0x02, 0x48,
|
|
0x52, 0xE0, 0x00, 0x00,
|
|
0x98, 0x31, 0x00, 0x03,
|
|
0xFF, 0x80, 0x00, 0x00,
|
|
0x30, 0x09, 0x00, 0x06,
|
|
0x00, 0x0E, 0xFF, 0xF7,
|
|
0x97, 0xFC, 0x0F, 0x20,
|
|
0x06, 0x40, 0x00, 0x27,
|
|
0x18, 0x4B, 0x19, 0x88,
|
|
0x18, 0x48, 0x01, 0x40,
|
|
0x18, 0x48, 0x02, 0x68,
|
|
0x10, 0x8A, 0x01, 0x43,
|
|
0x19, 0x80, 0x14, 0x7A,
|
|
0x30, 0x1C, 0xA0, 0x40,
|
|
0x04, 0x1C, 0xE0, 0x20,
|
|
0x00, 0x05, 0x24, 0x18,
|
|
0x13, 0x49, 0xFF, 0x25,
|
|
0x08, 0x22, 0x00, 0x00,
|
|
0x52, 0x02, 0x01, 0x3A,
|
|
0xA5, 0x54, 0xFC, 0xD1,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
static u8 patch_flash1M_6M[] = {
|
|
|
|
0x00, 0xB5, 0x00, 0x20, 0x02, 0xBC, 0x08, 0x47, 0x04, 0x30, 0x08, 0x22, 0x12, 0x06, 0x13, 0x88, 0x8E, 0x21, 0x09, 0x05, 0x4B, 0x88, 0xD3, 0x89, 0x12, 0x49, 0x8B, 0x8B, 0x12, 0x49, 0x4B, 0x89, 0x12, 0x49, 0x4B, 0x8A, 0x13, 0x88, 0x12, 0x49, 0xCB, 0x88, 0x41, 0x01, 0x89, 0x18, 0x0B, 0x88, 0x10, 0x49, 0xCB, 0x89, 0x13, 0x88, 0x09, 0x22, 0x12, 0x06, 0x13, 0x88, 0x0E, 0x49, 0x0B, 0x88, 0x8B, 0x89, 0x8B, 0x89, 0x8B, 0x89, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x0A, 0x1C, 0x96, 0x3A, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x98, 0x22, 0x12, 0x05, 0x40, 0x04, 0x80, 0x18, 0x03, 0x88, 0x0B, 0x89, 0x70, 0x47, 0xE0, 0x1F, 0x80, 0x08, 0x40, 0x10, 0x00, 0x08, 0x00, 0x06, 0x80, 0x08, 0x60, 0x1B, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0xE0, 0xFF, 0xFF, 0x09
|
|
|
|
};
|
|
|
|
static const u8 patch_flash1M_7[] = {
|
|
0x10, 0xB5,
|
|
0x0A, 0x4C,
|
|
0xAA, 0x22,
|
|
0x00, 0x00, // LSL R0, R0, #0
|
|
0x09, 0x4B,
|
|
0x55, 0x22,
|
|
0x00, 0x00, // LSL R0, R0, #0
|
|
0xA0, 0x22,
|
|
0x00, 0x00 // LSL R0, R0, #0
|
|
};
|
|
|
|
static u8 patch_flash1M_8[] = {
|
|
0x78, 0xB5, // push {r3, r4, r5, r6, lr}
|
|
0x00, 0x06, // LSL R0, R0, #0x18
|
|
0x03, 0x0F, // LSR R3, R0, #0x1C
|
|
0x00, 0x01, // LSL R0, R0, #4
|
|
0x00, 0x0C, // 04 // LSR R0, R0, #0x10
|
|
0x40, 0x18, // ADD R0, R0, R1
|
|
0xE0, 0x21, 0x09, 0x05, // MOVL R1, 0xE000000
|
|
0x09, 0x18, // ADD R1, R1, R0
|
|
0x0B, 0x48, // LDR R0, =0x9FE0000
|
|
0xD2, 0x25, 0x2D, 0x02, // MOVL R5, 0xD200
|
|
0x05, 0x80, // STRH R5, [R0]
|
|
0x0A, 0x48, // LDR R0, =0x8000000
|
|
0x15, 0x26, 0x36, 0x02, // MOVL R6, 0x1500
|
|
0x06, 0x80, // STRH R6, [R0]
|
|
0x09, 0x48, // LDR R0, =0x8020000
|
|
0x05, 0x80, // STRH R5, [R0]
|
|
0x09, 0x48, // LDR R0, =0x8040000
|
|
0x06, 0x80, // strh r6, [r0, #0]
|
|
0x09, 0x48, // LDR R0, =0x9C00000
|
|
0x1B, 0x01, // lsl r3, r3, #4
|
|
0x32, 0x33, // NOR:ADD R3, #0x10 PSRAM:ADD R3, #0x32
|
|
0x03, 0x80, // strh r3, [r0, #0]
|
|
0x08, 0x48, // LDR R0, =0x9FC0000
|
|
0x06, 0x80, // strh r6, [r0, #0]
|
|
0x0A, 0x70, // strb r2, [r1, #0]
|
|
0x00, 0x20, // MOV R0, #0
|
|
0x78, 0xBC, // pop {r3, r4, r5, r6}
|
|
0x02, 0xBC, // POP {R1}
|
|
0x08, 0x47, // BX R1
|
|
0x00, 0x00, 0xFE, 0x09, // DCD 0x9FE0000
|
|
0x00, 0x00, 0x00, 0x08, // DCD 0x8000000
|
|
0x00, 0x00, 0x02, 0x08, // DCD 0x8020000
|
|
0x00, 0x00, 0x04, 0x08, // DCD 0x8040000
|
|
0x00, 0x00, 0xC0, 0x09, // DCD 0x9C00000
|
|
0x00, 0x00, 0xFC, 0x09 // DCD 0x9FC0000
|
|
};
|
|
|
|
static const u8 patch_flash1M_8E[] = {
|
|
0x78, 0xb5, // push {r3, r4, r5, r6, lr}
|
|
0x00, 0x06, // lsl r0, r0, #24
|
|
0x03, 0x0f, // lsr r3, r0, #28
|
|
0x00, 0x01, // lsl r0, r0, #4
|
|
0x00, 0x0c, // lsr r0, r0, #16
|
|
0x40, 0x18, // add r0, r0, r1
|
|
0x07, 0x4d, // ldr r5, [pc, #28] ($0000002c)
|
|
0x29, 0x18, // add r1, r5, r0
|
|
0x07, 0x48, // ldr r0, [pc, #28] ($00000030)
|
|
0x04, 0x78, // ldrb r4, [r0, #0]
|
|
0x07, 0x48, // ldr r0, [pc, #28] ($00000034)
|
|
0x04, 0x78, // ldrb r4, [r0, #0]
|
|
0x07, 0x48, // ldr r0, [pc, #28] ($00000038)
|
|
0x04, 0x78, // ldrb r4, [r0, #0]
|
|
0x00, 0x33, // add r3, #8
|
|
0x2b, 0x70, // strb r3, [r5, #0]
|
|
0x28, 0x78, // ldrb r0, [r5, #0]
|
|
0x0a, 0x70, // strb r2, [r1, #0]
|
|
0x00, 0x20, // mov r0, #0
|
|
0x78, 0xbc, // pop {r3, r4, r5, r6}
|
|
0x02, 0xbc, // pop {r1}
|
|
0x08, 0x47, // bx r1
|
|
0x00, 0x00, 0x00, 0x0E, // DCD 0xE000000
|
|
0x55, 0x55, 0x00, 0x0E, // DCD 0xE005555
|
|
0xAA, 0x2A, 0x00, 0x0E, // DCD 0xE002AAA
|
|
0x55, 0xB0, 0x00, 0x0E, // DCD 0xE00B055
|
|
};
|
|
|
|
static u8 patch_flash1M_8M[] = {
|
|
|
|
0x38, 0xB5, 0x04, 0x06, 0x20, 0x0F, 0x24, 0x01, 0x24, 0x0C, 0x64, 0x18, 0x15, 0x1C, 0x04, 0x30, 0x08, 0x22, 0x12, 0x06, 0x13, 0x88, 0x8E, 0x21, 0x09, 0x05, 0x4B, 0x88, 0xD3, 0x89, 0x16, 0x49, 0x8B, 0x8B, 0x16, 0x49, 0x4B, 0x89, 0x16, 0x49, 0x4B, 0x8A, 0x13, 0x88, 0x15, 0x49, 0xCB, 0x88, 0x41, 0x01, 0x89, 0x18, 0x0B, 0x88, 0x14, 0x49, 0xCB, 0x89, 0x13, 0x88, 0x09, 0x22, 0x12, 0x06, 0x13, 0x88, 0x12, 0x49, 0x0B, 0x88, 0x8B, 0x89, 0x8B, 0x89, 0x8B, 0x89, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x0A, 0x1C, 0x96, 0x3A, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x98, 0x22, 0x12, 0x05, 0x40, 0x04, 0x80, 0x18, 0x03, 0x88, 0x0B, 0x89, 0x0E, 0x21, 0x09, 0x06, 0x09, 0x19, 0x0D, 0x70, 0x00, 0x20, 0x38, 0xBC, 0x02, 0xBC, 0x08, 0x47, 0xE0, 0x1F, 0x80, 0x08, 0x40, 0x10, 0x00, 0x08, 0x00, 0x06, 0x80, 0x08, 0x60, 0x1B, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0xE0, 0xFF, 0xFF, 0x09
|
|
|
|
};
|
|
|
|
static u8 patch_flash1M_9[] = {
|
|
0x7c, 0xb5, // PUSH {R2-R6,LR}
|
|
0x00, 0x06, // LSL R0, R0, #0x18
|
|
0x04, 0x0f, // LSR R4, R0, #0x1C
|
|
0x00, 0x01, // LSL R0, R0, #4
|
|
0x00, 0x0c, // LSR R0, R0, #0x10
|
|
0x0a, 0x1c, // ADD R2, R1, #0
|
|
0xe0, 0x21, 0x09, 0x05, // MOVL R1, 0xE000000
|
|
0x09, 0x18, // ADD R1, R1, R0
|
|
0x01, 0x23, 0x1b, 0x03, // MOVL R3, 0x1000
|
|
0x0e, 0x48, // LDR R0, =0x9FE0000
|
|
0xd2, 0x25, 0x2d, 0x02, // MOVL R5, 0xD200
|
|
0x05, 0x80, // STRH R5, [R0]
|
|
0x0d, 0x48, // LDR R0, =0x8000000
|
|
0x15, 0x26, 0x36, 0x02, // MOVL R6, 0x1500
|
|
0x06, 0x80, // STRH R6, [R0]
|
|
0x0c, 0x48, // LDR R0, =0x8020000
|
|
0x05, 0x80, // STRH R5, [R0]
|
|
0x0c, 0x48, // LDR R0, =0x8040000
|
|
0x06, 0x80, // STRH R6, [R0]
|
|
0x0c, 0x48, // LDR R0, =0x9C00000
|
|
0x24, 0x01, // LSL R4, R4, #4
|
|
0x32, 0x34, // NOR:ADD R4, #0x10 PSRAM:ADD R4, #0x32
|
|
0x04, 0x80, // STRH R4, [R0]
|
|
0x0b, 0x48, // LDR R0, =0x9FC0000
|
|
0x06, 0x80, // STRH R6, [R0]
|
|
// jmpl:
|
|
0x10, 0x78, // LDRB R0, [R2]
|
|
0x08, 0x70, // STRB R0, [R1]
|
|
0x01, 0x3b, // SUB R3, #1
|
|
0x01, 0x32, // ADD R2, #1
|
|
0x01, 0x31, // ADD R1, #1
|
|
0x00, 0x2b, // CMP R3, #0
|
|
0xf8, 0xd1, // BNE jmpl
|
|
0x00, 0x20, // MOV R0, #0
|
|
0x7c, 0xbc, // POP {R2-R6}
|
|
0x02, 0xbc, // POP {R1}
|
|
0x08, 0x47, // BX R1
|
|
0x00, 0x00, 0xfe, 0x09, // DCD 0x9FE0000
|
|
0x00, 0x00, 0x00, 0x08, // DCD 0x8000000
|
|
0x00, 0x00, 0x02, 0x08, // DCD 0x8020000
|
|
0x00, 0x00, 0x04, 0x08, // DCD 0x8040000
|
|
0x00, 0x00, 0xc0, 0x09, // DCD 0x9C00000
|
|
0x00, 0x00, 0xfc, 0x09 // DCD 0x9FC0000
|
|
};
|
|
static const u8 patch_flash1M_9E[] = {
|
|
0x7c, 0xb5, // push {r2, r3, r4, r5, r6, lr}
|
|
0x00, 0x06, // lsl r0, r0, #24
|
|
0x04, 0x0f, // lsr r4, r0, #28
|
|
0x00, 0x01, // lsl r0, r0, #4
|
|
0x00, 0x0c, // lsr r0, r0, #16
|
|
0x0a, 0x1c, // mov r2, r1 (add r2, r1, #0)
|
|
0x0b, 0x4d, // ldr r5, [pc, #44] ($0000003c)
|
|
0x29, 0x18, // add r1, r5, r0
|
|
0x0b, 0x48, // ldr r0, [pc, #44] ($00000040)
|
|
0x03, 0x78, // ldrb r3, [r0, #0]
|
|
0x0b, 0x48, // ldr r0, [pc, #44] ($00000044)
|
|
0x03, 0x78, // ldrb r3, [r0, #0]
|
|
0x0b, 0x48, // ldr r0, [pc, #44] ($00000048)
|
|
0x03, 0x78, // ldrb r3, [r0, #0]
|
|
0x00, 0x34, // add r4, #8
|
|
0x2c, 0x70, // strb r4, [r5, #0]
|
|
0x2b, 0x78, // ldrb r3, [r5, #0]
|
|
0x01, 0x23, // mov r3, #1
|
|
0x1b, 0x03, // lsl r3, r3, #12
|
|
// jmpl:
|
|
0x10, 0x78, // ldrb r0, [r2, #0]
|
|
0x08, 0x70, // strb r0, [r1, #0]
|
|
0x01, 0x3b, // sub r3, #1
|
|
0x01, 0x32, // add r2, #1
|
|
0x01, 0x31, // add r1, #1
|
|
0x00, 0x2b, // cmp r3, #0
|
|
0xf8, 0xd1, // bne jmpl
|
|
0x00, 0x20, // mov r0, #0
|
|
0x7c, 0xbc, // pop {r2, r3, r4, r5, r6}
|
|
0x02, 0xbc, // pop {r1}
|
|
0x08, 0x47, // bx r1
|
|
0x00, 0x00, 0x00, 0x0E, // DCD 0xE000000
|
|
0x55, 0x55, 0x00, 0x0E, // DCD 0xE005555
|
|
0xAA, 0x2A, 0x00, 0x0E, // DCD 0xE002AAA
|
|
0x55, 0xB0, 0x00, 0x0E, // DCD 0xE00B055
|
|
};
|
|
|
|
static u8 patch_flash1M_9M[] = {
|
|
|
|
0x3C, 0xB5, 0x04, 0x06, 0x20, 0x0F, 0x24, 0x01, 0x24, 0x0C, 0x0D, 0x1C, 0x04, 0x30, 0x08, 0x22, 0x12, 0x06, 0x13, 0x88, 0x8E, 0x21, 0x09, 0x05, 0x4B, 0x88, 0xD3, 0x89, 0x1A, 0x49, 0x8B, 0x8B, 0x1A, 0x49, 0x4B, 0x89, 0x1A, 0x49, 0x4B, 0x8A, 0x13, 0x88, 0x1A, 0x49, 0xCB, 0x88, 0x41, 0x01, 0x89, 0x18, 0x0B, 0x88, 0x18, 0x49, 0xCB, 0x89, 0x13, 0x88, 0x09, 0x22, 0x12, 0x06, 0x13, 0x88, 0x16, 0x49, 0x0B, 0x88, 0x8B, 0x89, 0x8B, 0x89, 0x8B, 0x89, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x0A, 0x1C, 0x96, 0x3A, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x98, 0x22, 0x12, 0x05, 0x40, 0x04, 0x80, 0x18, 0x03, 0x88, 0x0B, 0x89, 0x0E, 0x21, 0x09, 0x06, 0x09, 0x19, 0x01, 0x23, 0x1B, 0x03, 0x28, 0x78, 0x08, 0x70, 0x01, 0x3B, 0x01, 0x35, 0x01, 0x31, 0x00, 0x2B, 0xF8, 0xD1, 0x00, 0x20, 0x3C, 0xBC, 0x02, 0xBC, 0x08, 0x47, 0x00, 0x00, 0xE0, 0x1F, 0x80, 0x08, 0x40, 0x10, 0x00, 0x08, 0x00, 0x06, 0x80, 0x08, 0x60, 0x1B, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0xE0, 0xFF, 0xFF, 0x09
|
|
|
|
};
|
|
|
|
|
|
static const u8 patch_flash120_1[] = {
|
|
0x00, 0xB5, // PUSH {LR}
|
|
0x3D, 0x20, 0x00, 0x02, // MOVL R0, 0x3D00
|
|
0x1F, 0x21, // MOV R1, #0x1F
|
|
0x08, 0x43, // ORR R0, R1
|
|
0x02, 0xBC, // POP {R1}
|
|
0x08, 0x47 // BX R1
|
|
};
|
|
static const u8 patch_flash120_2[] = {
|
|
0x7C, 0xB5, // PUSH {R2-R6,LR}
|
|
0x00, 0x07, // LSL R0, R0, #0x1C
|
|
0x00, 0x0C, // LSR R0, R0, #0x10
|
|
0xE0, 0x21, 0x09, 0x05, // MOVL R1, 0xE000000
|
|
0x09, 0x18, // ADD R1, R1, R0
|
|
0x01, 0x23, 0x1B, 0x03, // MOVL R3, 0x1000
|
|
// jmp1:
|
|
0xFF, 0x20,
|
|
0x08, 0x70, // STRB R0, [R1]
|
|
0x01, 0x3B, // SUB R3, #1
|
|
0x01, 0x31, // ADD R1, #1
|
|
0x00, 0x2B, // CMP R3, #0
|
|
0xFA, 0xD1, // BNE jmpl
|
|
0x00, 0x20, // MOV R0, #0
|
|
0x7C, 0xBC, // POP {R2-R6}
|
|
0x02, 0xBC, // POP {R1}
|
|
0x08, 0x47 // BX R1
|
|
};
|
|
static const u8 patch_flash120_3[] = {
|
|
0x7c, 0xb5, // PUSH {R2-R6,LR}
|
|
0x90, 0xb0, // SUB SP, SP, #0x40
|
|
0x00, 0x03, // LSL R0, R0, #0xC
|
|
0x0a, 0x1c, // ADD R2, R1, #0
|
|
0xe0, 0x21, 0x09, 0x05, // MOVL R1, 0xE000000
|
|
0x09, 0x18, // ADD R1, R1, R0
|
|
0x01, 0x23, 0x1b, 0x03, // MOVL R3, 0x1000
|
|
// jmpl:
|
|
0x10, 0x78, // LDRB R0, [R2]
|
|
0x08, 0x70, // STRB R0, [R1]
|
|
0x01, 0x3b, // SUB R3, #1
|
|
0x01, 0x32, // ADD R2, #1
|
|
0x01, 0x31, // ADD R1, #1
|
|
0x00, 0x2b, // CMP R3, #0
|
|
0xf8, 0xd1, // BNE jmpl
|
|
0x00, 0x20, // MOV R0, #0
|
|
0x10, 0xb0, // ADD SP, SP, #0x40
|
|
0x7c, 0xbc, // POP {R2-R6}
|
|
0x08, 0xbc,
|
|
0x08, 0x47 // BX R1
|
|
};
|
|
|
|
|
|
static const u8 patch_flash_1[] = {
|
|
0x00, 0xb5, // PUSH {LR}
|
|
0x1b, 0x20, 0x00, 0x02, // MOVL R0, 0x1B00
|
|
0x32, 0x21, // MOV R1, #0x32
|
|
0x08, 0x43, // ORR R0, R1
|
|
0x02, 0xbc, // POP {R1}
|
|
0x08, 0x47 // BX R1
|
|
};
|
|
static const u8 patch_flash_2[] = {
|
|
0x00, 0xb5, // PUSH {LR}
|
|
0x00, 0x20, // MOV R0, #0
|
|
0x02, 0xbc, // POP {R1}
|
|
0x08, 0x47 // BX R1
|
|
};
|
|
static const u8 patch_flash_3[] = {
|
|
0x1b, 0x23, 0x1b, 0x02, // MOVL R3, 0x1B00
|
|
0x32, 0x20, // MOV R0, #0x32
|
|
0x03, 0x43 // ORR R3, R0
|
|
|
|
};
|
|
static const u8 patch_flash_4[] = {
|
|
0x7c, 0xb5, // PUSH {R2-R6,LR}
|
|
0x00, 0x07, // LSL R0, R0, #0x1C
|
|
0x00, 0x0c, // LSR R0, R0, #0x10
|
|
0x0a, 0x1c, // ADD R2, R1, #0
|
|
0xe0, 0x21, 0x09, 0x05, // MOVL R1, 0xE000000
|
|
0x09, 0x18, // ADD R1, R1, R0
|
|
0x01, 0x23, 0x1b, 0x03, // MOVL R3, 0x1000
|
|
// jmpl:
|
|
0x10, 0x78, // LDRB R0, [R2]
|
|
0x08, 0x70, // STRB R0, [R1]
|
|
0x01, 0x3b, // SUB R3, #1
|
|
0x01, 0x32, // ADD R2, #1
|
|
0x01, 0x31, // ADD R1, #1
|
|
0x00, 0x2b, // CMP R3, #0
|
|
0xf8, 0xd1, // BNE jmpl
|
|
0x00, 0x20, // MOV R0, #0
|
|
0x7c, 0xbc, // POP {R2-R6}
|
|
0x02, 0xbc, // POP {R1}
|
|
0x08, 0x47 // BX R1
|
|
};
|
|
static const u8 patch_flash_5[] = {
|
|
0x70, 0xb5, // PUSH {R4-R6,LR}
|
|
0xa0, 0xb0, // SUB SP, SP, #0x80
|
|
0x00, 0x03, // LSL R0, R0, #0xC
|
|
0x40, 0x18, // ADD R0, R0, R1
|
|
0xe0, 0x21, 0x09, 0x05, // MOVL R1, 0xE000000
|
|
0x09, 0x18, // ADD R1, R1, R0
|
|
// jmpl:
|
|
0x08, 0x78, // LDRB R0, [R1]
|
|
0x10, 0x70, // STRB R0, [R2]
|
|
0x01, 0x3b, // SUB R3, #1
|
|
0x01, 0x32, // ADD R2, #1
|
|
0x01, 0x31, // ADD R1, #1
|
|
0x00, 0x2b, // CMP R3, #0
|
|
0xf8, 0xd1, // BNE jmpl
|
|
0x00, 0x20, // MOV R0, #0
|
|
0x20, 0xb0, // ADD SP, SP, #0x80
|
|
0x70, 0xbc, // POP {R4-R6}
|
|
0x02, 0xbc, // POP {R1}
|
|
0x08, 0x47 // BX R1
|
|
};
|
|
static const u8 patch_flash_6[] = {
|
|
0x7c, 0xb5, // PUSH {R2-R6,LR}
|
|
0x90, 0xb0, // SUB SP, SP, #0x40
|
|
0x00, 0x03, // LSL R0, R0, #0xC
|
|
0x0a, 0x1c, // ADD R2, R1, #0
|
|
0xe0, 0x21, 0x09, 0x05, // MOVL R1, 0xE000000
|
|
0x09, 0x18, // ADD R1, R1, R0
|
|
0x01, 0x23, 0x1b, 0x03, // MOVL R3, 0x1000
|
|
// jmpl:
|
|
0x10, 0x78, // LDRB R0, [R2]
|
|
0x08, 0x70, // STRB R0, [R1]
|
|
0x01, 0x3b, // SUB R3, #1
|
|
0x01, 0x32, // ADD R2, #1
|
|
0x01, 0x31, // ADD R1, #1
|
|
0x00, 0x2b, // CMP R3, #0
|
|
0xf8, 0xd1, // BNE jmpl
|
|
0x00, 0x20, // MOV R0, #0
|
|
0x10, 0xb0, // ADD SP, SP, #0x40
|
|
0x7c, 0xbc, // POP {R2-R6}
|
|
0x02, 0xbc, // POP {R1}
|
|
0x08, 0x47 // BX R1
|
|
};
|
|
|
|
|
|
static void _patch_ram(u8 *buf, u32 ofs, const u8 *data, u32 size)
|
|
{
|
|
u16 *pbuf;
|
|
u16 *pdata;
|
|
u32 i;
|
|
|
|
pbuf = (u16*)buf;
|
|
pdata = (u16*)data;
|
|
|
|
for(i = 0; i < size/2; i++, ofs++) {
|
|
pbuf[ofs] = pdata[i];
|
|
}
|
|
}
|
|
|
|
static void _patch(u8 *buf, u32 ofs, const u8 *data, u32 size, u32 bend)
|
|
{
|
|
u32 i;
|
|
|
|
for(i = 0; i < size && ofs < bend; i++, ofs++) {
|
|
buf[ofs] = data[i];
|
|
}
|
|
|
|
if(i < size) {
|
|
RemainPtr = (u8*)data + i;
|
|
RemainByte = size - i;
|
|
} else {
|
|
RemainPtr = 0;
|
|
RemainByte = 0;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
static void _patch_write(char *name)
|
|
{
|
|
FILE *sign;
|
|
u8 buf[512];
|
|
int i;
|
|
|
|
|
|
if(!(_get_sign(name, (char *)buf))) {
|
|
PatchVer = PATCH_VER;
|
|
SaveType = 1;
|
|
SaveSize = 0x10000;
|
|
strcpy((char *)SaveVer, "BIN");
|
|
return;
|
|
}
|
|
|
|
if(PatchVer == PATCH_VER)
|
|
return;
|
|
|
|
PatchVer = PATCH_VER;
|
|
if(SaveType == 0) {
|
|
SaveType = 1;
|
|
SaveSize = 0x10000;
|
|
strcpy((char *)SaveVer, "UNKNOWN");
|
|
}
|
|
|
|
sign = fopen((char *)buf, "wb");
|
|
if(sign == NULL) return;
|
|
|
|
memset(buf, 0x00, 256);
|
|
*((u32*)(buf + 0)) = PatchVer;
|
|
*((u32*)(buf + 4)) = PatchCnt;
|
|
*((u32*)(buf + 8)) = SaveType;
|
|
*((u32*)(buf + 12)) = SaveSize;
|
|
for(i = 0; i < 16; i++)
|
|
buf[i + 16] = SaveVer[i];
|
|
for(i = 0; i < PatchCnt; i++) {
|
|
*((u32*)(buf + 32 + i * 8)) = PatchType[i];
|
|
*((u32*)(buf + 36 + i * 8)) = PatchAddr[i];
|
|
}
|
|
|
|
fwrite(buf, 1, 256, sign);
|
|
fclose(sign);
|
|
|
|
}
|
|
|
|
void gba_patch_Ram(u32 exp, char *name, int cart)
|
|
{
|
|
u8 *buf;
|
|
int i, j;
|
|
u32 ofs = 0;
|
|
bool V102 = true;
|
|
u32 paddr;
|
|
int fmini;
|
|
|
|
_patch_write(name);
|
|
|
|
if(SaveType < 2) return;
|
|
|
|
|
|
if(SaveType == 5 && cart == 6)
|
|
return;
|
|
|
|
// buf = (u8*)exp;
|
|
|
|
fmini = 124;
|
|
|
|
for(i = 1; i < PatchCnt; i++) {
|
|
buf = (u8*)(exp + PatchAddr[i]);
|
|
switch(SaveType) {
|
|
case 2: // EEPROM
|
|
if(PatchType[i] == 0x21)
|
|
_patch_ram(buf, ofs, patch_eeprom_1, sizeof(patch_eeprom_1));
|
|
if(PatchType[i] == 0x22)
|
|
_patch_ram(buf, ofs, patch_eeprom_2, sizeof(patch_eeprom_2));
|
|
if(PatchType[i] == 0x23)
|
|
_patch_ram(buf, ofs, patch_eeprom_2, sizeof(patch_eeprom_2));
|
|
if(PatchType[i] == 0x24)
|
|
_patch_ram(buf, ofs, patch_eeprom_2, sizeof(patch_eeprom_2));
|
|
if(PatchType[i] == 0x25) {
|
|
paddr = 0x08000001 + PatchAddr[i+2];
|
|
patch_eeprom111_1[4] = (u8)(paddr & 0xFF);
|
|
patch_eeprom111_1[5] = (u8)((paddr >> 8) & 0xFF);
|
|
patch_eeprom111_1[6] = (u8)((paddr >> 16) & 0xFF);
|
|
patch_eeprom111_1[7] = (u8)((paddr >> 24) & 0xFF);
|
|
// *((u32*)(patch_eeprom111_1 + 4)) = 0x08000001 + PatchAddr[i+2];
|
|
_patch_ram(buf, ofs, patch_eeprom111_1, sizeof(patch_eeprom111_1));
|
|
}
|
|
if(PatchType[i] == 0x26)
|
|
_patch_ram(buf, ofs, patch_eeprom111_2, sizeof(patch_eeprom111_2));
|
|
if(PatchType[i] == 0x27)
|
|
_patch_ram(buf, ofs, patch_eeprom111_3, sizeof(patch_eeprom111_3));
|
|
break;
|
|
case 3: // FLASH512_V
|
|
if(PatchType[i] == 0x31)
|
|
_patch_ram(buf, ofs, patch_flash_5, sizeof(patch_flash_5));
|
|
if(PatchType[i] == 0x32)
|
|
_patch_ram(buf, ofs, patch_flash_3, sizeof(patch_flash_3));
|
|
if(PatchType[i] == 0x33)
|
|
_patch_ram(buf, ofs, patch_flash_2, sizeof(patch_flash_2));
|
|
if(PatchType[i] == 0x34)
|
|
_patch_ram(buf, ofs, patch_flash_2, sizeof(patch_flash_2));
|
|
if(PatchType[i] == 0x35)
|
|
_patch_ram(buf, ofs, patch_flash_6, sizeof(patch_flash_6));
|
|
break;
|
|
case 4: // FLASH_V
|
|
if(PatchType[i] == 0x41)
|
|
_patch_ram(buf, ofs, patch_flash120_1, sizeof(patch_flash120_1));
|
|
if(PatchType[i] == 0x42)
|
|
_patch_ram(buf, ofs, patch_flash_1, sizeof(patch_flash_1));
|
|
if(PatchType[i] == 0x43)
|
|
_patch_ram(buf, ofs, patch_flash_2, sizeof(patch_flash_2));
|
|
if(PatchType[i] == 0x44) {
|
|
if(PatchType[1] == 0x41)
|
|
_patch_ram(buf, ofs, patch_flash120_2, sizeof(patch_flash120_2));
|
|
else _patch_ram(buf, ofs, patch_flash_2, sizeof(patch_flash_2));
|
|
}
|
|
if(PatchType[i] == 0x45) {
|
|
if(PatchType[1] == 0x41)
|
|
_patch_ram(buf, ofs, patch_flash120_3, sizeof(patch_flash120_3));
|
|
else _patch_ram(buf, ofs, patch_flash_4, sizeof(patch_flash_4));
|
|
}
|
|
if(PatchType[i] == 0x46)
|
|
_patch_ram(buf, ofs, patch_flash_3, sizeof(patch_flash_3));
|
|
if(PatchType[i] == 0x47)
|
|
_patch_ram(buf, ofs, patch_flash_5, sizeof(patch_flash_5));
|
|
if(PatchType[i] == 0x48)
|
|
_patch_ram(buf, ofs, patch_flash_2, sizeof(patch_flash_2));
|
|
if(PatchType[i] == 0x49)
|
|
_patch_ram(buf, ofs, patch_flash_2, sizeof(patch_flash_2));
|
|
if(PatchType[i] == 0x4A)
|
|
_patch_ram(buf, ofs, patch_flash_6, sizeof(patch_flash_6));
|
|
break;
|
|
case 5: // FLASH1M_V
|
|
if(PatchType[i] == 0x51) {
|
|
for(j = i + 1; j < PatchCnt; j++) {
|
|
// if(PatchType[j] == 0x56)
|
|
// savel = PatchAddr[j];
|
|
if(PatchType[j] == 0x58)
|
|
break;
|
|
}
|
|
if(j < PatchCnt) V102 = false;
|
|
if((cart == 4 || cart == 5) && V102) { // EWIN V102
|
|
_patch_ram(buf, ofs, patch_flash1M_1E, sizeof(patch_flash1M_1E));
|
|
break;
|
|
}
|
|
|
|
// *((u16*)(patch_flash1M_1 + 4)) = (u16)(0xF800 + ((savel + 2 - PatchAddr[i]) / 2));
|
|
if(V102)
|
|
patch_flash1M_1[4] = 0x55; // V102
|
|
else patch_flash1M_1[4] = 0x5B; // V103
|
|
_patch_ram(buf, ofs, patch_flash1M_1, sizeof(patch_flash1M_1));
|
|
}
|
|
if(PatchType[i] == 0x52) // V103
|
|
_patch_ram(buf, ofs, patch_flash1M_2, sizeof(patch_flash1M_2));
|
|
if(PatchType[i] == 0x53) // V103
|
|
_patch_ram(buf, ofs, patch_flash1M_3, sizeof(patch_flash1M_3));
|
|
if(PatchType[i] == 0x5A) // V102
|
|
_patch_ram(buf, ofs, patch_flash1M_3E, sizeof(patch_flash1M_3E));
|
|
if(PatchType[i] == 0x54) {
|
|
if((cart == 4 || cart == 5) && V102)
|
|
break;
|
|
_patch_ram(buf, ofs, patch_flash1M_4, sizeof(patch_flash1M_4));
|
|
}
|
|
if(PatchType[i] == 0x55) {
|
|
if((cart == 4 || cart == 5) && V102)
|
|
_patch_ram(buf, ofs, patch_flash1M_5E, sizeof(patch_flash1M_5E));
|
|
else _patch_ram(buf, ofs, patch_flash1M_5, sizeof(patch_flash1M_5));
|
|
}
|
|
if(PatchType[i] == 0x56) {
|
|
if(cart == 6) {
|
|
_patch_ram(buf, ofs, patch_flash1M_6M, sizeof(patch_flash1M_6M));
|
|
break;
|
|
}
|
|
if(cart == 4 || cart == 5) {
|
|
if(V102)
|
|
_patch_ram(buf, ofs, patch_flash1M_6E2, sizeof(patch_flash1M_6E2));
|
|
else _patch_ram(buf, ofs, patch_flash1M_6E, sizeof(patch_flash1M_6E));
|
|
} else {
|
|
if(cart != 3)
|
|
patch_flash1M_6[38] = 0x32;
|
|
else patch_flash1M_6[38] = 0x10;
|
|
_patch_ram(buf, ofs, patch_flash1M_6, sizeof(patch_flash1M_6));
|
|
}
|
|
}
|
|
if(PatchType[i] == 0x57) { // V102
|
|
// if(V102)
|
|
_patch_ram(buf, ofs, patch_flash1M_7, sizeof(patch_flash1M_7));
|
|
}
|
|
if(PatchType[i] == 0x58) {
|
|
if(cart == 6) {
|
|
_patch_ram(buf, ofs, patch_flash1M_8M, sizeof(patch_flash1M_8M));
|
|
break;
|
|
}
|
|
if(cart == 4 || cart == 5) {
|
|
if(V102) break;
|
|
_patch_ram(buf, ofs, patch_flash1M_8E, sizeof(patch_flash1M_8E));
|
|
} else {
|
|
if(cart != 3)
|
|
patch_flash1M_8[46] = 0x32;
|
|
else patch_flash1M_8[46] = 0x10;
|
|
_patch_ram(buf, ofs, patch_flash1M_8, sizeof(patch_flash1M_8));
|
|
}
|
|
}
|
|
if(PatchType[i] == 0x59) {
|
|
if(cart == 6) {
|
|
_patch_ram(buf, ofs, patch_flash1M_9M, sizeof(patch_flash1M_9M));
|
|
break;
|
|
}
|
|
if(cart == 4 || cart == 5) {
|
|
if(V102) break;
|
|
_patch_ram(buf, ofs, patch_flash1M_9E, sizeof(patch_flash1M_9E));
|
|
} else {
|
|
if(cart != 3)
|
|
patch_flash1M_9[50] = 0x32;
|
|
else patch_flash1M_9[50] = 0x10;
|
|
_patch_ram(buf, ofs, patch_flash1M_9, sizeof(patch_flash1M_9));
|
|
}
|
|
}
|
|
break;
|
|
case 8: // Famicom Mini
|
|
if(PatchType[i] == 0x81) {
|
|
paddr = 0xEA000000 + ((PatchAddr[PatchCnt - 1] - PatchAddr[i] - 8) / 4);
|
|
// mini_jmp = 0xEA03FEC2;
|
|
// _patch_ram(buf, ofs, patch_fmini_1, sizeof(patch_fmini_1));
|
|
_patch_ram(buf, ofs, (u8*)&paddr, sizeof(4));
|
|
}
|
|
if(PatchType[i] == 0x82) {
|
|
fmini = 124;
|
|
paddr = 0x08000000 + PatchAddr[i];
|
|
patch_fmini_5[0x40] = (u8)(paddr & 0xFF);
|
|
patch_fmini_5[0x41] = (u8)((paddr >> 8) & 0xFF);
|
|
patch_fmini_5[0x42] = (u8)((paddr >> 16) & 0xFF);
|
|
patch_fmini_5[0x43] = (u8)((paddr >> 24) & 0xFF);
|
|
|
|
paddr = 0x060000F8;
|
|
patch_fmini_5[0x6C] = (u8)(paddr & 0xFF);
|
|
patch_fmini_5[0x6D] = (u8)((paddr >> 8) & 0xFF);
|
|
patch_fmini_5[0x6E] = (u8)((paddr >> 16) & 0xFF);
|
|
patch_fmini_5[0x6F] = (u8)((paddr >> 24) & 0xFF);
|
|
}
|
|
if(PatchType[i] == 0x83) {
|
|
fmini = 124;
|
|
paddr = 0x08000000 + PatchAddr[i];
|
|
patch_fmini_5[0x40] = (u8)(paddr & 0xFF);
|
|
patch_fmini_5[0x41] = (u8)((paddr >> 8) & 0xFF);
|
|
patch_fmini_5[0x42] = (u8)((paddr >> 16) & 0xFF);
|
|
patch_fmini_5[0x43] = (u8)((paddr >> 24) & 0xFF);
|
|
|
|
paddr = 0x060000EC;
|
|
patch_fmini_5[0x6C] = (u8)(paddr & 0xFF);
|
|
patch_fmini_5[0x6D] = (u8)((paddr >> 8) & 0xFF);
|
|
patch_fmini_5[0x6E] = (u8)((paddr >> 16) & 0xFF);
|
|
patch_fmini_5[0x6F] = (u8)((paddr >> 24) & 0xFF);
|
|
}
|
|
if(PatchType[i] == 0x84) {
|
|
fmini = 122;
|
|
paddr = 0x08000000 + PatchAddr[i];
|
|
patch_fmini_6[0x40] = (u8)(paddr & 0xFF);
|
|
patch_fmini_6[0x41] = (u8)((paddr >> 8) & 0xFF);
|
|
patch_fmini_6[0x42] = (u8)((paddr >> 16) & 0xFF);
|
|
patch_fmini_6[0x43] = (u8)((paddr >> 24) & 0xFF);
|
|
}
|
|
/**************
|
|
if(PatchType[i] == 0x83) { // 0x08 -> 0x04
|
|
for(j = 0; j < 4; j++) {
|
|
if(buf[ofs + j] == 0x08)
|
|
buf[ofs + j] = 0x04;
|
|
}
|
|
}
|
|
if(PatchType[i] == 0x84) { // 0x08 -> 0xE8
|
|
for(j = 0; j < 4; j++) {
|
|
if(buf[ofs + j] == 0x08)
|
|
buf[ofs + j] = 0xE8;
|
|
}
|
|
}
|
|
*************/
|
|
if(PatchType[i] == 0x86) {
|
|
if(fmini == 124)
|
|
_patch_ram(buf, ofs, patch_fmini_5, sizeof(patch_fmini_5));
|
|
else _patch_ram(buf, ofs, patch_fmini_6, sizeof(patch_fmini_6));
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void gba_patch(u8 *buf, u32 add, u32 bufsize, int GBAmode, char *name)
|
|
{
|
|
int i, j;
|
|
u32 ofs;
|
|
u32 paddr;
|
|
int fmini;
|
|
|
|
if(add == 0)
|
|
_patch_write(name);
|
|
|
|
if(SaveType < 2) return;
|
|
|
|
if(RemainByte != 0)
|
|
_patch(buf, 0, RemainPtr, RemainByte, bufsize);
|
|
|
|
fmini = 124;
|
|
|
|
// for(i = 1; i < PatchCnt; i++) {
|
|
for(i = PatchCntS; i < PatchCnt; i++) {
|
|
if(PatchAddr[i] >= add + bufsize) break;
|
|
if(PatchAddr[i] < add) continue;
|
|
ofs = PatchAddr[i] - add;
|
|
switch(SaveType) {
|
|
case 2: // EEPROM
|
|
if(PatchType[i] == 0x21)
|
|
_patch(buf, ofs, patch_eeprom_1, sizeof(patch_eeprom_1), bufsize);
|
|
if(PatchType[i] == 0x22)
|
|
_patch(buf, ofs, patch_eeprom_2, sizeof(patch_eeprom_2), bufsize);
|
|
if(PatchType[i] == 0x23)
|
|
_patch(buf, ofs, patch_eeprom_2, sizeof(patch_eeprom_2), bufsize);
|
|
if(PatchType[i] == 0x24)
|
|
_patch(buf, ofs, patch_eeprom_2, sizeof(patch_eeprom_2), bufsize);
|
|
if(PatchType[i] == 0x25) {
|
|
paddr = 0x08000001 + PatchAddr[i+2];
|
|
patch_eeprom111_1[4] = (u8)(paddr & 0xFF);
|
|
patch_eeprom111_1[5] = (u8)((paddr >> 8) & 0xFF);
|
|
patch_eeprom111_1[6] = (u8)((paddr >> 16) & 0xFF);
|
|
patch_eeprom111_1[7] = (u8)((paddr >> 24) & 0xFF);
|
|
_patch(buf, ofs, patch_eeprom111_1, sizeof(patch_eeprom111_1), bufsize);
|
|
}
|
|
if(PatchType[i] == 0x26)
|
|
_patch(buf, ofs, patch_eeprom111_2, sizeof(patch_eeprom111_2), bufsize);
|
|
if(PatchType[i] == 0x27)
|
|
_patch(buf, ofs, patch_eeprom111_3, sizeof(patch_eeprom111_3), bufsize);
|
|
break;
|
|
case 3: // FLASH512_V
|
|
if(PatchType[i] == 0x31)
|
|
_patch(buf, ofs, patch_flash_5, sizeof(patch_flash_5), bufsize);
|
|
if(PatchType[i] == 0x32)
|
|
_patch(buf, ofs, patch_flash_3, sizeof(patch_flash_3), bufsize);
|
|
if(PatchType[i] == 0x33)
|
|
_patch(buf, ofs, patch_flash_2, sizeof(patch_flash_2), bufsize);
|
|
if(PatchType[i] == 0x34)
|
|
_patch(buf, ofs, patch_flash_2, sizeof(patch_flash_2), bufsize);
|
|
if(PatchType[i] == 0x35)
|
|
_patch(buf, ofs, patch_flash_6, sizeof(patch_flash_6), bufsize);
|
|
break;
|
|
case 4: // FLASH_V
|
|
if(PatchType[i] == 0x41)
|
|
_patch(buf, ofs, patch_flash120_1, sizeof(patch_flash120_1), bufsize);
|
|
if(PatchType[i] == 0x42)
|
|
_patch(buf, ofs, patch_flash_1, sizeof(patch_flash_1), bufsize);
|
|
if(PatchType[i] == 0x43)
|
|
_patch(buf, ofs, patch_flash_2, sizeof(patch_flash_2), bufsize);
|
|
if(PatchType[i] == 0x44) {
|
|
if(PatchType[1] == 0x41)
|
|
_patch(buf, ofs, patch_flash120_2, sizeof(patch_flash120_2), bufsize);
|
|
else _patch(buf, ofs, patch_flash_2, sizeof(patch_flash_2), bufsize);
|
|
}
|
|
if(PatchType[i] == 0x45) {
|
|
if(PatchType[1] == 0x41)
|
|
_patch(buf, ofs, patch_flash120_3, sizeof(patch_flash120_3), bufsize);
|
|
else _patch(buf, ofs, patch_flash_4, sizeof(patch_flash_4), bufsize);
|
|
}
|
|
if(PatchType[i] == 0x46)
|
|
_patch(buf, ofs, patch_flash_3, sizeof(patch_flash_3), bufsize);
|
|
if(PatchType[i] == 0x47)
|
|
_patch(buf, ofs, patch_flash_5, sizeof(patch_flash_5), bufsize);
|
|
if(PatchType[i] == 0x48)
|
|
_patch(buf, ofs, patch_flash_2, sizeof(patch_flash_2), bufsize);
|
|
if(PatchType[i] == 0x49)
|
|
_patch(buf, ofs, patch_flash_2, sizeof(patch_flash_2), bufsize);
|
|
if(PatchType[i] == 0x4A)
|
|
_patch(buf, ofs, patch_flash_6, sizeof(patch_flash_6), bufsize);
|
|
break;
|
|
case 5: // FLASH1M_V
|
|
if(PatchType[i] == 0x51) {
|
|
for(j = i + 1; j < PatchCnt; j++) {
|
|
if(PatchType[j] == 0x58)
|
|
break;
|
|
}
|
|
if(j < PatchCnt)
|
|
patch_flash1M_1[4] = 0x5B; // V103
|
|
else patch_flash1M_1[4] = 0x55; // V102
|
|
|
|
_patch(buf, ofs, patch_flash1M_1, sizeof(patch_flash1M_1), bufsize);
|
|
}
|
|
if(PatchType[i] == 0x52)
|
|
_patch(buf, ofs, patch_flash1M_2, sizeof(patch_flash1M_2), bufsize);
|
|
if(PatchType[i] == 0x53)
|
|
_patch(buf, ofs, patch_flash1M_3, sizeof(patch_flash1M_3), bufsize);
|
|
if(PatchType[i] == 0x54)
|
|
_patch(buf, ofs, patch_flash1M_4, sizeof(patch_flash1M_4), bufsize);
|
|
if(PatchType[i] == 0x55)
|
|
_patch(buf, ofs, patch_flash1M_5, sizeof(patch_flash1M_5), bufsize);
|
|
if(PatchType[i] == 0x56) {
|
|
if(GBAmode == 0)
|
|
patch_flash1M_6[38] = 0x32;
|
|
else patch_flash1M_6[38] = 0x10;
|
|
_patch(buf, ofs, patch_flash1M_6, sizeof(patch_flash1M_6), bufsize);
|
|
}
|
|
if(PatchType[i] == 0x57)
|
|
_patch(buf, ofs, patch_flash1M_7, sizeof(patch_flash1M_7), bufsize);
|
|
if(PatchType[i] == 0x58) {
|
|
if(GBAmode == 0)
|
|
patch_flash1M_8[46] = 0x32;
|
|
else patch_flash1M_8[46] = 0x10;
|
|
_patch(buf, ofs, patch_flash1M_8, sizeof(patch_flash1M_8), bufsize);
|
|
}
|
|
if(PatchType[i] == 0x59) {
|
|
if(GBAmode == 0)
|
|
patch_flash1M_9[50] = 0x32;
|
|
else patch_flash1M_9[50] = 0x10;
|
|
_patch(buf, ofs, patch_flash1M_9, sizeof(patch_flash1M_9), bufsize);
|
|
}
|
|
break;
|
|
case 8: // Famicom Mini
|
|
if(PatchType[i] == 0x81) {
|
|
paddr = 0xEA000000 + ((PatchAddr[PatchCnt - 1] - PatchAddr[i] - 8) / 4);
|
|
_patch(buf, ofs, (u8*)&paddr, sizeof(4), bufsize);
|
|
}
|
|
if(PatchType[i] == 0x82) {
|
|
fmini = 124;
|
|
paddr = 0x08000000 + PatchAddr[i];
|
|
patch_fmini_5[0x40] = (u8)(paddr & 0xFF);
|
|
patch_fmini_5[0x41] = (u8)((paddr >> 8) & 0xFF);
|
|
patch_fmini_5[0x42] = (u8)((paddr >> 16) & 0xFF);
|
|
patch_fmini_5[0x43] = (u8)((paddr >> 24) & 0xFF);
|
|
|
|
paddr = 0x060000F8;
|
|
patch_fmini_5[0x6C] = (u8)(paddr & 0xFF);
|
|
patch_fmini_5[0x6D] = (u8)((paddr >> 8) & 0xFF);
|
|
patch_fmini_5[0x6E] = (u8)((paddr >> 16) & 0xFF);
|
|
patch_fmini_5[0x6F] = (u8)((paddr >> 24) & 0xFF);
|
|
}
|
|
if(PatchType[i] == 0x83) {
|
|
fmini = 124;
|
|
paddr = 0x08000000 + PatchAddr[i];
|
|
patch_fmini_5[0x40] = (u8)(paddr & 0xFF);
|
|
patch_fmini_5[0x41] = (u8)((paddr >> 8) & 0xFF);
|
|
patch_fmini_5[0x42] = (u8)((paddr >> 16) & 0xFF);
|
|
patch_fmini_5[0x43] = (u8)((paddr >> 24) & 0xFF);
|
|
|
|
paddr = 0x060000EC;
|
|
patch_fmini_5[0x6C] = (u8)(paddr & 0xFF);
|
|
patch_fmini_5[0x6D] = (u8)((paddr >> 8) & 0xFF);
|
|
patch_fmini_5[0x6E] = (u8)((paddr >> 16) & 0xFF);
|
|
patch_fmini_5[0x6F] = (u8)((paddr >> 24) & 0xFF);
|
|
}
|
|
if(PatchType[i] == 0x84) {
|
|
fmini = 122;
|
|
paddr = 0x08000000 + PatchAddr[i];
|
|
patch_fmini_6[0x40] = (u8)(paddr & 0xFF);
|
|
patch_fmini_6[0x41] = (u8)((paddr >> 8) & 0xFF);
|
|
patch_fmini_6[0x42] = (u8)((paddr >> 16) & 0xFF);
|
|
patch_fmini_6[0x43] = (u8)((paddr >> 24) & 0xFF);
|
|
}
|
|
if(PatchType[i] == 0x86) {
|
|
if(fmini == 124)
|
|
_patch(buf, ofs, patch_fmini_5, sizeof(patch_fmini_5), bufsize);
|
|
else _patch(buf, ofs, patch_fmini_6, sizeof(patch_fmini_6), bufsize);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
PatchCntS = i;
|
|
|
|
}
|