Routinen für Diskettenoperationen

Die hier vorgestellten Routinen sind solche für die Verabeitung von grundlegenden Diskoperationen. Dies umfasst Parse-Routinen sowie Schnittstellen direkt zum BDOS. Die I/O Operationen sind Rekord-basiert:

Modul-Entry B: Beschreibung, I: Eingabe-, O: Ausgabeparameter

BDOS.MAC
@BDOS IORES B: Ausführen eines BDOS Aufrufes für Diskettenoperationen
  I: Registerpaar DE zeigt auf einen FCB, der Akku hält die auszuführende BDOS Funktion
  O: Das Ergebnisfeld IORES hält den Inhalt des Akkus, IORES+1 das Register H und IORES+2 die BDOS Funktion

FILCHK.MAC
FILCHK @FILCK B: Testen der CP/M Parameter nach Aufruf eines Programmes
  I: Bei Aufruf von FILCHK muss der Standard File Control Block (FCB) legale Dateiparameter beinhalten. Bei Aufruf von @FILCK weist Registerpaar DE auf ein FCB. Registerpaar HL zeigt auf eine Liste mit zwei Adressen, die im Fehlerfall geladen werden.
  O: Die Carryflag ist nicht gesetzt, wenn in der FCB ein legaler Dateiname vorhanden ist. Dann hält das Registerpaar DE die Adresse der FCB. Die Carryflag ist gesetzt, wenn ein illegaler oder leerer Dateiname gefunden wurde, dabei hält Registerpaar DE die erste Adresse aus der Liste, wenn kein Dateiname gefunden wurde, und die zweite Adresse, wenn der Dateiname fehlerhaft ist.

