Hallo Stefan,
[...]
Post by Stefan ReutherDass zweite Feature-Byte hat aber laut deinem Zitat Offset 6. Daher 'p[6]'.
Du hast wieder Recht. Ein zweites Feature-Byte muss nicht bei Offset 2
liegen.
Vielleicht sollte ich beim Lesen nicht soviel denken/interpretieren :-)
Nun versuche ich das, was ich gebastelt habe, mit djgpp zu kompilieren.
Aber es scheitert unter Anderem am segread, da es nicht existiert.
Also habe ich verschiedene Stellen (s.u.) durchgelesen, insbesondere die
DJGPP-FAQ.
Dort bin ich dann auf Folgendes gestoßen:
<Zitat>
The function segread used by some real-mode compilers does not exist in
DJGPP. It is used in real-mode code to store the values of the CS, DS,
SS, and ES registers into a struct SREGS variable, when some service
that needs one of these registers is called from code written for small
and tiny memory models.
DJGPP has the functions _my_cs, _my_ds, and _my_ss for that purpose (ES
and DS always hold the same selector in code produced by GCC from a C or
C++ source, so you don't need a fourth function).
However, these will not be useful if the original real-mode code used
the segment registers to invoke DOS/BIOS services. For these cases, you
will need to rewrite the code so that it copies the data to/from the
transfer buffer and passes the transfer buffer address via __dpmi_int,
as described above.
</Zitat> [1]
Verstehe ich das Zitat richtig?
Nach Aufruf des INT15/AH=C0h mit der Funktion int86(...,...,...),
welches Ergebniswerte bei ES:BX nach Ralfs Interupt Liste [2] ablegt,
kann man in DJGPP eben nicht mit segread(...) an die Werte kommen (weil
DJGPP ein 32bit Compiler ist).
Auch den FAR Pointer kann man nicht mit MK_FP(sregs.es, regs.x.bx)
generieren, da weder FAR noch diese Funktion definiert ist.
Also kann man mit DJGPP den folgenden Code nicht compilieren:
/* ************************ */
#include<dos.h>
void test(){
union REGS regs;
struct SREGS sregs;
regs.x.ax = 0xC000;
int86(0x15, ®s, ®s);
if ((regs.h.ah == 0) && (!(r.x.flags & 0x01))){
/* AH ist 0 und CF ist nicht gesetzt : Anfrage erfolgreich */
/* Zugriff auf ES:BX*/
segread( &sregs );
unsigned char far* p = (unsigned char far *) MK_FP(sregs.es, regs.x.bx);
unsigned char feature_byte = p[6]; /* zweites Featurebyte ist bei
Offset 6*/
if (feature_byte & (1<<6)) { /* sechstes Bit*/
/* Code hier */
}
}
}
/* ************************ */
Stattdessen muss man segread und MK_FP ersetzen und weitere
Header-Dateien einbinden.
Hier nun mein Versuch der Portierung für DJGPP ( ob ich das richtig
gemacht habe? ).
/* ************************ */
#include<dos.h> /*int83(...,...,...) - union REGS - struct SREGS */
#include<sys/segments.h> /*_my_ds() */
#include<sys/farptr.h> /*_farpeekb(...,...)*/
#include<go32.h> /*_dos_ds */
void test(){
union REGS regs;
struct SREGS sregs;
regs.x.ax = 0xC000;
int86(0x15, ®s, ®s);
if ((regs.h.ah == 0) && (!(r.x.flags & 0x01))){
/* AH ist 0 und CF ist nicht gesetzt : Anfrage erfolgreich */
/* Zugriff auf ES:BX mit DJGPP */
/* Ersatz für:
segread( &sregs );
unsigned char far* p = (unsigned char far *) MK_FP(sregs.es,
regs.x.bx);
unsigned char feature_byte = p[6]; /* zweites Featurebyte ist bei
Offset 6*/
*/
/*
DJGPP has the functions _my_cs, _my_ds, and _my_ss
for that purpose (ES and DS always hold the same selector
in code produced by GCC from a C or C++ source,
so you don't need a fourth function).
*/
unsigned short ES = _my_ds();
unsigned char feature_byte = _farpeekb( _dos_ds, ES*16 + regs.x.bx + 6 );
if (feature_byte & (1<<6)) { /* sechstes Bit ist gesetzt*/
/* Code hier */
}
}
}
/* ************************ */
Wäre wieder toll, wenn ich Rückmeldungen bekomme.
Danke.
Beste Grüße,
Robert
URIs:
[1] http://www.delorie.com/djgpp/v2faq/faq18_2.html
[2] http://www.ctyme.com/intr/rb-1594.htm
[3] http://www.delorie.com/djgpp/v2faq/faq17_7.html
[4] http://www.delorie.com/djgpp/v2faq/faq18_4.html
[5] http://www.delorie.com/djgpp/doc/ug/dpmi/farptr-intro.html
[6] http://www.inversereality.org/tutorials/djgpp%20programming/pmode.html