From c03e0db3a40f8715cefdc7f9b64befd15dc8b05b Mon Sep 17 00:00:00 2001 From: Sjoerd van der Berg Date: Fri, 18 Oct 2002 09:04:16 +0000 Subject: [PATCH] New and faster versions of block_read and block_write Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@334 --- src/hardware/memory.cpp | 42 +++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/hardware/memory.cpp b/src/hardware/memory.cpp index a666e496..cd0c9296 100644 --- a/src/hardware/memory.cpp +++ b/src/hardware/memory.cpp @@ -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; } }