SYSTEMAUFRUFE FÜR ANWENDUNGEN
eax      = Funktionsnummer
int 0x40 = Systemaufruf
00 = DEFINIEREN UND ZEICHNEN EINES FENSTERS
     ebx [x start]*65536 + [x größe]
     ecx [y start]*65536 + [y größe]
     edx Grundfarbe         0xXYRRGGBB  wenn X=8 -> Farbverlauf
                                        wenn Y=0 -> Fenstertyp  I
                                        wenn Y=1 -> reservierter Bereich, kein eichnen
                                        wenn Y=2 -> Fenstertyp  II
                                        wenn Y=3 -> Fenster skinned,
                                              schließen-Button id=1 hinzugefügt
     esi Titelleistenfarbe  0xXYRRGGBB  wenn X=8 -> negativer Farbverlauf
                                        wenn X=4 -> positiver Farbverlauf
                                        Y normal 0
                                        wenn Y=1 -> Fenster kann nicht über GUI bewegt werden
     edi Rahmenfarbe        0x00RRGGBB
     ret: keine Änderung
01 = PIXEL SETZEN
     ebx [x]
     ecx [y]
     edx Pixelfarbe 0x0XRRGGBB
                        ^ 0 normales setzen , 1 negativ
     ret: keine Änderung
02 = TASTE ERMITTELN
     ret: al 0 erfolgreich -> ah = Taste
          al 1 keine Taste im Puffer
          Siehe auch Funktion 66
03 = SYSTEMZEIT ERMITTELN
     ret: eax 0x00SSMMHH sec,min,hour
04 = TEXT IN FENSTER SCHREIBEN
     ebx [x start]*65536 + [y start]
     ecx Farbe               - 0x00RRGGBB
         Schriftart (0 or 1) - 0xF0000000
     edx Zeiger auf den Textanfang
     esi Textlänge
     ret: keine Änderung
05 = VERZÖGERUNG X/100 SEKUNDEN
     ebx VERZÖGERUNG in 1/100 Sekunden
     ret: keine Änderung
07 = BILD ANZEIGEN
     ebx Zeiger auf Bild im Speicher - RRGGBBRRGGBB..
     ecx Bildgröße [x]*65536+[y]
     edx BIldposition im Fenster [x]*65536+[y]
     ret: eax 0 erfolgreich, 1 überschneiden
08 = BUTTON DEFINIEREN
     ebx [x start]*65536 + [x größe]
     ecx [y start]*65536 + [y größe]
     edx Button ID Nummer (24 Bits)
     esi Buttonfarbe 0x 00 RR GG BB
     ret: keine Änderung
     ; wenn das Bit 31 in edx gesetzt ist, dann entfernt die Funktion den Button mit der passenden ID
     ; beachte dass die Funktion nicht das Buttonbild entfernt, um überflüssiges flackern zu verhindern -
     ; zum Beispiel beim wechseln der Farbe
     ; wenn das Bit 30 in edx gesetzt ist, dann wird das Buttonbild nicht gezeichnet
     ; wenn das Bit 29 gesetzt ist, wird das Rechteck beim drücken nicht gezeichnet
09 = PROZESS INFO
     ebx Zeiger auf die 1024 Byte Tabell
     ecx Prozess Nummer oder -1 = wer bin ich
     ret: eax Nummer des Prozesses
          table :  +00  dword   CPU Nutzung
                   +04   word   Position im Fenster-Stack
                   +06   word   Fenster-Stack Wert bei ecx
                   +10  12 db   Name des Prozesses
                   +22  dword   Start des Prozessspeichers
                   +26  dword   genutzer Speicher des Prozesses
                   +30  dword   PID des Prozesses
                   +34  dword   Fenster x start
                   +38  dword   Fenster y start
                   +42  dword   Fenster x größe
                   +46  dword   Fenster y größe
                   +50   word   Prozessstatus
10 = AUF EIN EREIGNIS WARTEN
     ret: eax Ereignisart, 1 Fenster neuzeichnen, 2 Taste im Puffer, 3 Button gedrückt
11 = AUF EIN EREIGNIS PRÜFEN, KEIN WARTEN
     ret: eax 0 kein Ereignis, 1 Fenster neuzeichnen, 2 Taste im Puffe, 3 Button gedrückt