WCARD.MAC
WCARD B: Testen ob Wild Card Zeichen („?") in FCB
  I: Registerpaar DE hält Adresse des FCB
  O: Zeroflag gesetzt bei „?" im FCB

SETDMA.MAC, (SETBUF.MAC)
SETDMA B: Setzen eines neuen DMA Puffers
(alt: SETBUF) I: Registerpaar DE hält Adresse eines neuen 128 Byte Puffers
  O: ---

CURDMA.MAC
CURDMA B: Holen des aktuellen DMA Puffers
  I: ---
  O: Registerpaar HL hält Adresse des aktuellen DMA Puffers

PARSE.MAC
PARSE B: Umwandeln einer Zeichenkette in FCB Format
  I: Registerpaar DE zeigt auf die Adresse eines Parseblocks mit:
  • Die erste Adresse zeigt auf einen Zeichenpuffer
  • Die zweite Adresse zeigt auf den FCB
  O: Bei normalem Ende ist die Carryflag nicht gesetzt und das Registerpaar HL zeigt auf den nächsten zu untersuchenden Teil der Zeichenkette oder, falls das Ende erreicht ist, enthält es Null. Im Fehlerfall ist Carry gesetzt.

PARSE22.MAC
PARSE B: Umwandeln einer Zeichenkette in FCB Format. Diese Routine ist speziell für CP/M 2.2 Anwender gedacht.
  I: Registerpaar DE zeigt auf die Adresse eines Parseblocks mit:
  • Die erste Adresse zeigt auf einen Zeichenpuffer
  • Die zweite Adresse zeigt auf den FCB
  O: Bei normalem Ende ist die Carryflag nicht gesetzt und das Registerpaar HL zeigt auf den nächsten zu untersuchenden Teil der Zeichenkette oder, falls das Ende erreicht ist, enthält es Null. Im Fehlerfall ist Carry gesetzt.

FPARSE.MAC
FPARSE B: Umwandeln einer Zeichenkette in FCB Format
  I: Registerpaar DE zeigt auf die Adresse eines Parseblocks mit:
  • Die erste Adresse zeigt auf einen Zeichenpuffer
  • Die zweite Adresse zeigt auf den FCB
  O: Bei normalem Ende ist die Carryflag nicht gesetzt und das Registerpaar HL zeigt auf den nächsten zu untersuchenden Teil der Zeichenkette oder, falls das Ende erreicht ist, enthält es Null. Im Fehlerfall ist Carry gesetzt. Der Akku hält 0, wenn kein Punkt in der Zeichenkette gefunden wurde. Akku hält 1, wenn ein Punkt gefunden wurde

XPARSE.MAC
XPARSE B: Umwandeln einer Zeichenkette in FCB Format
  I: Registerpaar DE zeigt auf die Adresse eines Parseblocks mit:
  • Die erste Adresse zeigt auf einen Zeichenpuffer
  • Die zweite Adresse zeigt auf den FCB
Registerpaar HL zeigt auf eine Liste von Zeichen, die neben den Standardzeichen das Endzeichen des Puffers für die Wandlung angeben. Das erste Byte in der Liste gibt die Länge der folgenden Zeichen an
  O: Bei normalem Ende ist die Carryflag nicht gesetzt und das Registerpaar HL zeigt auf den nächsten zu untersuchenden Teil der Zeichenkette oder, falls das Ende erreicht ist, enthält es Null. Im Fehlerfall ist Carry gesetzt.

XFPARS.MAC
XFPARS B: Umwandeln einer Zeichenkette in FCB Format
  I: Registerpaar DE zeigt auf die Adresse eines Parseblocks mit:
  • Die erste Adresse zeigt auf einen Zeichenpuffer
  • Die zweite Adresse zeigt auf den FCB
Registerpaar HL zeigt auf eine Liste von Zeichen, die neben den Standardzeichen das Endzeichen des Puffers für die Wandlung angeben. Das erste Byte in der Liste gibt die Länge der folgenden Zeichen an
  O: Bei normalem Ende ist die Carryflag nicht gesetzt und das Registerpaar HL zeigt auf den nächsten zu untersuchenden Teil der Zeichenkette oder, falls das Ende erreicht ist, enthält es Null. Im Fehlerfall ist Carry gesetzt. Der Akku hält 0, wenn kein Punkt in der Zeichenkette gefunden wurde. Akku hält 1, wenn ein Punkt gefunden wurde

PRSCHK.MAC
$PRDEL $PRPTR B: Hilfsroutinen für XPARSE und XFPRSE

GETDU.MAC
GETDU B: Umwandeln einer Zeichenkette in Laufwerk mit optionaler Angabe des Nutzerbereiches. Diese Routine sollte vor einer der PARSE Routinen aufgerufen werden.
  I: Registerpaar HL zeigt auf die Zeichenkette, die mit einem Doppelpunkt abgeschlossen sein muss.
  O: Register B hält das Laufwerk und Register C hält den Nutzer. Register E zeigt an, ob ein Laufwerk und/oder Nutzer definiert wurde. Falls nicht, so stehen in den Registern die gerade eingestellten Werte.
  • Bit 0 : Gesetzt bei Eingabe eines Laufwerkes
  • Bit 1 : Gesetzt bei Eingabe eines Nutzers
Im Fehlerfall ist Carry gesetzt. Wenn kein Fehler vorliegt, dann zeigt das Registerpaar HL hinter das Zeichen „:" oder bleibt unverändert.

GETDEV.MAC
GETDEV B: Umwandeln einer Zeichenkette in ein Gerät. Diese Routine sollte vor einer der PARSE (und GETDU) Routinen aufgerufen werden
  I: Registerpaar HL zeigt auf die Zeichenkette, die mit einem Doppelpunkt abgeschlossen sein muss. Optional zeigt Registerpaar DE auf eine Erweiterungstabelle, andernfalls hält das Registerpaar Null. Die Tabelle muss aus Elementen von je drei Zeichen bestehen (ohne Doppelpunkt), abgeschlossen mit Null.
  O: Register C hält den Wert des Gerätes:
0:NUL:
1:CON:
2:AUX:
3:LST:
4+x:Aus Erweiterung (x=0, 1, usw.)
Carry ist gesetzt, wenn kein Gerät gefunden wurde. Die Registerpaare HL und DE bleiben unverändert.

SETERR.MAC
SETERR B: Einstellen eines Fehlermodus
  I: Der Akku hält den Fehlermodus. Dieser kann gewählt werden aus:
00H->Warmstart bei Fehler
01H..FDH->Fehler ausgeben, dann Warmstart
FEH->Fehler anzeigen, Extended Mode
FFH->Nur Extended Mode
  O: Fehlermodus eingestellt

GETERR.MAC
GETERR B: Ermitteln des eingestellten Fehlermodus
  I: ---
  O: Der Akku hält den Fehlermodus:
00H->Warmstart bei Fehler
01H..FDH->Fehler ausgeben, dann Warmstart
FEH->Fehler anzeigen, Extended Mode
FFH->Nur Extended Mode

ERROR.MAC
@ERROR B: Überprüfen von Fehlern bei Diskettenoperationen
  I: Gesetzte Carryflag zeigt Fehler an.
  O: Im Fehlerfall wird geprüft, ob Extended Mode eingestellt ist. Falls ja, dann wird getestet, ob im Feld ERRPC (siehe nächstes Modul) eine Adresse ungleich Null steht. Falls ja, verzweigt das Modul auf diese Adresse, andernfalls Rückkehr mit gesetzter Carryflag. Der Akku hält den Originalwert vom Register H

ERRLNK.MAC
@ERCOD ERRPC B: Datenfelder zur Überprüfung von Fehlern bei Diskettenoperationen
  I: ---
  O: Der Extended Mode steht in @ERCOD. Im Feld ERRPC steht eine optionale Adresse.

ERRIDX.MAC
ERRIDX B: Wandeln von Fehlercodes in Indizes
  I: Feld IORES aus Modul @BDOS ist gefüllt mit Standard und IORES+1 mit erweitertem Code
  O: Registerpaar DE hält Index. Die Zeroflag ist gesetzt, wenn kein Fehler vorliegt.
Indizes für erweiterten Fehlercode (IORES = -1)
 
Registerpaar DEIORES+1Bedeutung
00Kein Fehler
21Disk I/O Fehler
42Read Only Disk
63Read Only Datei
84Drive Fehler
107Datei Passwort Fehler
128Datei existiert bereits
149FCB beinhaltet Wildcard (?)
  Indizes für Standard Fehlercode
 
Registerpaar DEIORESBedeutung
161Ende der Datei oder kein Platz auf der Disk
182Keine Datenblöcke frei
203Extent kann nicht geschlossen werden
224Suche in unbeschriebenem Extent
245Directory voll
266Random Rekord Nummer zu groß
289Ungültiger FCB
3010Disk wurde gewechselt

PHYSID.MAC
PHYSID B: Testen ob gewähltes Laufwerk vorhanden ist
  I: Das Registerpaar DE hält die Adresse des FCB
  O: Carryflag ist gesetzt bei nicht vorhandenem Laufwerk, sonst nicht gesetzt

OPEN.MAC
OPEN B: Öffnen einer existierenden Datei.
  I: Das Registerpaar DE hält die Adresse des FCB
  O: Carryflag ist gesetzt, wenn die Datei nicht gefunden wurde, sonst nicht gesetzt. Im Extended Mode Verzweigung auf Fehlerroutine möglich. Extent und Aktueller Rekord werden auf 0 gesetzt.

CREATE.MAC
CREATE B: Erzeugen einer neuen Datei
  I: Das Registerpaar DE hält Adresse des FCB
  O: Carryflag ist gesetzt, falls kein neue Directory Eintrag erfolgen kann (Diskette voll oder Datei schon vorhanden), sonst nicht gesetzt. Im Extended Mode Verzweigung auf Fehlerroutine möglich

CREATC.MAC
CREATC B: Erzeugen einer neuen Datei, falls Datei nicht schon vorhanden
  I: Das Registerpaar DE hält Adresse der FCB
  O: Carryflag ist gesetzt, falls kein Platz auf Diskette oder falls die Datei schon vorhanden ist, sonst nicht gesetzt.

CREATD.MAC
CREATD B: Erzeugen einer neuen Datei, Löschen einer vorhandenen Datei
  I: Das Registerpaar DE hält Adresse der FCB
  O: Carryflag ist gesetzt, falls kein Platz auf Diskette ist, sonst nicht gesetzt.

TRNCAT.MAC
TRNCAT B: Vorhandene Dateigröße verkleinern
  I: Das Registerpaar DE hält Adresse der FCB, in der der Random Rekord Zeiger auf den letzten neuen Rekord der Datei eingestellt sein muss
  O: Carryflag ist gesetzt, falls die Datei nicht vorhanden ist oder die gewählte Rekordnummer größer ist als die größte Rekordnummer der Datei. Im Extended Mode Verzweigung auf Fehlerroutine möglich

FILEOP.MAC
@FILOP B: Ausführung spezieller Diskettenfunktionen.
  I: Registerpaar DE hält Adresse des FCB. Der Akku hält die auszuführende BDOS Funktion (z.B. OPEN)
  O: Die Extension und der Current Rekord im FCB werden auf Null gesetzt. Die Carryflag wird bei fehlerhafter Operation gesetzt und Akku hält Extended Mode Fehlerkode

FILECL.MAC
@FILCL B: Ausführung spezieller Diskettenfunktionen
  I: Das Registerpaar DE hält Adresse des FCB. Der Akku hält die auszuführende BDOS Funktion (z.B. CLOSE)
  O: Bei fehlerhafter BDOS Funktion wird die Carryflag gesetzt (Abbildung MSB des Fehlercodes), sonst nicht. Der Akku hält Extended Mode Fehlerkode

OPNAPP.MAC
OPNAPP B: Öffnen einer vorhandenen Datei, Vorbereitung für Append (Anhängen neuer Daten an das Dateiende)
  I: Das Registerpaar DE hält Adresse des FCB
  O: Bei erfolgreichem Öffnen hält der Akku einen relativen Rekordzeiger 0..128 und die Carryflag ist nicht gesetzt, sonst ja. Der Aufrufer muss für die Einstellung des Disk Puffers sorgen.

REOPEN.MAC
REOPEN B: Öffnen einer existierenden Datei.
  I: Das Registerpaar DE hält die Adresse des FCB
  O: Carryflag ist gesetzt, wenn die Datei mit der gewählten Extent oder Rekordnummer nicht gefunden wurde, sonst nicht gesetzt. Im Extended Mode Verzweigung auf Fehlerroutine möglich. Extent und Aktueller Rekord werden übernommen.

SETOPN.MAC
SETOPN B: Öffnen einer existierenden Datei.
  I: Das Registerpaar DE hält die Adresse des FCB, Register L hält die Extent Nummer und Register H hält die aktuelle Rekordnummer
  O: Carryflag ist gesetzt, wenn die Datei mit der gewählten Extent oder Rekordnummer nicht gefunden wurde, sonst nicht gesetzt. Im Extended Mode Verzweigung auf Fehlerroutine möglich.

CLOSE.MAC
CLOSE B: Schließen einer geöffneten Datei
  I: Registerpaar DE hält Adresse des FCB
  O: Carryflag gesetzt falls Datei nicht gefunden wurde, sonst nicht gesetzt. Im Extended Mode Verzweigung auf Fehlerroutine möglich

DELETE.MAC
DELETE B: Löschen einer vorhandenen Datei
  I: Registerpaar DE hält Adresse des FCB
  O: Carryflag ist gesetzt falls Datei nicht vorhanden, sonst nicht gesetzt. Im Extended Mode Verzweigung auf Fehlerroutine möglich

RENAME.MAC
RENAME B: Umbenennen einer Datei
  I: Registerpaar DE hält Adresse des FCB
  O: Carryflag gesetzt falls alte Datei nicht vorhanden oder neue Datei schon auf Diskette, sonst nicht gesetzt. Im Extended Mode Verzweigung auf Fehlerroutine möglich

RENAMC.MAC
RENAMC B: Umbenennen einer Datei falls neuer Dateiname unbekannt
  I: Registerpaar DE hält Adresse des FCB
  O: Carryflag gesetzt falls alte Datei nicht vorhanden oder neue Datei schon auf Diskette, sonst nicht gesetzt. Im Extended Mode Verzweigung auf Fehlerroutine möglich

RENAMF.MAC
RENAMF B: Umbenennen einer Datei
  I: Registerpaar DE hält FCB der alten Datei und Registerpaar HL weist auf den neuen Namen.
  O: Siehe Modul RENAME

RENAMI.MAC
RENAMI B: Umbenennen einer Datei falls neuer Dateiname unbekannt
  I: Registerpaar DE hält FCB der alten Datei und Registerpaar HL weist auf den neuen Namen.
  O: Siehe Modul RENAMC

SETRND.MAC
SETRND B: Ermitteln der Random Rekord Zahl (RRN) aus einem FCB
  I: Registerpaar DE hält Adresse der geöffneten FCB
  O: Registerpaar HL hält niederwertigen Teil der RRN, Akku hält höchstweriges Byte. Die Zeroflag ist gesetzt, wenn Akku Null ist.

FTELL.MAC
FTELL B: Dateipositon für nächstes sequentielles Lesen bestimmen.
  I: Registerpaar DE hält Adresse der geöffneten FCB
  O: Registerpaar HL hält niederwertigen Teil der RRN, Akku hält höchstwertiges Byte.

FSEEK.MAC
FSEEK B: Datei für nächstes sequentielles Lesen positionieren.
  I: Registerpaar DE hält Adresse der geöffneten FCB. Registerpaar HL hält niederwertigen Teil der RRN, Akku hält höchstwertiges Byte. Ist in Adresse FSEEK-1 das Bit 0 gesetzt, so wird die RRN um 1 erhöht (durch sequentielles Lesen).
  O: Carryflag gesetzt falls Datei nicht gefunden oder vollständig gelesen wurde, sonst nicht gesetzt. Der Aufrufer muss für die Einstellung des Disk Puffers sorgen.