1
0
Fork 0

simplify memory checking handlers a bit

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3004
This commit is contained in:
Sebastian Strohhäcker 2007-09-30 14:10:08 +00:00
parent d0b4e12779
commit c6df37a834
4 changed files with 27 additions and 70 deletions

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: paging.h,v 1.26 2007-09-29 13:23:59 c2woody Exp $ */
/* $Id: paging.h,v 1.27 2007-09-30 14:10:04 c2woody Exp $ */
#ifndef DOSBOX_PAGING_H
#define DOSBOX_PAGING_H
@ -57,9 +57,9 @@ public:
virtual void writed(PhysPt addr,Bitu val);
virtual HostPt GetHostReadPt(Bitu phys_page);
virtual HostPt GetHostWritePt(Bitu phys_page);
virtual bool readb_checked(PhysPt addr, Bitu * val);
virtual bool readw_checked(PhysPt addr, Bitu * val);
virtual bool readd_checked(PhysPt addr, Bitu * val);
virtual bool readb_checked(PhysPt addr,Bit8u * val);
virtual bool readw_checked(PhysPt addr,Bit16u * val);
virtual bool readd_checked(PhysPt addr,Bit32u * val);
virtual bool writeb_checked(PhysPt addr,Bitu val);
virtual bool writew_checked(PhysPt addr,Bitu val);
virtual bool writed_checked(PhysPt addr,Bitu val);
@ -231,13 +231,7 @@ INLINE bool mem_readb_checked(PhysPt address, Bit8u * val) {
if (paging.tlb.read[index]) {
*val=host_readb(paging.tlb.read[index]+address);
return false;
} else {
Bitu uval;
bool retval;
retval=paging.tlb.handler[index]->readb_checked(address, &uval);
*val=(Bit8u)uval;
return retval;
}
} else return paging.tlb.handler[index]->readb_checked(address, val);
}
INLINE bool mem_readw_checked(PhysPt address, Bit16u * val) {
@ -246,13 +240,7 @@ INLINE bool mem_readw_checked(PhysPt address, Bit16u * val) {
if (paging.tlb.read[index]) {
*val=host_readw(paging.tlb.read[index]+address);
return false;
} else {
Bitu uval;
bool retval;
retval=paging.tlb.handler[index]->readw_checked(address, &uval);
*val=(Bit16u)uval;
return retval;
}
} else return paging.tlb.handler[index]->readw_checked(address, val);
} else return mem_unalignedreadw_checked(address, val);
}
@ -262,13 +250,7 @@ INLINE bool mem_readd_checked(PhysPt address, Bit32u * val) {
if (paging.tlb.read[index]) {
*val=host_readd(paging.tlb.read[index]+address);
return false;
} else {
Bitu uval;
bool retval;
retval=paging.tlb.handler[index]->readd_checked(address, &uval);
*val=(Bit32u)uval;
return retval;
}
} else return paging.tlb.handler[index]->readd_checked(address, val);
} else return mem_unalignedreadd_checked(address, val);
}

View file