12 = STATUS BEIM FENSTER NEUZEICHNEN
     ebx  1 beginn des neuzeichnens, 2 ende des neuzeichnens
     ret: keine Änderung
13 = BALKEN ZEICHNEN
     ebx [x start]*65536 + [x größe]
     ecx [y start]*65536 + [y größe]
     edx Farbe 0x00RRGGBB
     ret: keine Änderung
14 = BILDSCHIRMGRÖßE ERMITTELN
     ret: eax [screen x max]*65536 + [screen y max]
15 = HINTERGRUND
     ebx 1 : Hintergrundgröße setzen
             ecx x größe
             edx y größe
     ebx 2 : in Hintergrundspeicher schreiben - max (0x100000-16)
             ecx Position im Speicher in Bytes
             edx Farbe 0x00RRGGBB
     ebx 3 : Hintergrund zeichnen
     ebx 4 : Art des Hintergrund zeichnens
             ecx 1 - kacheln
             ecx 2 - strecken
     ebx 5 : Bild in des OS Hintergrundspeicher bewegen
             ecx - von
             edx - nach wohin in den OS Hintergrundspeicher
             esi - Anzahl der zu bewegenden Bytes
16 = RAMDISK AUF DISKETTE SPEICHERN
     ebx 1 : alles speichern
17 = GEDRÜCKTE BUTTON-ID ERMITTELN
     ret: al 0 erfolgreich -> ah  = ID Nummer (8 Bits)
               shr eax,8   -> eax = ID Nummer (24 Bits)
          al 1 keine Taste im Puffer
18 = SYSTEMSERVICE
     ebx 1 - Systemboot
     ebx 2 - Beendigung erzwingen, ecx Prozessnummer
     ebx 3 - aktiviere Fenster in der Prozessliste ecx
     ebx 4 - IDLE Taktzyklen / Sekunde
     ebx 5 - Zeitstempelzähler / Sekunde - CPU-Geschwindigkeit
20 = MIDI INTERFACE - MPU401
     ebx  1 - Gerät resetten
     ebx  2 - cl Midi Daten zur Ausgabe
21 = EINRICHTUNG VON GERÄTEN
     ebx 1=Roland MPU Midi Base, Basis IO Adresse
     ebx 2=Tastatur  1 Basis Tastaturlayout  2 Tastaturlayout umschalten (ecx Zeiger auf Tastaturlayout)
                     9 Land 1eng 2fi 3ger 4rus
     ebx 3=CD Basis  1 Pri Master  2 Pri Slave,
                     3 Sec Master  4 Sec Slave
     ebx 4=SB16 Basis, Basis IO Adresse
     ebx 5=Systemsprache, 1eng 2fi 3ger 4rus
     ebx 6=wss Basis, Basis IO Adresse
     ebx 7=HD Basis, 1 Pri Master  2 Pri Slave
                     3 Sec Master  4 Sec Slave
     ebx 8=FAT32 Partition in HD
     ebx 10=Sound DMA Kanal in ecx
23 = AUF EIN EREIGNIS MIT TIMEOUT WARTEN
     ebx Zeit der Verzögerung in 1/100 Sekunden
     ret: eax Ereignisart: 0 kein Ereignis, 1 Fenster neugezeichnet,
                           2 Taste im Puffer, 3 Button
24 = CD AUDIO
     ebx 1 - spielen von ecx 00 FR SS MM
     ebx 2 - Playlistgröße von ecx zu [edx] ermitteln
     ebx 3 - Stop/Pause Play
25 = SB16 - MIXER I
     ebx 1 - Hauptlautstärke setzen cl [L]*16+[R]
     ebx 2 - CD-Lautstärke setzen   cl [L]*16+[R]
