MenuetOS The Assembly Language Programmers OS!


Home | Das Wiki | Screenshots | Dokumente | Downloads | Foren | Kontakt

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