Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
7d8cfeb9
Commit
7d8cfeb9
authored
Aug 01, 1999
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Removed IP_reg, SP_reg and FL_reg definitions to avoid potential
aliasing optimization problems.
parent
bdf83bc5
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
99 additions
and
105 deletions
+99
-105
registers.c
debugger/registers.c
+23
-23
stack.c
debugger/stack.c
+1
-1
winaspi16.c
dlls/winaspi/winaspi16.c
+3
-3
snoop.c
if1632/snoop.c
+11
-11
winnt.h
include/winnt.h
+0
-5
segment.c
loader/ne/segment.c
+5
-5
error.c
misc/error.c
+4
-4
devices.c
msdos/devices.c
+7
-7
dpmi.c
msdos/dpmi.c
+34
-35
int21.c
msdos/int21.c
+3
-3
int33.c
msdos/int33.c
+8
-8
No files found.
debugger/registers.c
View file @
7d8cfeb9
...
...
@@ -31,22 +31,22 @@ void DEBUG_SetRegister( enum debug_regs reg, int val )
case
REG_EFL
:
EFL_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_EIP
:
EIP_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_ESP
:
ESP_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_AX
:
AX_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_BX
:
BX_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_CX
:
CX_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_DX
:
DX_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_SI
:
SI_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_DI
:
DI_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_BP
:
BP_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_FL
:
FL_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_IP
:
IP_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_SP
:
SP_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_CS
:
CS_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_DS
:
DS_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_ES
:
ES_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_SS
:
SS_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_FS
:
FS_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_GS
:
GS_reg
(
&
DEBUG_context
)
=
val
;
break
;
case
REG_AX
:
SET_LOWORD
(
EAX_reg
(
&
DEBUG_context
),
val
);
break
;
case
REG_BX
:
SET_LOWORD
(
EBX_reg
(
&
DEBUG_context
),
val
);
break
;
case
REG_CX
:
SET_LOWORD
(
ECX_reg
(
&
DEBUG_context
),
val
);
break
;
case
REG_DX
:
SET_LOWORD
(
EDX_reg
(
&
DEBUG_context
),
val
);
break
;
case
REG_SI
:
SET_LOWORD
(
ESI_reg
(
&
DEBUG_context
),
val
);
break
;
case
REG_DI
:
SET_LOWORD
(
EDI_reg
(
&
DEBUG_context
),
val
);
break
;
case
REG_BP
:
SET_LOWORD
(
EBP_reg
(
&
DEBUG_context
),
val
);
break
;
case
REG_FL
:
SET_LOWORD
(
EFL_reg
(
&
DEBUG_context
),
val
);
break
;
case
REG_IP
:
SET_LOWORD
(
EIP_reg
(
&
DEBUG_context
),
val
);
break
;
case
REG_SP
:
SET_LOWORD
(
ESP_reg
(
&
DEBUG_context
),
val
);
break
;
}
}
...
...
@@ -105,22 +105,22 @@ int DEBUG_GetRegister( enum debug_regs reg )
case
REG_EFL
:
return
EFL_reg
(
&
DEBUG_context
);
case
REG_EIP
:
return
EIP_reg
(
&
DEBUG_context
);
case
REG_ESP
:
return
ESP_reg
(
&
DEBUG_context
);
case
REG_AX
:
return
AX_reg
(
&
DEBUG_context
);
case
REG_BX
:
return
BX_reg
(
&
DEBUG_context
);
case
REG_CX
:
return
CX_reg
(
&
DEBUG_context
);
case
REG_DX
:
return
DX_reg
(
&
DEBUG_context
);
case
REG_SI
:
return
SI_reg
(
&
DEBUG_context
);
case
REG_DI
:
return
DI_reg
(
&
DEBUG_context
);
case
REG_BP
:
return
BP_reg
(
&
DEBUG_context
);
case
REG_FL
:
return
FL_reg
(
&
DEBUG_context
);
case
REG_IP
:
return
IP_reg
(
&
DEBUG_context
);
case
REG_SP
:
return
SP_reg
(
&
DEBUG_context
);
case
REG_CS
:
return
CS_reg
(
&
DEBUG_context
);
case
REG_DS
:
return
DS_reg
(
&
DEBUG_context
);
case
REG_ES
:
return
ES_reg
(
&
DEBUG_context
);
case
REG_SS
:
return
SS_reg
(
&
DEBUG_context
);
case
REG_FS
:
return
FS_reg
(
&
DEBUG_context
);
case
REG_GS
:
return
GS_reg
(
&
DEBUG_context
);
case
REG_AX
:
return
LOWORD
(
EAX_reg
(
&
DEBUG_context
));
case
REG_BX
:
return
LOWORD
(
EBX_reg
(
&
DEBUG_context
));
case
REG_CX
:
return
LOWORD
(
ECX_reg
(
&
DEBUG_context
));
case
REG_DX
:
return
LOWORD
(
EDX_reg
(
&
DEBUG_context
));
case
REG_SI
:
return
LOWORD
(
ESI_reg
(
&
DEBUG_context
));
case
REG_DI
:
return
LOWORD
(
EDI_reg
(
&
DEBUG_context
));
case
REG_BP
:
return
LOWORD
(
EBP_reg
(
&
DEBUG_context
));
case
REG_FL
:
return
LOWORD
(
EFL_reg
(
&
DEBUG_context
));
case
REG_IP
:
return
LOWORD
(
EIP_reg
(
&
DEBUG_context
));
case
REG_SP
:
return
LOWORD
(
ESP_reg
(
&
DEBUG_context
));
}
return
0
;
/* should not happen */
}
...
...
@@ -199,9 +199,9 @@ void DEBUG_InfoRegisters(void)
if
(
dbg_mode
==
16
)
{
fprintf
(
stderr
,
"
\n
IP:%04x SP:%04x BP:%04x FLAGS:%04x(%s)
\n
"
,
IP_reg
(
&
DEBUG_context
),
SP_reg
(
&
DEBUG_context
),
BP_reg
(
&
DEBUG_context
),
FL_reg
(
&
DEBUG_context
),
DEBUG_Flags
(
FL_reg
(
&
DEBUG_context
),
flag
));
LOWORD
(
EIP_reg
(
&
DEBUG_context
)),
LOWORD
(
ESP_reg
(
&
DEBUG_context
)
),
LOWORD
(
EBP_reg
(
&
DEBUG_context
)),
LOWORD
(
EFL_reg
(
&
DEBUG_context
)
),
DEBUG_Flags
(
LOWORD
(
EFL_reg
(
&
DEBUG_context
)
),
flag
));
fprintf
(
stderr
,
" AX:%04x BX:%04x CX:%04x DX:%04x SI:%04x DI:%04x
\n
"
,
AX_reg
(
&
DEBUG_context
),
BX_reg
(
&
DEBUG_context
),
CX_reg
(
&
DEBUG_context
),
DX_reg
(
&
DEBUG_context
),
...
...
debugger/stack.c
View file @
7d8cfeb9
...
...
@@ -211,7 +211,7 @@ static void DEBUG_DoBackTrace(int noisy)
is16
=
FALSE
;
}
else
{
frames
[
0
].
cs
=
addr
.
seg
=
cs
;
frames
[
0
].
eip
=
addr
.
off
=
IP_reg
(
&
DEBUG_context
);
frames
[
0
].
eip
=
addr
.
off
=
LOWORD
(
EIP_reg
(
&
DEBUG_context
)
);
if
(
noisy
)
frames
[
0
].
frame
=
DEBUG_PrintAddress
(
&
addr
,
16
,
TRUE
);
else
...
...
dlls/winaspi/winaspi16.c
View file @
7d8cfeb9
...
...
@@ -520,9 +520,9 @@ void WINAPI ASPI_DOS_func(CONTEXT86 *context)
ASPI_SendASPICommand
(
ptrSRB
,
ASPI_DOS
);
/* simulate a normal RETF sequence as required by DPMI CallRMProcFar */
IP_reg
(
context
)
=
*
(
stack
++
);
CS_reg
(
context
)
=
*
(
stack
++
);
SP_reg
(
context
)
+=
2
*
sizeof
(
WORD
);
E
IP_reg
(
context
)
=
*
(
stack
++
);
CS_reg
(
context
)
=
*
(
stack
++
);
E
SP_reg
(
context
)
+=
2
*
sizeof
(
WORD
);
}
...
...
if1632/snoop.c
View file @
7d8cfeb9
...
...
@@ -208,10 +208,10 @@ SNOOP16_GetProcAddress16(HMODULE16 hmod,DWORD ordinal,FARPROC16 origfun) {
return
(
FARPROC16
)(
SEGPTR
)
MAKELONG
(((
char
*
)
fun
-
(
char
*
)
dll
->
funs
),
dll
->
funhandle
);
}
#define CALLER1REF (*(DWORD*)(PTR_SEG_OFF_TO_LIN(SS_reg(context),
SP_reg(context
)+4)))
#define CALLER1REF (*(DWORD*)(PTR_SEG_OFF_TO_LIN(SS_reg(context),
LOWORD(ESP_reg(context)
)+4)))
void
WINAPI
SNOOP16_Entry
(
CONTEXT86
*
context
)
{
DWORD
ordinal
=
0
;
DWORD
entry
=
(
DWORD
)
PTR_SEG_OFF_TO_LIN
(
CS_reg
(
context
),
IP_reg
(
context
))
-
5
;
DWORD
entry
=
(
DWORD
)
PTR_SEG_OFF_TO_LIN
(
CS_reg
(
context
),
LOWORD
(
EIP_reg
(
context
)
))
-
5
;
WORD
xcs
=
CS_reg
(
context
);
SNOOP16_DLL
*
dll
=
firstdll
;
SNOOP16_FUN
*
fun
=
NULL
;
...
...
@@ -254,10 +254,10 @@ void WINAPI SNOOP16_Entry(CONTEXT86 *context) {
ret
->
dll
=
dll
;
ret
->
args
=
NULL
;
ret
->
ordinal
=
ordinal
;
ret
->
origSP
=
SP_reg
(
context
);
ret
->
origSP
=
LOWORD
(
ESP_reg
(
context
)
);
IP_reg
(
context
)
=
LOWORD
(
fun
->
origfun
);
CS_reg
(
context
)
=
HIWORD
(
fun
->
origfun
);
E
IP_reg
(
context
)
=
LOWORD
(
fun
->
origfun
);
CS_reg
(
context
)
=
HIWORD
(
fun
->
origfun
);
DPRINTF
(
"Call %s.%ld: %s("
,
dll
->
name
,
ordinal
,
fun
->
name
);
...
...
@@ -265,19 +265,19 @@ void WINAPI SNOOP16_Entry(CONTEXT86 *context) {
max
=
fun
->
nrofargs
;
if
(
max
>
16
)
max
=
16
;
for
(
i
=
max
;
i
--
;)
DPRINTF
(
"%04x%s"
,
*
(
WORD
*
)((
char
*
)
PTR_SEG_OFF_TO_LIN
(
SS_reg
(
context
),
SP_reg
(
context
))
+
8
+
sizeof
(
WORD
)
*
i
),
i
?
","
:
""
);
DPRINTF
(
"%04x%s"
,
*
(
WORD
*
)((
char
*
)
PTR_SEG_OFF_TO_LIN
(
SS_reg
(
context
),
LOWORD
(
ESP_reg
(
context
)
))
+
8
+
sizeof
(
WORD
)
*
i
),
i
?
","
:
""
);
if
(
max
!=
fun
->
nrofargs
)
DPRINTF
(
" ..."
);
}
else
if
(
fun
->
nrofargs
<
0
)
{
DPRINTF
(
"<unknown, check return>"
);
ret
->
args
=
HeapAlloc
(
SystemHeap
,
0
,
16
*
sizeof
(
WORD
));
memcpy
(
ret
->
args
,(
LPBYTE
)((
char
*
)
PTR_SEG_OFF_TO_LIN
(
SS_reg
(
context
),
SP_reg
(
context
))
+
8
),
sizeof
(
WORD
)
*
16
);
memcpy
(
ret
->
args
,(
LPBYTE
)((
char
*
)
PTR_SEG_OFF_TO_LIN
(
SS_reg
(
context
),
LOWORD
(
ESP_reg
(
context
)
))
+
8
),
sizeof
(
WORD
)
*
16
);
}
DPRINTF
(
") ret=%04x:%04x
\n
"
,
HIWORD
(
ret
->
origreturn
),
LOWORD
(
ret
->
origreturn
));
}
void
WINAPI
SNOOP16_Return
(
CONTEXT86
*
context
)
{
SNOOP16_RETURNENTRY
*
ret
=
(
SNOOP16_RETURNENTRY
*
)((
char
*
)
PTR_SEG_OFF_TO_LIN
(
CS_reg
(
context
),
IP_reg
(
context
))
-
5
);
SNOOP16_RETURNENTRY
*
ret
=
(
SNOOP16_RETURNENTRY
*
)((
char
*
)
PTR_SEG_OFF_TO_LIN
(
CS_reg
(
context
),
LOWORD
(
EIP_reg
(
context
)
))
-
5
);
/* We haven't found out the nrofargs yet. If we called a cdecl
* function it is too late anyway and we can just set '0' (which
...
...
@@ -285,10 +285,10 @@ void WINAPI SNOOP16_Return(CONTEXT86 *context) {
* If pascal -> everything ok.
*/
if
(
ret
->
dll
->
funs
[
ret
->
ordinal
].
nrofargs
<
0
)
{
ret
->
dll
->
funs
[
ret
->
ordinal
].
nrofargs
=
(
SP_reg
(
context
)
-
ret
->
origSP
-
4
)
/
2
;
ret
->
dll
->
funs
[
ret
->
ordinal
].
nrofargs
=
(
LOWORD
(
ESP_reg
(
context
)
)
-
ret
->
origSP
-
4
)
/
2
;
}
IP_reg
(
context
)
=
LOWORD
(
ret
->
origreturn
);
CS_reg
(
context
)
=
HIWORD
(
ret
->
origreturn
);
E
IP_reg
(
context
)
=
LOWORD
(
ret
->
origreturn
);
CS_reg
(
context
)
=
HIWORD
(
ret
->
origreturn
);
if
(
ret
->
args
)
{
int
i
,
max
;
...
...
include/winnt.h
View file @
7d8cfeb9
...
...
@@ -580,11 +580,6 @@ typedef HANDLE *PHANDLE;
#define DL_reg(context) (*(BYTE*)&EDX_reg(context))
#define DH_reg(context) (*((BYTE*)&EDX_reg(context)+1))
#define IP_reg(context) (*(WORD*)&EIP_reg(context))
#define SP_reg(context) (*(WORD*)&ESP_reg(context))
#define FL_reg(context) (*(WORD*)&EFL_reg(context))
#define SET_CFLAG(context) (EFL_reg(context) |= 0x0001)
#define RESET_CFLAG(context) (EFL_reg(context) &= ~0x0001)
#define SET_ZFLAG(context) (EFL_reg(context) |= 0x0040)
...
...
loader/ne/segment.c
View file @
7d8cfeb9
...
...
@@ -660,8 +660,8 @@ static BOOL NE_InitDLL( TDB* pTask, NE_MODULE *pModule )
pModule
->
cs
=
0
;
/* Don't initialize it twice */
TRACE_
(
dll
)(
"Calling LibMain, cs:ip=%04lx:%04x ds=%04lx di=%04x cx=%04x
\n
"
,
CS_reg
(
&
context
),
IP_reg
(
&
context
),
DS_reg
(
&
context
),
TRACE_
(
dll
)(
"Calling LibMain, cs:ip=%04lx:%04
l
x ds=%04lx di=%04x cx=%04x
\n
"
,
CS_reg
(
&
context
),
E
IP_reg
(
&
context
),
DS_reg
(
&
context
),
DI_reg
(
&
context
),
CX_reg
(
&
context
)
);
Callbacks
->
CallRegisterShortProc
(
&
context
,
0
);
return
TRUE
;
...
...
@@ -693,7 +693,7 @@ static void NE_CallDllEntryPoint( NE_MODULE *pModule, DWORD dwReason )
ES_reg
(
&
context
)
=
ds
;
/* who knows ... */
CS_reg
(
&
context
)
=
HIWORD
(
entryPoint
);
IP_reg
(
&
context
)
=
LOWORD
(
entryPoint
);
E
IP_reg
(
&
context
)
=
LOWORD
(
entryPoint
);
EBP_reg
(
&
context
)
=
OFFSETOF
(
NtCurrentTeb
()
->
cur_stack
)
+
(
WORD
)
&
((
STACK16FRAME
*
)
0
)
->
bp
;
...
...
@@ -704,8 +704,8 @@ static void NE_CallDllEntryPoint( NE_MODULE *pModule, DWORD dwReason )
*
(
DWORD
*
)(
stack
-
14
)
=
0
;
/* dwReserved1 */
*
(
WORD
*
)
(
stack
-
16
)
=
0
;
/* wReserved2 */
TRACE_
(
dll
)(
"Calling DllEntryPoint, cs:ip=%04lx:%04x
\n
"
,
CS_reg
(
&
context
),
IP_reg
(
&
context
));
TRACE_
(
dll
)(
"Calling DllEntryPoint, cs:ip=%04lx:%04
l
x
\n
"
,
CS_reg
(
&
context
),
E
IP_reg
(
&
context
));
Callbacks
->
CallRegisterShortProc
(
&
context
,
16
);
}
...
...
misc/error.c
View file @
7d8cfeb9
...
...
@@ -174,11 +174,11 @@ void WINAPI HandleParamError( CONTEXT86 *context )
to error handler (location at [bp-2]) */
WORD
*
stack
=
PTR_SEG_OFF_TO_LIN
(
SS_reg
(
context
),
BP_reg
(
context
)
);
SP_reg
(
context
)
=
BP_reg
(
context
)
-
2
;
BP_reg
(
context
)
=
stack
[
0
]
&
0xfffe
;
LOWORD
(
EBP_reg
(
context
))
);
ESP_reg
(
context
)
=
LOWORD
(
EBP_reg
(
context
)
)
-
2
;
E
BP_reg
(
context
)
=
stack
[
0
]
&
0xfffe
;
IP_reg
(
context
)
=
stack
[
-
1
];
E
IP_reg
(
context
)
=
stack
[
-
1
];
EAX_reg
(
context
)
=
ECX_reg
(
context
)
=
EDX_reg
(
context
)
=
0
;
ES_reg
(
context
)
=
0
;
...
...
msdos/devices.c
View file @
7d8cfeb9
...
...
@@ -132,9 +132,9 @@ static void do_lret(CONTEXT86*ctx)
{
WORD
*
stack
=
CTX_SEG_OFF_TO_LIN
(
ctx
,
SS_reg
(
ctx
),
ESP_reg
(
ctx
));
IP_reg
(
ctx
)
=
*
(
stack
++
);
CS_reg
(
ctx
)
=
*
(
stack
++
);
SP_reg
(
ctx
)
+=
2
*
sizeof
(
WORD
);
E
IP_reg
(
ctx
)
=
*
(
stack
++
);
CS_reg
(
ctx
)
=
*
(
stack
++
);
E
SP_reg
(
ctx
)
+=
2
*
sizeof
(
WORD
);
}
static
void
do_strategy
(
CONTEXT86
*
ctx
,
int
id
,
int
extra
)
...
...
@@ -522,17 +522,17 @@ static void DOSDEV_DoReq(void*req, DWORD dev)
memset
(
&
ctx
,
0
,
sizeof
(
ctx
));
/* ES:BX points to request for strategy routine */
ES_reg
(
&
ctx
)
=
HIWORD
(
DOS_LOLSeg
);
BX_reg
(
&
ctx
)
=
ALLDEV_OFS
;
ES_reg
(
&
ctx
)
=
HIWORD
(
DOS_LOLSeg
);
E
BX_reg
(
&
ctx
)
=
ALLDEV_OFS
;
/* call strategy routine */
CS_reg
(
&
ctx
)
=
SELECTOROF
(
dev
);
IP_reg
(
&
ctx
)
=
dhdr
->
strategy
;
E
IP_reg
(
&
ctx
)
=
dhdr
->
strategy
;
DPMI_CallRMProc
(
&
ctx
,
0
,
0
,
0
);
/* call interrupt routine */
CS_reg
(
&
ctx
)
=
SELECTOROF
(
dev
);
IP_reg
(
&
ctx
)
=
dhdr
->
interrupt
;
E
IP_reg
(
&
ctx
)
=
dhdr
->
interrupt
;
DPMI_CallRMProc
(
&
ctx
,
0
,
0
,
0
);
/* completed, copy request back */
...
...
msdos/dpmi.c
View file @
7d8cfeb9
...
...
@@ -173,9 +173,9 @@ static void INT_SetRealModeContext( REALMODECALL *call, CONTEXT86 *context )
call
->
esi
=
ESI_reg
(
context
);
call
->
edi
=
EDI_reg
(
context
);
call
->
ebp
=
EBP_reg
(
context
);
call
->
fl
=
FL_reg
(
context
);
call
->
ip
=
IP_reg
(
context
);
call
->
sp
=
SP_reg
(
context
);
call
->
fl
=
LOWORD
(
EFL_reg
(
context
)
);
call
->
ip
=
LOWORD
(
EIP_reg
(
context
)
);
call
->
sp
=
LOWORD
(
ESP_reg
(
context
)
);
call
->
cs
=
CS_reg
(
context
);
call
->
ds
=
DS_reg
(
context
);
call
->
es
=
ES_reg
(
context
);
...
...
@@ -277,7 +277,7 @@ int DPMI_CallRMProc( CONTEXT86 *context, LPWORD stack, int args, int iret )
EAX_reg
(
context
),
EBX_reg
(
context
),
ECX_reg
(
context
),
EDX_reg
(
context
)
);
TRACE
(
"ESI=%08lx EDI=%08lx ES=%04lx DS=%04lx CS:IP=%04lx:%04x, %d WORD arguments, %s
\n
"
,
ESI_reg
(
context
),
EDI_reg
(
context
),
ES_reg
(
context
),
DS_reg
(
context
),
CS_reg
(
context
),
IP_reg
(
context
),
args
,
iret
?
"IRET"
:
"FAR"
);
CS_reg
(
context
),
LOWORD
(
EIP_reg
(
context
)
),
args
,
iret
?
"IRET"
:
"FAR"
);
callrmproc_again:
...
...
@@ -286,23 +286,23 @@ callrmproc_again:
code
=
CTX_SEG_OFF_TO_LIN
(
context
,
CS_reg
(
context
),
EIP_reg
(
context
));
switch
(
*
code
)
{
case
0xe9
:
/* JMP NEAR */
IP_reg
(
context
)
+=
3
+
*
(
WORD
*
)(
code
+
1
);
E
IP_reg
(
context
)
+=
3
+
*
(
WORD
*
)(
code
+
1
);
/* yeah, I know these gotos don't look good... */
goto
callrmproc_again
;
case
0xea
:
/* JMP FAR */
IP_reg
(
context
)
=
*
(
WORD
*
)(
code
+
1
);
E
IP_reg
(
context
)
=
*
(
WORD
*
)(
code
+
1
);
CS_reg
(
context
)
=
*
(
WORD
*
)(
code
+
3
);
/* ...but since the label is there anyway... */
goto
callrmproc_again
;
case
0xeb
:
/* JMP SHORT */
IP_reg
(
context
)
+=
2
+
*
(
signed
char
*
)(
code
+
1
);
E
IP_reg
(
context
)
+=
2
+
*
(
signed
char
*
)(
code
+
1
);
/* ...because of other gotos below, so... */
goto
callrmproc_again
;
}
/* shortcut for chaining to internal interrupt handlers */
if
((
CS_reg
(
context
)
==
0xF000
)
&&
iret
)
{
return
INT_RealModeInterrupt
(
IP_reg
(
context
)
/
4
,
context
);
return
INT_RealModeInterrupt
(
LOWORD
(
EIP_reg
(
context
)
)
/
4
,
context
);
}
/* shortcut for RMCBs */
...
...
@@ -324,7 +324,7 @@ callrmproc_again:
if
(
!
SS_reg
(
context
))
{
alloc
=
1
;
/* allocate default stack */
stack16
=
addr
=
DOSMEM_GetBlock
(
pModule
->
self
,
64
,
(
UINT16
*
)
&
(
SS_reg
(
context
))
);
SP_reg
(
context
)
=
64
-
2
;
E
SP_reg
(
context
)
=
64
-
2
;
stack16
+=
32
-
1
;
if
(
!
addr
)
{
ERR
(
"could not allocate default stack
\n
"
);
...
...
@@ -333,7 +333,7 @@ callrmproc_again:
}
else
{
stack16
=
CTX_SEG_OFF_TO_LIN
(
context
,
SS_reg
(
context
),
ESP_reg
(
context
));
}
SP_reg
(
context
)
-=
(
args
+
(
iret
?
1
:
0
))
*
sizeof
(
WORD
);
E
SP_reg
(
context
)
-=
(
args
+
(
iret
?
1
:
0
))
*
sizeof
(
WORD
);
#else
if
(
!
already
)
{
stack16
=
(
LPWORD
)
CURRENT_STACK16
;
...
...
@@ -343,14 +343,14 @@ callrmproc_again:
/* push flags if iret */
if
(
iret
)
{
stack16
--
;
args
++
;
*
stack16
=
FL_reg
(
context
);
*
stack16
=
LOWORD
(
EFL_reg
(
context
)
);
}
#ifdef MZ_SUPPORTED
/* push return address (return to interrupt wrapper) */
*
(
--
stack16
)
=
DPMI_wrap_seg
;
*
(
--
stack16
)
=
0
;
/* adjust stack */
SP_reg
(
context
)
-=
2
*
sizeof
(
WORD
);
E
SP_reg
(
context
)
-=
2
*
sizeof
(
WORD
);
#endif
already
=
1
;
}
...
...
@@ -360,7 +360,7 @@ callrmproc_again:
DPMI_CallRMCBProc
(
context
,
CurrRMCB
,
pModule
->
lpDosTask
?
pModule
->
lpDosTask
->
dpmi_flag
:
0
);
/* check if we returned to where we thought we would */
if
((
CS_reg
(
context
)
!=
DPMI_wrap_seg
)
||
(
IP_reg
(
context
)
!=
0
))
{
(
LOWORD
(
EIP_reg
(
context
)
)
!=
0
))
{
/* we need to continue at different address in real-mode space,
so we need to set it all up for real mode again */
goto
callrmproc_again
;
...
...
@@ -370,12 +370,12 @@ callrmproc_again:
#if 0 /* this was probably unnecessary */
/* push call address */
*(--stack16) = CS_reg(context);
*(--stack16) =
IP_reg(context
);
*(--stack16) =
LOWORD(EIP_reg(context)
);
/* adjust stack */
SP_reg(context) -= 2*sizeof(WORD);
E
SP_reg(context) -= 2*sizeof(WORD);
/* set initial CS:IP to the wrapper's "lret" */
CS_reg(context) = DPMI_wrap_seg;
IP_reg(context) = 2;
E
IP_reg(context) = 2;
#endif
TRACE
(
"entering real mode...
\n
"
);
DOSVM_Enter
(
context
);
...
...
@@ -386,7 +386,7 @@ callrmproc_again:
seg_addr
=
PTR_SEG_OFF_TO_SEGPTR
(
sel
,
0
);
CS_reg
(
context
)
=
HIWORD
(
seg_addr
);
IP_reg
(
context
)
=
LOWORD
(
seg_addr
);
E
IP_reg
(
context
)
=
LOWORD
(
seg_addr
);
EBP_reg
(
context
)
=
OFFSETOF
(
NtCurrentTeb
()
->
cur_stack
)
+
(
WORD
)
&
((
STACK16FRAME
*
)
0
)
->
bp
;
Callbacks
->
CallRegisterShortProc
(
context
,
args
*
sizeof
(
WORD
));
...
...
@@ -452,7 +452,7 @@ static void CallRMProc( CONTEXT86 *context, int iret )
return
;
}
INT_GetRealModeContext
(
p
,
&
context16
);
DPMI_CallRMProc
(
&
context16
,
((
LPWORD
)
PTR_SEG_OFF_TO_LIN
(
SS_reg
(
context
),
SP_reg
(
context
)))
+
3
,
DPMI_CallRMProc
(
&
context16
,
((
LPWORD
)
PTR_SEG_OFF_TO_LIN
(
SS_reg
(
context
),
LOWORD
(
ESP_reg
(
context
)
)))
+
3
,
CX_reg
(
context
),
iret
);
INT_SetRealModeContext
(
p
,
&
context16
);
}
...
...
@@ -519,12 +519,12 @@ static void AllocRMCB( CONTEXT86 *context )
NewRMCB
->
proc_sel
=
DS_reg
(
context
);
NewRMCB
->
regs_ofs
=
DI_reg
(
context
);
NewRMCB
->
regs_sel
=
ES_reg
(
context
);
CX_reg
(
context
)
=
HIWORD
(
NewRMCB
->
address
);
DX_reg
(
context
)
=
LOWORD
(
NewRMCB
->
address
);
SET_LOWORD
(
ECX_reg
(
context
),
HIWORD
(
NewRMCB
->
address
)
);
SET_LOWORD
(
EDX_reg
(
context
),
LOWORD
(
NewRMCB
->
address
)
);
}
else
{
AX_reg
(
context
)
=
0x8015
;
/* callback unavailable */
SET_LOWORD
(
EAX_reg
(
context
),
0x8015
)
;
/* callback unavailable */
SET_CFLAG
(
context
);
}
}
...
...
@@ -575,7 +575,7 @@ static void FreeRMCB( CONTEXT86 *context )
CX_reg
(
context
),
DX_reg
(
context
));
if
(
DPMI_FreeRMCB
(
MAKELONG
(
DX_reg
(
context
),
CX_reg
(
context
))))
{
AX_reg
(
context
)
=
0x8024
;
/* invalid callback address */
SET_LOWORD
(
EAX_reg
(
context
),
0x8024
)
;
/* invalid callback address */
SET_CFLAG
(
context
);
}
}
...
...
@@ -621,8 +621,8 @@ static void StartPM( CONTEXT86 *context, LPDOSTASK lpDosTask )
pm_ctx
=
*
context
;
CS_reg
(
&
pm_ctx
)
=
lpDosTask
->
dpmi_sel
;
/* our mode switch wrapper expects the new CS in DX, and the new SS in AX */
AX_reg
(
&
pm_ctx
)
=
ss
;
DX_reg
(
&
pm_ctx
)
=
cs
;
E
AX_reg
(
&
pm_ctx
)
=
ss
;
E
DX_reg
(
&
pm_ctx
)
=
cs
;
DS_reg
(
&
pm_ctx
)
=
ds
;
ES_reg
(
&
pm_ctx
)
=
es
;
FS_reg
(
&
pm_ctx
)
=
0
;
...
...
@@ -775,10 +775,10 @@ void WINAPI INT_Int31Handler( CONTEXT86 *context )
{
case
0x0000
:
/* Allocate LDT descriptors */
TRACE
(
"allocate LDT descriptors (%d)
\n
"
,
CX_reg
(
context
));
if
(
!
(
AX_reg
(
context
)
=
AllocSelectorArray16
(
CX_reg
(
context
)
)))
if
(
!
(
E
AX_reg
(
context
)
=
AllocSelectorArray16
(
CX_reg
(
context
)
)))
{
TRACE
(
"failed
\n
"
);
AX_reg
(
context
)
=
0x8011
;
/* descriptor unavailable */
E
AX_reg
(
context
)
=
0x8011
;
/* descriptor unavailable */
SET_CFLAG
(
context
);
}
TRACE
(
"success, array starts at 0x%04x
\n
"
,
AX_reg
(
context
));
...
...
@@ -788,7 +788,7 @@ void WINAPI INT_Int31Handler( CONTEXT86 *context )
TRACE
(
"free LDT descriptor (0x%04x)
\n
"
,
BX_reg
(
context
));
if
(
FreeSelector16
(
BX_reg
(
context
)
))
{
AX_reg
(
context
)
=
0x8022
;
/* invalid selector */
E
AX_reg
(
context
)
=
0x8022
;
/* invalid selector */
SET_CFLAG
(
context
);
}
else
...
...
@@ -818,36 +818,35 @@ void WINAPI INT_Int31Handler( CONTEXT86 *context )
case
0xe000
:
entryPoint
=
190
;
break
;
/* __E000H */
case
0xf000
:
entryPoint
=
194
;
break
;
/* __F000H */
default:
AX_reg
(
context
)
=
DOSMEM_AllocSelector
(
BX_reg
(
context
));
E
AX_reg
(
context
)
=
DOSMEM_AllocSelector
(
BX_reg
(
context
));
break
;
}
if
(
entryPoint
)
AX_reg
(
context
)
=
LOWORD
(
NE_GetEntryPoint
(
GetModuleHandle16
(
"KERNEL"
),
entryPoint
));
EAX_reg
(
context
)
=
LOWORD
(
NE_GetEntryPoint
(
GetModuleHandle16
(
"KERNEL"
),
entryPoint
));
}
break
;
case
0x0003
:
/* Get next selector increment */
TRACE
(
"get selector increment (__AHINCR)
\n
"
);
AX_reg
(
context
)
=
__AHINCR
;
E
AX_reg
(
context
)
=
__AHINCR
;
break
;
case
0x0004
:
/* Lock selector (not supported) */
FIXME
(
"lock selector not supported
\n
"
);
AX_reg
(
context
)
=
0
;
/* FIXME: is this a correct return value? */
E
AX_reg
(
context
)
=
0
;
/* FIXME: is this a correct return value? */
break
;
case
0x0005
:
/* Unlock selector (not supported) */
FIXME
(
"unlock selector not supported
\n
"
);
AX_reg
(
context
)
=
0
;
/* FIXME: is this a correct return value? */
E
AX_reg
(
context
)
=
0
;
/* FIXME: is this a correct return value? */
break
;
case
0x0006
:
/* Get selector base address */
TRACE
(
"get selector base address (0x%04x)
\n
"
,
BX_reg
(
context
));
if
(
!
(
dw
=
GetSelectorBase
(
BX_reg
(
context
)
)))
{
AX_reg
(
context
)
=
0x8022
;
/* invalid selector */
E
AX_reg
(
context
)
=
0x8022
;
/* invalid selector */
SET_CFLAG
(
context
);
}
else
...
...
msdos/int21.c
View file @
7d8cfeb9
...
...
@@ -1130,7 +1130,7 @@ void WINAPI DOS3Call( CONTEXT86 *context )
if
(
scan
)
{
/* return pending scancode */
AL_reg
(
context
)
=
scan
;
FL_reg
(
context
)
&=
~
0x40
;
/* clear ZF */
E
FL_reg
(
context
)
&=
~
0x40
;
/* clear ZF */
scan
=
0
;
}
else
{
char
ascii
;
...
...
@@ -1138,13 +1138,13 @@ void WINAPI DOS3Call( CONTEXT86 *context )
CONSOLE_GetKeystroke
(
&
scan
,
&
ascii
);
/* return ASCII code */
AL_reg
(
context
)
=
ascii
;
FL_reg
(
context
)
&=
~
0x40
;
/* clear ZF */
E
FL_reg
(
context
)
&=
~
0x40
;
/* clear ZF */
/* return scan code on next call only if ascii==0 */
if
(
ascii
)
scan
=
0
;
}
else
{
/* nothing pending, clear everything */
AL_reg
(
context
)
=
0
;
FL_reg
(
context
)
|=
0x40
;
/* set ZF */
E
FL_reg
(
context
)
|=
0x40
;
/* set ZF */
scan
=
0
;
/* just in case */
}
}
...
...
msdos/int33.c
View file @
7d8cfeb9
...
...
@@ -59,14 +59,14 @@ static void MouseRelay(LPDOSTASK lpDosTask,CONTEXT86 *context,void *mdata)
MCALLDATA
*
data
=
(
MCALLDATA
*
)
mdata
;
CONTEXT86
ctx
=
*
context
;
AX_reg
(
&
ctx
)
=
data
->
mask
;
BX_reg
(
&
ctx
)
=
data
->
but
;
CX_reg
(
&
ctx
)
=
data
->
x
;
DX_reg
(
&
ctx
)
=
data
->
y
;
SI_reg
(
&
ctx
)
=
data
->
mx
;
DI_reg
(
&
ctx
)
=
data
->
my
;
CS_reg
(
&
ctx
)
=
SELECTOROF
(
data
->
proc
);
IP_reg
(
&
ctx
)
=
OFFSETOF
(
data
->
proc
);
E
AX_reg
(
&
ctx
)
=
data
->
mask
;
E
BX_reg
(
&
ctx
)
=
data
->
but
;
E
CX_reg
(
&
ctx
)
=
data
->
x
;
E
DX_reg
(
&
ctx
)
=
data
->
y
;
E
SI_reg
(
&
ctx
)
=
data
->
mx
;
E
DI_reg
(
&
ctx
)
=
data
->
my
;
CS_reg
(
&
ctx
)
=
SELECTOROF
(
data
->
proc
);
E
IP_reg
(
&
ctx
)
=
OFFSETOF
(
data
->
proc
);
free
(
data
);
DPMI_CallRMProc
(
&
ctx
,
NULL
,
0
,
0
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment