
Graphics by Lord Azathoth
Programming
the
CDROM
The CDROM is very useful for the audio and the data storage. Isn't very simply to programming a
small AudioCD player, and I will teach you the secrets of this drive. I use the Microsoft CDROM
Extension (MSCDEX) and a bit of AT&T assembly language. If you don't know the AT&T syntax please go
to this site and read the ASM tutorial.
Checking
the
installation
of
MSCDEX
For checking the presence of the MSCDEX driver call the function 0x1100 of the multilex interrupt
(int 0x2F) with the value 0xDADA pushed on the stack; the driver is installed only if the function
return the value 0xFF in the register al:
BOOL installed;
__asm__ __volatile__ ("
movw $56026, %%ax
pushw %%ax
movw $4352, %%ax
int $47
popw %%bx
cmpb $255, %%al
jne not_installed
movb $1, %0
not_installed:"
: "=g"(installed)
);
The installation check isn't difficult. Another important informations is the version of the MSCDEX
driver....
Read
the
MSCDEX
driver
version
Under W95 (MSCDEX v2.95) the IOCTL call (used for the CDROM functions) are incompatible with the
IOCTL call of older MSCDEX versions (truly is the DOS to be incompatible), so is very important
to read the MSCDEX driver version. Using the function 0x150C of the INT 0x2F we can read a word
that contain the version:
WORD version;
__asm__ __volatile__ ("
movw $5388, %%ax
int $47
movw %%bx, %0"
: "=g"(version)
);
The high byte of the version contain the version number, and the low byte the revision
number (E.g. if version=0x025F the MSCDEX version is 2.95).
Read
the
number
of
CDROM
drives
installed
Another important information is the number of CDROM drives installed on the system. Via the
function 0x1500 of INT 0x2F we can read the number of drives and the number of the drive where
the first CDROM is installed:
WORD number;
BYTE firstdrive;
__asm__ __volatile__ ("
movw $5376, %%ax
movw $0, %%bx
int $47
movw %%bx, %0
movb %%cl, %1"
: "=g"(number), "=g"(firstdrive)
);
Using this function we know where the first CDROM drive is installed, but if there are other drives?
Read
the
list
of
the
CDROM
drives
The function 0x150D of INT 0x2F fills an array of byte (longer than the number of CDROM drives
installed on the system) with the number of drives that use. E.g. if the first CDROM drive is
installed on the drive E:, drivelist[0] will contain 4, and the second
on drive G: drivelist[1] will contain 6. The function use a buffer in real
memory, so we can use the __tb (transfer buffer) internal of DJGPP:
__dpmi_regs regs;
char drivelist[MAX_CDROMS];
regs.x.ax=0x150D;
regs.x.bx=__tb & 0x0F;
regs.x.es=(__tb >> 4) & 0xFFFF;
__dpmi_int(0x2F, ®s);
dosmemget(__tb, number, drivelist);
And now we can access to all the CDROM drives.
Detect
if
the
drive
is
a
CDROM
drive
There are another way to detect where the CDROM drives are installed: test each drive. This is done
by using the function 0x150B of INT 0x2F. This function return 1 if the specified drive is a CDROM
drive:
WORD drive=4; // 4 = drive E: (0 = A:, 1 = B:, ...)
BOOL isCDROM=FALSE;
__asm__ __volatile__ ("
movw $5387, %%ax
mov %1, %%cx
int $47
orw %%ax, %%ax
jz not_cd_rom
cmpw $44461, %%bx
jne not_cd_rom
movb $1, %0
not_cd_rom: "
: "=g"(isCDROM)
: "g"(drive)
);
So we can check a short number of drives for detect where the CDROM drives are installed.
Wanna see the demo program?
[main]
[prec]
[next]
[email]
Site Made and Maintained by
The Dark Angel
<DarkAngel@tin.it>
My ICQ Number is
2063026
You Visited This Page
times
This page hosted by
Get your own Free Home Page