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
ab163db7
Commit
ab163db7
authored
Nov 23, 2002
by
Jukka Heinonen
Committed by
Alexandre Julliard
Nov 23, 2002
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move int2f handler to winedos.
Clean winedos headers a bit.
parent
1d8cb6ef
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
491 additions
and
494 deletions
+491
-494
kernel32.spec
dlls/kernel/kernel32.spec
+2
-1
Makefile.in
dlls/ntdll/Makefile.in
+0
-1
Makefile.in
dlls/winedos/Makefile.in
+1
-0
dosexe.h
dlls/winedos/dosexe.h
+15
-2
int2f.c
dlls/winedos/int2f.c
+473
-472
interrupts.c
dlls/winedos/interrupts.c
+0
-2
miscemu.h
include/miscemu.h
+0
-16
No files found.
dlls/kernel/kernel32.spec
View file @
ab163db7
...
...
@@ -999,6 +999,8 @@
@ stdcall GetSelectorBase(long) GetSelectorBase
@ stdcall GetSelectorLimit16(long) GetSelectorLimit16
@ stdcall GetThreadQueue16(long) GetThreadQueue16
@ stdcall GetVersion16() GetVersion16
@ stdcall GetWinFlags16() GetWinFlags16
@ stdcall GlobalDOSAlloc16(long) GlobalDOSAlloc16
@ stdcall GlobalDOSFree16(long) GlobalDOSFree16
@ stdcall GlobalFlags16(long) GlobalFlags16
...
...
@@ -1053,7 +1055,6 @@
@ stdcall INT_Int15Handler(ptr) INT_Int15Handler
@ stdcall INT_Int25Handler(ptr) INT_Int25Handler
@ stdcall INT_Int26Handler(ptr) INT_Int26Handler
@ stdcall INT_Int2fHandler(ptr) INT_Int2fHandler
@ stdcall NetBIOSCall16(ptr) NetBIOSCall16
@ cdecl LOCAL_Alloc(long long long) LOCAL_Alloc
@ cdecl LOCAL_Compact(long long long) LOCAL_Compact
...
...
dlls/ntdll/Makefile.in
View file @
ab163db7
...
...
@@ -55,7 +55,6 @@ C_SRCS = \
$(TOPOBJDIR)
/msdos/int21.c
\
$(TOPOBJDIR)
/msdos/int25.c
\
$(TOPOBJDIR)
/msdos/int26.c
\
$(TOPOBJDIR)
/msdos/int2f.c
\
$(TOPOBJDIR)
/msdos/int5c.c
\
$(TOPOBJDIR)
/msdos/ioports.c
\
$(TOPOBJDIR)
/msdos/ppdev.c
\
...
...
dlls/winedos/Makefile.in
View file @
ab163db7
...
...
@@ -28,6 +28,7 @@ C_SRCS = \
int21.c
\
int29.c
\
int2a.c
\
int2f.c
\
int31.c
\
int33.c
\
int41.c
\
...
...
dlls/winedos/dosexe.h
View file @
ab163db7
...
...
@@ -30,7 +30,15 @@
struct
_DOSEVENT
;
struct
DPMI_segments
;
/* 48-bit segmented pointers for DOS DPMI32 */
typedef
struct
{
WORD
selector
;
DWORD
offset
;
}
SEGPTR48
,
FARPROC48
;
typedef
void
(
*
DOSRELAY
)(
CONTEXT86
*
,
void
*
);
typedef
void
(
WINAPI
*
RMCBPROC
)(
CONTEXT86
*
);
typedef
void
(
WINAPI
*
INTPROC
)(
CONTEXT86
*
);
#define DOS_PRIORITY_REALTIME 0
/* IRQ0 */
#define DOS_PRIORITY_KEYBOARD 1
/* IRQ1 */
...
...
@@ -51,12 +59,16 @@ extern const struct DPMI_segments *DOSVM_dpmi_segments;
#define BIOS_DATA ((void *)0x400)
/* module.c */
extern
void
WINAPI
MZ_LoadImage
(
LPCSTR
filename
,
HANDLE
hFile
);
extern
BOOL
WINAPI
MZ_Exec
(
CONTEXT86
*
context
,
LPCSTR
filename
,
BYTE
func
,
LPVOID
paramblk
);
extern
void
WINAPI
MZ_Exit
(
CONTEXT86
*
context
,
BOOL
cs_psp
,
WORD
retval
);
extern
BOOL
WINAPI
MZ_Current
(
void
);
extern
void
WINAPI
MZ_AllocDPMITask
(
void
);
extern
void
WINAPI
MZ_RunInThread
(
PAPCFUNC
proc
,
ULONG_PTR
arg
);
extern
BOOL
DOSVM_IsWin16
(
void
);
/* dosvm.c */
extern
INT
WINAPI
DOSVM_Enter
(
CONTEXT86
*
context
);
extern
void
WINAPI
DOSVM_Wait
(
INT
read_pipe
,
HANDLE
hObject
);
extern
DWORD
WINAPI
DOSVM_Loop
(
HANDLE
hThread
);
...
...
@@ -65,7 +77,6 @@ extern void WINAPI DOSVM_PIC_ioport_out( WORD port, BYTE val );
extern
void
WINAPI
DOSVM_SetTimer
(
UINT
ticks
);
extern
UINT
WINAPI
DOSVM_GetTimer
(
void
);
extern
void
DOSVM_RealModeInterrupt
(
BYTE
intnum
,
CONTEXT86
*
context
);
extern
BOOL
DOSVM_IsWin16
(
void
);
/* devices.c */
extern
void
DOSDEV_InstallDOSDevices
(
void
);
...
...
@@ -137,8 +148,10 @@ extern void WINAPI DOSVM_Int29Handler(CONTEXT86*);
/* int2a.c */
extern
void
WINAPI
DOSVM_Int2aHandler
(
CONTEXT86
*
);
/* int2f.c */
extern
void
WINAPI
DOSVM_Int2fHandler
(
CONTEXT86
*
);
/* int31.c */
typedef
void
(
WINAPI
*
RMCBPROC
)(
CONTEXT86
*
);
extern
void
WINAPI
DOSVM_Int31Handler
(
CONTEXT86
*
);
extern
BOOL
DOSVM_IsDos32
(
void
);
extern
FARPROC16
WINAPI
DPMI_AllocInternalRMCB
(
RMCBPROC
);
...
...
ms
dos/int2f.c
→
dlls/wine
dos/int2f.c
View file @
ab163db7
...
...
@@ -32,6 +32,7 @@
#include "winioctl.h"
#include "ntddstor.h"
#include "ntddcdrm.h"
#include "dosexe.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
int
);
...
...
@@ -42,11 +43,11 @@ static void do_int2f_16( CONTEXT86 *context );
static
void
MSCDEX_Handler
(
CONTEXT86
*
context
);
/**********************************************************************
*
INT_Int2fHandler (WPROCS
.147)
*
DOSVM_Int2fHandler (WINEDOS16
.147)
*
* Handler for int 2fh (multiplex).
*/
void
WINAPI
INT
_Int2fHandler
(
CONTEXT86
*
context
)
void
WINAPI
DOSVM
_Int2fHandler
(
CONTEXT86
*
context
)
{
TRACE
(
"Subfunction 0x%X
\n
"
,
AX_reg
(
context
));
...
...
@@ -66,7 +67,7 @@ void WINAPI INT_Int2fHandler( CONTEXT86 *context )
/* not installed */
break
;
default:
INT_BARF
(
context
,
0x2f
);
INT_BARF
(
context
,
0x2f
);
break
;
}
break
;
...
...
@@ -87,7 +88,7 @@ void WINAPI INT_Int2fHandler( CONTEXT86 *context )
break
;
/* Instead of having a message table in DOS-space, */
/* we can use a special case for MS-DOS to force */
/* the secondary interface.
*/
/* the secondary interface.
*/
case
0x00
:
case
0x02
:
case
0x04
:
...
...
@@ -121,26 +122,26 @@ void WINAPI INT_Int2fHandler( CONTEXT86 *context )
case
0x43
:
#if 1
switch
(
LOBYTE
(
context
->
Eax
))
{
case
0x00
:
/* XMS v2+ installation check */
WARN
(
"XMS is not fully implemented
\n
"
);
SET_AL
(
context
,
0x80
);
break
;
case
0x10
:
/* XMS v2+ get driver address */
{
context
->
SegEs
=
DOS
MEM_dpmi_segments
.
xms_seg
;
switch
(
LOBYTE
(
context
->
Eax
))
{
case
0x00
:
/* XMS v2+ installation check */
WARN
(
"XMS is not fully implemented
\n
"
);
SET_AL
(
context
,
0x80
);
break
;
case
0x10
:
/* XMS v2+ get driver address */
{
context
->
SegEs
=
DOS
VM_dpmi_segments
->
xms_seg
;
SET_BX
(
context
,
0
);
break
;
}
default:
INT_BARF
(
context
,
0x2f
);
}
}
default:
INT_BARF
(
context
,
0x2f
);
}
#else
FIXME
(
"check for XMS (not supported)
\n
"
);
SET_AL
(
context
,
0x42
);
/* != 0x80 */
FIXME
(
"check for XMS (not supported)
\n
"
);
SET_AL
(
context
,
0x42
);
/* != 0x80 */
#endif
break
;
break
;
case
0x45
:
switch
(
LOBYTE
(
context
->
Eax
))
...
...
@@ -164,8 +165,8 @@ void WINAPI INT_Int2fHandler( CONTEXT86 *context )
case
0x4a
:
switch
(
LOBYTE
(
context
->
Eax
))
{
case
0x10
:
/* smartdrv */
break
;
/* not installed */
case
0x10
:
/* smartdrv */
break
;
/* not installed */
case
0x11
:
/* dblspace */
break
;
/* not installed */
case
0x12
:
/* realtime compression interface */
...
...
@@ -177,40 +178,40 @@ void WINAPI INT_Int2fHandler( CONTEXT86 *context )
}
break
;
case
0x4b
:
switch
(
LOBYTE
(
context
->
Eax
))
{
case
0x01
:
case
0x02
:
case
0x03
:
case
0x04
:
case
0x05
:
FIXME
(
"Task Switcher - not implemented
\n
"
);
break
;
default:
INT_BARF
(
context
,
0x2f
);
}
break
;
switch
(
LOBYTE
(
context
->
Eax
))
{
case
0x01
:
case
0x02
:
case
0x03
:
case
0x04
:
case
0x05
:
FIXME
(
"Task Switcher - not implemented
\n
"
);
break
;
default:
INT_BARF
(
context
,
0x2f
);
}
break
;
case
0x56
:
/* INTERLNK */
switch
(
LOBYTE
(
context
->
Eax
))
{
case
0x01
:
/* check if redirected drive */
SET_AL
(
context
,
0
);
/* not redirected */
break
;
default:
INT_BARF
(
context
,
0x2f
);
}
break
;
switch
(
LOBYTE
(
context
->
Eax
))
{
case
0x01
:
/* check if redirected drive */
SET_AL
(
context
,
0
);
/* not redirected */
break
;
default:
INT_BARF
(
context
,
0x2f
);
}
break
;
case
0x7a
:
/* NOVELL NetWare */
switch
(
LOBYTE
(
context
->
Eax
))
{
case
0x0
:
/* Low-level Netware installation check AL=0 not installed.*/
case
0x0
:
/* Low-level Netware installation check AL=0 not installed.*/
SET_AL
(
context
,
0
);
break
;
case
0x20
:
/* Get VLM Call Address */
/* return nothing -> NetWare not installed */
break
;
default:
INT_BARF
(
context
,
0x2f
);
INT_BARF
(
context
,
0x2f
);
break
;
}
break
;
...
...
@@ -224,13 +225,13 @@ void WINAPI INT_Int2fHandler( CONTEXT86 *context )
/* not installed */
break
;
default:
INT_BARF
(
context
,
0x2f
);
INT_BARF
(
context
,
0x2f
);
break
;
}
break
;
case
0xbd
:
/* some Novell network install check ??? */
SET_AX
(
context
,
0xa5a5
);
/* pretend to have Novell IPX installed */
break
;
break
;
case
0xbf
:
/* REDIRIFS.EXE */
switch
(
LOBYTE
(
context
->
Eax
))
{
...
...
@@ -238,23 +239,23 @@ void WINAPI INT_Int2fHandler( CONTEXT86 *context )
/* not installed */
break
;
default:
INT_BARF
(
context
,
0x2f
);
INT_BARF
(
context
,
0x2f
);
break
;
}
break
;
case
0xd2
:
switch
(
LOBYTE
(
context
->
Eax
))
{
case
0x01
:
/* Quarterdeck RPCI - QEMM/QRAM - PCL-838.EXE functions */
if
(
BX_reg
(
context
)
==
0x5145
&&
CX_reg
(
context
)
==
0x4D4D
&&
DX_reg
(
context
)
==
0x3432
)
TRACE
(
"Check for QEMM v5.0+ (not installed)
\n
"
);
break
;
default:
INT_BARF
(
context
,
0x2f
);
break
;
}
break
;
switch
(
LOBYTE
(
context
->
Eax
))
{
case
0x01
:
/* Quarterdeck RPCI - QEMM/QRAM - PCL-838.EXE functions */
if
(
BX_reg
(
context
)
==
0x5145
&&
CX_reg
(
context
)
==
0x4D4D
&&
DX_reg
(
context
)
==
0x3432
)
TRACE
(
"Check for QEMM v5.0+ (not installed)
\n
"
);
break
;
default:
INT_BARF
(
context
,
0x2f
);
break
;
}
break
;
case
0xd7
:
/* Banyan Vines */
switch
(
LOBYTE
(
context
->
Eax
))
{
...
...
@@ -262,23 +263,23 @@ void WINAPI INT_Int2fHandler( CONTEXT86 *context )
/* not installed */
break
;
default:
INT_BARF
(
context
,
0x2f
);
INT_BARF
(
context
,
0x2f
);
break
;
}
break
;
case
0xde
:
switch
(
LOBYTE
(
context
->
Eax
))
{
case
0x01
:
/* Quarterdeck QDPMI.SYS - DESQview */
if
(
BX_reg
(
context
)
==
0x4450
&&
CX_reg
(
context
)
==
0x4d49
&&
DX_reg
(
context
)
==
0x8f4f
)
TRACE
(
"Check for QDPMI.SYS (not installed)
\n
"
);
break
;
default:
INT_BARF
(
context
,
0x2f
);
break
;
}
break
;
switch
(
LOBYTE
(
context
->
Eax
))
{
case
0x01
:
/* Quarterdeck QDPMI.SYS - DESQview */
if
(
BX_reg
(
context
)
==
0x4450
&&
CX_reg
(
context
)
==
0x4d49
&&
DX_reg
(
context
)
==
0x8f4f
)
TRACE
(
"Check for QDPMI.SYS (not installed)
\n
"
);
break
;
default:
INT_BARF
(
context
,
0x2f
);
break
;
}
break
;
case
0xfa
:
/* Watcom debugger check, returns 0x666 if installed */
break
;
default:
...
...
@@ -289,7 +290,7 @@ void WINAPI INT_Int2fHandler( CONTEXT86 *context )
/**********************************************************************
*
do_int2f_16
*
do_int2f_16
*/
static
void
do_int2f_16
(
CONTEXT86
*
context
)
{
...
...
@@ -317,19 +318,19 @@ static void do_int2f_16( CONTEXT86 *context )
break
;
case
0x80
:
/* Release time-slice */
/* Linux sched_yield() still keeps burning CPU cycles
* if the current process is the only one in highest priority list
* (as Linux will immediately return to this process to waste
* more CPU cycles), so sched_yield() is essentially useless for us
* (poor API, if you ask me: its return code should indicate
* whether other processes did run in between, in order for us
* to be able to decide whether to do an additional Sleep() or not...)
* Thus we better unconditionally use a well-balanced Sleep()
* instead to really make sure the process calling int 0x2f/0x1680
* *doesn't* use 100% CPU...
*/
Sleep
(
55
);
/* just wait 55ms (one "timer tick") for now. */
SET_AL
(
context
,
0
);
/* Linux sched_yield() still keeps burning CPU cycles
* if the current process is the only one in highest priority list
* (as Linux will immediately return to this process to waste
* more CPU cycles), so sched_yield() is essentially useless for us
* (poor API, if you ask me: its return code should indicate
* whether other processes did run in between, in order for us
* to be able to decide whether to do an additional Sleep() or not...)
* Thus we better unconditionally use a well-balanced Sleep()
* instead to really make sure the process calling int 0x2f/0x1680
* *doesn't* use 100% CPU...
*/
Sleep
(
55
);
/* just wait 55ms (one "timer tick") for now. */
SET_AL
(
context
,
0
);
break
;
case
0x81
:
/* Begin critical section. */
...
...
@@ -346,8 +347,8 @@ static void do_int2f_16( CONTEXT86 *context )
* According to Ralf Brown's Interrupt List, never return 0. But it
* seems to work okay (returning 0), just to be sure we return 1.
*/
SET_BX
(
context
,
1
);
/* VM 1 is probably the System VM */
break
;
SET_BX
(
context
,
1
);
/* VM 1 is probably the System VM */
break
;
case
0x84
:
/* Get device API entry point */
{
...
...
@@ -359,7 +360,7 @@ static void do_int2f_16( CONTEXT86 *context )
context
->
SegEs
=
SELECTOROF
(
addr
);
SET_DI
(
context
,
OFFSETOF
(
addr
)
);
}
break
;
break
;
case
0x86
:
/* DPMI detect mode */
SET_AX
(
context
,
0
);
/* Running under DPMI */
...
...
@@ -367,20 +368,20 @@ static void do_int2f_16( CONTEXT86 *context )
case
0x87
:
/* DPMI installation check */
{
SYSTEM_INFO
si
;
GetSystemInfo
(
&
si
);
SET_AX
(
context
,
0x0000
);
/* DPMI Installed */
SYSTEM_INFO
si
;
GetSystemInfo
(
&
si
);
SET_AX
(
context
,
0x0000
);
/* DPMI Installed */
SET_BX
(
context
,
0x0001
);
/* 32bits available */
SET_CL
(
context
,
si
.
wProcessorLevel
);
SET_DX
(
context
,
0x005a
);
/* DPMI major/minor 0.90 */
SET_SI
(
context
,
0
);
/* # of para. of DOS extended private data */
context
->
SegEs
=
DOS
MEM_dpmi_segments
.
dpmi_seg
;
context
->
SegEs
=
DOS
VM_dpmi_segments
->
dpmi_seg
;
SET_DI
(
context
,
0
);
/* ES:DI is DPMI switch entry point */
break
;
}
case
0x8a
:
/* DPMI get vendor-specific API entry point. */
/* The 1.0 specs say this should work with all 0.9 hosts. */
break
;
/* The 1.0 specs say this should work with all 0.9 hosts. */
break
;
default:
INT_BARF
(
context
,
0x2f
);
...
...
@@ -393,43 +394,43 @@ static void do_int2f_16( CONTEXT86 *context )
* in this case, we would need two macros, one for read, the other one for write
* Note: PTR_AT can be used as an l-value
*/
#define
PTR_AT(_ptr, _ofs, _typ)
(*((_typ*)(((char*)_ptr)+(_ofs))))
#define
PTR_AT(_ptr, _ofs, _typ)
(*((_typ*)(((char*)_ptr)+(_ofs))))
/* Use #if 1 if you want full int 2f debug... normal users can leave it at 0 */
#if 0
/**********************************************************************
*
MSCDEX_Dump
[internal]
*
MSCDEX_Dump
[internal]
*
* Dumps mscdex requests to int debug channel.
*/
static
void
MSCDEX_Dump(char* pfx, BYTE* req, int dorealmode)
static
void
MSCDEX_Dump(char* pfx, BYTE* req, int dorealmode)
{
int
i;
BYTE
buf[2048];
BYTE*
ptr;
BYTE*
ios;
int
i;
BYTE
buf[2048];
BYTE*
ptr;
BYTE*
ios;
ptr = buf;
ptr += sprintf(ptr, "%s\tCommand => ", pfx);
for (i = 0; i < req[0]; i++) {
ptr += sprintf(ptr, "%02x ", req[i]);
ptr += sprintf(ptr, "%02x ", req[i]);
}
switch (req[2]) {
case 3:
case 12:
ptr += sprintf(ptr, "\n\t\t\t\tIO_struct => ");
ios = (dorealmode) ? PTR_REAL_TO_LIN( PTR_AT(req, 16, WORD), PTR_AT(req, 14, WORD)) :
ptr += sprintf(ptr, "\n\t\t\t\tIO_struct => ");
ios = (dorealmode) ? PTR_REAL_TO_LIN( PTR_AT(req, 16, WORD), PTR_AT(req, 14, WORD)) :
MapSL(MAKESEGPTR(PTR_AT(req, 16, WORD), PTR_AT(req, 14, WORD)));
for (i = 0; i < PTR_AT(req, 18, WORD); i++) {
ptr += sprintf(ptr, "%02x ", ios[i]);
if ((i & 0x1F) == 0x1F) {
*ptr++ = '\n';
*ptr = 0;
}
}
break;
for (i = 0; i < PTR_AT(req, 18, WORD); i++) {
ptr += sprintf(ptr, "%02x ", ios[i]);
if ((i & 0x1F) == 0x1F) {
*ptr++ = '\n';
*ptr = 0;
}
}
break;
}
TRACE("%s\n", buf);
}
...
...
@@ -444,9 +445,9 @@ static void MSCDEX_Dump(char* pfx, BYTE* req, int dorealmode)
#define CTRL_OF_TOC(toc, idx) (((toc).TrackData[idx - (toc).FirstTrack].Control << 4) | \
(toc).TrackData[idx - (toc).FirstTrack].Adr)
static
void
MSCDEX_StoreMSF
(
DWORD
frame
,
BYTE
*
val
)
static
void
MSCDEX_StoreMSF
(
DWORD
frame
,
BYTE
*
val
)
{
val
[
3
]
=
0
;
/* zero */
val
[
3
]
=
0
;
/* zero */
val
[
2
]
=
frame
/
CDFRAMES_PERMIN
;
/* minutes */
val
[
1
]
=
(
frame
/
CDFRAMES_PERSEC
)
%
60
;
/* seconds */
val
[
0
]
=
frame
%
CDFRAMES_PERSEC
;
/* frames */
...
...
@@ -461,93 +462,93 @@ static int is_cdrom( int drive)
static
void
MSCDEX_Handler
(
CONTEXT86
*
context
)
{
int
drive
,
count
;
char
*
p
;
int
drive
,
count
;
char
*
p
;
switch
(
LOBYTE
(
context
->
Eax
))
{
case
0x00
:
/* Installation check */
/* Count the number of contiguous CDROM drives
*/
for
(
drive
=
count
=
0
;
drive
<
26
;
drive
++
)
{
if
(
is_cdrom
(
drive
))
{
while
(
is_cdrom
(
drive
+
count
))
count
++
;
break
;
}
}
TRACE
(
"Installation check: %d cdroms, starting at %d
\n
"
,
count
,
drive
);
SET_BX
(
context
,
count
);
SET_CX
(
context
,
(
drive
<
26
)
?
drive
:
0
);
break
;
/* Count the number of contiguous CDROM drives
*/
for
(
drive
=
count
=
0
;
drive
<
26
;
drive
++
)
{
if
(
is_cdrom
(
drive
))
{
while
(
is_cdrom
(
drive
+
count
))
count
++
;
break
;
}
}
TRACE
(
"Installation check: %d cdroms, starting at %d
\n
"
,
count
,
drive
);
SET_BX
(
context
,
count
);
SET_CX
(
context
,
(
drive
<
26
)
?
drive
:
0
);
break
;
case
0x0B
:
/* drive check */
SET_AX
(
context
,
is_cdrom
(
CX_reg
(
context
))
);
SET_BX
(
context
,
0xADAD
);
break
;
SET_AX
(
context
,
is_cdrom
(
CX_reg
(
context
))
);
SET_BX
(
context
,
0xADAD
);
break
;
case
0x0C
:
/* get version */
SET_BX
(
context
,
0x020a
);
TRACE
(
"Version number => %04x
\n
"
,
BX_reg
(
context
));
break
;
SET_BX
(
context
,
0x020a
);
TRACE
(
"Version number => %04x
\n
"
,
BX_reg
(
context
));
break
;
case
0x0D
:
/* get drive letters */
p
=
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegEs
,
context
->
Ebx
);
memset
(
p
,
0
,
26
);
for
(
drive
=
0
;
drive
<
26
;
drive
++
)
{
if
(
is_cdrom
(
drive
))
*
p
++
=
drive
;
}
TRACE
(
"Get drive letters
\n
"
);
break
;
p
=
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegEs
,
context
->
Ebx
);
memset
(
p
,
0
,
26
);
for
(
drive
=
0
;
drive
<
26
;
drive
++
)
{
if
(
is_cdrom
(
drive
))
*
p
++
=
drive
;
}
TRACE
(
"Get drive letters
\n
"
);
break
;
case
0x10
:
/* direct driver access */
{
BYTE
*
driver_request
;
BYTE
*
io_stru
;
BYTE
Error
=
255
;
/* No Error */
int
dorealmode
=
ISV86
(
context
);
{
BYTE
*
driver_request
;
BYTE
*
io_stru
;
BYTE
Error
=
255
;
/* No Error */
int
dorealmode
=
ISV86
(
context
);
char
devName
[]
=
"
\\\\
.
\\
@:"
;
HANDLE
h
;
HANDLE
h
;
CDROM_TOC
toc
;
CDROM_SUB_Q_DATA_FORMAT
fmt
;
SUB_Q_CHANNEL_DATA
data
;
DWORD
br
;
DWORD
present
=
TRUE
;
driver_request
=
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegEs
,
context
->
Ebx
);
if
(
!
driver_request
)
{
/* FIXME - to be deleted ?? */
ERR
(
"ES:BX==0 ! SEGFAULT ?
\n
"
);
ERR
(
"-->BX=0x%04x, ES=0x%04lx, DS=0x%04lx, CX=0x%04x
\n
"
,
BX_reg
(
context
),
context
->
SegEs
,
context
->
SegDs
,
CX_reg
(
context
));
driver_request
[
4
]
|=
0x80
;
driver_request
[
3
]
=
5
;
/* bad request length */
return
;
}
/* FIXME
driver_request
=
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegEs
,
context
->
Ebx
);
if
(
!
driver_request
)
{
/* FIXME - to be deleted ?? */
ERR
(
"ES:BX==0 ! SEGFAULT ?
\n
"
);
ERR
(
"-->BX=0x%04x, ES=0x%04lx, DS=0x%04lx, CX=0x%04x
\n
"
,
BX_reg
(
context
),
context
->
SegEs
,
context
->
SegDs
,
CX_reg
(
context
));
driver_request
[
4
]
|=
0x80
;
driver_request
[
3
]
=
5
;
/* bad request length */
return
;
}
/* FIXME
* the following tests are wrong because lots of functions don't require the
* tray to be closed with a CD inside
*/
TRACE
(
"CDROM device driver -> command <%d>
\n
"
,
(
unsigned
char
)
driver_request
[
2
]);
*/
TRACE
(
"CDROM device driver -> command <%d>
\n
"
,
(
unsigned
char
)
driver_request
[
2
]);
if
(
!
is_cdrom
(
CX_reg
(
context
)))
{
WARN
(
"Request made doesn't match a CD ROM drive (%d)
\n
"
,
CX_reg
(
context
));
driver_request
[
4
]
|=
0x80
;
driver_request
[
3
]
=
1
;
/* unknown unit */
return
;
}
if
(
!
is_cdrom
(
CX_reg
(
context
)))
{
WARN
(
"Request made doesn't match a CD ROM drive (%d)
\n
"
,
CX_reg
(
context
));
driver_request
[
4
]
|=
0x80
;
driver_request
[
3
]
=
1
;
/* unknown unit */
return
;
}
MSCDEX_Dump
(
"Beg"
,
driver_request
,
dorealmode
);
MSCDEX_Dump
(
"Beg"
,
driver_request
,
dorealmode
);
/* set status to 0 */
PTR_AT
(
driver_request
,
3
,
WORD
)
=
0
;
/* set status to 0 */
PTR_AT
(
driver_request
,
3
,
WORD
)
=
0
;
devName
[
4
]
=
'A'
+
CX_reg
(
context
);
h
=
CreateFileA
(
devName
,
GENERIC_READ
,
FILE_SHARE_READ
,
NULL
,
OPEN_EXISTING
,
0
,
0
);
if
(
!
h
)
{
WARN
(
"Couldn't open cdrom handle
\n
"
);
driver_request
[
4
]
|=
0x80
;
driver_request
[
3
]
=
1
;
/* unknown unit */
return
;
}
WARN
(
"Couldn't open cdrom handle
\n
"
);
driver_request
[
4
]
|=
0x80
;
driver_request
[
3
]
=
1
;
/* unknown unit */
return
;
}
fmt
.
Format
=
IOCTL_CDROM_CURRENT_POSITION
;
if
(
!
DeviceIoControl
(
h
,
IOCTL_CDROM_READ_TOC
,
NULL
,
0
,
&
toc
,
sizeof
(
toc
),
&
br
,
NULL
)
||
...
...
@@ -558,7 +559,7 @@ static void MSCDEX_Handler(CONTEXT86* context)
if
(
driver_request
[
2
]
!=
6
&&
driver_request
[
2
]
!=
15
)
{
driver_request
[
4
]
|=
0x80
;
driver_request
[
3
]
=
2
;
/* drive not ready */
driver_request
[
3
]
=
2
;
/* drive not ready */
CloseHandle
(
h
);
return
;
}
...
...
@@ -567,209 +568,209 @@ static void MSCDEX_Handler(CONTEXT86* context)
else
{
driver_request
[
4
]
|=
0x80
;
driver_request
[
3
]
=
1
;
/* unknown unit */
driver_request
[
3
]
=
1
;
/* unknown unit */
CloseHandle
(
h
);
return
;
}
}
switch
(
driver_request
[
2
])
{
case
3
:
io_stru
=
(
dorealmode
)
?
switch
(
driver_request
[
2
])
{
case
3
:
io_stru
=
(
dorealmode
)
?
PTR_REAL_TO_LIN
(
PTR_AT
(
driver_request
,
16
,
WORD
),
PTR_AT
(
driver_request
,
14
,
WORD
)
)
:
MapSL
(
MAKESEGPTR
(
PTR_AT
(
driver_request
,
16
,
WORD
),
PTR_AT
(
driver_request
,
14
,
WORD
)));
MapSL
(
MAKESEGPTR
(
PTR_AT
(
driver_request
,
16
,
WORD
),
PTR_AT
(
driver_request
,
14
,
WORD
)));
TRACE
(
" --> IOCTL INPUT <%d>
\n
"
,
io_stru
[
0
]);
switch
(
io_stru
[
0
])
{
TRACE
(
" --> IOCTL INPUT <%d>
\n
"
,
io_stru
[
0
]);
switch
(
io_stru
[
0
])
{
#if 0
case 0: /* Get device Header */
{
static
LPSTR ptr = 0;
if (ptr == 0)
{
ptr = SEGPTR_ALLOC(22);
PTR_AT(ptr, 0, DWORD) = ~1;
/* Next Device Driver */
PTR_AT(ptr, 4, WORD) = 0xC800;
/* Device attributes */
PTR_AT(ptr, 6, WORD) = 0x1234;
/* Pointer to device strategy routine: FIXME */
PTR_AT(ptr, 8, WORD) = 0x3142;
/* Pointer to device interrupt routine: FIXME */
PTR_AT(ptr, 10, char) = 'W';
/* 8-byte character device name field */
PTR_AT(ptr, 11, char) = 'I';
PTR_AT(ptr, 12, char) = 'N';
PTR_AT(ptr, 13, char) = 'E';
PTR_AT(ptr, 14, char) = '_';
PTR_AT(ptr, 15, char) = 'C';
PTR_AT(ptr, 16, char) = 'D';
PTR_AT(ptr, 17, char) = '_';
PTR_AT(ptr, 18, WORD) = 0;
/* Reserved (must be zero) */
PTR_AT(ptr, 20, BYTE) = 0; /* Drive letter (must be zero) */
PTR_AT(ptr, 21, BYTE) = 1; /* Number of units supported (one or more) FIXME*/
}
PTR_AT(io_stru, DWORD, 0) = SEGPTR_GET(ptr);
}
break;
case 0: /* Get device Header */
{
static
LPSTR ptr = 0;
if (ptr == 0)
{
ptr = SEGPTR_ALLOC(22);
PTR_AT(ptr, 0, DWORD) = ~1;
/* Next Device Driver */
PTR_AT(ptr, 4, WORD) = 0xC800;
/* Device attributes */
PTR_AT(ptr, 6, WORD) = 0x1234;
/* Pointer to device strategy routine: FIXME */
PTR_AT(ptr, 8, WORD) = 0x3142;
/* Pointer to device interrupt routine: FIXME */
PTR_AT(ptr, 10, char) = 'W';
/* 8-byte character device name field */
PTR_AT(ptr, 11, char) = 'I';
PTR_AT(ptr, 12, char) = 'N';
PTR_AT(ptr, 13, char) = 'E';
PTR_AT(ptr, 14, char) = '_';
PTR_AT(ptr, 15, char) = 'C';
PTR_AT(ptr, 16, char) = 'D';
PTR_AT(ptr, 17, char) = '_';
PTR_AT(ptr, 18, WORD) = 0;
/* Reserved (must be zero) */
PTR_AT(ptr, 20, BYTE) = 0; /* Drive letter (must be zero) */
PTR_AT(ptr, 21, BYTE) = 1; /* Number of units supported (one or more) FIXME*/
}
PTR_AT(io_stru, DWORD, 0) = SEGPTR_GET(ptr);
}
break;
#endif
case
1
:
/* location of head */
switch
(
io_stru
[
1
])
{
case
0
:
PTR_AT
(
io_stru
,
2
,
DWORD
)
=
case
1
:
/* location of head */
switch
(
io_stru
[
1
])
{
case
0
:
PTR_AT
(
io_stru
,
2
,
DWORD
)
=
FRAME_OF_ADDR
(
data
.
CurrentPosition
.
AbsoluteAddress
);
break
;
case
1
:
MSCDEX_StoreMSF
(
FRAME_OF_ADDR
(
data
.
CurrentPosition
.
AbsoluteAddress
),
break
;
case
1
:
MSCDEX_StoreMSF
(
FRAME_OF_ADDR
(
data
.
CurrentPosition
.
AbsoluteAddress
),
io_stru
+
2
);
break
;
default:
ERR
(
"CD-ROM driver: unsupported addressing mode !!
\n
"
);
Error
=
0x0c
;
}
TRACE
(
" ----> HEAD LOCATION <%ld>
\n
"
,
PTR_AT
(
io_stru
,
2
,
DWORD
));
break
;
case
4
:
/* Audio channel info */
io_stru
[
1
]
=
0
;
io_stru
[
2
]
=
0xff
;
io_stru
[
3
]
=
1
;
io_stru
[
4
]
=
0xff
;
io_stru
[
5
]
=
2
;
io_stru
[
6
]
=
0
;
io_stru
[
7
]
=
3
;
io_stru
[
8
]
=
0
;
TRACE
(
" ----> AUDIO CHANNEL INFO
\n
"
);
break
;
case
6
:
/* device status */
PTR_AT
(
io_stru
,
1
,
DWORD
)
=
0x00000290
;
/* 290 =>
* 1
Supports HSG and Red Book addressing modes
* 0
Supports audio channel manipulation
*
* 1
Supports prefetching requests
* 0
Reserved
* 0
No interleaving
* 1
Data read and plays audio/video tracks
*
* 0
Read only
* 0
Supports only cooked reading
* 0
Door locked
* 0
see below (Door closed/opened)
*/
if
(
!
present
)
PTR_AT
(
io_stru
,
1
,
DWORD
)
|=
1
;
TRACE
(
" ----> DEVICE STATUS <0x%08lx>
\n
"
,
PTR_AT
(
io_stru
,
1
,
DWORD
));
break
;
case
8
:
/* Volume size */
PTR_AT
(
io_stru
,
1
,
DWORD
)
=
FRAME_OF_TOC
(
toc
,
toc
.
LastTrack
+
1
)
-
break
;
default:
ERR
(
"CD-ROM driver: unsupported addressing mode !!
\n
"
);
Error
=
0x0c
;
}
TRACE
(
" ----> HEAD LOCATION <%ld>
\n
"
,
PTR_AT
(
io_stru
,
2
,
DWORD
));
break
;
case
4
:
/* Audio channel info */
io_stru
[
1
]
=
0
;
io_stru
[
2
]
=
0xff
;
io_stru
[
3
]
=
1
;
io_stru
[
4
]
=
0xff
;
io_stru
[
5
]
=
2
;
io_stru
[
6
]
=
0
;
io_stru
[
7
]
=
3
;
io_stru
[
8
]
=
0
;
TRACE
(
" ----> AUDIO CHANNEL INFO
\n
"
);
break
;
case
6
:
/* device status */
PTR_AT
(
io_stru
,
1
,
DWORD
)
=
0x00000290
;
/* 290 =>
* 1
Supports HSG and Red Book addressing modes
* 0
Supports audio channel manipulation
*
* 1
Supports prefetching requests
* 0
Reserved
* 0
No interleaving
* 1
Data read and plays audio/video tracks
*
* 0
Read only
* 0
Supports only cooked reading
* 0
Door locked
* 0
see below (Door closed/opened)
*/
if
(
!
present
)
PTR_AT
(
io_stru
,
1
,
DWORD
)
|=
1
;
TRACE
(
" ----> DEVICE STATUS <0x%08lx>
\n
"
,
PTR_AT
(
io_stru
,
1
,
DWORD
));
break
;
case
8
:
/* Volume size */
PTR_AT
(
io_stru
,
1
,
DWORD
)
=
FRAME_OF_TOC
(
toc
,
toc
.
LastTrack
+
1
)
-
FRAME_OF_TOC
(
toc
,
toc
.
FirstTrack
)
-
1
;
TRACE
(
" ----> VOLUME SIZE <%ld>
\n
"
,
PTR_AT
(
io_stru
,
1
,
DWORD
));
break
;
case
9
:
/* media changed ? */
/* answers don't know... -1/1 for yes/no would be better */
io_stru
[
1
]
=
0
;
/* FIXME? 1? */
TRACE
(
" ----> MEDIA CHANGED <%d>
\n
"
,
io_stru
[
1
]);
break
;
case
10
:
/* audio disk info */
io_stru
[
1
]
=
toc
.
FirstTrack
;
/* starting track of the disc */
io_stru
[
2
]
=
toc
.
LastTrack
;
/* ending track */
MSCDEX_StoreMSF
(
FRAME_OF_TOC
(
toc
,
toc
.
LastTrack
+
1
)
-
TRACE
(
" ----> VOLUME SIZE <%ld>
\n
"
,
PTR_AT
(
io_stru
,
1
,
DWORD
));
break
;
case
9
:
/* media changed ? */
/* answers don't know... -1/1 for yes/no would be better */
io_stru
[
1
]
=
0
;
/* FIXME? 1? */
TRACE
(
" ----> MEDIA CHANGED <%d>
\n
"
,
io_stru
[
1
]);
break
;
case
10
:
/* audio disk info */
io_stru
[
1
]
=
toc
.
FirstTrack
;
/* starting track of the disc */
io_stru
[
2
]
=
toc
.
LastTrack
;
/* ending track */
MSCDEX_StoreMSF
(
FRAME_OF_TOC
(
toc
,
toc
.
LastTrack
+
1
)
-
FRAME_OF_TOC
(
toc
,
toc
.
FirstTrack
)
-
1
,
io_stru
+
3
);
TRACE
(
" ----> AUDIO DISK INFO <%d-%d/%08lx>
\n
"
,
io_stru
[
1
],
io_stru
[
2
],
PTR_AT
(
io_stru
,
3
,
DWORD
));
break
;
case
11
:
/* audio track info */
if
(
io_stru
[
1
]
>=
toc
.
FirstTrack
&&
io_stru
[
1
]
<=
toc
.
LastTrack
)
{
MSCDEX_StoreMSF
(
FRAME_OF_TOC
(
toc
,
io_stru
[
1
]),
io_stru
+
2
);
/* starting point if the track */
io_stru
[
6
]
=
CTRL_OF_TOC
(
toc
,
io_stru
[
1
]);
}
else
{
PTR_AT
(
io_stru
,
2
,
DWORD
)
=
0
;
io_stru
[
6
]
=
0
;
}
TRACE
(
" ----> AUDIO TRACK INFO[%d] = [%08lx:%d]
\n
"
,
io_stru
[
1
],
PTR_AT
(
io_stru
,
2
,
DWORD
),
io_stru
[
6
]);
break
;
case
12
:
/* get Q-Channel info */
io_stru
[
1
]
=
CTRL_OF_TOC
(
toc
,
data
.
CurrentPosition
.
TrackNumber
);
io_stru
[
2
]
=
data
.
CurrentPosition
.
TrackNumber
;
io_stru
[
3
]
=
0
;
/* FIXME ?? */
/* why the heck did MS use another format for 0MSF information... sigh */
{
BYTE
bTmp
[
4
];
MSCDEX_StoreMSF
(
FRAME_OF_ADDR
(
data
.
CurrentPosition
.
TrackRelativeAddress
),
bTmp
);
io_stru
[
4
]
=
bTmp
[
2
];
io_stru
[
5
]
=
bTmp
[
1
];
io_stru
[
6
]
=
bTmp
[
0
];
io_stru
[
7
]
=
0
;
MSCDEX_StoreMSF
(
FRAME_OF_ADDR
(
data
.
CurrentPosition
.
AbsoluteAddress
),
bTmp
);
io_stru
[
8
]
=
bTmp
[
2
];
io_stru
[
9
]
=
bTmp
[
1
];
io_stru
[
10
]
=
bTmp
[
0
];
io_stru
[
11
]
=
0
;
}
TRACE
(
"Q-Channel info: Ctrl/adr=%02x TNO=%02x X=%02x rtt=%02x:%02x:%02x rtd=%02x:%02x:%02x (cf=%08x, tp=%08x)
\n
"
,
io_stru
[
1
],
io_stru
[
2
],
io_stru
[
3
],
io_stru
[
4
],
io_stru
[
5
],
io_stru
[
6
],
io_stru
[
8
],
io_stru
[
9
],
io_stru
[
10
],
FRAME_OF_ADDR
(
data
.
CurrentPosition
.
AbsoluteAddress
),
TRACE
(
" ----> AUDIO DISK INFO <%d-%d/%08lx>
\n
"
,
io_stru
[
1
],
io_stru
[
2
],
PTR_AT
(
io_stru
,
3
,
DWORD
));
break
;
case
11
:
/* audio track info */
if
(
io_stru
[
1
]
>=
toc
.
FirstTrack
&&
io_stru
[
1
]
<=
toc
.
LastTrack
)
{
MSCDEX_StoreMSF
(
FRAME_OF_TOC
(
toc
,
io_stru
[
1
]),
io_stru
+
2
);
/* starting point if the track */
io_stru
[
6
]
=
CTRL_OF_TOC
(
toc
,
io_stru
[
1
]);
}
else
{
PTR_AT
(
io_stru
,
2
,
DWORD
)
=
0
;
io_stru
[
6
]
=
0
;
}
TRACE
(
" ----> AUDIO TRACK INFO[%d] = [%08lx:%d]
\n
"
,
io_stru
[
1
],
PTR_AT
(
io_stru
,
2
,
DWORD
),
io_stru
[
6
]);
break
;
case
12
:
/* get Q-Channel info */
io_stru
[
1
]
=
CTRL_OF_TOC
(
toc
,
data
.
CurrentPosition
.
TrackNumber
);
io_stru
[
2
]
=
data
.
CurrentPosition
.
TrackNumber
;
io_stru
[
3
]
=
0
;
/* FIXME ?? */
/* why the heck did MS use another format for 0MSF information... sigh */
{
BYTE
bTmp
[
4
];
MSCDEX_StoreMSF
(
FRAME_OF_ADDR
(
data
.
CurrentPosition
.
TrackRelativeAddress
),
bTmp
);
io_stru
[
4
]
=
bTmp
[
2
];
io_stru
[
5
]
=
bTmp
[
1
];
io_stru
[
6
]
=
bTmp
[
0
];
io_stru
[
7
]
=
0
;
MSCDEX_StoreMSF
(
FRAME_OF_ADDR
(
data
.
CurrentPosition
.
AbsoluteAddress
),
bTmp
);
io_stru
[
8
]
=
bTmp
[
2
];
io_stru
[
9
]
=
bTmp
[
1
];
io_stru
[
10
]
=
bTmp
[
0
];
io_stru
[
11
]
=
0
;
}
TRACE
(
"Q-Channel info: Ctrl/adr=%02x TNO=%02x X=%02x rtt=%02x:%02x:%02x rtd=%02x:%02x:%02x (cf=%08x, tp=%08x)
\n
"
,
io_stru
[
1
],
io_stru
[
2
],
io_stru
[
3
],
io_stru
[
4
],
io_stru
[
5
],
io_stru
[
6
],
io_stru
[
8
],
io_stru
[
9
],
io_stru
[
10
],
FRAME_OF_ADDR
(
data
.
CurrentPosition
.
AbsoluteAddress
),
FRAME_OF_TOC
(
toc
,
data
.
CurrentPosition
.
TrackNumber
));
break
;
case
15
:
/* Audio status info */
/* !!!! FIXME FIXME FIXME !! */
PTR_AT
(
io_stru
,
1
,
WORD
)
=
2
|
((
data
.
CurrentPosition
.
Header
.
AudioStatus
==
AUDIO_STATUS_PAUSED
)
?
1
:
0
);
if
(
!
present
)
{
PTR_AT
(
io_stru
,
3
,
DWORD
)
=
0
;
PTR_AT
(
io_stru
,
7
,
DWORD
)
=
0
;
}
else
{
PTR_AT
(
io_stru
,
3
,
DWORD
)
=
FRAME_OF_TOC
(
toc
,
toc
.
FirstTrack
);
PTR_AT
(
io_stru
,
7
,
DWORD
)
=
FRAME_OF_TOC
(
toc
,
toc
.
LastTrack
+
1
);
}
TRACE
(
"Audio status info: status=%04x startLoc=%ld endLoc=%ld
\n
"
,
PTR_AT
(
io_stru
,
1
,
WORD
),
PTR_AT
(
io_stru
,
3
,
DWORD
),
PTR_AT
(
io_stru
,
7
,
DWORD
));
break
;
default:
FIXME
(
"IOCTL INPUT: Unimplemented <%d>!!
\n
"
,
io_stru
[
0
]);
Error
=
0x0c
;
break
;
}
break
;
case
12
:
io_stru
=
(
dorealmode
)
?
PTR_REAL_TO_LIN
(
PTR_AT
(
driver_request
,
16
,
WORD
),
PTR_AT
(
driver_request
,
14
,
WORD
))
:
MapSL
(
MAKESEGPTR
(
PTR_AT
(
driver_request
,
16
,
WORD
),
PTR_AT
(
driver_request
,
14
,
WORD
)));
TRACE
(
" --> IOCTL OUTPUT <%d>
\n
"
,
io_stru
[
0
]);
switch
(
io_stru
[
0
])
{
case
0
:
/* eject */
break
;
case
15
:
/* Audio status info */
/* !!!! FIXME FIXME FIXME !! */
PTR_AT
(
io_stru
,
1
,
WORD
)
=
2
|
((
data
.
CurrentPosition
.
Header
.
AudioStatus
==
AUDIO_STATUS_PAUSED
)
?
1
:
0
);
if
(
!
present
)
{
PTR_AT
(
io_stru
,
3
,
DWORD
)
=
0
;
PTR_AT
(
io_stru
,
7
,
DWORD
)
=
0
;
}
else
{
PTR_AT
(
io_stru
,
3
,
DWORD
)
=
FRAME_OF_TOC
(
toc
,
toc
.
FirstTrack
);
PTR_AT
(
io_stru
,
7
,
DWORD
)
=
FRAME_OF_TOC
(
toc
,
toc
.
LastTrack
+
1
);
}
TRACE
(
"Audio status info: status=%04x startLoc=%ld endLoc=%ld
\n
"
,
PTR_AT
(
io_stru
,
1
,
WORD
),
PTR_AT
(
io_stru
,
3
,
DWORD
),
PTR_AT
(
io_stru
,
7
,
DWORD
));
break
;
default:
FIXME
(
"IOCTL INPUT: Unimplemented <%d>!!
\n
"
,
io_stru
[
0
]);
Error
=
0x0c
;
break
;
}
break
;
case
12
:
io_stru
=
(
dorealmode
)
?
PTR_REAL_TO_LIN
(
PTR_AT
(
driver_request
,
16
,
WORD
),
PTR_AT
(
driver_request
,
14
,
WORD
))
:
MapSL
(
MAKESEGPTR
(
PTR_AT
(
driver_request
,
16
,
WORD
),
PTR_AT
(
driver_request
,
14
,
WORD
)));
TRACE
(
" --> IOCTL OUTPUT <%d>
\n
"
,
io_stru
[
0
]);
switch
(
io_stru
[
0
])
{
case
0
:
/* eject */
DeviceIoControl
(
h
,
IOCTL_STORAGE_EJECT_MEDIA
,
NULL
,
0
,
NULL
,
0
,
&
br
,
NULL
);
TRACE
(
" ----> EJECT
\n
"
);
break
;
case
2
:
/* reset drive */
DeviceIoControl
(
h
,
IOCTL_STORAGE_RESET_DEVICE
,
NULL
,
0
,
NULL
,
0
,
&
br
,
NULL
);
TRACE
(
" ----> RESET
\n
"
);
break
;
case
3
:
/* Audio Channel Control */
FIXME
(
" ----> AUDIO CHANNEL CONTROL (NIY)
\n
"
);
break
;
case
5
:
/* close tray */
TRACE
(
" ----> EJECT
\n
"
);
break
;
case
2
:
/* reset drive */
DeviceIoControl
(
h
,
IOCTL_STORAGE_RESET_DEVICE
,
NULL
,
0
,
NULL
,
0
,
&
br
,
NULL
);
TRACE
(
" ----> RESET
\n
"
);
break
;
case
3
:
/* Audio Channel Control */
FIXME
(
" ----> AUDIO CHANNEL CONTROL (NIY)
\n
"
);
break
;
case
5
:
/* close tray */
DeviceIoControl
(
h
,
IOCTL_STORAGE_LOAD_MEDIA
,
NULL
,
0
,
NULL
,
0
,
&
br
,
NULL
);
TRACE
(
" ----> CLOSE TRAY
\n
"
);
break
;
default:
FIXME
(
" IOCTL OUTPUT: Unimplemented <%d>!!
\n
"
,
io_stru
[
0
]);
Error
=
0x0c
;
break
;
}
break
;
TRACE
(
" ----> CLOSE TRAY
\n
"
);
break
;
default:
FIXME
(
" IOCTL OUTPUT: Unimplemented <%d>!!
\n
"
,
io_stru
[
0
]);
Error
=
0x0c
;
break
;
}
break
;
case
128
:
/* read long */
{
...
...
@@ -779,16 +780,16 @@ static void MSCDEX_Handler(CONTEXT86* context)
WORD
num
=
PTR_AT
(
driver_request
,
18
,
WORD
);
RAW_READ_INFO
rri
;
switch
(
driver_request
[
13
])
{
case
1
:
/* Red book addressing mode = 0:m:s:f */
/* FIXME : frame <=> msf conversion routines could be shared
* between mscdex and mcicda
*/
at
=
LOBYTE
(
HIWORD
(
at
))
*
CDFRAMES_PERMIN
+
HIBYTE
(
LOWORD
(
at
))
*
CDFRAMES_PERSEC
+
LOBYTE
(
LOWORD
(
at
));
/* fall through */
case
0
:
/* HSG addressing mode */
switch
(
driver_request
[
13
])
{
case
1
:
/* Red book addressing mode = 0:m:s:f */
/* FIXME : frame <=> msf conversion routines could be shared
* between mscdex and mcicda
*/
at
=
LOBYTE
(
HIWORD
(
at
))
*
CDFRAMES_PERMIN
+
HIBYTE
(
LOWORD
(
at
))
*
CDFRAMES_PERSEC
+
LOBYTE
(
LOWORD
(
at
));
/* fall through */
case
0
:
/* HSG addressing mode */
switch
(
PTR_AT
(
driver_request
,
24
,
BYTE
))
{
case
0
:
/* cooked */
...
...
@@ -802,80 +803,80 @@ static void MSCDEX_Handler(CONTEXT86* context)
rri
.
SectorCount
=
num
;
DeviceIoControl
(
h
,
IOCTL_CDROM_RAW_READ
,
&
rri
,
sizeof
(
rri
),
dst
,
num
*
2352
,
&
br
,
NULL
);
break
;
break
;
default:
ERR
(
"Unsupported read mode !!
\n
"
);
Error
=
0x0c
;
break
;
}
break
;
default:
ERR
(
"Unsupported address mode !!
\n
"
);
Error
=
0x0c
;
break
;
}
default:
ERR
(
"Unsupported address mode !!
\n
"
);
Error
=
0x0c
;
break
;
}
}
break
;
case
131
:
/* seek */
{
DWORD
at
;
case
131
:
/* seek */
{
DWORD
at
;
CDROM_SEEK_AUDIO_MSF
seek
;
at
=
PTR_AT
(
driver_request
,
20
,
DWORD
);
TRACE
(
" --> SEEK AUDIO mode :<0x%02X>, [%ld]
\n
"
,
(
BYTE
)
driver_request
[
13
],
at
);
switch
(
driver_request
[
13
])
{
case
1
:
/* Red book addressing mode = 0:m:s:f */
/* FIXME : frame <=> msf conversion routines could be shared
* between mscdex and mcicda
*/
at
=
LOBYTE
(
HIWORD
(
at
))
*
CDFRAMES_PERMIN
+
HIBYTE
(
LOWORD
(
at
))
*
CDFRAMES_PERSEC
+
LOBYTE
(
LOWORD
(
at
));
/* fall through */
case
0
:
/* HSG addressing mode */
at
=
PTR_AT
(
driver_request
,
20
,
DWORD
);
TRACE
(
" --> SEEK AUDIO mode :<0x%02X>, [%ld]
\n
"
,
(
BYTE
)
driver_request
[
13
],
at
);
switch
(
driver_request
[
13
])
{
case
1
:
/* Red book addressing mode = 0:m:s:f */
/* FIXME : frame <=> msf conversion routines could be shared
* between mscdex and mcicda
*/
at
=
LOBYTE
(
HIWORD
(
at
))
*
CDFRAMES_PERMIN
+
HIBYTE
(
LOWORD
(
at
))
*
CDFRAMES_PERSEC
+
LOBYTE
(
LOWORD
(
at
));
/* fall through */
case
0
:
/* HSG addressing mode */
seek
.
M
=
at
/
CDFRAMES_PERMIN
;
seek
.
S
=
(
at
/
CDFRAMES_PERSEC
)
%
60
;
seek
.
F
=
at
%
CDFRAMES_PERSEC
;
DeviceIoControl
(
h
,
IOCTL_CDROM_SEEK_AUDIO_MSF
,
&
seek
,
sizeof
(
seek
),
NULL
,
0
,
&
br
,
NULL
);
break
;
default:
ERR
(
"Unsupported address mode !!
\n
"
);
Error
=
0x0c
;
break
;
}
}
break
;
case
132
:
/* play */
{
DWORD
beg
,
end
;
break
;
default:
ERR
(
"Unsupported address mode !!
\n
"
);
Error
=
0x0c
;
break
;
}
}
break
;
case
132
:
/* play */
{
DWORD
beg
,
end
;
CDROM_PLAY_AUDIO_MSF
play
;
beg
=
end
=
PTR_AT
(
driver_request
,
14
,
DWORD
);
end
+=
PTR_AT
(
driver_request
,
18
,
DWORD
);
TRACE
(
" --> PLAY AUDIO mode :<0x%02X>, [%ld-%ld]
\n
"
,
(
BYTE
)
driver_request
[
13
],
beg
,
end
);
switch
(
driver_request
[
13
])
{
case
1
:
/* Red book addressing mode = 0:m:s:f */
/* FIXME : frame <=> msf conversion routines could be shared
* between mscdex and mcicda
*/
beg
=
LOBYTE
(
LOWORD
(
beg
))
*
CDFRAMES_PERMIN
+
HIBYTE
(
LOWORD
(
beg
))
*
CDFRAMES_PERSEC
+
LOBYTE
(
HIWORD
(
beg
));
end
=
LOBYTE
(
LOWORD
(
end
))
*
CDFRAMES_PERMIN
+
HIBYTE
(
LOWORD
(
end
))
*
CDFRAMES_PERSEC
+
LOBYTE
(
HIWORD
(
end
));
/* fall through */
case
0
:
/* HSG addressing mode */
beg
=
end
=
PTR_AT
(
driver_request
,
14
,
DWORD
);
end
+=
PTR_AT
(
driver_request
,
18
,
DWORD
);
TRACE
(
" --> PLAY AUDIO mode :<0x%02X>, [%ld-%ld]
\n
"
,
(
BYTE
)
driver_request
[
13
],
beg
,
end
);
switch
(
driver_request
[
13
])
{
case
1
:
/* Red book addressing mode = 0:m:s:f */
/* FIXME : frame <=> msf conversion routines could be shared
* between mscdex and mcicda
*/
beg
=
LOBYTE
(
LOWORD
(
beg
))
*
CDFRAMES_PERMIN
+
HIBYTE
(
LOWORD
(
beg
))
*
CDFRAMES_PERSEC
+
LOBYTE
(
HIWORD
(
beg
));
end
=
LOBYTE
(
LOWORD
(
end
))
*
CDFRAMES_PERMIN
+
HIBYTE
(
LOWORD
(
end
))
*
CDFRAMES_PERSEC
+
LOBYTE
(
HIWORD
(
end
));
/* fall through */
case
0
:
/* HSG addressing mode */
play
.
StartingM
=
beg
/
CDFRAMES_PERMIN
;
play
.
StartingS
=
(
beg
/
CDFRAMES_PERSEC
)
%
60
;
play
.
StartingF
=
beg
%
CDFRAMES_PERSEC
;
...
...
@@ -884,54 +885,54 @@ static void MSCDEX_Handler(CONTEXT86* context)
play
.
EndingF
=
end
%
CDFRAMES_PERSEC
;
DeviceIoControl
(
h
,
IOCTL_CDROM_PLAY_AUDIO_MSF
,
&
play
,
sizeof
(
play
),
NULL
,
0
,
&
br
,
NULL
);
break
;
default:
ERR
(
"Unsupported address mode !!
\n
"
);
Error
=
0x0c
;
break
;
}
}
break
;
case
133
:
if
(
data
.
CurrentPosition
.
Header
.
AudioStatus
==
AUDIO_STATUS_IN_PROGRESS
)
{
break
;
default:
ERR
(
"Unsupported address mode !!
\n
"
);
Error
=
0x0c
;
break
;
}
}
break
;
case
133
:
if
(
data
.
CurrentPosition
.
Header
.
AudioStatus
==
AUDIO_STATUS_IN_PROGRESS
)
{
DeviceIoControl
(
h
,
IOCTL_CDROM_PAUSE_AUDIO
,
NULL
,
0
,
NULL
,
0
,
&
br
,
NULL
);
TRACE
(
" --> STOP AUDIO (Paused)
\n
"
);
}
else
{
TRACE
(
" --> STOP AUDIO (Paused)
\n
"
);
}
else
{
DeviceIoControl
(
h
,
IOCTL_CDROM_STOP_AUDIO
,
NULL
,
0
,
NULL
,
0
,
&
br
,
NULL
);
TRACE
(
" --> STOP AUDIO (Stopped)
\n
"
);
}
break
;
TRACE
(
" --> STOP AUDIO (Stopped)
\n
"
);
}
break
;
case
136
:
TRACE
(
" --> RESUME AUDIO
\n
"
);
case
136
:
TRACE
(
" --> RESUME AUDIO
\n
"
);
DeviceIoControl
(
h
,
IOCTL_CDROM_PAUSE_AUDIO
,
NULL
,
0
,
NULL
,
0
,
&
br
,
NULL
);
break
;
default:
FIXME
(
" ioctl unimplemented <%d>
\n
"
,
driver_request
[
2
]);
Error
=
0x0c
;
}
/* setting error codes if any */
if
(
Error
<
255
)
{
driver_request
[
4
]
|=
0x80
;
driver_request
[
3
]
=
Error
;
}
CloseHandle
(
h
);
/* setting status bits
* 3 == playing && done
* 1 == done
*/
driver_request
[
4
]
|=
break
;
default:
FIXME
(
" ioctl unimplemented <%d>
\n
"
,
driver_request
[
2
]);
Error
=
0x0c
;
}
/* setting error codes if any */
if
(
Error
<
255
)
{
driver_request
[
4
]
|=
0x80
;
driver_request
[
3
]
=
Error
;
}
CloseHandle
(
h
);
/* setting status bits
* 3 == playing && done
* 1 == done
*/
driver_request
[
4
]
|=
(
data
.
CurrentPosition
.
Header
.
AudioStatus
==
AUDIO_STATUS_IN_PROGRESS
)
?
3
:
1
;
MSCDEX_Dump
(
"End"
,
driver_request
,
dorealmode
);
}
break
;
MSCDEX_Dump
(
"End"
,
driver_request
,
dorealmode
);
}
break
;
default:
FIXME
(
"Unimplemented MSCDEX function 0x%02X.
\n
"
,
LOBYTE
(
context
->
Eax
));
break
;
FIXME
(
"Unimplemented MSCDEX function 0x%02X.
\n
"
,
LOBYTE
(
context
->
Eax
));
break
;
}
}
dlls/winedos/interrupts.c
View file @
ab163db7
...
...
@@ -29,7 +29,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(int);
* DOSVM_Int15Handler (WINEDOS16.121)
* DOSVM_Int25Handler (WINEDOS16.137)
* DOSVM_Int26Handler (WINEDOS16.138)
* DOSVM_Int2fHandler (WINEDOS16.147)
* DOSVM_Int5cHandler (WINEDOS16.192)
*
* FIXME: Interrupt handlers for interrupts implemented in other DLLs.
...
...
@@ -40,7 +39,6 @@ void WINAPI DOSVM_Int11Handler( CONTEXT86 *context ) { INT_Int11Handler(context)
void
WINAPI
DOSVM_Int15Handler
(
CONTEXT86
*
context
)
{
INT_Int15Handler
(
context
);
}
void
WINAPI
DOSVM_Int25Handler
(
CONTEXT86
*
context
)
{
INT_Int25Handler
(
context
);
}
void
WINAPI
DOSVM_Int26Handler
(
CONTEXT86
*
context
)
{
INT_Int26Handler
(
context
);
}
void
WINAPI
DOSVM_Int2fHandler
(
CONTEXT86
*
context
)
{
INT_Int2fHandler
(
context
);
}
void
WINAPI
DOSVM_Int5cHandler
(
CONTEXT86
*
context
)
{
NetBIOSCall16
(
context
);
}
static
FARPROC16
DOSVM_Vectors16
[
256
];
...
...
include/miscemu.h
View file @
ab163db7
...
...
@@ -175,12 +175,6 @@ struct DPMI_segments
WORD
int48_sel
;
};
/* 48-bit segmented pointers for DOS DPMI32 */
typedef
struct
{
WORD
selector
;
DWORD
offset
;
}
SEGPTR48
,
FARPROC48
;
extern
struct
DPMI_segments
DOSMEM_dpmi_segments
;
extern
const
struct
DPMI_segments
*
DOSMEM_GetDPMISegments
(
void
);
...
...
@@ -198,13 +192,6 @@ extern UINT DOSMEM_MapLinearToDos(LPVOID); /* linear Wine to DOS */
/* memory/instr.c */
extern
BOOL
INSTR_EmulateInstruction
(
CONTEXT86
*
context
);
/* msdos/interrupts.c */
typedef
void
(
WINAPI
*
INTPROC
)(
CONTEXT86
*
);
extern
FARPROC16
INT_GetPMHandler
(
BYTE
intnum
);
extern
void
INT_SetPMHandler
(
BYTE
intnum
,
FARPROC16
handler
);
extern
FARPROC48
INT_GetPMHandler48
(
BYTE
intnum
);
extern
void
INT_SetPMHandler48
(
BYTE
intnum
,
FARPROC48
handler
);
/* msdos/ioports.c */
extern
DWORD
IO_inport
(
int
port
,
int
count
);
extern
void
IO_outport
(
int
port
,
int
count
,
DWORD
value
);
...
...
@@ -221,9 +208,6 @@ extern void WINAPI INT_Int25Handler(CONTEXT86*);
/* msdos/int26.c */
extern
void
WINAPI
INT_Int26Handler
(
CONTEXT86
*
);
/* msdos/int2f.c */
extern
void
WINAPI
INT_Int2fHandler
(
CONTEXT86
*
);
/* msdos/int5c.c */
extern
void
WINAPI
NetBIOSCall16
(
CONTEXT86
*
);
...
...
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