26 = KONFIGURATION VON GERÄTEN ERMITTELN
     ebx 1=Roland MPU Midi Basis, Basis IO Adresse
     ebx 2=Tastatur  1 Basis Tastaturlayout  2 Tastaturlayout umschalten
                     9 Land 1eng 2fi 3ger 4rus
     ebx 3=CD Basis  1 Pri Master  2 Pri Slave,
                     3 Sec Master  4 Sec Slave
     ebx 4=SB16 Basis, Base IO Adresse
     ebx 5=Systemsprache, 1eng 2fi 3ger 4rus
     ebx 6=wss Basis, Basis IO Adresse
     ebx 7=HD Basis, 1 Pri.Master  2 Pri Slave
                     3 Sec Master  4 Sec Slave
     ebx 8=FAT32 Partition in HD
     ebx 9=Laufzeit in 1/100 Sekunden -> eax
     Rückgabewert in eax
27 = WINDOWS SOUNDSYSTEM
     ebx 1 - Hauptlautstärke setzen nach cl 0-255
     ebx 2 - CD-Lautstärke setzen   nach cl 0-255
28 = SB16 - MIXER II
     ebx 1 - Hauptlautstärke setzen nach cl 0-255
     ebx 2 - CD-Lautstärke setzene  nach cl 0-255
29 = DATUM ERMITTELN
     ret: eax 0x00YYDDMM Jahr Tag Monat
32 = DATEI VON DISKETTE LÖSCHEN
     ebx  Zeiger auf Dateiname
     ret: eax - 0 = erfolgreich, 1 = Datei nicht gefunden
35 = BILDSCHIRMPIXEL LESEN
     ebx = Pixel werden von oben-links an gezählt
     ret: eax = 0x00RRGGBB
37 = MAUS-POSITION LESEN
     ebx=0 Relativ zum Bildschirm
     ebx=1 Relativ zum Fenster
     ebx=2 Tasten gedrückt
     Rückgabewert in eax
38 = LINIE ZEICHNEN
     ebx  [x start] shl 16 + [x ende]
     ecx  [y start] shl 16 + [y ende]
     edx  Farbe 0x00RRGGBB
     ret: keine Änderung
39 = HINTERGRUND ERMITTELN
     ebx=1 -> eax=[Hintergrund x größe] shl 16 + [Hintergrund y größe]
     ebx=2
     ecx=     Position des Speichers des Hintergunds der in eax zurückgegeben wird
     ebx=4 -> eax=1 gekachelt, eax=2 gestreckt
40 = BITFELDER FÜR DIE GEWÜNSCHTEN EREIGNISSE SETZEN
     Standard:
     ebx = 00000000 00000000 00000000 00000111b  Ereignisse:
                                             I   Fenster zeichnen
                                            I    Taste im Puffer
                                           I     Button im Puffer
                                          I      (Ende der Anfrage)
                                         I       Desktop Hintergrund zeichnen
                                        I        Maus ändern
                                       I         IPC Event
           I---------------I                     IRQ Daten ermitteln
41 = IRQ BESITZER ERMITTELN
     ebx : IRQ
     ret : PID des Prozesses
42 = DATEN ERMITTELN DIE VON IRQ GELESEN WERDEN
     ebx : IRQ Nummer
     ret :  eax  Anzahl der Bytes im Puffer
             bl  Daten
            ecx  0 = erfolgreich Daten gelesen
                 1 = keine Daten im Puffer
                 2 = falscher IRQ Besitzer
44 = PROGRAMM IRQ's
     ebx : Zeiger auf die Tabelle
     ecx : IRQ Nummer
45 = IRQ RESERVIEREN/FREIMACHEN
     ebx : 0 - reservieren, 1 - freimachen
     ecx : IRQ Nummer
     ret : eax: 0 - erfolgreich, 1 - fehler
46 = PORT-BEREICH RESERVIEREN/FREIMACHEN
     ebx : 0 - reservieren, 1 - freimachen
     ecx : Port-Bereich Beginn   ( min 256   )
     edx : Port-Bereich Ende     ( max 16383 )
     ret : eax: 0 - erfolgreich, 1 - fehler
     Direkter Zugriff auf ein- und ausgehende Kommandos
47 = DISPLAYNUMMER ZUM FENSTER
     ebx = Drucktyp,   bl=0 -> ecx ist Nummer
                       bl=1 -> ecx ist Zeiger
                       bh=0 -> Dezimal anzeigen
                       bh=1 -> Hexadezimal anzeigen
                       bh=2 -> Binär anzeigen
           Bits 16-21 = Anzahl der anzuzeigenden Ziffern (0-32)
           Bits 22-31 = reserviert
     ecx = Nummer oder Zeiger
     edx = x shl 16 + y
     esi = Farbe
