1
0
Fork 0

use RAM for PCJr graphics memory

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2409
This commit is contained in:
Sebastian Strohhäcker 2005-12-05 21:25:56 +00:00
parent 380a7c73d0
commit a708a1344f
5 changed files with 33 additions and 11 deletions

View file

@ -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);

View file

@ -311,6 +311,7 @@ typedef struct {
VGA_TANDY tandy;
VGA_OTHER other;
VGA_Memory mem;
Bit8u * gfxmem_start;
} VGA_Type;

View file

@ -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;

View file

@ -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<vga.draw.blocks;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;
@ -61,8 +61,8 @@ static Bit8u * VGA_Draw_2BPP_Line(Bitu vidstart,Bitu panning,Bitu line) {
static Bit8u * VGA_Draw_2BPPHiRes_Line(Bitu vidstart,Bitu panning,Bitu line) {
line*=8*1024;Bit32u * draw=(Bit32u *)TempLine;
for (Bitu x=0;x<(vga.draw.blocks>>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;x<vga.draw.blocks;x++) {
Bitu val1=*reader++;Bitu val2=*reader++;
@ -127,7 +127,7 @@ static Bit8u * VGA_Draw_4BPP_Line(Bitu vidstart,Bitu panning,Bitu line) {
}
static Bit8u * VGA_Draw_4BPP_Line_Double(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;x<vga.draw.blocks;x++) {
Bitu val1=*reader++;Bitu val2=*reader++;
@ -222,7 +222,7 @@ static Bit8u * VGA_Draw_VGA_Line_HWMouse(Bitu vidstart, Bitu panning, Bitu line)
static Bit32u FontMask[2]={0xffffffff,0x0};
static Bit8u * VGA_TEXT_Draw_Line(Bitu vidstart,Bitu panning,Bitu line) {
Bit32u * draw=(Bit32u *)TempLine;
Bit8u * vidmem=&vga.mem.linear[vidstart];
Bit8u * vidmem=&vga.gfxmem_start[vidstart];
for (Bitu cx=0;cx<vga.draw.blocks;cx++) {
Bitu chr=vidmem[cx*2];
Bitu col=vidmem[cx*2+1];
@ -240,7 +240,7 @@ static Bit8u * VGA_TEXT_Draw_Line(Bitu vidstart,Bitu panning,Bitu line) {
if (line<vga.draw.cursor.sline) goto skip_cursor;
if (line>vga.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:

View file

@ -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];
}