ndr-nkc.de ndr-nbc.de
  
Startseite
News
 
NDR-NKC
Geräte Z80
Geräte 68000
Geräte 8088
 
NKC Emulator
 
Z80 Section
Baugruppen
ROM's
Software
68000 Section
Baugruppen
ROM's
PASCAL/S
Software
CP/M 68K
8088 Section
Baugruppen
Downloads
 
Bussysteme
Stromversorgung
Input / Output
Grafikkarten
Speicherkarten
Massenspeicher
Weitere Baugruppen
 
Projekte
 
Dokumentation
Datenblätter
Glossar
Portraits
Links

Impressum

 

CP/M 68K Programmierkurs - Die BIOS-Funktionen

Obwohl es technisch möglich ist, geschieht die Kommunikation mit der Hardware unter CP/M in der Regel nicht direkt, sondern über den Umweg über das BIOS (Basic Input Output System). Das BIOS dient zur Anpassung unterschiedlicher Hardware an das standardisierte Betriebssystem, es wird vom Hersteller der Hardware bereitgestellt und in das CP/M System integriert.

Themen dieses Kapitels

  • Aufrufkonventionen
  • Alle BIOS-Funktionen als Liste
  • Ein erstes kleines Programm
Die BIOS-Funktionen sind allesamt sehr hardwarenah und können je nach Computer unterschiedlich ausfallen, die Hersteller der Hardware dürfen erweiterte Funktionen implementieren. Lediglich die ersten 23 Funktionen sind vorgegeben und müssen vom BIOS bereitgestellt werden. Das BIOS im NKC stellt jedoch nur den Zugriff auf einen kleinen Teil der Hardware des NKC zur Verfügung, so dass zum Beispiel Baugruppen wie PROMER, SOUND und andere nicht darüber angesprochen werden können.

Hält man sich an die BIOS-Aufrufe, dann können Programme, die auf einem Computer übersetzt wurden, theoretisch auch auf einem anderen Computer zur Ausführung gebracht werden.

Aufrufkonventionen

Die BIOS-Funktionen sind durch fortlaufende Funktionsnummern in Verbindung mit einem TRAP-Befehl des 68000 Prozessors ansprechbar. Die Funktionsnummer wird immer im Register D0 angegeben, eventuell notwendige Parameter in der Regel in den darauffolgenden Registern der CPU. Hier ein einfaches Beispiel, welches einen Buchstaben auf dem Monitor ausgibt.
MOVE #4,D0         * Laden der Funktionsnummer für CONOUT
MOVE #'A',D1       * ASCII Code des Zeichens A nach D1 laden
TRAP #3            * Aufruf der BIOS-Funktion

Liste der BIOS Funktionen

Genauere Beschreibungen einzelner Funktionen werde ich in den folgenden Kapiteln nach Bedarf erläutern.

