Mail Archives: djgpp/1999/11/17/14:20:58
From: | icemaze <icemaze AT planet DOT it>
|
Newsgroups: | comp.os.msdos.djgpp
|
Subject: | Few lines, huge problems...
|
Date: | Wed, 17 Nov 1999 16:57:52 +0100
|
Organization: | Centro Servizi Interbusiness
|
Lines: | 60
|
Message-ID: | <3832D080.1B79710F@planet.it>
|
NNTP-Posting-Host: | pri2-1.planet.it
|
Mime-Version: | 1.0
|
X-Mailer: | Mozilla 4.5 [en] (Win98; I)
|
X-Accept-Language: | it,en
|
To: | djgpp AT Delorie DOT com
|
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp
|
Reply-To: | djgpp AT delorie DOT com
|
I'm trying to make a cdrom library with DJGPP. I need to use assembly
to communicate with MSCDEX, and I managed to get, for example, its
version number and the number of CDs installed. I need some help with
this piece of asm code I found in a CD-Programming FAQ: it's
written in C.
---- BEGIN ----
char* allocDriveArray (int driveCount)
{
char* array = (char*)malloc(driveCount * sizeof(char));
union REGS r;
struct SREGS s;
s.es = FP_SEG(array);
r.x.bx = FP_OFF(array);
r.x.ax = 0x150D;
int86x(0x2F, &r, &r, &s);
return array;
}
---- END ----
I tried to port it to DJGPP C++ (since I'm making an Object Oriented
Library), but there is nothing like FP_SEG and FP_OFF in DJGPP, so I
don't know what to give to ES and BX. Can someone help me out? I read
the DJGPP FAQ, but I didn't understand how to use the transfer buffer:
all I managed to get is a SIGNAL_ABORT!! This is the latest version of
my code:
---- BEGIN ----
void cdromclass::GetCDDrives (void)
{
char *_drive = new char [_number_of_drives];
// Trying to use DJGPP transfer buffer... but it doesn't work!! :(
unsigned long t = __tb >> 4;
t &= 0xFFFF;
asm // Function which should put in "_drive" the drive number of each
// CDROM unit present.
(
"movl %0, %%es;"
"movw %1, %%bx;"
"movw $0x150D, %%ax;"
"int $2F;"
:
: "g" (t), "g" (__tb & 0x000F) // drive_number or drives_number???
: "memory","cc"
);
printf ("\n\nLinear buffer address: %04X:%01X.", (__tb >> 4) & 0xFFFF,
__tb & 0x000F);
for (k = 0; k < _number_of_drives; k++)
printf ("\nDrive %d is #%d!", k, _drive[k]);
delete [] _drive;
}
---- END ----
Help! ^_^
--
icemaze AT planet DOT it
- Raw text -