48 = ALLGEMEINE FENSTEREIGENSCHAFTEN DEFINIEREN
     ebx = 0      anwenden/neuzeichnen
        ecx = 0 , Desktop anwenden/neuzeichnen
     ebx = 1      Button-Stil definieren
        ecx = 0 , flache Buttons setzen
        ecx = 1 , 3D Buttons setzen
     ebx = 2      Fensterfarben definieren
        ecx = Zeiger auf Tabelle
        edx = Anzahl definierter Bytes
     ebx = 3      definierte Fensterfarben ermitteln
        ecx = Zeiger auf Tabelle
        edx = Anzahl der zu ermittelnden Bytes
     ebx = 4      Fensterhöhe ermitteln
50 = FENSTER FREI GESTALTEN UND SKALIEREN
     ebx = 0 ; Referenzgestaltungsbereich
       ecx = Zeiger auf den Referenzbereich
             Bytes pro Pixel, 0 nicht genutzt, 1=genutzt, andere = reserviert
     ebx = 1 ; Referenzbereichsskalierung (standard 1:1)
       ecx : skalieren ist auf 2^ecx gesetzt
     ret: keine Änderung
51 = THREAD ERSTELLEN
     ebx = 1  ; ERSTELLEN
       ecx    ; = Thread Einstiegspunkt
       edx    ; = Thread Stack-Position
     ret: eax = PID oder 0xfffffff0+ für fehler
52 = STACK-TREIBER STATUS
     - siehe stack.txt
53 = SOCKET-SCHNITTSTELLE
     - siehe stack.txt
55 = SOUND-SCHNITTSTELLE
     ebx = 0     ; Soundblock laden
       ecx =     ; Zeiger auf (Standardgröße 65536 Bytes) Soundblock
     ebx = 1     ; spiele (Standard 44 kHz 8 Bit Mono) Soundblock
     ebx = 2     ; Format setzen
       ecx = 1   ; Playblocklänge setzen
         edx =   ; Blocklänge
57 = DATEI VON FESTPLATTE LÖSCHEN
     ebx   Zeiger auf Dateiname : 11 Großbuchstaben
     edx   Zeiger auf Pfad : Pfad db 0
58 = SYSTEM TREE ACCESS
     ebx    Zeiger auf Dateiinfo Block
     Pfad-Beispiel:
     '/RAMDISK/FIRST/KERNEL.ASM',0
     '/RD/1/KERNEL.ASM',0
     '/HARDDISK/FIRST/KERNEL.ASM',0
     '/HD/1/KERNEL.ASM',0
     '/HARDDISK/FIRST/MENUET/PICS/TANZANIA.BMP',0
     Dateiinfo:
     dd   0                    ; 0=LESEN    (löschen/anhängen)
     dd   0x0                  ; 512 Block zum lesen 0+
     dd   0x1                  ; Blocks zum lesen (/Bytes zu schreiben/anhängen)
     dd   0x20000              ; gibt Datenzeiger zurück
     dd   0x10000              ; Arbeitsbereich für OS - 16384 Bytes
     db   '/RAMDISK/FIRST/KERNEL.ASM',0  ; ASCIIZ Verzeichnis & Dateiname
     ret: eax = 0 - erfolg, andere - Fehlercode
          ebx = Dateigröße
     oder
     Dateiinfo:
     dd   1                    ; 1=SCHREIBEN
     dd   0x0                  ; nicht genutzt
     dd   10000                ; zu schreibende Bytes
     dd   0x20000              ; Quelldatenzeiger
     dd   0x10000              ; Arbeitsbereich für OS - 16384 Bytes
     db   '/RAMDISK/FIRST/KERNEL.ASM',0  ; ASCIIZ Verzeichnis & Dateiname
     ret: eax = 0 - erfolg, andere - Fehlercode
     oder
     ; LBA
     Dateiinfo:
     dd   8                    ; 8=LBA lesen (/9=LBA schreiben)
     dd   0x0                  ; 512 Block zum lesen (schreiben)
     dd   0x1                  ; auf 1 setzen
     dd   0x20000              ; gibt Datenzeiger zurück
     dd   0x10000              ; Arbeitsbereich für OS (16384 Bytes)
     dd   '/HARDDISK/SECOND',0 ; Physikalisches Gerät ; ASCIIZ
          ( oder /rd/1/ )
          LBA lesen muss mit dem Setup eingeschaltet sein
     NOTE: Die ASCIIZ in diesem Kontext beziehen sich auf Physikalische Geräte und
           nicht auf logische.
           Für HD: erste =Pri Master, zweite=Pri Slave
                   dritte=Sec Master, vierte=Sec Slave
     od
     Dateiinfo:
     dd   16                   ; 16=ANWENDUNG STARTEN
     dd   0x0                  ; nop (No OPeration)
     dd   param                ; 0 oder Parameterbereich ( ASCIIZ )
                               ; zu empfangene Anwendung muss
                               ; einen 256 Byte-Bereich reservieren
     dd   0x0                  ; nop
     dd   0x10000              ; Arbeitsbereich für OS - 16384 Bytes
     db   '/HD/1/MENUET/APPS/FIRE',0  ; ASCIIZ Verzeichnis & Dateiname
     ret: eax = PID oder 0xfffffff0+ für fehler
