New and faster versions of block_read and block_write
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@334
This commit is contained in:
parent
02e888e001
commit
c03e0db3a4
1 changed files with 26 additions and 16 deletions
|
@ -34,28 +34,38 @@ MEMORY_WriteHandler WriteHandlerTable[MAX_PAGES];
|
|||
#define MAX_PAGE_LIMIT PAGE_COUNT(C_MEM_MAX_SIZE*1024*1024)
|
||||
|
||||
void MEM_BlockRead(PhysPt off,void * data,Bitu size) {
|
||||
Bitu c;
|
||||
Bit8u * idata=(Bit8u *)data;
|
||||
for (c=1;c<=(size>>2);c++) {
|
||||
writed(idata,mem_readd(off));
|
||||
idata+=4;off+=4;
|
||||
}
|
||||
for (c=1;c<=(size&3);c++) {
|
||||
writeb(idata,mem_readb(off));
|
||||
idata+=1;off+=1;
|
||||
while (size>0) {
|
||||
Bitu page=off >> PAGE_SHIFT;
|
||||
Bitu start=off & (PAGE_SIZE-1);
|
||||
Bitu tocopy=PAGE_SIZE-start;
|
||||
if (tocopy>size) tocopy=size;
|
||||
if (ReadHostTable[page]) {
|
||||
memcpy(idata,ReadHostTable[page]+off,tocopy);
|
||||
idata+=tocopy;
|
||||
off+=tocopy;
|
||||
} else {
|
||||
for (;tocopy>0;tocopy--) *idata++=ReadHandlerTable[page](off++);
|
||||
}
|
||||
size-=tocopy;
|
||||
}
|
||||
}
|
||||
|
||||
void MEM_BlockWrite(PhysPt off,void * data,Bitu size) {
|
||||
Bitu c;
|
||||
Bit8u * idata=(Bit8u *)data;
|
||||
for (c=1;c<=(size>>2);c++) {
|
||||
mem_writed(off,readd(idata));
|
||||
idata+=4;off+=4;
|
||||
}
|
||||
for (c=1;c<=(size&3);c++) {
|
||||
mem_writeb(off,readb(idata));
|
||||
idata+=1;off+=1;
|
||||
while (size>0) {
|
||||
Bitu page=off >> PAGE_SHIFT;
|
||||
Bitu start=off & (PAGE_SIZE-1);
|
||||
Bitu tocopy=PAGE_SIZE-start;
|
||||
if (tocopy>size) tocopy=size;
|
||||
if (WriteHostTable[page]) {
|
||||
memcpy(WriteHostTable[page]+off,idata,tocopy);
|
||||
idata+=tocopy;
|
||||
off+=tocopy;
|
||||
} else {
|
||||
for (;tocopy>0;tocopy--) WriteHandlerTable[page](off++,*idata++);
|
||||
}
|
||||
size-=tocopy;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue