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 BDOS-Funktionen

Das BDOS (Basic Disk Operating System) arbeitet auf einem höheren Level als das zuvor besprochene BIOS. Das BDOS aller CP/M Systeme ist nicht mehr abhängig von der Hardware und funktioniert auf allen Systemen in gleicher Art. Die bereitgestellten Funktionen sind umfangreicher und mehr anwendungszentriert. Trotzdem sind umfangreiche Kenntnisse über den internen Aufbau von CP/M notwendig, um alle Funktionen nutzen zu können.

Themen dieses Kapitels

  • Aufrufkonventionen
  • Alle BDOS-Funktionen als Liste
  • Ein weiteres kleines Programm

Aufrufkonventionen

Das BDOS erwartet vor dem Aufruf mit TRAP #2 die Funktionsnummer F# im Register D0.W und alle Parameter in den Registern wie sie in der Beschreibung angegeben sind. Falls eine Funktion des BDOS einen oder mehrere Werte an das aufrufende Programm zurück gibt, sind entsprechende Angaben ebenfalls der Beschreibung in der Tabelle zu entnehmen.
MOVE #9,D0         * Laden der Funktionsnummer für PRINT STRING
MOVE.L #TEXT,D1    * Parameter, hier Adresse des auszugebenden Textes
TRAP #2            * Aufruf der BDOS-Funktion

Liste der BDOS Funktionen

Funktion F# Beschreibung
System Reset00Terminiert das laufende Programm und kehrt zum CCP zurück.
Parameter: keine
Rückgabe: keine
Console Input01Liest das nächste Zeichen von der Console
Parameter: keine
Rückgabe in D0.W: ASCII Zeichen
Die Funktion wartet bis ein Zeichen eingegeben wurde.
Console Output02Sendet ein Zeichen zur Konsole
Parameter in D1.W: ASCII Zeichen
Rückgabe in D0.W: $00
Wenn die Console nicht bereit ist wird die Programmausführung unterbrochen.
Auxiliary Input03Liest das nächste Zeichen vom alternativen Device AUX
Parameter: keine
Rückgabe in D0.W: ASCII Zeichen
Die Funktion wartet bis ein Zeichen eingegeben wurde.
Auxiliary Output04Sendet ein Zeichen zum alternativen Device AUX
Parameter in D1.W: ASCII Zeichen
Rückgabe in D0.W: $00
Wenn die Console nicht bereit ist wird die Programmausführung unterbrochen.
List Output05Sendet ein Zeichen zum LST Device
Parameter in D1.W: ASCII Zeichen
Rückgabe in D0.W: $00
Wenn die Console nicht bereit ist wird die Programmausführung unterbrochen.
Direct Console I/O06Direkter Zugriff auf die Console ohne Verarbeitung von Control-Zeichen
Parameter in D1.W: ASCII Zeichen
Rückgabe in D0.W: ASCII Zeichen oder Status
Get I/O Byte07Ermittelt das I/O Byte
Parameter: keine
Rückgabe in D0.W: I/O Byte
Set I/O Byte08Setzt das I/O Byte
Parameter in D1.W: I/O Byte
Rückgabe in D0.W: $00
Print String09Ausgabe eines Strings auf der Console
Parameter in D1.L: Adresse des Strings
Rückgabe in D0.W: $00
Die Funktion sendet alle ab der angegebenen Adresse gefundenen Zeichen bis ein $ auftritt.
Read Console Buffer10Liest eine Zeile von der Console in einen Buffer ein.
Parameter in D1.L: Adresse des Buffers
Rückgabe in D0.W: $00
Das erste Byte des Buffers zeigt dessen Größe in Byte an, das zweite Byte zeigt die tatsächliche Anzahl Zeichen im Buffer an, ab dem dritten Byte folgen die Zeichen.
Get Console Status11Prüft, ob ein Zeichen in der Console vorliegt
Parameter: keine
Rückgabe in D0.W: $00 = kein Zeichen, sonst ungleich $00
Return Version Number12Gibt die Versionsnummer des CP/M zurück
Parameter: keine
Rückgabe in D0.W: Version Number
Reset Disk System13Setzt das Diskettensystem zurück
Parameter: keine
Rückgabe in D0.W: $00
alle Laufwerke werden auf Read/Write geschaltet und ausgeloggt.
Select Disk14Bestimmt das Standardlaufwerk für folgende Funktionen
Parameter in D1.W = Laufwerksnummer
Rückgabe in D0.W: $00
Das Laufwerk wird zusätzlich eingeloggt.
Open File15Öffnet die im FCB angegebene Datei
Parameter in D1.L = Adresse des FCB
Rückgabe in D0.W: $00..$03 = OK, $FF = ERROR
Close File16Schließt die im FCB angegebene Datei
Parameter in D1.L = Adresse des FCB
Rückgabe in D0.W: $00..$03 = OK, $FF = ERROR
Search First17Sucht im Directory nach dem ersten Auftreten des Dateimusters
Parameter in D1.L = Adresse des FCB
Rückgabe in D0.W: $00..$03 = OK, $FF = ERROR
Der gefundene Directory Eintrag wird an die aktuelle DMA Adresse kopiert. Der Wert in D0.W bildet den Index auf einen 32 Byte umfassenden Eintrag im Buffer, D0.W * 32 ist die Startposition im Buffer.
Search Next18Sucht im Directory nach weiteren Auftreten des Dateimusters
Parameter in D1.L = Adresse des FCB
Rückgabe in D0.W: $00..$03 = OK, $FF = ERROR
Search Next darf erst nach einem Search First eingesetzt werden, zwischen aufeinanderfolgenden Search Next Aufrufen dürfen keine anderen Diskettenbezogenen BDOS Funktionen benutzt werden.
Delete File19Entfernt Dateien aus dem Directory
Parameter in D1.L = Adresse des FCB
Rückgabe in D0.W: $00 = Datei gelöscht, $FF = Datei nicht gefunden
Read Sequential20Liest die nächsten 128 Byte aus einer Datei in den DMA Buffer
Parameter in D1.L = Adresse des FCB
Rückgabe in D0.W: $00 = OK, $01 = ERROR
Der FCB muss zuvor durch Open File (Function 15) oder Make File (Function 22) geöffnet worden sein. Das Programm muss das Feld Current Record (Bytes 21-23 des FCB) auf 0 setzen um die Datei vom Anfang zu lesen.
Write Sequential21Schreibt 128 Byte vom DMA Buffer in eine Datei
Parameter in D1.L = Adresse des FCB
Rückgabe in D0.W: $00 = OK, $01 = Directory voll, $02 = Diskette voll
Der FCB muss zuvor durch Funktion 15 oder 22 geöffnet worden sein. Der Inhalt wird in die aktuelle Satznummer (Byte 21-23 des FCB) geschrieben. Die Satznummer wird nach dem Schreiben automatisch erhöht.
Make File22Erstellt und öffnet eine neue Datei
Parameter in D1.L = Adresse des FCB
Rückgabe in D0.W: $00..$03 = OK, $FF = Directory voll
Es muss sichergestellt sein, dass die im FCB angegebene Datei nicht bereits existiert. Zur Sicherheit sollte vorher Delete File aufgerufen werden.
Rename File23Benennt eine Datei um
Rückgabe in D0.W: Login Vector
Die ersten 12 Byte des FCB bezeichnen die umzubenennende Datei, In den Bytes 16-27 des FCB wird der neue Dateiname angegeben.
Return Login Vector24Gibt den Login Status aller Laufwerke als 16 Bit Wert zurück
Parameter: keine
Rückgabe in D0.W: Login Vector
Return Current Disk25Gibt die Nummer des aktuellen Laufwerks zurück
Parameter: keine
Rückgabe in D0.W: Current Disk
Set DMA Address26Setzt die Startadresse des DMA Buffers
Parameter in D1.L = Adresse des Buffers
Rückgabe in D0.W: $00
Der DMA Buffer hat einen Umfang von 128 Byte und kann auf geraden oder ungeraden Adressen beginnen.
Write Protect Disk28Setzt den temporären Schreibschutz für ein Laufwerk
Parameter: keine
Rückgabe in D0.W: $00
Get Readonly Vector29Ermittelt den Schreibschutz Status aller Laufwerke
Parameter: keine
Rückgabe in D0.W: Read-Only Vector
Set File Attributes30Setzt die Dateiattribute der angegebenen Datei
Parameter in D1.L = Adresse des Buffers
Rückgabe in D0.W: $00 = OK, $FF = ERROR
Die Dateiattribute befinden sich in den höchstwertigen Bits des Dateinamens. F1...F4 = Benutzerdefiniert, F5...F7 = Reserviert, T1 = Read Only, T2 = System, T3 = Archive
Get Disk Parameters31Holt eine Kopie des BIOS Disk Parameter Blocks für das Standardlaufwerk
Parameter in D1.L: Adresse des DPB
Rückgabe in D0.W: $00
Die Belegung des DPB findet sich weiter unten in einer getrennten Tabelle.
Set/Get User Code32Setzt oder ermittelt die Benutzernummer
Parameter in D1.W: $FF = GET oder User Code = SET
Rückgabe in D0.W: Benutzernummer
Die Benutzernummer muss im Bereich 0 ... 15 liegen.
Read Random33Liest einen Satz aus einer Datei in den DMA Buffer
Parameter in D1.L = Adresse des FCB
Rückgabe in D0.W: $00 = OK, $01,$03,$04,$06 = ERROR
Der FCB muss zuvor durch Open File (Function 15) oder Make File (Function 22) geöffnet worden sein. Das Programm muss im Feld Current Record (Bytes 21-23 des FCB) die zu lesende Satznummer vorgeben.
Write Random34Schreibt einen Satz vom DMA Buffer in eine Datei
Parameter in D1.L = Adresse des FCB
Rückgabe in D0.W: $00 = OK, $01,$03,$05,$06 = ERROR
Der FCB muss zuvor durch Open File (Function 15) oder Make File (Function 22) geöffnet worden sein. Das Programm muss im Feld Current Record (Bytes 21-23 des FCB) die zu schreibende Satznummer vorgeben.
Compute File Size35Ermittelt die Größe einer Datei
Parameter in D1.L = Adresse des FCB
Rückgabe in D0.W: $00
Bei Erfolg enthält die Satznummer des FCB die Länge der Datei, bei Auftreten eines Fehlers ist die Satznummer 0.
Set Random Record36Berechnet die Satznummer zur aktuellen Dateiposition
Parameter in D1.L = Adresse des FCB
Rückgabe in D0.W: $00
Die Satznummer ist abhängig von der vorausgegangenen Operation.
Reset Drive37Bringt die angegebenen Laufwerke in den Reset Status
Parameter in D1.W: Drive Vector
Rückgabe in D0.W: $00
Zurückgesetzte Laufwerke sind nicht eingeloggt und haben den Status Read-Write.
Write Random with Zero Fill40Schreibt einen Satz vom DMA Buffer in eine Datei
Parameter in D1.L = Adresse des FCB
Rückgabe in D0.W: $00 = OK, $01,$03,$05,$06 = ERROR
Der FCB muss zuvor durch Open File (Function 15) oder Make File (Function 22) geöffnet worden sein. Das Programm muss im Feld Current Record (Bytes 21-23 des FCB) die zu schreibende Satznummer vorgeben.
Get Disk Free Space46Ermittelt die Anzahl der freien logischen Sektoren
Parameter in D1.W: Laufwerksnummer
Rückgabe im DMA Buffer: 4 Byte Anzahl Sektoren
Chain to Program47Beendet das aktuelle Programm und führt die Kommandozeile im DMA Buffer aus
Im ersten Byte des DMA Buffers steht die Anzahl der Zeichen, darauf folgen bis zu 126 ASCII Zeichen, das letzte Byte des DMA Buffers ist $00.
Flush Buffers48Schreibt alle nicht verarbeiteten Buffer auf die Disketten
Parameter: keine
Rückgabe iin D0.W: $00 = OK, sonst ERROR