Funktion F# Beschreibung
INIT0Führt einen Kaltstart des Systems aus und initialisiert die Hardware
Parameter: keine
Rückgabe: keine
WARMST1Führt einen Warmstart des Systems aus
Parameter: keine
Rückgabe: keine
CONST2Ermittelt ob ein Zeichen von der Konsole zur Eingabe bereit ist
Parameter: keine
Ergebnis in D0.W: $0000 = kein Zeichen vorhanden, $00FF = Zeichen zum Einlesen bereit
CONIN3Liest ein Zeichen von der Konsole (Tastatur) ein
Parameter: keine
Ergebnis in D0.W: Eingelesenes Zeichen
CONOUT4Gibt ein Zeichen auf der Konsole (Monitor) aus
Parameter in D1.W: Auszugebendes Zeichen
Rückgabe: keine
LIST5Gibt ein Zeichen auf dem LST Device (Drucker) aus
Parameter in D1.W: Auszugebendes Zeichen
Rückgabe: keine
AUXOUT6Gibt ein Zeichen auf dem alternativen Device aus
Parameter in D1.W: Auszugebendes Zeichen
Rückgabe in D0.W: Ausgegebenes Zeichen
AUXIN7Liest ein Zeichen von dem alternativen Device ein
Parameter in D1.W: Auszugebendes Zeichen
Rückgabe in D0.W: Eingelesenes Zeichen, $001A = Datenende
HOME8Laufwerk auf Spur 0 positionieren
Parameter: keine
Rückgabe: keine
SELDSK9Laufwerk auswählen
Parameter in D1.B: Laufwerksnummer, 0 für A, 1 für B bis 15 für Laufwerk P
Parameter in D2.B: Flag, ob das Laufwerk bereits eingeloggt ist.
Rückgabe in D0.L: Adresse des Disk-Parameter-Header (DPH)
Bei nicht existenten Laufwerken Ist das Ergebnis in D0.L = $00000000
SETTRK10Spurnummer setzen
Parameter in D1.W: Spurnummer zwischen 0 und 65536
Rückgabe: keine
Beim NKC Diskettenformat werden Spurnummern zwischen 0 und 79 unterstützt.
SETSEC11Sektornummer setzen
Parameter in D1.W: Sektornummer zwischen 0 und 65536
Rückgabe: keine
Beim NKC Diskettenformat werden Sektornummern zwischen 0 und 26 unterstützt.
SETDMA12Setzen der Adresse für DMA (Direct Memory Access)
Parameter in D1.L: Adresse eines 128 Byte Blocks zum Puffern eines Sektorinhaltes
Rückgabe: keine
READ13Ausgewählten Sektor lesen
Parameter: keine
Rückgabe in D0.W: Status, $0000 = OK, $0001 = Lesefehler
WRITE14Ausgewählten Sektor schreiben
Parameter in D1.W: Schreibmodus, 0 = normal, 1 = Inhaltsverzeichnis, 2 = neuer Block
Rückgabe in D0.W: Status, $0000 = OK, $0001 = Schreibfehler
LISTST15Status des LST Device (Drucker) lesen
Parameter: keine
Rückgabe in D0.W: Status, $0000 = Gerät nicht bereit, $00FF = Gerät bereit
SECTRAN16Sektorübersetzung
Parameter in D1.W: logische Sektornummer
Parameter in D2.L: Adresse der Sektorübersetzungstabelle
GETMEM18Adressen der Speicherbereiche ermitteln
Parameter: keine
Rückgabe in D0.L: Adresse der Tabelle mit Speicherbereichsinformationen
Unter CP/M 68K gibt es nur einen Adressbereich, die Transient Program Area (TPA)
GETIO19Eingabe/Ausgabe Zuordnung lesen
Parameter: keine
Rückgabe in D0.W: Aktueller Wert des IOBYTE
SETIO20Eingabe/Ausgabe Zuordnung setzen
Parameter in D1.W: Neuer Wert für IOBYTE
Rückgabe: keine
FLUSH21Veränderte Buffer schreiben
Parameter: keine
Rückgabe in D0.W: $0000 = erfolgreich, $FFFF = Fehler
Die Funktion erzwingt das Schreiben aller als geändert markierten Puffer.
SETVEC22Vektor für Ausnahme setzen
Parameter in D1.W: Nummer des Vektors
Parameter in D2.L: Adresse der Behandlungsroutine
Rückgabe in D0.W: bisherige Adresse
GETGP23Adresse des Grundprogramms ermitteln
Dies ist eine Sonderfunktion durch die Implementierung des BIOS im NKC
Parameter: keine
Rückgabe in A4: Adresse des Grundprogramms

Teaser

Hier ein real funktionierendes Programm, welches bei Aufruf den Inhalt des Bildschirms löscht. Einfach mal eintippen und mit MAKE CLS aus dem vorangegangenen Kapitel übersetzen.
******************************************
* Programm zum löschen des Bildschirms
******************************************

CLRSCR EQU 20           * Funktionsnummer im Grundprogramm

TEXT                    * Start des Textsegments, erste Anweisung

    MOVE #23, D0        * Funktionsnummer für GETGP (siehe oben)
    TRAP #3             * Aufruf des BIOS

    MOVE #CLRSCR, D7    * Funktionsnummer für GP setzen
    JSR $420(A4)        * Routine im GP aufrufen

    RTS                 * Programmende

END                     * Ende des Quelltextes


Fazit

Wie man sieht, ist es nicht wirklich schwer, kleine eigene Programm zu entwickeln, die unter CP/M 68K ablauffähig sind. Bis hierhin haben wir einen einfachen Weg, der es erlaubt alle offiziellen Einsprünge in das Grundprogramm aufzurufen (auch wenn das Beispiel extrem simpel ist).

Weiter zu Teil 4 der Serie: Die BDOS-Funktionen

Zurück zu Teil 2 der Serie: Der Linker LO68