Hallo alle zusammen,
Zunächst mal vorweg, ich habe zwar schon das eine oder andere kleine Programm realisiert, aber ich bin nicht der wahre Programmier-Experte.
Mein Problem ist nun folgendes:
Ich möchte in einem C++ Projekt (Borland C++ Ver. 5.0) unter MS-DOS Informationen von einer PCI-Karte im PC auslesen (z.B. die I/O-Adresse).
Dazu habe ich einen Beispielcode mit Inline-Assembler nach folgendem Schema gefunden:
for (slot_no=0;(slot_no<=0x00F8) && (io_adr==0);slot_no+=8)
{
__asm mov bx,word ptr (slot_no)
__asm mov ax,word ptr (0xb109)
__asm mov di,word ptr (0x0000)
__asm INT (0x1a)
__asm mov v_id,ecx // <<< die Stelle wird zum 1. Problem!
.... und so weiter (es folgen noch mehrere Zugriffe auf ecx).
Das Problem ist, dass der Borland-Compiler nur 286-er Maschinenbefehle kennt, und damit keine 32-Bit Registerzugriffe (z.B. ecx) kann.
Den Code zum Auslesen des PCI-BIOS gibts auch noch direkt als ASM-Datei, und vorkompiliert als OBJ-Datei.
Dazu ist auch noch ein Beispiel mit dem Aufruf der Funktion (INT_1A), etwa so:
extern unsigned long far pascal INT_1A( unsigned long reax,
unsigned long rebx,
unsigned long recx,
unsigned long redi);
// ------------------------------------------------------------------
unsigned long pci_rd_cfg (unsigned int einheit, unsigned int adresse)
{
unsigned long inhalt;
inhalt=INT_1A(0xb10aL,(long) einheit,0L , (long) adresse);
return (inhalt);
}
// -------------------------------------------------------------------
void pci_wr_cfg(unsigned int einheit, unsigned int adresse, unsigned long wert)
{
INT_1A(0xb10dL, (long) einheit, (long) wert, (long) adresse);
....
}
Nun meine Frage, wie kann ich in das Projekt die "INT_1A.OBJ" -Datei einbinden, damit der Compiler den Funktionsaufruf versteht?
Beste Grüße
Jörg
Zunächst mal vorweg, ich habe zwar schon das eine oder andere kleine Programm realisiert, aber ich bin nicht der wahre Programmier-Experte.
Mein Problem ist nun folgendes:
Ich möchte in einem C++ Projekt (Borland C++ Ver. 5.0) unter MS-DOS Informationen von einer PCI-Karte im PC auslesen (z.B. die I/O-Adresse).
Dazu habe ich einen Beispielcode mit Inline-Assembler nach folgendem Schema gefunden:
for (slot_no=0;(slot_no<=0x00F8) && (io_adr==0);slot_no+=8)
{
__asm mov bx,word ptr (slot_no)
__asm mov ax,word ptr (0xb109)
__asm mov di,word ptr (0x0000)
__asm INT (0x1a)
__asm mov v_id,ecx // <<< die Stelle wird zum 1. Problem!
.... und so weiter (es folgen noch mehrere Zugriffe auf ecx).
Das Problem ist, dass der Borland-Compiler nur 286-er Maschinenbefehle kennt, und damit keine 32-Bit Registerzugriffe (z.B. ecx) kann.
Den Code zum Auslesen des PCI-BIOS gibts auch noch direkt als ASM-Datei, und vorkompiliert als OBJ-Datei.
Dazu ist auch noch ein Beispiel mit dem Aufruf der Funktion (INT_1A), etwa so:
extern unsigned long far pascal INT_1A( unsigned long reax,
unsigned long rebx,
unsigned long recx,
unsigned long redi);
// ------------------------------------------------------------------
unsigned long pci_rd_cfg (unsigned int einheit, unsigned int adresse)
{
unsigned long inhalt;
inhalt=INT_1A(0xb10aL,(long) einheit,0L , (long) adresse);
return (inhalt);
}
// -------------------------------------------------------------------
void pci_wr_cfg(unsigned int einheit, unsigned int adresse, unsigned long wert)
{
INT_1A(0xb10dL, (long) einheit, (long) wert, (long) adresse);
....
}
Nun meine Frage, wie kann ich in das Projekt die "INT_1A.OBJ" -Datei einbinden, damit der Compiler den Funktionsaufruf versteht?
Beste Grüße
Jörg