@ -461,13 +461,8 @@ static void dyn_read_intro(DynReg * addr,bool release_addr=true) {
cache_addw(0xc18b); // mov eax,ecx
}
bool mem_readb_checked_x86x(PhysPt address) {
Bitu index=(address>>12);
Bitu uval;
bool retval;
retval=paging.tlb.handler[index]->readb_checked(address, &uval);
core_dyn.readdata=(Bit8u)uval;
return retval;
bool mem_readb_checked_dcx86(PhysPt address) {
return paging.tlb.handler[address>>12]->readb_checked(address, (Bit8u*)(&core_dyn.readdata));
}
static void dyn_read_byte(DynReg * addr,DynReg * dst,Bitu high) {
@ -489,7 +484,7 @@ static void dyn_read_byte(DynReg * addr,DynReg * dst,Bitu high) {
gen_fill_branch(je_loc);
cache_addb(0x51); // push ecx
cache_addb(0xe8);
cache_addd(((Bit32u)&mem_readb_checked_x86x) - (Bit32u)cache.pos-4);
cache_addd(((Bit32u)&mem_readb_checked_dcx86) - (Bit32u)cache.pos-4);
cache_addw(0xc483); // add esp,4
cache_addb(0x04);
cache_addw(0x012c); // sub al,1
@ -527,7 +522,7 @@ static void dyn_read_byte_release(DynReg * addr,DynReg * dst,Bitu high) {
gen_fill_branch(je_loc);
cache_addb(0x51); // push ecx
cache_addb(0xe8);
cache_addd(((Bit32u)&mem_readb_checked_x86x) - (Bit32u)cache.pos-4);
cache_addd(((Bit32u)&mem_readb_checked_dcx86) - (Bit32u)cache.pos-4);
cache_addw(0xc483); // add esp,4
cache_addb(0x04);
cache_addw(0x012c); // sub al,1
@ -546,18 +541,14 @@ static void dyn_read_byte_release(DynReg * addr,DynReg * dst,Bitu high) {
dst->flags|=DYNFLG_CHANGED;
}
bool mem_readd_checked_x86x(PhysPt address) {
bool mem_readd_checked_dcx86(PhysPt address) {
if ((address & 0xfff)<0xffd) {
Bitu index=(address>>12);
if (paging.tlb.read[index]) {
core_dyn.readdata=host_readd(paging.tlb.read[index]+address);
return false;
} else {
Bitu uval;
bool retval;
retval=paging.tlb.handler[index]->readd_checked(address, &uval);
core_dyn.readdata=(Bit32u)uval;
return retval;
return paging.tlb.handler[index]->readd_checked(address, &core_dyn.readdata);
}
} else return mem_unalignedreadd_checked(address, &core_dyn.readdata);
}
@ -589,7 +580,7 @@ static void dyn_read_word(DynReg * addr,DynReg * dst,bool dword) {
gen_fill_branch(je_loc);
cache_addb(0x51); // push ecx
cache_addb(0xe8);
cache_addd(((Bit32u)&mem_readd_checked_x86x) - (Bit32u)cache.pos-4);
cache_addd(((Bit32u)&mem_readd_checked_dcx86) - (Bit32u)cache.pos-4);
cache_addw(0xc483); // add esp,4
cache_addb(0x04);
cache_addw(0x012c); // sub al,1
@ -635,7 +626,7 @@ static void dyn_read_word_release(DynReg * addr,DynReg * dst,bool dword) {
gen_fill_branch(je_loc);
cache_addb(0x51); // push ecx
cache_addb(0xe8);
cache_addd(((Bit32u)&mem_readd_checked_x86x) - (Bit32u)cache.pos-4);
cache_addd(((Bit32u)&mem_readd_checked_dcx86) - (Bit32u)cache.pos-4);
cache_addw(0xc483); // add esp,4
cache_addb(0x04);
cache_addw(0x012c); // sub al,1

View file

@ -570,11 +570,7 @@ bool DRC_CALL_CONV mem_readb_checked_drc(PhysPt address) {
*((Bit8u*)(&core_dynrec.readdata))=host_readb(paging.tlb.read[index]+address);
return false;
} else {
Bitu uval;
bool retval;
retval=paging.tlb.handler[index]->readb_checked(address, &uval);
*((Bit8u*)(&core_dynrec.readdata))=(Bit8u)uval;
return retval;
return paging.tlb.handler[index]->readb_checked(address, (Bit8u*)(&core_dynrec.readdata));
}
}
@ -594,13 +590,7 @@ bool DRC_CALL_CONV mem_readw_checked_drc(PhysPt address) {
if (paging.tlb.read[index]) {
*((Bit16u*)(&core_dynrec.readdata))=host_readw(paging.tlb.read[index]+address);
return false;
} else {
Bitu uval;
bool retval;
retval=paging.tlb.handler[index]->readw_checked(address, &uval);
*((Bit16u*)(&core_dynrec.readdata))=(Bit16u)uval;
return retval;
}
} else return paging.tlb.handler[index]->readw_checked(address, (Bit16u*)(&core_dynrec.readdata));
} else return mem_unalignedreadw_checked(address, ((Bit16u*)(&core_dynrec.readdata)));
}
@ -611,13 +601,7 @@ bool DRC_CALL_CONV mem_readd_checked_drc(PhysPt address) {
if (paging.tlb.read[index]) {
*((Bit32u*)(&core_dynrec.readdata))=host_readd(paging.tlb.read[index]+address);
return false;
} else {
Bitu uval;
bool retval;
retval=paging.tlb.handler[index]->readd_checked(address, &uval);
*((Bit32u*)(&core_dynrec.readdata))=(Bit32u)uval;
return retval;
}
} else return paging.tlb.handler[index]->readd_checked(address, (Bit32u*)(&core_dynrec.readdata));
} else return mem_unalignedreadd_checked(address, ((Bit32u*)(&core_dynrec.readdata)));
}

View file

@ -75,14 +75,14 @@ HostPt PageHandler::GetHostWritePt(Bitu /*phys_page*/) {
return 0;
}
bool PageHandler::readb_checked(PhysPt addr, Bitu * val) {
*val=readb(addr); return false;
bool PageHandler::readb_checked(PhysPt addr, Bit8u * val) {
*val=(Bit8u)readb(addr); return false;
}
bool PageHandler::readw_checked(PhysPt addr, Bitu * val) {
*val=readw(addr); return false;
bool PageHandler::readw_checked(PhysPt addr, Bit16u * val) {
*val=(Bit16u)readw(addr); return false;
}
bool PageHandler::readd_checked(PhysPt addr, Bitu * val) {
*val=readd(addr); return false;
bool PageHandler::readd_checked(PhysPt addr, Bit32u * val) {
*val=(Bit32u)readd(addr); return false;
}
bool PageHandler::writeb_checked(PhysPt addr,Bitu val) {
writeb(addr,val); return false;
@ -185,19 +185,19 @@ public:
InitPage(addr,true);
mem_writed(addr,val);
}
bool readb_checked(PhysPt addr, Bitu * val) {
bool readb_checked(PhysPt addr, Bit8u * val) {
if (InitPage(addr,false,true)) {
*val=mem_readb(addr);
return false;
} else return true;
}
bool readw_checked(PhysPt addr, Bitu * val) {
bool readw_checked(PhysPt addr, Bit16u * val) {
if (InitPage(addr,false,true)){
*val=mem_readw(addr);
return false;
} else return true;
}
bool readd_checked(PhysPt addr, Bitu * val) {
bool readd_checked(PhysPt addr, Bit32u * val) {
if (InitPage(addr,false,true)) {
*val=mem_readd(addr);
return false;