Got completely rid of readmemb386l() and writememb386l().
This commit is contained in:
@@ -148,13 +148,14 @@ static uint32_t gen_MEM_LOAD_ADDR_EA_B()
|
||||
addbyte(0x3a);
|
||||
addbyte(0xc3); /*RET*/
|
||||
|
||||
addbyte(0x50); /*slowpath: PUSH EAX*/
|
||||
addbyte(0x01); /*slowpath: ADD ESI,EAX*/
|
||||
addbyte(0xc6);
|
||||
addbyte(0x56); /*PUSH ESI*/
|
||||
addbyte(0xe8); /*CALL readmembl*/
|
||||
addlong((uint32_t)readmemb386l - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x83); /*ADD ESP, 8*/
|
||||
addlong((uint32_t)readmembl - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x83); /*ADD ESP, 4*/
|
||||
addbyte(0xc4);
|
||||
addbyte(8);
|
||||
addbyte(4);
|
||||
addbyte(0x80); /*CMP abrt, 0*/
|
||||
addbyte(0x7d);
|
||||
addbyte((uint8_t)cpu_state_offset(abrt));
|
||||
@@ -360,13 +361,14 @@ static uint32_t gen_MEM_STORE_ADDR_EA_B()
|
||||
addbyte(0xc3); /*RET*/
|
||||
|
||||
addbyte(0x51); /*slowpath: PUSH ECX*/
|
||||
addbyte(0x50); /*PUSH EAX*/
|
||||
addbyte(0x01); /*ADD EBX,EAX*/
|
||||
addbyte(0xC3);
|
||||
addbyte(0x53); /*PUSH EBX*/
|
||||
addbyte(0xe8); /*CALL writememb386l*/
|
||||
addlong((uint32_t)writememb386l - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x83); /*ADD ESP, 12*/
|
||||
addbyte(0xe8); /*CALL writemembl*/
|
||||
addlong((uint32_t)writemembl - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x83); /*ADD ESP, 8*/
|
||||
addbyte(0xc4);
|
||||
addbyte(12);
|
||||
addbyte(8);
|
||||
addbyte(0x80); /*CMP abrt, 0*/
|
||||
addbyte(0x7d);
|
||||
addbyte((uint8_t)cpu_state_offset(abrt));
|
||||
@@ -575,13 +577,14 @@ static uint32_t gen_MEM_LOAD_ADDR_EA_B_NO_ABRT()
|
||||
addbyte(0x3a);
|
||||
addbyte(0xc3); /*RET*/
|
||||
|
||||
addbyte(0x50); /*slowpath: PUSH EAX*/
|
||||
addbyte(0x01); /*slowpath: ADD ESI,EAX*/
|
||||
addbyte(0xc6);
|
||||
addbyte(0x56); /*PUSH ESI*/
|
||||
addbyte(0xe8); /*CALL readmembl*/
|
||||
addlong((uint32_t)readmemb386l - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x83); /*ADD ESP, 8*/
|
||||
addlong((uint32_t)readmembl - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x83); /*ADD ESP, 4*/
|
||||
addbyte(0xc4);
|
||||
addbyte(8);
|
||||
addbyte(4);
|
||||
#ifndef RELEASE_BUILD
|
||||
addbyte(0x80); /*CMP abrt, 0*/
|
||||
addbyte(0x7d);
|
||||
@@ -777,13 +780,14 @@ static uint32_t gen_MEM_STORE_ADDR_EA_B_NO_ABRT()
|
||||
addbyte(0xc3); /*RET*/
|
||||
|
||||
addbyte(0x51); /*slowpath: PUSH ECX*/
|
||||
addbyte(0x50); /*PUSH EAX*/
|
||||
addbyte(0x01); /*ADD EBX,EAX*/
|
||||
addbyte(0xc3);
|
||||
addbyte(0x53); /*PUSH EBX*/
|
||||
addbyte(0xe8); /*CALL writememb386l*/
|
||||
addlong((uint32_t)writememb386l - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x83); /*ADD ESP, 12*/
|
||||
addbyte(0xe8); /*CALL writemembl*/
|
||||
addlong((uint32_t)writemembl - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
addbyte(0x83); /*ADD ESP, 8*/
|
||||
addbyte(0xc4);
|
||||
addbyte(12);
|
||||
addbyte(8);
|
||||
#ifndef RELEASE_BUILD
|
||||
addbyte(0x80); /*CMP abrt, 0*/
|
||||
addbyte(0x7d);
|
||||
|
@@ -1465,11 +1465,7 @@ checkio(int port)
|
||||
return 1;
|
||||
|
||||
cpl_override = 1;
|
||||
#ifdef USE_NEW_DYNAREC
|
||||
d = readmembl(tr.base + t + (port >> 3));
|
||||
#else
|
||||
d = readmemb386l(0, tr.base + t + (port >> 3));
|
||||
#endif
|
||||
cpl_override = 0;
|
||||
return d & (1 << (port & 7));
|
||||
}
|
||||
|
@@ -32,15 +32,12 @@
|
||||
#define writememl(s,a,v) if (writelookup2[(uint32_t)((s)+(a))>>12]==LOOKUP_INV || (((s)+(a)) & 3)) writememll((s)+(a),v); else *(uint32_t *)(writelookup2[(uint32_t)((s) + (a)) >> 12] + (uintptr_t)((s) + (a))) = v
|
||||
#define writememq(s,a,v) if (writelookup2[(uint32_t)((s)+(a))>>12]==LOOKUP_INV || (((s)+(a)) & 7)) writememql((s)+(a),v); else *(uint64_t *)(writelookup2[(uint32_t)((s) + (a)) >> 12] + (uintptr_t)((s) + (a))) = v
|
||||
#else
|
||||
#undef readmemb
|
||||
#undef writememb
|
||||
|
||||
|
||||
#define readmemb(s,a) ((readlookup2[(uint32_t)((s)+(a))>>12]==LOOKUP_INV || (s)==0xFFFFFFFF)?readmemb386l(s,a): *(uint8_t *)(readlookup2[(uint32_t)((s)+(a))>>12] + (uintptr_t)((s) + (a))) )
|
||||
#define readmemb(s,a) ((readlookup2[(uint32_t)((s)+(a))>>12]==LOOKUP_INV || (s)==0xFFFFFFFF)?readmembl((s)+(a)): *(uint8_t *)(readlookup2[(uint32_t)((s)+(a))>>12] + (uintptr_t)((s) + (a))) )
|
||||
#define readmemw(s,a) ((readlookup2[(uint32_t)((s)+(a))>>12]==LOOKUP_INV || (s)==0xFFFFFFFF || (((s)+(a)) & 1))?readmemwl(s,a):*(uint16_t *)(readlookup2[(uint32_t)((s)+(a))>>12]+(uint32_t)((s)+(a))))
|
||||
#define readmeml(s,a) ((readlookup2[(uint32_t)((s)+(a))>>12]==LOOKUP_INV || (s)==0xFFFFFFFF || (((s)+(a)) & 3))?readmemll(s,a):*(uint32_t *)(readlookup2[(uint32_t)((s)+(a))>>12]+(uint32_t)((s)+(a))))
|
||||
#define readmemq(s,a) ((readlookup2[(uint32_t)((s)+(a))>>12]==LOOKUP_INV || (s)==0xFFFFFFFF || (((s)+(a)) & 7))?readmemql(s,a):*(uint64_t *)(readlookup2[(uint32_t)((s)+(a))>>12]+(uintptr_t)((s)+(a))))
|
||||
|
||||
#define writememb(s,a,v) if (writelookup2[(uint32_t)((s)+(a))>>12]==LOOKUP_INV || (s)==0xFFFFFFFF) writememb386l(s,a,v); else *(uint8_t *)(writelookup2[(uint32_t)((s) + (a)) >> 12] + (uintptr_t)((s) + (a))) = v
|
||||
|
||||
#define writememb(s,a,v) if (writelookup2[(uint32_t)((s)+(a))>>12]==LOOKUP_INV || (s)==0xFFFFFFFF) writemembl((s)+(a),v); else *(uint8_t *)(writelookup2[(uint32_t)((s) + (a)) >> 12] + (uintptr_t)((s) + (a))) = v
|
||||
#define writememw(s,a,v) if (writelookup2[(uint32_t)((s)+(a))>>12]==LOOKUP_INV || (s)==0xFFFFFFFF || (((s)+(a)) & 1)) writememwl(s,a,v); else *(uint16_t *)(writelookup2[(uint32_t)((s) + (a)) >> 12] + (uintptr_t)((s) + (a))) = v
|
||||
#define writememl(s,a,v) if (writelookup2[(uint32_t)((s)+(a))>>12]==LOOKUP_INV || (s)==0xFFFFFFFF || (((s)+(a)) & 3)) writememll(s,a,v); else *(uint32_t *)(writelookup2[(uint32_t)((s) + (a)) >> 12] + (uintptr_t)((s) + (a))) = v
|
||||
#define writememq(s,a,v) if (writelookup2[(uint32_t)((s)+(a))>>12]==LOOKUP_INV || (s)==0xFFFFFFFF || (((s)+(a)) & 7)) writememql(s,a,v); else *(uint64_t *)(writelookup2[(uint32_t)((s) + (a)) >> 12] + (uintptr_t)((s) + (a))) = v
|
||||
@@ -359,7 +356,7 @@ static __inline void seteaq(uint64_t v)
|
||||
#define seteaw(v) if (cpu_mod!=3) { CHECK_WRITE_COMMON(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 1); if (eal_w) *(uint16_t *)eal_w=v; else writememwl(easeg+cpu_state.eaaddr,v); } else cpu_state.regs[cpu_rm].w=v
|
||||
#define seteal(v) if (cpu_mod!=3) { CHECK_WRITE_COMMON(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3); if (eal_w) *eal_w=v; else writememll(easeg+cpu_state.eaaddr,v); } else cpu_state.regs[cpu_rm].l=v
|
||||
#else
|
||||
#define seteab(v) if (cpu_mod!=3) { CHECK_WRITE_COMMON(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr); if (eal_w) *(uint8_t *)eal_w=v; else { writememb386l(easeg,cpu_state.eaaddr,v); } } else if (cpu_rm&4) cpu_state.regs[cpu_rm&3].b.h=v; else cpu_state.regs[cpu_rm].b.l=v
|
||||
#define seteab(v) if (cpu_mod!=3) { CHECK_WRITE_COMMON(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr); if (eal_w) *(uint8_t *)eal_w=v; else { writemembl(easeg+cpu_state.eaaddr,v); } } else if (cpu_rm&4) cpu_state.regs[cpu_rm&3].b.h=v; else cpu_state.regs[cpu_rm].b.l=v
|
||||
#define seteaw(v) if (cpu_mod!=3) { CHECK_WRITE_COMMON(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 1); if (eal_w) *(uint16_t *)eal_w=v; else { writememwl(easeg,cpu_state.eaaddr,v); } } else cpu_state.regs[cpu_rm].w=v
|
||||
#define seteal(v) if (cpu_mod!=3) { CHECK_WRITE_COMMON(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3); if (eal_w) *eal_w=v; else { writememll(easeg,cpu_state.eaaddr,v); } } else cpu_state.regs[cpu_rm].l=v
|
||||
#endif
|
||||
@@ -369,7 +366,7 @@ static __inline void seteaq(uint64_t v)
|
||||
#define seteaw_mem(v) if (eal_w) *(uint16_t *)eal_w=v; else writememwl(easeg+cpu_state.eaaddr,v);
|
||||
#define seteal_mem(v) if (eal_w) *eal_w=v; else writememll(easeg+cpu_state.eaaddr,v);
|
||||
#else
|
||||
#define seteab_mem(v) if (eal_w) *(uint8_t *)eal_w=v; else writememb386l(easeg,cpu_state.eaaddr,v);
|
||||
#define seteab_mem(v) if (eal_w) *(uint8_t *)eal_w=v; else writemembl(easeg+cpu_state.eaaddr,v);
|
||||
#define seteaw_mem(v) if (eal_w) *(uint16_t *)eal_w=v; else writememwl(easeg,cpu_state.eaaddr,v);
|
||||
#define seteal_mem(v) if (eal_w) *eal_w=v; else writememll(easeg,cpu_state.eaaddr,v);
|
||||
#endif
|
||||
|
@@ -236,15 +236,11 @@ extern uint16_t read_mem_w(uint32_t addr);
|
||||
extern void write_mem_b(uint32_t addr, uint8_t val);
|
||||
extern void write_mem_w(uint32_t addr, uint16_t val);
|
||||
|
||||
#ifndef USE_NEW_DYNAREC
|
||||
#define readmemb(a) ((readlookup2[(a)>>12]==-1)?readmembl(a):*(uint8_t *)(readlookup2[(a) >> 12] + (a)))
|
||||
#define readmemw(s,a) ((readlookup2[(uint32_t)((s)+(a))>>12]==-1 || (s)==0xFFFFFFFF || (((s)+(a)) & 1))?readmemwl(s,a):*(uint16_t *)(readlookup2[(uint32_t)((s)+(a))>>12]+(uint32_t)((s)+(a))))
|
||||
#define readmeml(s,a) ((readlookup2[(uint32_t)((s)+(a))>>12]==-1 || (s)==0xFFFFFFFF || (((s)+(a)) & 3))?readmemll(s,a):*(uint32_t *)(readlookup2[(uint32_t)((s)+(a))>>12]+(uint32_t)((s)+(a))))
|
||||
|
||||
extern uint8_t readmembl(uint32_t addr);
|
||||
extern void writemembl(uint32_t addr, uint8_t val);
|
||||
extern uint8_t readmemb386l(uint32_t seg, uint32_t addr);
|
||||
extern void writememb386l(uint32_t seg, uint32_t addr, uint8_t val);
|
||||
extern void rwmembl(uint32_t raddr, uint32_t waddr, uint8_t val);
|
||||
|
||||
#ifndef USE_NEW_DYNAREC
|
||||
extern uint16_t readmemwl(uint32_t seg, uint32_t addr);
|
||||
extern void writememwl(uint32_t seg, uint32_t addr, uint16_t val);
|
||||
extern uint32_t readmemll(uint32_t seg, uint32_t addr);
|
||||
@@ -252,8 +248,6 @@ extern void writememll(uint32_t seg, uint32_t addr, uint32_t val);
|
||||
extern uint64_t readmemql(uint32_t seg, uint32_t addr);
|
||||
extern void writememql(uint32_t seg, uint32_t addr, uint64_t val);
|
||||
#else
|
||||
extern uint8_t readmembl(uint32_t addr);
|
||||
extern void writemembl(uint32_t addr, uint8_t val);
|
||||
extern uint16_t readmemwl(uint32_t addr);
|
||||
extern void writememwl(uint32_t addr, uint16_t val);
|
||||
extern uint32_t readmemll(uint32_t addr);
|
||||
|
@@ -804,6 +804,55 @@ writemembl(uint32_t addr, uint8_t val)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
rwmembl(uint32_t raddr, uint32_t waddr, uint8_t val)
|
||||
{
|
||||
uint64_t raddr64 = (uint64_t) raddr;
|
||||
uint64_t waddr64 = (uint64_t) waddr;
|
||||
mem_mapping_t *rmap, *wmap;
|
||||
uint8_t temp = 0xff;
|
||||
|
||||
mem_logical_addr = raddr;
|
||||
|
||||
if (cr0 >> 31) {
|
||||
raddr64 = mmutranslate_read(raddr);
|
||||
if (raddr64 == 0xffffffffffffffffULL)
|
||||
goto do_writebl;
|
||||
if (raddr64 > 0xffffffffULL)
|
||||
goto do_writebl;
|
||||
}
|
||||
raddr = (uint32_t) (raddr64 & rammask);
|
||||
|
||||
rmap = read_mapping[raddr >> MEM_GRANULARITY_BITS];
|
||||
if (rmap && rmap->read_b)
|
||||
temp = rmap->read_b(raddr, rmap->p);
|
||||
|
||||
do_writebl:
|
||||
if (cpu_state.abrt)
|
||||
return;
|
||||
|
||||
mem_logical_addr = waddr;
|
||||
|
||||
if (page_lookup[waddr >> 12] && page_lookup[waddr >> 12]->write_b) {
|
||||
page_lookup[waddr >> 12]->write_b(waddr, temp, page_lookup[waddr >> 12]);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cr0 >> 31) {
|
||||
waddr64 = mmutranslate_write(waddr);
|
||||
if (waddr64 == 0xffffffffffffffffULL)
|
||||
return;
|
||||
if (waddr64 > 0xffffffffULL)
|
||||
return;
|
||||
}
|
||||
waddr = (uint32_t) (waddr64 & rammask);
|
||||
|
||||
wmap = write_mapping[waddr >> MEM_GRANULARITY_BITS];
|
||||
if (wmap && wmap->write_b)
|
||||
wmap->write_b(waddr, temp, wmap->p);
|
||||
}
|
||||
|
||||
|
||||
#ifdef USE_NEW_DYNAREC
|
||||
uint16_t
|
||||
readmemwl(uint32_t addr)
|
||||
@@ -1112,20 +1161,6 @@ writememql(uint32_t addr, uint64_t val)
|
||||
}
|
||||
}
|
||||
#else
|
||||
uint8_t
|
||||
readmemb386l(uint32_t seg, uint32_t addr)
|
||||
{
|
||||
return readmembl(addr + seg);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
writememb386l(uint32_t seg, uint32_t addr, uint8_t val)
|
||||
{
|
||||
writemembl(addr + seg, val);
|
||||
}
|
||||
|
||||
|
||||
uint16_t
|
||||
readmemwl(uint32_t seg, uint32_t addr)
|
||||
{
|
||||
@@ -1143,8 +1178,7 @@ readmemwl(uint32_t seg, uint32_t addr)
|
||||
if (mmutranslate_read(addr2+1) == 0xffffffffffffffffULL)
|
||||
return 0xffff;
|
||||
}
|
||||
if (is386) return readmemb386l(seg,addr)|(((uint16_t) readmemb386l(seg,addr+1))<<8);
|
||||
else return readmembl(seg+addr)|(((uint16_t) readmembl(seg+addr+1))<<8);
|
||||
return readmembl(seg+addr)|(((uint16_t) readmembl(seg+addr+1))<<8);
|
||||
} else if (readlookup2[addr2 >> 12] != (uintptr_t) LOOKUP_INV)
|
||||
return *(uint16_t *)(readlookup2[addr2 >> 12] + addr2);
|
||||
}
|
||||
@@ -1193,13 +1227,8 @@ writememwl(uint32_t seg, uint32_t addr, uint16_t val)
|
||||
if (mmutranslate_write(addr2) == 0xffffffffffffffffULL) return;
|
||||
if (mmutranslate_write(addr2+1) == 0xffffffffffffffffULL) return;
|
||||
}
|
||||
if (is386) {
|
||||
writememb386l(seg,addr,val);
|
||||
writememb386l(seg,addr+1,val>>8);
|
||||
} else {
|
||||
writemembl(seg+addr,val);
|
||||
writemembl(seg+addr+1,val>>8);
|
||||
}
|
||||
writemembl(seg+addr,val);
|
||||
writemembl(seg+addr+1,val>>8);
|
||||
return;
|
||||
} else if (writelookup2[addr2 >> 12] != (uintptr_t) LOOKUP_INV) {
|
||||
*(uint16_t *)(writelookup2[addr2 >> 12] + addr2) = val;
|
||||
|
Reference in New Issue
Block a user