API

Damit die Bibliothek mit den Assembler-lastigen Steuerfunktionen keine Black Box ist umd zum besseren Verständnis sollen die verfügbaren Routinen, die bislang in reinem Assembler umzusetzen waren, an dieser Stelle dokumentiert werden:

Ausführung von Interrupts

 

 void inter( interrupt )
int interrupt;
{
/*Parameter in den Stack laden...*/
interrupt = interrupt;
#asm
mov cx, 4[bp]; interrupt - parameter holen
mov dx, ss; stack segment sichern
mov ax, cs;
mov ss, ax; in Datenbereich schreiben...
mov bp, #int_label ; zu ändernder Befehl...
mov [bp+1], cl; neuen interrupt setzen...
mov ss, dx; Stack wiederherstellen...
int_label:
int 123 ; Wert egal wird ohnehin überschrieben...
#endasm
}

 

Ausgabe auf Hardware-Port

 

void outb( port, value )
unsigned char port;
unsigned char value;
{
port = port; /* Stack für Argumente initialisieren */
/* opcode fuer out ist e6 */
#asm
mov bx, 6[bp]; value
mov cx, 4[bp]; port parameter holen
mov dx, ss; stack segment sichern
mov ax, cs;
mov ss, ax; in Datenbereich schreiben...
mov bp, #out_label ; zu ändernder Befehl...
mov [bp+1], cl; neuen out - wert setzen...
mov ss, dx; Stack wiederherstellen...
; neuen out - befehl anwenden.
mov ax, bx; value
out_label:
out 6, al;
; int 3;
#endasm
}

 

Installation einer Interrupt Service Routine

 

void installisr( function, address )
unsigned int function;
unsigned int address;
{
function = function; /* Stack für Argumente initialisieren */
#asm
mov bx, 4[bp]; Funktionsposition
mov cx, 6[bp]; Adresse...
mov dx, ss; stack segment sichern
mov ax, cs; im Codesegment bleiben
mov ss, ax; in Datenbereich schreiben...
mov bp, cx; Adresse...
mov [bp + 0], bx; segment 0
mov [bp + 2], #$0; Funktionsposition schreiben
mov ss, dx; Stack wiederherstellen...
#endasm
}

 

Verlassen einer Interrupt Service Routine

 

void iret() {
#asm
add sp, *2
pop si
pop di
pop bp
iret
#endasm
}

 

Interrupts freigeben

 

void sti() {
#asm
sti
#endasm
}

 

Interrupts sperren

 

void cli() {
#asm
cli
#endasm
}

 


Einstiegspunkt

 

void main() {
#asm
; standard-stack ist 0x20
mov ax, #$50
mov sp, ax
#endasm
entry();
#asm
int 3; Programmende
#endasm
}
keyboard_arrow_up