#include #include #include #include #include "gba_patch.h" #include "GBA_ini.h" #include "dscard.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; extern bool isOmega; 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)); } } 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]; } 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++) { switch (SaveType) { case 2: ii = _eeprom_chk(pbuf, ii, i, size); break; case 3: ii = _flash512_chk(pbuf, ii, i); break; case 4: ii = _flash_chk(pbuf, ii, i); break; case 5: ii = _flash1M_chk(pbuf, ii, i); break; } } // 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; u8 _OmegaPage = 0; for(i = 1; i < PatchCnt; i++) { // EZ Flash Omega and it's silly mapping schemes.... :P if (isOmega) { if ((exp + PatchAddr[i]) >= 0x08800000 && (exp + PatchAddr[i]) < 0x09000000) { SetPSRampage(0); _OmegaPage = 0; } else if ((exp + PatchAddr[i]) >= 0x09000000 && (exp + PatchAddr[i]) < 0x09800000) { SetPSRampage(0x1000); _OmegaPage = 0x01; } else if ((exp + PatchAddr[i]) >= 0x09800000 && (exp + PatchAddr[i]) < 0x0A000000) { SetPSRampage(0x2000); _OmegaPage = 0x02; } else if ((exp + PatchAddr[i]) >= 0x0A000000 && (exp + PatchAddr[i]) < 0x0A800000) { SetPSRampage(0x3000); _OmegaPage = 0x03; } } if (isOmega) { buf = (u8*)((exp + PatchAddr[i]) - (_OmegaPage * 0x00800000)); } else { 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)_patch_ram(buf, ofs, patch_flash1M_2, sizeof(patch_flash1M_2)); // V103 if(PatchType[i] == 0x53)_patch_ram(buf, ofs, patch_flash1M_3, sizeof(patch_flash1M_3)); // V103 if(PatchType[i] == 0x5A)_patch_ram(buf, ofs, patch_flash1M_3E, sizeof(patch_flash1M_3E)); // V102 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; } } if (isOmega)SetPSRampage(0); } 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); } void gba_check_Ram2(u32 exp, u8 *buf, u32 bufsize, u32 size) { u32 i, ii; u32 *pbuf; // int cnt; switch (SaveType) { case 0: // UNKNOWN Famicom Mini if(PatchCnt > 2 && PatchType[1] == 0x81 && PatchType[2] == 0x84) { SaveType = 8; PatchCnt = 3; strcpy((char*)SaveVer, "FaMini"); } break; case 8: PatchType[PatchCnt] = 0x86; // Patch PatchAddr[PatchCnt] = 0x100000 - 0x800; PatchCnt++; break; } if(SaveType < 2 || PatchCnt <= 1 || SaveType == PatchType[1]/0x10)return; pbuf = (u32*)buf; PatchCnt = 1; u16 OmegaPage = 0; for(i = 0; i < size; i += bufsize, exp += bufsize) { if (isOmega) { if (exp >= 0x09000000) { OmegaPage += 0x1000; SetPSRampage(OmegaPage); exp = PSRAMBase_S98; } /*if (exp >= 0x08800000 && exp < 0x09000000) { SetPSRampage(0); } else if (exp >= 0x09000000 && exp < 0x09800000) { SetPSRampage(0x1000); } else if (exp >= 0x0A000000 && exp < 0x0A800000) { SetPSRampage(0x2000); } else if (exp >= 0x0B000000 && exp < 0x0B800000) { SetPSRampage(0x3000); }*/ } // u32 currentAddress = exp; // if (isOmega && currentAddress >= 0x08800000 && _OmegaPage != 0)currentAddress = (currentAddress - (_OmegaPage * 0x00800000)); _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++) { switch (SaveType) { case 2: ii = _eeprom_chk(pbuf, ii, i, size); break; case 3: ii = _flash512_chk(pbuf, ii, i); break; case 4: ii = _flash_chk(pbuf, ii, i); break; case 5: ii = _flash1M_chk(pbuf, ii, i); break; } } // if(PatchCnt > 1 && cnt == PatchCnt) // break; if (isOmega)SetPSRampage(0); } } 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; }