From a5ae4cfba5de8bd3b3543520d30aa98008b1a73c Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 30 Nov 2020 05:27:04 +0100 Subject: [PATCH] Got completely rid of readmemb386l() and writememb386l(). --- src/codegen/codegen_x86.c | 40 +++++++++++---------- src/cpu/386_common.c | 4 --- src/cpu/386_common.h | 15 ++++---- src/include/86box/mem.h | 12 ++----- src/mem/mem.c | 75 +++++++++++++++++++++++++++------------ 5 files changed, 83 insertions(+), 63 deletions(-) diff --git a/src/codegen/codegen_x86.c b/src/codegen/codegen_x86.c index 8ad2222bd..4ad608aac 100644 --- a/src/codegen/codegen_x86.c +++ b/src/codegen/codegen_x86.c @@ -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); diff --git a/src/cpu/386_common.c b/src/cpu/386_common.c index 4f03f0aca..59ae935a1 100644 --- a/src/cpu/386_common.c +++ b/src/cpu/386_common.c @@ -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)); } diff --git a/src/cpu/386_common.h b/src/cpu/386_common.h index baf5a63e1..2c7c0eaff 100644 --- a/src/cpu/386_common.h +++ b/src/cpu/386_common.h @@ -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 diff --git a/src/include/86box/mem.h b/src/include/86box/mem.h index a5bae6f89..7e7d4a67c 100644 --- a/src/include/86box/mem.h +++ b/src/include/86box/mem.h @@ -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); diff --git a/src/mem/mem.c b/src/mem/mem.c index 52fae564d..0f281cf02 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -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;