59 = NACH SYSTEMAUFRUFEN VON PROZESSEN UNTERSUCHEN
     ebx = 0   ; Systemereignisse ermitteln
       ecx     ; Zeiger auf Tabelle-> ; 64 Bytes/Systemaufruf Descriptor
                                      ; +00 PID
                                      ; +32 EDI
                                      ; +36 ESI
                                      ; +40 EBP
                                      ; +44 ESP
                                      ; +48 EBX
                                      ; +52 EDX
                                      ; +56 ECX
                                      ; +60 EAX
       edx     ; Anzahl der Bytes die zur Tabelle zurückgegeben werden sollen (momentan maximal 16*64)
     return:  eax = Anzahl der Systemaufrufe seit dem Start
                    letzte Aufruf wird in (eax mod 16)*64 in der Tabelle gespeichert
              ebx = 0 : obige Format
60 = INTERPROzESSKOMMUNIKATION
     ebx = 1 - definiere IPC Speicher
     ebx = 2 - sende Nachricht
61 = DIREKTER GRAFIKZUGRIFF
     ebx = 1 - Auflösung ermitteln       ->  eax [x] shl 16 + [y]
     ebx = 2 - Bits pro Pixel ermitteln  ->  eax
     ebx = 3 - Bytes pro Linie ermitteln ->  eax
     Direkter Zugriff mit dem gs Selector : mov [gs:0],dword 0xffffff
62 = PCI ZUGRIFF
     - siehe pci.txt
63 = ALLGEMEINE FEHLERBESEITIGUNG
     ebx = 1 schreibe Byte in cl
     ebx = 2 lese Byte : ebx = 1 -> Byte in al ; ebx = 0 -> keine Daten
64 = ANWENDUNGSSPEICHERGRÖßE ÄNDERN
     ebx = 1 Speichermenge setzen
       ecx = neue Speichermenge
       ret: eax = 0 - erfolgreich
            eax = 1 - nicht genügend Speicher
65 = UTF
66 = TASTATUR DATENMODUS
     ebx = 1 Mode setzen
       ecx = 0 : Tastaturlayout
       ecx = 1 : Scancodes
     ebx = 2 Modus ermitteln : Rückgabewert in eax
     ebx = 3 CTRL ALT SHIFT Status ermitteln : Rückgabewert in eax
67 = ANWENDUNGSFENSTER BEWEGEN ODER GRÖßE ÄNDERN
     ebx = new x start
     ecx = new y start
     edx = new x größe
     esi = new y größe
     Wenn man irgendwelche Parameter als -1 spezifiziert, bleibt der Parameter unverändert.
     Z.B. spezifiziere ebx = -1 und ecx = -1 um einfach die Fenstergröße zu ändern, aber
     nicht zu bewegen
-1 = ANWENDUNG BEENDEN