GBA-Exploader/arm9/source/gba_patch.cpp
2024-05-08 00:50:01 -05:00

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