by schtruck » Oct 22, 2002 @ 12:08pm
Yeah BYTES SWAP TRICK Work!!!
the problem was that ARM can only access 32 to Address divisible only by 4..... so here is what i did:
#ifdef BYTES_SWAP
#define ReadB(address) *(uint8*)((uint32)(address)^1)
#define WriteB(address,value) *(uint8*)((uint32)(address)^1)=value
#define ReadW(addr) *(uint16*)(addr)
#define WriteW(addr,value) *(uint16*)(addr)=value
#define ReadL(address) ((*(uint16*)(address))<<16)|(*(uint16*)(address+2))
#define WriteL(address,value) WriteW(address + 2, value); WriteW(address, value>> 16)
#else
#define ReadB(address) *((int8 *) (address))
#define ReadW(addr) ((*(uint16 *)(addr) << 8) | (*(uint16 *)(addr) >> 8))
#define ReadL(address) ((uint16) ReadW(address) << 16) | (uint16) ReadW((address) + 2)
#define WriteB(address,value) *((int8 *) (address)) = (value)
#define WriteW(addr,value) *((int16 *)(addr)) = ((((uint16)(value)) << 8) | (((uint16)(value)) >> 8))
#define WriteL(address,value) WriteW((address) + 2, value); WriteW(address, (value) >> 16)
#endif
and here is what the Compiler Generate:
; 197 : WriteB(address + membase, value);
ldr r2, [pc, #0x10] ; pc+8+16 = 00000018
ldr r2, [r2]
add r3, r2, r0
eor r3, r3, #1
strb r1, [r3]
; 203 : WriteW(address + membase, value);
ldr r2, [pc, #8] ; pc+8+8 = 00000010
ldr r2, [r2]
strh r1, [r2, +r0]
; 209 : WriteL(address + membase, value);
ldr r2, [pc, #0x18] ; pc+8+24 = 00000024
ldr r3, [r2]
add r3, r3, r0
strh r1, [r3, #2]
mov r3, r1, lsr #16
ldr r1, [r2]
strh r3, [r1, +r0]
; 214 : return ReadB(address + membase);
ldr r1, [pc, #0x10] ; pc+8+16 = 00000018
ldr r1, [r1]
add r3, r1, r0
eor r3, r3, #1
ldrb r0, [r3]
; 219 : return ReadW(address + membase);
ldr r1, [pc, #8] ; pc+8+8 = 00000010
ldr r1, [r1]
ldrh r0, [r1, +r0]
; 224 : return ReadL(address + membase);
ldr r1, [pc, #0x14] ; pc+8+20 = 0000001C
ldr r1, [r1]
add r2, r1, r0
ldrh r3, [r2, #2]
ldrh r2, [r1, +r0]
orr r0, r3, r2, lsl #16
not so bad :)
let me test Game now to see How that boost....