diff options
author | ripsaw8080 <ripsaw8080@users.sourceforge.net> | 2022-07-14 22:05:21 +0300 |
---|---|---|
committer | kcgen <kcgen@users.noreply.github.com> | 2022-07-14 22:14:09 +0300 |
commit | dc449ac9714595ecd83f7f4b66df8e89326165c5 (patch) | |
tree | 95667446e7d14719964aadade2163d395656b70c | |
parent | 1ef4f3796e5458a895a3bfee1cfc3c7a74720601 (diff) | |
parent | 6314c03bcba892994746bdcf83cc25928d229330 (diff) |
Merge branch 'svn/trunk' into kc/merge-r4481kc/merge-r4481
-rw-r--r-- | src/cpu/callback.cpp | 20 | ||||
-rw-r--r-- | src/dos/dos.cpp | 12 | ||||
-rw-r--r-- | src/dos/dos_execute.cpp | 55 | ||||
-rw-r--r-- | src/dos/dos_mscdex.cpp | 5 |
4 files changed, 40 insertions, 52 deletions
diff --git a/src/cpu/callback.cpp b/src/cpu/callback.cpp index 36afbbdd9..71b61842d 100644 --- a/src/cpu/callback.cpp +++ b/src/cpu/callback.cpp @@ -87,10 +87,10 @@ static Bitu stop_handler(void) { void CALLBACK_RunRealFar(uint16_t seg,uint16_t off) { reg_sp-=4; - mem_writew(SegPhys(ss)+reg_sp,RealOff(CALLBACK_RealPointer(call_stop))); - mem_writew(SegPhys(ss)+reg_sp+2,RealSeg(CALLBACK_RealPointer(call_stop))); - uint32_t oldeip=reg_eip; - uint16_t oldcs=SegValue(cs); + real_writew(SegValue(ss),reg_sp+0,RealOff(CALLBACK_RealPointer(call_stop))); + real_writew(SegValue(ss),reg_sp+2,RealSeg(CALLBACK_RealPointer(call_stop))); + auto oldeip=reg_eip; + auto oldcs=SegValue(cs); reg_eip=off; SegSet16(cs,seg); DOSBOX_RunMachine(); @@ -109,24 +109,24 @@ void CALLBACK_RunRealInt(uint8_t intnum) { } void CALLBACK_SZF(bool val) { - uint16_t tempf = mem_readw(SegPhys(ss)+reg_sp+4); + auto tempf = real_readw(SegValue(ss),reg_sp+4); if (val) tempf |= FLAG_ZF; else tempf &= ~FLAG_ZF; - mem_writew(SegPhys(ss)+reg_sp+4,tempf); + real_writew(SegValue(ss),reg_sp+4,tempf); } void CALLBACK_SCF(bool val) { - uint16_t tempf = mem_readw(SegPhys(ss)+reg_sp+4); + auto tempf = real_readw(SegValue(ss),reg_sp+4); if (val) tempf |= FLAG_CF; else tempf &= ~FLAG_CF; - mem_writew(SegPhys(ss)+reg_sp+4,tempf); + real_writew(SegValue(ss),reg_sp+4,tempf); } void CALLBACK_SIF(bool val) { - uint16_t tempf = mem_readw(SegPhys(ss)+reg_sp+4); + auto tempf = real_readw(SegValue(ss),reg_sp+4); if (val) tempf |= FLAG_IF; else tempf &= ~FLAG_IF; - mem_writew(SegPhys(ss)+reg_sp+4,tempf); + real_writew(SegValue(ss),reg_sp+4,tempf); } void CALLBACK_SetDescription(Bitu nr, const char* descr) { diff --git a/src/dos/dos.cpp b/src/dos/dos.cpp index 092d6f16d..630af0937 100644 --- a/src/dos/dos.cpp +++ b/src/dos/dos.cpp @@ -284,6 +284,16 @@ static Bitu DOS_21Handler(void) { if (((reg_ah != 0x50) && (reg_ah != 0x51) && (reg_ah != 0x62) && (reg_ah != 0x64)) && (reg_ah<0x6c)) { DOS_PSP psp(dos.psp()); psp.SetStack(RealMake(SegValue(ss),reg_sp-18)); + /* Save registers */ + real_writew(SegValue(ss),reg_sp-18,reg_ax); + real_writew(SegValue(ss),reg_sp-16,reg_bx); + real_writew(SegValue(ss),reg_sp-14,reg_cx); + real_writew(SegValue(ss),reg_sp-12,reg_dx); + real_writew(SegValue(ss),reg_sp-10,reg_si); + real_writew(SegValue(ss),reg_sp- 8,reg_di); + real_writew(SegValue(ss),reg_sp- 6,reg_bp); + real_writew(SegValue(ss),reg_sp- 4,SegValue(ds)); + real_writew(SegValue(ss),reg_sp- 2,SegValue(es)); } char name1[DOSNAMEBUF+2+DOS_NAMELENGTH_ASCII]; @@ -293,7 +303,7 @@ static Bitu DOS_21Handler(void) { switch (reg_ah) { case 0x00: /* Terminate Program */ - DOS_Terminate(mem_readw(SegPhys(ss)+reg_sp+2),false,0); + DOS_Terminate(real_readw(SegValue(ss),reg_sp+2),false,0); break; case 0x01: /* Read character from STDIN, with echo */ { diff --git a/src/dos/dos_execute.cpp b/src/dos/dos_execute.cpp index ad180f169..9d24d213d 100644 --- a/src/dos/dos_execute.cpp +++ b/src/dos/dos_execute.cpp @@ -64,33 +64,6 @@ struct EXE_Header { #define OVERLAY 3 - -static void SaveRegisters(void) { - reg_sp-=18; - mem_writew(SegPhys(ss)+reg_sp+ 0,reg_ax); - mem_writew(SegPhys(ss)+reg_sp+ 2,reg_cx); - mem_writew(SegPhys(ss)+reg_sp+ 4,reg_dx); - mem_writew(SegPhys(ss)+reg_sp+ 6,reg_bx); - mem_writew(SegPhys(ss)+reg_sp+ 8,reg_si); - mem_writew(SegPhys(ss)+reg_sp+10,reg_di); - mem_writew(SegPhys(ss)+reg_sp+12,reg_bp); - mem_writew(SegPhys(ss)+reg_sp+14,SegValue(ds)); - mem_writew(SegPhys(ss)+reg_sp+16,SegValue(es)); -} - -static void RestoreRegisters(void) { - reg_ax=mem_readw(SegPhys(ss)+reg_sp+ 0); - reg_cx=mem_readw(SegPhys(ss)+reg_sp+ 2); - reg_dx=mem_readw(SegPhys(ss)+reg_sp+ 4); - reg_bx=mem_readw(SegPhys(ss)+reg_sp+ 6); - reg_si=mem_readw(SegPhys(ss)+reg_sp+ 8); - reg_di=mem_readw(SegPhys(ss)+reg_sp+10); - reg_bp=mem_readw(SegPhys(ss)+reg_sp+12); - SegSet16(ds,mem_readw(SegPhys(ss)+reg_sp+14)); - SegSet16(es,mem_readw(SegPhys(ss)+reg_sp+16)); - reg_sp+=18; -} - extern void GFX_SetTitle(int32_t cycles,int frameskip,bool paused); void DOS_UpdatePSPName(void) { DOS_MCB mcb(dos.psp()-1); @@ -127,14 +100,23 @@ void DOS_Terminate(uint16_t pspseg,bool tsr,uint8_t exitcode) { /* Restore the SS:SP to the previous one */ SegSet16(ss,RealSeg(parentpsp.GetStack())); reg_sp = RealOff(parentpsp.GetStack()); - /* Restore the old CS:IP from int 22h */ - RestoreRegisters(); + /* Restore registers */ + reg_ax = real_readw(SegValue(ss),reg_sp+ 0); + reg_bx = real_readw(SegValue(ss),reg_sp+ 2); + reg_cx = real_readw(SegValue(ss),reg_sp+ 4); + reg_dx = real_readw(SegValue(ss),reg_sp+ 6); + reg_si = real_readw(SegValue(ss),reg_sp+ 8); + reg_di = real_readw(SegValue(ss),reg_sp+10); + reg_bp = real_readw(SegValue(ss),reg_sp+12); + SegSet16(ds,real_readw(SegValue(ss),reg_sp+14)); + SegSet16(es,real_readw(SegValue(ss),reg_sp+16)); + reg_sp+=18; /* Set the CS:IP stored in int 0x22 back on the stack */ - mem_writew(SegPhys(ss)+reg_sp+0,RealOff(old22)); - mem_writew(SegPhys(ss)+reg_sp+2,RealSeg(old22)); + real_writew(SegValue(ss),reg_sp+0,RealOff(old22)); + real_writew(SegValue(ss),reg_sp+2,RealSeg(old22)); /* set IOPL=3 (Strike Commander), nested task set, interrupts enabled, test flags cleared */ - mem_writew(SegPhys(ss)+reg_sp+4,0x7202); + real_writew(SegValue(ss),reg_sp+4,0x7202); // Free memory owned by process if (!tsr) DOS_FreeProcessMemory(pspseg); DOS_UpdatePSPName(); @@ -227,11 +209,8 @@ bool DOS_ChildPSP(uint16_t segment, uint16_t size) { psp.SetFCB1(RealMake(parent_psp_seg,0x5c)); psp.SetFCB2(RealMake(parent_psp_seg,0x6c)); psp.SetEnvironment(psp_parent.GetEnvironment()); + psp.SetStack(psp_parent.GetStack()); psp.SetSize(size); - // push registers in case child PSP is terminated - SaveRegisters(); - psp.SetStack(RealMakeSeg(ss,reg_sp)); - reg_sp+=18; return true; } @@ -439,8 +418,8 @@ bool DOS_Execute(char * name,PhysPt block_pt,uint8_t flags) { if ((flags==LOAD) || (flags==LOADNGO)) { /* Get Caller's program CS:IP of the stack and set termination address to that */ - RealSetVec(0x22,RealMake(mem_readw(SegPhys(ss)+reg_sp+2),mem_readw(SegPhys(ss)+reg_sp))); - SaveRegisters(); + RealSetVec(0x22,RealMake(real_readw(SegValue(ss),reg_sp+2),real_readw(SegValue(ss),reg_sp))); + reg_sp-=18; DOS_PSP callpsp(dos.psp()); /* Save the SS:SP on the PSP of calling program */ callpsp.SetStack(RealMakeSeg(ss,reg_sp)); diff --git a/src/dos/dos_mscdex.cpp b/src/dos/dos_mscdex.cpp index 8e1cf8212..9a388f87c 100644 --- a/src/dos/dos_mscdex.cpp +++ b/src/dos/dos_mscdex.cpp @@ -1212,10 +1212,9 @@ static bool MSCDEX_Handler(void) { if(reg_ah == 0x11) { if(reg_al == 0x00) { if (mscdex->rootDriverHeaderSeg==0) return false; - PhysPt check = PhysMake(SegValue(ss),reg_sp); - if(mem_readw(check+6) == 0xDADA) { + if(real_readw(SegValue(ss),reg_sp+6) == 0xDADA) { //MSCDEX sets word on stack to ADAD if it DADA on entry. - mem_writew(check+6,0xADAD); + real_writew(SegValue(ss),reg_sp+6,0xADAD); } reg_al = 0xff; return true; |