1
0
Fork 0

New memory handling using 1 big block of memory

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1920
This commit is contained in:
Sjoerd van der Berg 2004-08-23 12:19:17 +00:00
parent fc8d4d89c2
commit f7a6317328
3 changed files with 27 additions and 101 deletions

View file

@ -20,8 +20,6 @@
#define __MEM_H
#include <dosbox.h>
#define bmemcpy(mem1,mem2,size) memcpy((void *)mem1,(void *)mem2,size)
typedef Bit32u PhysPt;
typedef Bit8u * HostPt;
typedef Bit32u RealPt;
@ -30,6 +28,8 @@ typedef Bit32s MemHandle;
#define MEM_PAGESIZE 4096
extern HostPt MemBase;
bool MEM_A20_Enabled(void);
void MEM_A20_Enable(bool enable);
@ -123,9 +123,25 @@ void mem_writeb(PhysPt pt,Bit8u val);
void mem_writew(PhysPt pt,Bit16u val);
void mem_writed(PhysPt pt,Bit32u val);
void phys_writeb(PhysPt addr,Bit8u val);
void phys_writew(PhysPt addr,Bit16u val);
void phys_writed(PhysPt addr,Bit32u val);
INLINE void phys_writeb(PhysPt addr,Bit8u val) {
host_writeb(MemBase+addr,val);
}
INLINE void phys_writew(PhysPt addr,Bit16u val){
host_writew(MemBase+addr,val);
}
INLINE void phys_writed(PhysPt addr,Bit32u val){
host_writed(MemBase+addr,val);
}
INLINE Bit8u phys_readb(PhysPt addr) {
return host_readb(MemBase+addr);
}
INLINE Bit16u phys_readw(PhysPt addr){
return host_readw(MemBase+addr);
}
INLINE Bit32u phys_readd(PhysPt addr){
return host_readd(MemBase+addr);
}
/* These don't check for alignment, better be sure it's correct */

View file

@ -70,11 +70,6 @@ bool PAGING_MakePhysPage(Bitu & page);
void MEM_SetLFB(Bitu _page,Bitu _pages,HostPt _pt);
void MEM_SetPageHandler(Bitu phys_page,Bitu pages,PageHandler * handler);
Bit32u MEM_PhysReadD(Bitu addr);
#pragma pack(1)
typedef struct {
Bit32u p:1;

View file

@ -34,11 +34,6 @@
#define LFB_PAGES 512
#define MAX_LINKS ((MAX_MEMORY*1024/4)+4096) //Hopefully enough
struct AllocBlock {
Bit8u data[PAGES_IN_BLOCK*4096];
AllocBlock * next;
};
struct LinkBlock {
Bitu used;
Bit32u pages[MAX_LINKS];
@ -47,14 +42,8 @@ struct LinkBlock {
static struct MemoryBlock {
Bitu pages;
PageHandler * * phandlers;
HostPt * hostpts;
MemHandle * mhandles;
LinkBlock links;
struct {
Bitu pages;
HostPt cur_page;
AllocBlock *cur_block;
} block;
struct {
Bitu start_page;
Bitu end_page;
@ -67,6 +56,8 @@ static struct MemoryBlock {
} a20;
} memory;
HostPt MemBase;
class IllegalPageHandler : public PageHandler {
public:
IllegalPageHandler() {
@ -90,10 +81,7 @@ public:
flags=PFLAG_READABLE|PFLAG_WRITEABLE;
}
HostPt GetHostPt(Bitu phys_page) {
if (!memory.hostpts[phys_page]) {
memory.hostpts[phys_page]=MEM_GetBlockPage();
}
return memory.hostpts[phys_page];
return MemBase+phys_page*MEM_PAGESIZE;
}
};
@ -467,51 +455,6 @@ void mem_writed(PhysPt address,Bit32u val) {
mem_writed_inline(address,val);
}
void phys_writeb(PhysPt addr,Bit8u val) {
HostPt block=memory.hostpts[addr >> 12];
if (!block) {
block=memory.hostpts[addr >> 12]=MEM_GetBlockPage();
}
host_writeb(block+(addr & 4095),val);
}
void phys_writew(PhysPt addr,Bit16u val) {
phys_writeb(addr,(Bit8u)val);
phys_writeb(addr+1,(Bit8u)(val >> 8));
}
void phys_writed(PhysPt addr,Bit32u val) {
phys_writeb(addr,(Bit8u)val);
phys_writeb(addr+1,(Bit8u)(val >> 8));
phys_writeb(addr+2,(Bit8u)(val >> 16));
phys_writeb(addr+3,(Bit8u)(val >> 24));
}
Bit32u MEM_PhysReadD(Bitu addr) {
Bitu page=addr >> 12;
Bitu index=(addr & 4095);
if (page>memory.pages)
E_Exit("Reading from illegal page");
HostPt block=memory.hostpts[page];
if (!block) {
E_Exit("Reading from empty page");
}
return host_readd(block+index);
}
void MEM_PhysWriteD(Bitu addr,Bit32u val) {
Bitu page=addr >> 12;
Bitu index=(addr & 4095);
if (page>memory.pages)
E_Exit("Writing from illegal page");
HostPt block=memory.hostpts[page];
if (!block) {
E_Exit("Writing to empty page");
}
host_writed(block+index,val);
}
static void write_p92(Bitu port,Bitu val,Bitu iolen) {
// Bit 0 = system reset (switch back to real mode)
if (val&1) E_Exit("XMS: CPU reset via port 0x92 not supported.");
@ -524,42 +467,14 @@ static Bitu read_p92(Bitu port,Bitu iolen) {
}
HostPt MEM_GetBlockPage(void) {
HostPt ret;
if (memory.block.pages) {
ret=memory.block.cur_page;
memory.block.pages--;
memory.block.cur_page+=4096;
} else {
AllocBlock * newblock=new AllocBlock;
memset(newblock,0,sizeof(AllocBlock)); //zero new allocated memory
newblock->next=memory.block.cur_block;
memory.block.cur_block=newblock;
memory.block.pages=PAGES_IN_BLOCK-1;
ret=&newblock->data[0];
memory.block.cur_page=&newblock->data[4096];
}
return ret;
}
static void MEM_ShutDown(Section * sec) {
AllocBlock * theblock=memory.block.cur_block;
while (theblock) {
AllocBlock * next=theblock->next;
delete theblock;
theblock=next;
}
free(MemBase);
}
void MEM_Init(Section * sec) {
Bitu i;
Section_prop * section=static_cast<Section_prop *>(sec);
/* Setup Memory Block */
memory.block.pages=0;
memory.block.cur_block=0;
/* Setup the Physical Page Links */
Bitu memsize=section->Get_int("memsize");
@ -568,13 +483,13 @@ void MEM_Init(Section * sec) {
LOG_MSG("Maximum memory size is %d MB",MAX_MEMORY);
memsize=MAX_MEMORY;
}
MemBase=(HostPt)malloc(memsize*1024*1024);
if (!MemBase) E_Exit("Can't allocate main memory of %d MB",memsize);
memory.pages=(memsize*1024*1024)/4096;
/* Allocate the data for the different page information blocks */
memory.hostpts=new HostPt[memory.pages];
memory.phandlers=new PageHandler * [memory.pages];
memory.mhandles=new MemHandle [memory.pages];
for (i=0;i<memory.pages;i++) {
memory.hostpts[i]=0; //0 handler is allocate memory
memory.phandlers[i]=&ram_page_handler;
memory.mhandles[i]=0; //Set to 0 for memory allocation
}