From a708a1344f86e106572286f0a8c42fbe5b38ccc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Mon, 5 Dec 2005 21:25:56 +0000 Subject: [PATCH] use RAM for PCJr graphics memory Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2409 --- include/mem.h | 1 + include/vga.h | 1 + src/hardware/memory.cpp | 4 +++- src/hardware/vga_draw.cpp | 16 ++++++++-------- src/hardware/vga_memory.cpp | 22 ++++++++++++++++++++-- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/include/mem.h b/include/mem.h index 6f99054d..ce3f5d7c 100644 --- a/include/mem.h +++ b/include/mem.h @@ -32,6 +32,7 @@ typedef Bit32s MemHandle; #define MEM_PAGESIZE 4096 extern HostPt MemBase; +HostPt GetMemBase(void); bool MEM_A20_Enabled(void); void MEM_A20_Enable(bool enable); diff --git a/include/vga.h b/include/vga.h index abd1d296..ceb6f4d7 100644 --- a/include/vga.h +++ b/include/vga.h @@ -311,6 +311,7 @@ typedef struct { VGA_TANDY tandy; VGA_OTHER other; VGA_Memory mem; + Bit8u * gfxmem_start; } VGA_Type; diff --git a/src/hardware/memory.cpp b/src/hardware/memory.cpp index 8423c353..c434ca9a 100644 --- a/src/hardware/memory.cpp +++ b/src/hardware/memory.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: memory.cpp,v 1.40 2005-12-03 10:43:22 c2woody Exp $ */ +/* $Id: memory.cpp,v 1.41 2005-12-05 21:25:56 c2woody Exp $ */ #include "dosbox.h" #include "mem.h" @@ -472,6 +472,8 @@ static Bitu read_p92(Bitu port,Bitu iolen) { return memory.a20.controlport | (memory.a20.enabled ? 0x02 : 0); } +HostPt GetMemBase(void) { return MemBase; } + class MEMORY:public Module_base{ private: IO_ReadHandleObject ReadHandler; diff --git a/src/hardware/vga_draw.cpp b/src/hardware/vga_draw.cpp index b8f07a84..ae042c2d 100644 --- a/src/hardware/vga_draw.cpp +++ b/src/hardware/vga_draw.cpp @@ -36,7 +36,7 @@ static Bit8u TempLine[1280]; static Bit8u * VGA_Draw_1BPP_Line(Bitu vidstart,Bitu panning,Bitu line) { line*=8*1024;Bit32u * draw=(Bit32u *)TempLine; for (Bitu x=vga.draw.blocks;x>0;x--) { - Bitu val=vga.mem.linear[vidstart+line]; + Bitu val=vga.gfxmem_start[vidstart+line]; vidstart++; if((vga.crtc.mode_control & 0x01) == 0) // CGA compatible addressing vidstart &= 0x1dfff; @@ -49,7 +49,7 @@ static Bit8u * VGA_Draw_1BPP_Line(Bitu vidstart,Bitu panning,Bitu line) { static Bit8u * VGA_Draw_2BPP_Line(Bitu vidstart,Bitu panning,Bitu line) { line*=8*1024;Bit32u * draw=(Bit32u *)TempLine; for (Bitu x=0;x>1);x++) { - Bitu val1=vga.mem.linear[vidstart+line]; - Bitu val2=vga.mem.linear[vidstart+1+line]; + Bitu val1=vga.gfxmem_start[vidstart+line]; + Bitu val2=vga.gfxmem_start[vidstart+1+line]; vidstart+=2; if((vga.crtc.mode_control & 0x01) == 0) // CGA compatible addressing vidstart &= 0x1dfff; @@ -114,7 +114,7 @@ static Bit8u * VGA_Draw_CGA16_Line(Bitu vidstart,Bitu panning,Bitu line) { } static Bit8u * VGA_Draw_4BPP_Line(Bitu vidstart,Bitu panning,Bitu line) { - Bit8u * reader=&vga.mem.linear[vidstart + (line * 8 * 1024)]; + Bit8u * reader=&vga.gfxmem_start[vidstart + (line * 8 * 1024)]; Bit32u * draw=(Bit32u *)TempLine; for (Bitu x=0;xvga.draw.cursor.eline) goto skip_cursor; draw=(Bit32u *)&TempLine[font_addr*8]; - Bit32u att=TXT_FG_Table[vga.mem.linear[vga.draw.cursor.address+1]&0xf]; + Bit32u att=TXT_FG_Table[vga.gfxmem_start[vga.draw.cursor.address+1]&0xf]; *draw++=att;*draw++=att; } skip_cursor: diff --git a/src/hardware/vga_memory.cpp b/src/hardware/vga_memory.cpp index 93d6d5d9..391f66ae 100644 --- a/src/hardware/vga_memory.cpp +++ b/src/hardware/vga_memory.cpp @@ -434,11 +434,24 @@ public: } }; +class VGA_PCJR_PageHandler : public PageHandler { +public: + VGA_PCJR_PageHandler() { + flags=PFLAG_READABLE|PFLAG_WRITEABLE; + } + HostPt GetHostPt(Bitu phys_page) { + phys_page-=0xb8; + if (!vga.tandy.is_32k_mode) phys_page&=0x03; + return MemBase+(vga.tandy.mem_bank << 14)+(phys_page * 4096); + } +}; + static struct vg { VGA_MAP_PageHandler hmap; VGA_TEXT_PageHandler htext; VGA_TANDY_PageHandler htandy; + VGA_PCJR_PageHandler hpcjr; VGA_256_PageHandler h256; VGA_256Chain4_PageHandler h256c4; VGA_16_PageHandler h16; @@ -462,8 +475,8 @@ void VGA_SetupHandlers(void) { MEM_SetPageHandler(0x80,32,range_handler); goto range_b800; case MCH_PCJR: - range_handler=&vgaph.htandy; - MEM_SetPageHandler(vga.tandy.mem_bank<<2,vga.tandy.is_32k_mode ? 0x08 : 0x04,range_handler); + range_handler=&vgaph.hpcjr; +// MEM_SetPageHandler(vga.tandy.mem_bank<<2,vga.tandy.is_32k_mode ? 0x08 : 0x04,range_handler); goto range_b800; } switch (vga.mode) { @@ -557,4 +570,9 @@ void VGA_UnmapMMIO(void) { void VGA_SetupMemory() { memset((void *)&vga.mem,0,512*1024*4); + if (machine==MCH_PCJR) { + /* PCJr does not have dedicated graphics memory but uses + conventional memory below 128k */ + vga.gfxmem_start=GetMemBase(); + } else vga.gfxmem_start=&vga.mem.linear[0]; }