diff --git a/include/paging.h b/include/paging.h index b33df8e6..1366babb 100644 --- a/include/paging.h +++ b/include/paging.h @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: paging.h,v 1.11 2004-09-07 18:21:51 qbix79 Exp $ */ +/* $Id: paging.h,v 1.12 2004-10-12 10:45:10 harekiet Exp $ */ #ifndef _PAGING_H_ #define _PAGING_H_ @@ -42,7 +42,6 @@ class PageDirectory; //Allow 128 mb of memory to be linked #define PAGING_LINKS (128*1024/4) - class PageHandler { public: virtual Bitu readb(PhysPt addr); @@ -72,6 +71,8 @@ bool PAGING_MakePhysPage(Bitu & page); void MEM_SetLFB(Bitu _page,Bitu _pages,HostPt _pt); void MEM_SetPageHandler(Bitu phys_page,Bitu pages,PageHandler * handler); +void MEM_ResetPageHandler(Bitu phys_page, Bitu pages); + #ifdef _MSC_VER #pragma pack (1) diff --git a/src/hardware/memory.cpp b/src/hardware/memory.cpp index 69f86660..a4e206c9 100644 --- a/src/hardware/memory.cpp +++ b/src/hardware/memory.cpp @@ -141,6 +141,13 @@ void MEM_SetPageHandler(Bitu phys_page,Bitu pages,PageHandler * handler) { } } +void MEM_ResetPageHandler(Bitu phys_page, Bitu pages) { + for (;pages>0;pages--) { + memory.phandlers[phys_page]=&ram_page_handler; + phys_page++; + } +} + Bitu mem_strlen(PhysPt pt) { Bitu x=0; while (x<1024) { diff --git a/src/hardware/vga_memory.cpp b/src/hardware/vga_memory.cpp index 0d67a8ae..490297f8 100644 --- a/src/hardware/vga_memory.cpp +++ b/src/hardware/vga_memory.cpp @@ -15,9 +15,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - - #include #include @@ -135,8 +132,7 @@ static void VGA_GFX_256U_WriteHandler(PhysPt start,Bit8u val) { #define VGA_PAGE_B8 (0xB8000/4096) static struct { - Bit8u ram_area[VGA_PAGES*4096]; - Bitu map_base; + Bitu base,mask; } vgapages; class VGARead_PageHandler : public PageHandler { @@ -213,37 +209,24 @@ public: flags=PFLAG_NOCODE; } Bitu readb(PhysPt addr) { - addr&=0xffff; + addr&=vgapages.mask; return vga.draw.font[addr]; } void writeb(PhysPt addr,Bitu val){ - addr&=0xffff; + addr&=vgapages.mask; if (vga.seq.map_mask & 0x4) { vga.draw.font[addr]=(Bit8u)val; } } }; - -class VGA_RAM_PageHandler : public PageHandler { -public: - VGA_RAM_PageHandler() { - flags=PFLAG_READABLE|PFLAG_WRITEABLE|PFLAG_NOCODE; - } - HostPt GetHostPt(Bitu phys_page) { - phys_page-=VGA_PAGE_A0; - return &vgapages.ram_area[phys_page*4096]; - } -}; - - class VGA_MAP_PageHandler : public PageHandler { public: VGA_MAP_PageHandler() { flags=PFLAG_READABLE|PFLAG_WRITEABLE|PFLAG_NOCODE; } HostPt GetHostPt(Bitu phys_page) { - phys_page-=vgapages.map_base; + phys_page-=vgapages.base; return &vga.mem.linear[vga.s3.bank*64*1024+phys_page*4096]; } }; @@ -327,7 +310,6 @@ public: static struct vg { - VGA_RAM_PageHandler hram; VGA_MAP_PageHandler hmap; VGA_TEXT_PageHandler htext; VGA_TANDY_PageHandler htandy; @@ -380,27 +362,31 @@ void VGA_SetupHandlers(void) { } switch ((vga.gfx.miscellaneous >> 2) & 3) { case 0: - vgapages.map_base=VGA_PAGE_A0; + vgapages.base=VGA_PAGE_A0; + vgapages.mask=0x1ffff; MEM_SetPageHandler(VGA_PAGE_A0,32,range_handler); break; case 1: - vgapages.map_base=VGA_PAGE_A0; + vgapages.base=VGA_PAGE_A0; + vgapages.mask=0xffff; MEM_SetPageHandler(VGA_PAGE_A0,16,range_handler); - MEM_SetPageHandler(VGA_PAGE_B0,16,&vgaph.hram); + MEM_ResetPageHandler(VGA_PAGE_B0,16); break; case 2: range_b000: - vgapages.map_base=VGA_PAGE_B0; + vgapages.base=VGA_PAGE_B0; + vgapages.mask=0x7fff; MEM_SetPageHandler(VGA_PAGE_B0,8,range_handler); - MEM_SetPageHandler(VGA_PAGE_A0,16,&vgaph.hram); - MEM_SetPageHandler(VGA_PAGE_B8,8,&vgaph.hram); + MEM_ResetPageHandler(VGA_PAGE_A0,16); + MEM_ResetPageHandler(VGA_PAGE_B8,8); break; case 3: range_b800: - vgapages.map_base=VGA_PAGE_B8; + vgapages.base=VGA_PAGE_B8; + vgapages.mask=0x7fff; MEM_SetPageHandler(VGA_PAGE_B8,8,range_handler); - MEM_SetPageHandler(VGA_PAGE_A0,16,&vgaph.hram); - MEM_SetPageHandler(VGA_PAGE_B0,8,&vgaph.hram); + MEM_ResetPageHandler(VGA_PAGE_A0,16); + MEM_ResetPageHandler(VGA_PAGE_B0,8); break; }