From ef5e7f519ef8d8f044bebe231746cbeaf0035326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Mon, 19 Dec 2005 20:39:51 +0000 Subject: [PATCH] fake a 128k-PCJr when com files are loaded low (dos memory only) Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2417 --- src/dos/dos_execute.cpp | 10 +++++++++- src/dos/dos_memory.cpp | 9 ++++++++- src/dos/dos_programs.cpp | 12 +++++------- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/dos/dos_execute.cpp b/src/dos/dos_execute.cpp index 29ccb928..966aded7 100644 --- a/src/dos/dos_execute.cpp +++ b/src/dos/dos_execute.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dos_execute.cpp,v 1.52 2005-12-03 10:43:22 c2woody Exp $ */ +/* $Id: dos_execute.cpp,v 1.53 2005-12-19 20:39:51 c2woody Exp $ */ #include #include @@ -311,6 +311,14 @@ bool DOS_Execute(char * name,PhysPt block_pt,Bit8u flags) { maxsize=0xffff; /* resize to full extent of memory block */ DOS_ResizeMemory(pspseg,&maxsize); + /* now try to lock out memory above segment 0x2000 */ + if ((real_readb(0x2000,0)==0x5a) && (real_readw(0x2000,1)==0) && (real_readw(0x2000,3)==0x7ffe)) { + /* MCB after PCJr graphics memory region is still free */ + if (pspseg+maxsize==0x17ff) { + DOS_MCB cmcb((Bit16u)(pspseg-1)); + cmcb.SetType(0x5a); // last block + } + } } loadseg=pspseg+16; if (!iscom) { diff --git a/src/dos/dos_memory.cpp b/src/dos/dos_memory.cpp index 19bf2d1a..dbdd7063 100644 --- a/src/dos/dos_memory.cpp +++ b/src/dos/dos_memory.cpp @@ -49,7 +49,14 @@ void DOS_FreeProcessMemory(Bit16u pspseg) { if (mcb.GetPSPSeg()==pspseg) { mcb.SetPSPSeg(MCB_FREE); } - if (mcb.GetType()==0x5a) break; + if (mcb.GetType()==0x5a) { + /* check if currently last block reaches up to the PCJr graphics memory */ + if ((machine==MCH_PCJR) && (mcb_segment+mcb.GetSize()==0x17fe) && + (real_readb(0x17ff,0)==0x4d) && (real_readw(0x17ff,1)==8)) { + /* re-enable the memory past segment 0x2000 */ + mcb.SetType(0x4d); + } else break; + } mcb_segment+=mcb.GetSize()+1; mcb.SetPt(mcb_segment); } diff --git a/src/dos/dos_programs.cpp b/src/dos/dos_programs.cpp index 423ace13..3432341d 100644 --- a/src/dos/dos_programs.cpp +++ b/src/dos/dos_programs.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dos_programs.cpp,v 1.48 2005-12-04 21:17:28 c2woody Exp $ */ +/* $Id: dos_programs.cpp,v 1.49 2005-12-19 20:39:51 c2woody Exp $ */ #include #include @@ -287,7 +287,9 @@ public: Bit16u seg,blocks;blocks=0xffff; DOS_AllocateMemory(&seg,&blocks); - WriteOut(MSG_Get("PROGRAM_MEM_CONVEN"),blocks*16/1024); + if ((machine==MCH_PCJR) && (real_readb(0x2000,0)==0x5a) && (real_readw(0x2000,1)==0) && (real_readw(0x2000,3)==0x7ffe)) { + WriteOut(MSG_Get("PROGRAM_MEM_CONVEN"),0x7ffe*16/1024); + } else WriteOut(MSG_Get("PROGRAM_MEM_CONVEN"),blocks*16/1024); if (umb_start!=0xffff) { DOS_LinkUMBsToMemChain(1); @@ -451,11 +453,7 @@ public: fclose(usefile); /* write cartridge data into ROM */ - Bit16u romseg=0xe000; - if ((rombuf[7]==0x42) && (rombuf[8]==0x41) && (rombuf[9]==0x53) && (rombuf[10]==0x49)) { - /* BASIC rom, doesn't work though */ - romseg=0xf600; - } + Bit16u romseg=host_readw(&bootarea.rawdata[0x1ce]); for(i=0;i