Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
6aa4f2e7
Commit
6aa4f2e7
authored
Feb 02, 1999
by
Eric Pouech
Committed by
Alexandre Julliard
Feb 02, 1999
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Removed references to obsolete msdos/cdrom.c file.
Make use of new Wine internal CD ROM interface.
parent
d4926497
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
274 additions
and
364 deletions
+274
-364
msdos.h
include/msdos.h
+0
-2
Makefile.in
msdos/Makefile.in
+0
-1
cdrom.c
msdos/cdrom.c
+0
-311
int2f.c
msdos/int2f.c
+274
-50
No files found.
include/msdos.h
View file @
6aa4f2e7
...
...
@@ -184,8 +184,6 @@ extern struct DosDeviceStruct LPT[MAX_PORTS];
#define EL_Memory 0x05
void
WINAPI
DOS3Call
(
CONTEXT
*
context
);
void
do_mscdex
(
CONTEXT
*
context
);
void
do_mscdex_dd
(
CONTEXT
*
context
,
int
dorealmode
);
#define DOSCONF_MEM_HIGH 0x0001
#define DOSCONF_MEM_UMB 0x0002
...
...
msdos/Makefile.in
View file @
6aa4f2e7
...
...
@@ -6,7 +6,6 @@ VPATH = @srcdir@
MODULE
=
msdos
C_SRCS
=
\
cdrom.c
\
dosconf.c
\
dosmem.c
\
dpmi.c
\
...
...
msdos/cdrom.c
deleted
100644 → 0
View file @
d4926497
/*
* Cdrom - device driver emulation - Audio features.
* (c) 1998 Petr Tomasek <tomasek@etf.cuni.cz>
*
*/
#ifdef linux
#include "config.h"
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
/* FIXME - how to make this OS independent ?? */
#ifdef HAVE_LINUX_CDROM_H
# include <linux/cdrom.h>
#endif
#ifdef HAVE_LINUX_UCDROM_H
# include <linux/ucdrom.h>
#endif
#include "ldt.h"
#include "drive.h"
#include "msdos.h"
#include "miscemu.h"
#include "module.h"
#include "debug.h"
/* FIXME - more general ?? */
#define cdrom_dev "/dev/cdrom"
u_char
cdrom_a_status
(
int
fd
)
{
struct
cdrom_subchnl
sc
;
ioctl
(
fd
,
CDROMSUBCHNL
,
&
sc
);
return
sc
.
cdsc_audiostatus
;
}
BYTE
*
get_io_stru
(
WORD
*
reqh
,
int
dorealmode
)
{
WORD
ofst
,
segm
;
BYTE
*
io_stru
;
ofst
=
reqh
[
7
];
segm
=
reqh
[
8
];
if
(
dorealmode
)
io_stru
=
DOSMEM_MapRealToLinear
(
MAKELONG
(
ofst
,
segm
));
else
io_stru
=
PTR_SEG_OFF_TO_LIN
(
segm
,
ofst
);
return
io_stru
;
}
DWORD
msf0_to_abs
(
struct
cdrom_msf0
msf
)
{
return
(
msf
.
minute
*
60
+
msf
.
second
)
*
75
+
msf
.
frame
-
150
;
}
void
abs_to_msf0
(
DWORD
abs
,
struct
cdrom_msf0
*
msf
)
{
DWORD
d
;
d
=
abs
+
150
;
msf
->
frame
=
d
%
75
;
d
=
d
/
75
;
msf
->
second
=
d
%
60
;
msf
->
minute
=
d
/
60
;
}
void
msf0_to_msf
(
struct
cdrom_msf0
from
,
struct
cdrom_msf0
to
,
struct
cdrom_msf
*
msf
)
{
msf
->
cdmsf_min0
=
from
.
minute
;
msf
->
cdmsf_min1
=
to
.
minute
;
msf
->
cdmsf_sec0
=
from
.
second
;
msf
->
cdmsf_sec1
=
to
.
second
;
msf
->
cdmsf_frame0
=
from
.
frame
;
msf
->
cdmsf_frame1
=
to
.
frame
;
}
void
abs_to_msf
(
DWORD
from
,
DWORD
to
,
struct
cdrom_msf
*
msf
)
{
struct
cdrom_msf0
fr
,
tt
;
abs_to_msf0
(
from
,
&
fr
);
abs_to_msf0
(
to
,
&
tt
);
msf0_to_msf
(
fr
,
tt
,
msf
);
}
/************************************************************
*
* Cdrom ms-dos driver emulation.
* (accesible throught the MSCDEX 0x10 function.)
*/
extern
void
do_mscdex_dd
(
CONTEXT
*
context
,
int
dorealmode
)
{
BYTE
*
driver_request
;
BYTE
*
io_stru
;
static
int
fdcd
=-
1
;
/* file descriptor.. */
struct
cdrom_tochdr
tochdr
;
/* the Toc header */
struct
cdrom_tocentry
tocentry
;
/* a Toc entry */
struct
cdrom_msf
msf
;
struct
cdrom_subchnl
subchnl
;
u_char
Error
=
255
;
/*No Error */
if
(
dorealmode
)
driver_request
=
DOSMEM_MapRealToLinear
(
MAKELONG
(
BX_reg
(
context
),
ES_reg
(
context
)));
else
driver_request
=
PTR_SEG_OFF_TO_LIN
(
ES_reg
(
context
),
BX_reg
(
context
));
if
(
!
driver_request
)
{
/* FIXME - to be deleted ?? */
ERR
(
int
,
" ES:BX==0 ! SEGFAULT ?
\n
"
);
ERR
(
int
,
" -->BX=0x%04x, ES=0x%04lx, DS=0x%04lx, CX=0x%04x
\n\n
"
,
BX_reg
(
context
),
ES_reg
(
context
),
DS_reg
(
context
),
CX_reg
(
context
));
}
else
/* FIXME - would be best to open the device at the begining of the wine
session .... */
if
(
fdcd
<
0
)
fdcd
=
open
(
cdrom_dev
,
O_RDONLY
);
TRACE
(
int
,
"CDROM device driver -> command <%d>
\n
"
,
(
unsigned
char
)
driver_request
[
2
]);
/* set status to 0 */
driver_request
[
3
]
=
0
;
driver_request
[
4
]
=
0
;
switch
(
driver_request
[
2
])
{
case
3
:
io_stru
=
get_io_stru
((
WORD
*
)
driver_request
,
dorealmode
);
FIXME
(
int
,
" --> IOCTL INPUT <%d>
\n
"
,
io_stru
[
0
]);
switch
(
io_stru
[
0
])
{
case
1
:
/* location of head */
if
(
io_stru
[
1
]
==
0
)
{
ioctl
(
fdcd
,
CDROMSUBCHNL
,
&
subchnl
);
((
DWORD
*
)
io_stru
+
2
)[
0
]
=
(
DWORD
)
msf0_to_abs
(
subchnl
.
cdsc_absaddr
.
msf
);
FIXME
(
int
,
" ----> HEAD LOCATION <%ld>
\n\n
"
,
((
DWORD
*
)
io_stru
+
2
)[
0
]);
}
else
{
ERR
(
int
,
"CDRom-Driver: Unsupported address mode !!
\n
"
);
Error
=
0x0c
;
}
break
;
case
6
:
/* device status */
/* FIXME .. does this work properly ?? */
io_stru
[
3
]
=
io_stru
[
4
]
=
0
;
io_stru
[
2
]
=
1
;
/* supports audio channels (?? FIXME ??) */
io_stru
[
1
]
=
16
;
/* data read and plays audio racks */
#if defined(CDROM_DRIVE_STATUS) && defined(CDS_TRAY_OPEN)
io_stru
[
1
]
|=
(
ioctl
(
fdcd
,
CDROM_DRIVE_STATUS
,
0
)
==
CDS_TRAY_OPEN
);
#endif
TRACE
(
int
,
" ----> DEVICE STATUS <0x%08lx>
\n\n
"
,(
DWORD
)
io_stru
[
1
]);
break
;
case
9
:
/* media changed ? */
#ifdef CDROM_MEDIA_CHANGED
if
(
ioctl
(
fdcd
,
CDROM_MEDIA_CHANGED
,
0
))
io_stru
[
1
]
=
0xff
;
else
#endif
io_stru
[
0
]
=
0
;
/* FIXME? 1? */
break
;
case
10
:
/* audio disk info */
ioctl
(
fdcd
,
CDROMREADTOCHDR
,
&
tochdr
);
io_stru
[
1
]
=
tochdr
.
cdth_trk0
;
/* staring track of the disc */
io_stru
[
2
]
=
tochdr
.
cdth_trk1
;
/* ending track */
tocentry
.
cdte_track
=
CDROM_LEADOUT
;
/* Now the leadout track ...*/
tocentry
.
cdte_format
=
CDROM_MSF
;
ioctl
(
fdcd
,
CDROMREADTOCENTRY
,
&
tocentry
);
/* ... get position of it */
((
DWORD
*
)
io_stru
+
3
)[
0
]
=
(
DWORD
)
msf0_to_abs
(
tocentry
.
cdte_addr
.
msf
);
TRACE
(
int
,
" ----> AUDIO DISK INFO <%d-%d/%ld>
\n\n
"
,
io_stru
[
1
],
io_stru
[
2
],
((
DWORD
*
)
io_stru
+
3
)[
0
]);
break
;
case
11
:
/* audio track info */
tocentry
.
cdte_track
=
io_stru
[
1
];
/* track of the disc */
tocentry
.
cdte_format
=
CDROM_MSF
;
ioctl
(
fdcd
,
CDROMREADTOCENTRY
,
&
tocentry
);
((
DWORD
*
)
io_stru
+
2
)[
0
]
=
(
DWORD
)
msf0_to_abs
(
tocentry
.
cdte_addr
.
msf
);
/* starting point if the track */
io_stru
[
6
]
=
tocentry
.
cdte_adr
+
16
*
tocentry
.
cdte_ctrl
;
TRACE
(
int
,
" ----> AUDIO TRACK INFO <track=%d>[%ld]
\n\n
"
,
io_stru
[
1
],((
DWORD
*
)
io_stru
+
2
)[
0
]);
break
;
case
12
:
/* get Q-Channel / Subchannel (??) info */
subchnl
.
cdsc_format
=
CDROM_MSF
;
ioctl
(
fdcd
,
CDROMSUBCHNL
,
&
subchnl
);
io_stru
[
1
]
=
subchnl
.
cdsc_adr
+
16
*
subchnl
.
cdsc_ctrl
;
io_stru
[
2
]
=
subchnl
.
cdsc_trk
;
io_stru
[
3
]
=
subchnl
.
cdsc_ind
;
/* FIXME - ?? */
io_stru
[
4
]
=
subchnl
.
cdsc_reladdr
.
msf
.
minute
;
io_stru
[
5
]
=
subchnl
.
cdsc_reladdr
.
msf
.
second
;
io_stru
[
6
]
=
subchnl
.
cdsc_reladdr
.
msf
.
frame
;
io_stru
[
7
]
=
0
;
/* always zero */
io_stru
[
8
]
=
subchnl
.
cdsc_absaddr
.
msf
.
minute
;
io_stru
[
9
]
=
subchnl
.
cdsc_absaddr
.
msf
.
second
;
io_stru
[
10
]
=
subchnl
.
cdsc_absaddr
.
msf
.
frame
;
break
;
case
15
:
/* fixme !!!!!!! just a small workaround ! */
/* !!!! FIXME FIXME FIXME !! */
tocentry
.
cdte_track
=
CDROM_LEADOUT
;
/* Now the leadout track ...*/
tocentry
.
cdte_format
=
CDROM_MSF
;
ioctl
(
fdcd
,
CDROMREADTOCENTRY
,
&
tocentry
);
/* ... get position of it */
((
DWORD
*
)
io_stru
+
7
)[
0
]
=
(
DWORD
)
msf0_to_abs
(
tocentry
.
cdte_addr
.
msf
);
break
;
default:
FIXME
(
int
,
" Cdrom-driver: IOCTL INPUT: Unimplemented <%d>!!
\n
"
,
io_stru
[
0
]);
Error
=
0x0c
;
break
;
}
break
;
case
12
:
io_stru
=
get_io_stru
((
WORD
*
)
driver_request
,
dorealmode
);
TRACE
(
int
,
" --> IOCTL OUTPUT <%d>
\n
"
,
io_stru
[
0
]);
switch
(
io_stru
[
0
])
{
case
0
:
/* eject */
ioctl
(
fdcd
,
CDROMEJECT
);
TRACE
(
int
,
" ----> EJECT
\n\n
"
);
break
;
case
5
:
/* close tray */
ioctl
(
fdcd
,
CDROMCLOSETRAY
);
TRACE
(
int
,
" ----> CLOSE TRAY
\n\n
"
);
break
;
case
2
:
/* reset drive */
ioctl
(
fdcd
,
CDROMRESET
);
TRACE
(
int
,
" ----> RESET
\n\n
"
);
break
;
default:
FIXME
(
int
,
" Cdrom-driver: IOCTL OUPUT: Unimplemented <%d>!!
\n
"
,
io_stru
[
0
]);
Error
=
0x0c
;
break
;
}
break
;
case
133
:
if
(
cdrom_a_status
(
fdcd
)
==
CDROM_AUDIO_PLAY
)
{
ioctl
(
fdcd
,
CDROMPAUSE
);
TRACE
(
int
,
" --> STOP AUDIO (Paused)
\n\n
"
);
}
else
{
ioctl
(
fdcd
,
CDROMSTOP
);
TRACE
(
int
,
" --> STOP AUDIO (Stopped)
\n\n
"
);
}
break
;
case
132
:
/* FIXME - It didn't function for me... */
FIXME
(
int
,
" --> PLAY AUDIO
\n
"
);
ioctl
(
fdcd
,
CDROMSTART
);
FIXME
(
int
,
"Mode :<0x%02X> , [%ld-%ld]
\n\n
"
,
(
unsigned
char
)
driver_request
[
13
],
((
DWORD
*
)
driver_request
+
14
)[
0
],
((
DWORD
*
)
driver_request
+
18
)[
0
]);
if
(
driver_request
[
13
]
==
0
)
{
abs_to_msf
(((
DWORD
*
)
driver_request
+
14
)[
0
],
((
DWORD
*
)
driver_request
+
18
)[
0
],
&
msf
);
ioctl
(
fdcd
,
CDROMPLAYMSF
,
&
msf
);
}
else
{
ERR
(
int
,
"CDRom-Driver: Unsupported address mode !!
\n
"
);
Error
=
0x0c
;
}
break
;
case
136
:
TRACE
(
int
,
" --> RESUME AUDIO
\n\n
"
);
ioctl
(
fdcd
,
CDROMRESUME
);
break
;
default:
FIXME
(
int
,
" CDRom-Driver - ioctl uninplemented <%d>
\n
"
,
driver_request
[
2
]);
Error
=
0x0c
;
}
if
(
Error
<
255
)
{
driver_request
[
4
]
|=
127
;
driver_request
[
3
]
=
Error
;
}
driver_request
[
4
]
|=
2
*
(
cdrom_a_status
(
fdcd
)
==
CDROM_AUDIO_PLAY
);
/* close (fdcd); FIXME !! -- cannot use close when ejecting
the cd-rom - close would close it again */
}
#endif
msdos/int2f.c
View file @
6aa4f2e7
/* -*- tab-width: 8; c-basic-offset: 4 -*- */
/*
* DOS interrupt 2fh handler
*
* Cdrom - device driver emulation - Audio features.
* (c) 1998 Petr Tomasek <tomasek@etf.cuni.cz>
* (c) 1999 Eric Pouech
*/
#include <stdlib.h>
...
...
@@ -13,13 +18,16 @@
#include "module.h"
#include "task.h"
#include "dosexe.h"
#include "heap.h"
/* #define DEBUG_INT */
#include "debug.h"
#include "cdrom.h"
/* base WPROCS.DLL ordinal number for VxDs */
/* base WPROCS.DLL ordinal number for VxDs */
#define VXD_BASE 400
static
void
do_int2f_16
(
CONTEXT
*
context
);
static
void
do_mscdex
(
CONTEXT
*
context
);
/**********************************************************************
* INT_Int2fHandler
...
...
@@ -336,57 +344,273 @@ static void do_int2f_16( CONTEXT *context )
void
do_mscdex
(
CONTEXT
*
context
)
{
int
drive
,
count
;
char
*
p
;
switch
(
AL_reg
(
context
))
int
drive
,
count
;
char
*
p
;
switch
(
AL_reg
(
context
))
{
case
0x00
:
/* Installation check */
/* Count the number of contiguous CDROM drives
*/
for
(
drive
=
count
=
0
;
drive
<
MAX_DOS_DRIVES
;
drive
++
)
{
if
(
DRIVE_GetType
(
drive
)
==
TYPE_CDROM
)
{
while
(
DRIVE_GetType
(
drive
+
count
)
==
TYPE_CDROM
)
count
++
;
break
;
}
}
TRACE
(
int
,
"Installation check: %d cdroms, starting at %d
\n
"
,
count
,
drive
);
BX_reg
(
context
)
=
count
;
CX_reg
(
context
)
=
(
drive
<
MAX_DOS_DRIVES
)
?
drive
:
0
;
break
;
case
0x0B
:
/* drive check */
AX_reg
(
context
)
=
(
DRIVE_GetType
(
CX_reg
(
context
))
==
TYPE_CDROM
);
BX_reg
(
context
)
=
0xADAD
;
break
;
case
0x0C
:
/* get version */
BX_reg
(
context
)
=
0x020a
;
break
;
case
0x0D
:
/* get drive letters */
p
=
CTX_SEG_OFF_TO_LIN
(
context
,
ES_reg
(
context
),
EBX_reg
(
context
));
memset
(
p
,
0
,
MAX_DOS_DRIVES
);
for
(
drive
=
0
;
drive
<
MAX_DOS_DRIVES
;
drive
++
)
{
if
(
DRIVE_GetType
(
drive
)
==
TYPE_CDROM
)
*
p
++
=
drive
;
}
break
;
case
0x10
:
/* direct driver acces */
{
case
0x00
:
/* Installation check */
/* Count the number of contiguous CDROM drives
*/
for
(
drive
=
count
=
0
;
drive
<
MAX_DOS_DRIVES
;
drive
++
)
{
if
(
DRIVE_GetType
(
drive
)
==
TYPE_CDROM
)
{
while
(
DRIVE_GetType
(
drive
+
count
)
==
TYPE_CDROM
)
count
++
;
break
;
}
}
BX_reg
(
context
)
=
count
;
CX_reg
(
context
)
=
(
drive
<
MAX_DOS_DRIVES
)
?
drive
:
0
;
break
;
case
0x0B
:
/* drive check */
AX_reg
(
context
)
=
(
DRIVE_GetType
(
CX_reg
(
context
))
==
TYPE_CDROM
);
BX_reg
(
context
)
=
0xADAD
;
break
;
case
0x0C
:
/* get version */
BX_reg
(
context
)
=
0x020a
;
break
;
case
0x0D
:
/* get drive letters */
p
=
CTX_SEG_OFF_TO_LIN
(
context
,
ES_reg
(
context
),
EBX_reg
(
context
));
memset
(
p
,
0
,
MAX_DOS_DRIVES
);
for
(
drive
=
0
;
drive
<
MAX_DOS_DRIVES
;
drive
++
)
{
if
(
DRIVE_GetType
(
drive
)
==
TYPE_CDROM
)
*
p
++
=
drive
;
}
break
;
#ifdef linux
/* FIXME: why a new linux-only CDROM drive access, for crying out loud?
* There are pretty complete routines in multimedia/mcicda.c already! */
case
0x10
:
/* direct driver acces */
FIXME
(
cdaudio
,
"mscdex should use multimedia/mcicda.c
\n
"
);
do_mscdex_dd
(
context
,
ISV86
(
context
));
static
WINE_CDAUDIO
wcda
;
BYTE
*
driver_request
;
BYTE
*
io_stru
;
u_char
Error
=
255
;
/* No Error */
int
dorealmode
=
ISV86
(
context
);
driver_request
=
(
dorealmode
)
?
DOSMEM_MapRealToLinear
(
MAKELONG
(
BX_reg
(
context
),
ES_reg
(
context
)))
:
PTR_SEG_OFF_TO_LIN
(
ES_reg
(
context
),
BX_reg
(
context
));
if
(
!
driver_request
)
{
/* FIXME - to be deleted ?? */
ERR
(
int
,
" ES:BX==0 ! SEGFAULT ?
\n
"
);
ERR
(
int
,
" -->BX=0x%04x, ES=0x%04lx, DS=0x%04lx, CX=0x%04x
\n
"
,
BX_reg
(
context
),
ES_reg
(
context
),
DS_reg
(
context
),
CX_reg
(
context
));
}
else
{
/* FIXME - would be best to open the device at the begining of the wine session ....
*/
if
(
wcda
.
unixdev
<=
0
)
CDAUDIO_Open
(
&
wcda
);
}
TRACE
(
int
,
"CDROM device driver -> command <%d>
\n
"
,
(
unsigned
char
)
driver_request
[
2
]);
/* set status to 0 */
driver_request
[
3
]
=
driver_request
[
4
]
=
0
;
CDAUDIO_GetCDStatus
(
&
wcda
);
switch
(
driver_request
[
2
])
{
case
3
:
io_stru
=
(
dorealmode
)
?
DOSMEM_MapRealToLinear
(
MAKELONG
(
*
((
WORD
*
)(
driver_request
+
14
)),
*
((
WORD
*
)(
driver_request
+
16
))))
:
PTR_SEG_OFF_TO_LIN
(
*
((
WORD
*
)(
driver_request
+
16
)),
*
((
WORD
*
)(
driver_request
+
18
)));
TRACE
(
int
,
" --> 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);
*((DWORD*)(ptr )) = ~1; /* Next Device Driver */
*((WORD* )(ptr + 4)) = 0xC800; /* Device attributes */
*((WORD* )(ptr + 6)) = 0x1234; /* Pointer to device strategy routine: FIXME */
*((WORD* )(ptr + 8)) = 0x3142; /* Pointer to device interrupt routine: FIXME */
*((char*) (ptr + 10)) = 'W'; /* 8-byte character device name field */
*((char*) (ptr + 11)) = 'I';
*((char*) (ptr + 12)) = 'N';
*((char*) (ptr + 13)) = 'E';
*((char*) (ptr + 14)) = '_';
*((char*) (ptr + 15)) = 'C';
*((char*) (ptr + 16)) = 'D';
*((char*) (ptr + 17)) = '_';
*((WORD*) (ptr + 18)) = 0; /* Reserved (must be zero) */
*((BYTE*) (ptr + 20)) = 0; /* Drive letter (must be zero) */
*((BYTE*) (ptr + 21)) = 1; /* Number of units supported (one or more) FIXME*/
}
((DWORD*)io_stru+1)[0] = SEGPTR_GET(ptr);
}
break;
#endif
default:
FIXME
(
int
,
"Unimplemented MSCDEX function 0x%02X.
\n
"
,
AL_reg
(
context
));
break
;
case
1
:
/* location of head */
if
(
io_stru
[
1
]
==
0
)
{
/* FIXME: what if io_stru+2 is not DWORD aligned ? */
((
DWORD
*
)
io_stru
+
2
)[
0
]
=
wcda
.
dwCurFrame
;
TRACE
(
int
,
" ----> HEAD LOCATION <%ld>
\n
"
,
((
DWORD
*
)
io_stru
+
2
)[
0
]);
}
else
{
ERR
(
int
,
"CDRom-Driver: Unsupported addressing mode !!
\n
"
);
Error
=
0x0c
;
}
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
]
=
0xff
;
io_stru
[
7
]
=
3
;
io_stru
[
8
]
=
0xff
;
TRACE
(
int
,
" ----> AUDIO CHANNEL CONTROL
\n
"
);
break
;
case
6
:
/* device status */
/* FIXME .. does this work properly ?? */
io_stru
[
3
]
=
io_stru
[
4
]
=
0
;
io_stru
[
2
]
=
1
;
/* supports audio channels (?? FIXME ??) */
io_stru
[
1
]
=
16
;
/* data read and plays audio tracks */
if
(
wcda
.
cdaMode
==
WINE_CDA_OPEN
)
io_stru
[
1
]
|=
1
;
TRACE
(
int
,
" ----> DEVICE STATUS <0x%08lx>
\n
"
,
(
DWORD
)
io_stru
[
1
]);
break
;
case
8
:
/* Volume size */
*
((
DWORD
*
)(
io_stru
+
1
))
=
wcda
.
dwTotalLen
;
TRACE
(
int
,
" ----> VOLMUE SIZE <0x%08lx>
\n
"
,
*
((
DWORD
*
)(
io_stru
+
1
)));
break
;
case
9
:
/* media changed ? */
/* answers don't know... -1/1 for yes/no would be better */
io_stru
[
0
]
=
0
;
/* FIXME? 1? */
break
;
case
10
:
/* audio disk info */
io_stru
[
1
]
=
wcda
.
nFirstTrack
;
/* starting track of the disc */
io_stru
[
2
]
=
wcda
.
nLastTrack
;
/* ending track */
((
DWORD
*
)
io_stru
+
3
)[
0
]
=
wcda
.
dwFirstOffset
;
TRACE
(
int
,
" ----> AUDIO DISK INFO <%d-%d/%ld>
\n
"
,
io_stru
[
1
],
io_stru
[
2
],
((
DWORD
*
)
io_stru
+
3
)[
0
]);
break
;
case
11
:
/* audio track info */
((
DWORD
*
)
io_stru
+
2
)[
0
]
=
wcda
.
lpdwTrackPos
[
io_stru
[
1
]];
/* starting point if the track */
io_stru
[
6
]
=
wcda
.
lpbTrackFlags
[
io_stru
[
1
]];
TRACE
(
int
,
" ----> AUDIO TRACK INFO <track=%d>[%ld:%d]
\n
"
,
io_stru
[
1
],((
DWORD
*
)
io_stru
+
2
)[
0
],
io_stru
[
6
]);
break
;
case
12
:
/* get Q-Channel / Subchannel (??) info */
io_stru
[
1
]
=
wcda
.
lpbTrackFlags
[
wcda
.
nCurTrack
];
io_stru
[
2
]
=
wcda
.
nCurTrack
;
io_stru
[
3
]
=
0
;
/* FIXME ?? */
{
DWORD
f
=
wcda
.
lpdwTrackPos
[
wcda
.
nCurTrack
]
-
wcda
.
dwCurFrame
;
io_stru
[
4
]
=
f
/
CDFRAMES_PERMIN
;
io_stru
[
5
]
=
(
f
-
CDFRAMES_PERMIN
*
io_stru
[
4
])
/
CDFRAMES_PERSEC
;
io_stru
[
6
]
=
f
-
CDFRAMES_PERMIN
*
io_stru
[
4
]
-
CDFRAMES_PERSEC
*
io_stru
[
5
];
}
io_stru
[
7
]
=
0
;
{
DWORD
f
=
wcda
.
dwCurFrame
;
io_stru
[
8
]
=
f
/
CDFRAMES_PERMIN
;
io_stru
[
9
]
=
(
f
-
CDFRAMES_PERMIN
*
io_stru
[
4
])
/
CDFRAMES_PERSEC
;
io_stru
[
10
]
=
f
-
CDFRAMES_PERMIN
*
io_stru
[
4
]
-
CDFRAMES_PERSEC
*
io_stru
[
5
];
}
break
;
case
15
:
/* Audio status info */
/* !!!! FIXME FIXME FIXME !! */
*
((
WORD
*
)(
io_stru
+
1
))
=
(
wcda
.
cdaMode
==
WINE_CDA_PAUSE
);
*
((
DWORD
*
)(
io_stru
+
3
))
=
wcda
.
lpdwTrackPos
[
0
];
*
((
DWORD
*
)(
io_stru
+
7
))
=
wcda
.
lpdwTrackPos
[
wcda
.
nTracks
-
1
];
break
;
default:
FIXME
(
int
,
" Cdrom-driver: IOCTL INPUT: Unimplemented <%d>!!
\n
"
,
io_stru
[
0
]);
Error
=
0x0c
;
break
;
}
break
;
case
12
:
io_stru
=
(
dorealmode
)
?
DOSMEM_MapRealToLinear
(
MAKELONG
(
*
((
WORD
*
)(
driver_request
+
14
)),
*
((
WORD
*
)(
driver_request
+
16
))))
:
PTR_SEG_OFF_TO_LIN
(
*
((
WORD
*
)(
driver_request
+
16
)),
*
((
WORD
*
)(
driver_request
+
18
)));
TRACE
(
int
,
" --> IOCTL OUTPUT <%d>
\n
"
,
io_stru
[
0
]);
switch
(
io_stru
[
0
])
{
case
0
:
/* eject */
CDAUDIO_SetDoor
(
&
wcda
,
1
);
TRACE
(
int
,
" ----> EJECT
\n
"
);
break
;
case
2
:
/* reset drive */
CDAUDIO_Reset
(
&
wcda
);
TRACE
(
int
,
" ----> RESET
\n
"
);
break
;
case
3
:
/* Audio Channel Control */
FIXME
(
int
,
" ----> AUDIO CHANNEL CONTROL (NIY)
\n
"
);
break
;
case
5
:
/* close tray */
CDAUDIO_SetDoor
(
&
wcda
,
0
);
TRACE
(
int
,
" ----> CLOSE TRAY
\n
"
);
break
;
default:
FIXME
(
int
,
" Cdrom-driver: IOCTL OUPUT: Unimplemented <%d>!!
\n
"
,
io_stru
[
0
]);
Error
=
0x0c
;
break
;
}
break
;
case
132
:
/* FIXME - It didn't function for me... */
TRACE
(
int
,
" --> PLAY AUDIO
\n
"
);
if
(
driver_request
[
13
]
==
0
)
{
TRACE
(
int
,
"Mode :<0x%02X> , [%ld-%ld]
\n
"
,
(
unsigned
char
)
driver_request
[
13
],
((
DWORD
*
)
driver_request
+
14
)[
0
],
((
DWORD
*
)
driver_request
+
18
)[
0
]);
CDAUDIO_Play
(
&
wcda
,
((
DWORD
*
)
driver_request
+
14
)[
0
],
((
DWORD
*
)
driver_request
+
14
)[
0
]
+
((
DWORD
*
)
driver_request
+
18
)[
0
]);
}
else
{
ERR
(
int
,
"CDRom-Driver: Unsupported address mode !!
\n
"
);
Error
=
0x0c
;
}
break
;
case
133
:
if
(
wcda
.
cdaMode
==
WINE_CDA_PLAY
)
{
CDAUDIO_Pause
(
&
wcda
,
1
);
TRACE
(
int
,
" --> STOP AUDIO (Paused)
\n
"
);
}
else
{
CDAUDIO_Stop
(
&
wcda
);
TRACE
(
int
,
" --> STOP AUDIO (Stopped)
\n
"
);
}
break
;
case
136
:
TRACE
(
int
,
" --> RESUME AUDIO
\n
"
);
CDAUDIO_Pause
(
&
wcda
,
0
);
break
;
default:
FIXME
(
int
,
" CDRom-Driver - ioctl uninplemented <%d>
\n
"
,
driver_request
[
2
]);
Error
=
0x0c
;
}
if
(
Error
<
255
)
{
driver_request
[
4
]
|=
127
;
driver_request
[
3
]
=
Error
;
}
driver_request
[
4
]
|=
2
*
(
wcda
.
cdaMode
=
WINE_CDA_PLAY
);
/* close (fdcd); FIXME !! -- cannot use close when ejecting
the cd-rom - close would close it again */
}
break
;
default:
FIXME
(
int
,
"Unimplemented MSCDEX function 0x%02X.
\n
"
,
AL_reg
(
context
));
break
;
}
}
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