Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dosbox-staging/dosbox-staging.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorripsaw8080 <ripsaw8080@users.sourceforge.net>2022-07-14 22:05:21 +0300
committerkcgen <kcgen@users.noreply.github.com>2022-07-14 22:14:09 +0300
commitdc449ac9714595ecd83f7f4b66df8e89326165c5 (patch)
tree95667446e7d14719964aadade2163d395656b70c
parent1ef4f3796e5458a895a3bfee1cfc3c7a74720601 (diff)
parent6314c03bcba892994746bdcf83cc25928d229330 (diff)
Merge branch 'svn/trunk' into kc/merge-r4481kc/merge-r4481
-rw-r--r--src/cpu/callback.cpp20
-rw-r--r--src/dos/dos.cpp12
-rw-r--r--src/dos/dos_execute.cpp55
-rw-r--r--src/dos/dos_mscdex.cpp5
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;