From 02b866dc4a7f5c7f76bf25de54f204a78fce9f39 Mon Sep 17 00:00:00 2001 From: Ralf Grillenberger Date: Wed, 19 Jan 2011 18:26:06 +0000 Subject: [PATCH] Implement video memory access to all text mode planes. Fixes Fasttracker Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3669 --- src/hardware/vga_memory.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/hardware/vga_memory.cpp b/src/hardware/vga_memory.cpp index 74f97528..8a8b43f7 100644 --- a/src/hardware/vga_memory.cpp +++ b/src/hardware/vga_memory.cpp @@ -466,12 +466,29 @@ public: } Bitu readb(PhysPt addr) { addr = PAGING_GetPhysicalAddress(addr) & vgapages.mask; - return vga.draw.font[addr]; + switch(vga.gfx.read_map_select) { + case 0: // character index + return vga.mem.linear[CHECKED3(vga.svga.bank_read_full+addr)]; + case 1: // character attribute + return vga.mem.linear[CHECKED3(vga.svga.bank_read_full+addr+1)]; + case 2: // font map + return vga.draw.font[addr]; + default: // 3=unused, but still RAM that could save values + return 0; + } } void writeb(PhysPt addr,Bitu val){ addr = PAGING_GetPhysicalAddress(addr) & vgapages.mask; - if (vga.seq.map_mask & 0x4) { + + if (GCC_LIKELY(vga.seq.map_mask == 0x4)) { vga.draw.font[addr]=(Bit8u)val; + } else { + if (vga.seq.map_mask & 0x4) // font map + vga.draw.font[addr]=(Bit8u)val; + if (vga.seq.map_mask & 0x2) // character attribute + vga.mem.linear[CHECKED3(vga.svga.bank_read_full+addr+1)]=(Bit8u)val; + if (vga.seq.map_mask & 0x1) // character index + vga.mem.linear[CHECKED3(vga.svga.bank_read_full+addr)]=(Bit8u)val; } } };