Teaser

Hier ein weiteres kleines Testprogramm, welches Diesmal ohne die Zuhilfenahme des Grundprogramms auskommt. Im Gegensatz zum ersten Beispiel würde dieses Programm auf jedem CP/M 68K System der Welt ablauffähig sein.
******************************************
* Das übliche Hallo-Welt Beispiel
******************************************

PRINTSTR EQU 9             * BDOS Funktionsnummer zur Textausgabe 

START:                     * Label (eigentlich nicht notwendig)

    MOVE #PRINTSTR, D0     * Laden der Funktionsnummer zum BDOS Aufruf
    MOVE.L #MELDUNG, D1    * Laden der Adresse des auszugebenden Textes
    TRAP #2                * BDOS-Funktion ausführen

    RTS                    * Programmende, Rücksprung nach CP/M

MELDUNG:                   * Definition des auszugebenden Textes

    DC.B 13, 10, 'Ich bin der NDR Klein Computer', 13, 10, '$'

END                        * Ende des Quelltextes

Fazit

Viel schwieriger ist es nicht geworden obwohl in diesem Beispiel nicht einmal das Grundprogramm zur Hilfe genommen wurde. Keine Angst, es wird etwas komplexer, wenn man auf die Datenstrukturen des BIOS und BDOS zugreifen muss.

Weiter zu Teil 5 der Serie: Nützliche Unterprogramme

Zurück zu Teil 3 der Serie: Die BIOS-Funktionen