// ZIP public byte[] aspace_ziparray = {0,0,0,0}; //, 2, public int[] mainarray = {0}; // public static final int ASPACE_RET_SUCCESS = 1; public static final int ASPACE_RET_UNKNOWNERROR = 0; public static final int ASPACE_RET_NOZIPFILE = -1; public static final int ASPACE_RET_NOZIPENTRY = -2; public static final int ASPACE_RET_SIGNOFIND = -3; // 0xA8000000 (SDRAM) 0xB0000000 (Flash) private static final int ASPACE_OFFSET_SDRAM_TO_FLASH = 0x8000000; // 0x00000000 ( ) public static int mainarray_startindex = 0; /* Flash */ // () 0xA0000030 private static final int[] aspace_sgold_flash_signature = { 0xA0000000, //0xA0000000 0x5FFFFFFF, //0x5FFFFFFF 0xA0000074, //0xA0000074 0x544B4A43 //CJKT Marker }; /* ( ) */ public int ASpace_Init(String any_zipfile, String any_zipentryname) { try { // , ZipFile zf = new ZipFile(any_zipfile); if (zf != null) { // ZipEntry ZipEntry ze = zf.getEntry(any_zipentryname); if (ze != null) { // InputStream zis = zf.getInputStream(ze); // , , // 2 zis.read(aspace_ziparray, 4, 0x7FFFFFFF); // zip - zf.close(); // Flash // // 0x0 int i = ASPACE_OFFSET_SDRAM_TO_FLASH/4; for (; i > 0; i--) { int j = 0; for (int k = 0; k < 4; k++) { if (mainarray[i + k] != aspace_sgold_flash_signature[k]) { j = 1; break; } } if (j == 0) { // Flash mainarray_startindex = i - (aspace_sgold_flash_signature_offset/4); // , , .. 0x00 mainarray_startindex += ( 0x50000000/4 ); break; } } //, if (i != 0) return ASPACE_RET_SUCCESS; // else return ASPACE_RET_SIGNOFIND; // } else return ASPACE_RET_NOZIPENTRY; // } else return ASPACE_RET_NOZIPFILE; // } catch (Exception e) { return ASPACE_RET_UNKNOWNERROR; } }
// 32 public int ASpace_readword(int address); // 16 public int ASpace_readhwrd(int address); // public int ASpace_readbyte(int address); // 32 public int ASpace_writeword(int address, int value); // 16 public int ASpace_writehwrd(int address, int value); // public int ASpace_writebyte(int address, int value);
/* ARM Caller - ARM - */ // public final int aspace_sgold_armcaller_newpointer = 0x803F8; // ARM Caller'a public final int aspace_sgold_armcaller_bodyaddress = 0x8E010; // public final int aspace_sgold_workcode_bodyaddress = 0x8E100; // private static final int ASPACE_ARMCALLER_STATE = 16; private static final int ASPACE_ARMCALLER_OLDPROC = 17; private static final int ASPACE_ARMCALLER_RUNPROC = 18; private static final int ASPACE_ARMCALLER_PARAM0 = 19; private static final int ASPACE_ARMCALLER_PARAM1 = 20; private static final int ASPACE_ARMCALLER_PARAM2 = 21; private static final int ASPACE_ARMCALLER_PARAM3 = 22; private static final int ASPACE_ARMCALLER_RETURN = 23; // private static int aspace_armcaller_repaddress = 0; // ARM Caller'a private static int aspace_armcaller_bodyaddress = 0; // ARM private static int[] aspace_armcaller = { 0xE92D401F, // ; STMFD SP!, {R0-R4,LR} 0xE59F0038, // ; LDR R0, =old_proc 0xE12FFF30, // ; BLX R0 0xE59F002C, // ; LDR R0, =state 0xE3500000, // ; CMP R0, #0 0x08BD801F, // ; LDMEQFD SP!, {R0-R4,PC} 0xE59F002C, // ; LDR R0, =param0 0xE59F102C, // ; LDR R1, =param1 0xE59F202C, // ; LDR R2, =param2 0xE59F302C, // ; LDR R3, =param3 0xE59F4018, // ; LDR R4, =run_proc 0xE12FFF34, // ; BLX R4 0xE58F0024, // ; STR R0, [PC,#0x24] ; ret 0xE3A00000, // ; MOV R0, #0 0xE58F0000, // ; STR R0, [PC,#0x00] ; state 0xE8BD801F, // ; LDMFD SP!, {R0-R4,PC} 0x00000000, // ; state 0x00000000, // ; old_proc 0x00000000, // ; run_proc 0x00000000, // ; param0 0x00000000, // ; param1 0x00000000, // ; param2 0x00000000, // ; param3 0x00000000 // ; ret };
/* / ARM Caller'a ( ) */ // ARM Caller'a public int ASpace_InstallArmCaller(int replace_address, int body_address); // ARM Caller'a public int ASpace_DeInstallArmCaller(); /* */ public int ASpace_RunArmCode(int address, int arg0, int arg1, int arg2, int arg3);
/* / ARM Data Abort */ public void ASpace_DisableDataAbort(); public void ASpace_EnableDataAbort(); /* SDRAM 0xB8000000 ( ARM Caller) */ public void ASpace_SDRAMRemap(); /* */ public int ASpace_SearchFunction(int search_address, int search_size, int[] pattern, int offset); /* */ public int ASpace_SearchFunctionByWords(int search_address, int search_size, int[] pattern, int offset);
Source: https://habr.com/ru/post/149068/
All Articles