Amstrad Extended BIOS Aufrufe

Übersetzt habe ich nur die Passagen, die für den Joyce relevant sind.
Auf das Amstrad eXtended BIOS wird mittels der BIOS-Funktion USERF zugegriffen. Der Aufruf hat folgende Gestalt:
        CALL    USERF
        DEFW    Wert
Wert ist eine 16-Bit Adresse in der Speicherbank 0 (Anwendungen laufen normalerweise in Bank 1). Der (dokumentierte) XBIOS Sprungblock beginnt ab Adresse 0080h und erstreckt sich bis 00E9h.

Da die Adresse der Funktion USERF an verschiedenen Rechnern unterschiedlich sein kann, sollte das folgende Unterprogramm benutzt werden, um die Funktion unabhängig von dem jeweiligen Rechner aufzurufen:
USERF:  PUSH    HL
        PUSH    DE
        LD      HL,(1)
        LD      DE,57h
        ADD     HL,DE
        POP     DE
        EX      (SP),HL
        RET
Oftmals benötigt diese Routinen eine Adresse, die an die Funktion übergeben wird. Wenn sie nicht aus Bank 0 aufgerufen werden, sollte diese Adresse oberhalb 0C000h liegen, damit die Routine darauf auch zugreifen kann. Zwar werden die Alternativregister während des Programmaufrufes gerettet, aber die Werte in ihnen stehen dem aufgerufenen Programm nicht zur Verfügung.

Kategorien
DD INIT80H DD SETUP83H DD READ SECTOR86H DD WRITE SECTOR89H DD CHECK SECTOR8CH DD FORMAT8FH
DD LOGIN92H DD SEL FORMAT95H DD DRIVE STATUS98H DD READ ID9BH DD L DPB9EH DD L XDPBA1H
DD L ON MOTORA4H DD L T OFF MOTORA7H DD L OFF MOTORAAH DD L READADH DD L WRITEB0H DD L SEEKB3H
CD SA INITB6H CD SA BAUDB9H CD SA PARAMSBCH TE ASKBFH TE RESETC2H TE STL ASKC5H
TE STL ON OFFC8H TE SET INKCBH TE SET BORDERCEH TE SET SPEEDD1H KM SET EXPANDD4H KM SET KEYD7H
KM KT GETDAH KM KT PUTDDH KM SET SPEEDE0H CD VERSIONE3H CD INFOE6H SCR RUN ROUTINEE9H

DD INIT - 0080h
Initialisiert das Floppy Disk Laufwerk.

Bei Aufruf werden die Floppy-Laufwerke auf ihren Ursprungswert zurückgesetzt (für 3" oder 3.5" Laufwerke, abhängig von der Maschine) und der Laufwerksmotor wird abgeschaltet. Zerstört Register AF,BC,DE,HL.

DD SETUP - 0083h
Einstellen des Floppy Disk Laufwerks.

Aufruf mit: HL=Adresse des Parameterblocks, oberhalb 0C000h. Zerstört Register AF, BC, DE und HL. Der Parameterblock ist wie folgt aufgebaut:
        DB      Timeout für Motor an, in 1/10.Sekunden
        DB      Timeout für Motor aus, in 1/10.Sekunden
        DB      Auszeit für Schreibstrom in 10 µs Einheiten
        DB      Head Settle Time, in Millisekunden.
        DB      Step Rate, in Millisekunden.
        DB      Head Unload Delay in 32ms Einheiten.
        DB      (2*Head Load Delay in 4ms Einheiten)+non DMA mode.
[Nur die neuesten PCW Versionen] Wenn HL=0 ist, dann wird nur ein Laufwerk eingestellt - dessen Nummer im Register C steht. Register DE hält die Adresse des Parameterblocks.

DD READ SECTOR - 0086h
Sektor von Floppy Disk lesen.

Aufruf mit: B=CP/M Bank, C=Laufwerkseinheit (0 oder 1), D=Spur (0 basierend), E=Sektor (0 basierend), HL=Lade-Adresse innerhalb der Bank, IX=Adresse des Disketten-XDPB.

Beendigung mit: Carry gesetzt wenn Lesen erfolgreich, nicht gesetzt im Fehlerfall. A=Fehlernummer 0-9. BC, DE und HL sind zerstört.

Fehlerkodierung:
0: Laufwerk nicht bereit
1: Schreibgeschützt
2: Suchfehler
3: Datenfehler
4: Keine Daten
5: Adressmarkierung fehlt
6: Fehlerhaftes Format
7: Unbekannter Fehler
8: Medium gewechselt
9: Ungeeignetes Medium
DD WRITE SECTOR - 0089h
Sektor auf Floppy Disk schreiben.

Aufruf mit: B=CP/M Bank, C=Laufwerkseinheit (0 oder 1), D=Spur (0 basierend), E=Sektor (0 basierend), HL=Lade-Adresse innerhalb der Bank des Sektors, IX=Adresse des Disketten-XDPB.

Beendigung mit: Carry gesetzt wenn Schreiben erfolgreich, nicht gesetzt im Fehlerfall. A=Fehlernummer 0-9. BC, DE und HL sind zerstört.

DD CHECK SECTOR - 008Ch
Überprüfen eines Diskettensektors.

Aufruf mit: B=CP/M Bank, C=Laufwerkseinheit (0 oder 1), D=Spur (0 basierend), E=Sektor (0 basierend), HL=Lade-Adresse innerhalb der Bank des Sektors, IX=Adresse des Disketten-XDPB.

Beendigung mit: Im Fehlerfall: Carry nicht gesetzt, A=Fehlernummer 0-9. Wenn kein Fehler vorliegt ist Carry gesetzt, Zero ist gesetzt, wenn der Sektor mit dem Speicherinhalt übereinstimmt. Andernfalls ist Zero nicht gesetzt. BC, DE und HL sind zerstört.

DD FORMAT - 008Fh
Formatierung einer Diskettenspur.

Aufruf mit: B=CP/M Bank, C=Laufwerkseinheit (0 oder 1), D=Spur (0 basierend), E=Füllbyte, HL=Lade-Adresse innerhalb der Bank der Formatdaten, IX=Adresse des Disketten-XDPB.

Beendigung mit: Im Fehlerfall: Carry nicht gesetzt, A=Fehlernummer 0-9. Wenn kein Fehler vorliegt ist Carry gesetzt. BC, DE und HL sind zerstört.

Der Bereich der Formatdaten besteht aus einer Liste von Sektoren; jeder Eintrag besteht aus vier Bytes. Die Anordung für einen Sektor ist wie folgt:
        DB      Spurnumner
        DB      Kopfnummer
        DB      Sektornummer
        DB      Physikalische Sektorverschiebung. 0 => 128, 1 => 256, 2 => 512...
DD LOGIN - 0092h
Anmeldung einer Diskette.

Aufruf mit: C=Laufwerkseinheit (0 oder 1), IX=Adresse des Disketten-XDPB.

Beendigung mit: Ohne Fehler ist Carry gesetzt, A=Formattyp, BC zerstört, DE=Größe des Doppel-Bit Belegungszeigers, HL=Größe der Hash-Tabelle, XDPB initialisiert. Im Fehlerfall hält A=Fehlernummer, BC DE HL XDPB zerstört.

Formattypen sind:
0: PCW Single Sided Single Density
1: CPC Systemformat
2: CPC Datenformat
3: PCW Double Sided Double Density
DD SEL FORMAT - 0095h
Vorbelegung eines XDPB mit einem Standardformat.

Aufruf mit: A=Format IX=Adresse des Ziel-XDPB.

Beendigung mit: Ohne Fehler ist Carry gesetzt, A=Formattyp, BC zerstört, DE=Größe des Doppel-Bit Belegungszeigers, HL=Größe der Hash-Tabelle, XDPB initialisiert. Im Fehlerfall hält A=Fehlernummer, BC DE HL XDPB zerstört.

Formattypen sind:
0: PCW Standard SS/SD, 173k 
1: CPC Systemformat,   169k
2: CPC Datenformat,    180k 
3: PCW Standard DS/DD, 706k 
DD DRIVE STATUS - 0098h
Holen des Laufwerkstatus.

Aufruf mit: C=Laufwerkseinheit (0 oder 1); das Bit 2 von Register C beinhaltet die Nummer des Kopfes.

Rückgabe HL zerstört, A=μPD765a Statusregister 3:
Bit 7: ?
Bit 6: Schreibgeschützt
Bit 5: Betriebsbereit   Wenn beide Bits 5 und 6 Null sind, existiert kein Laufwerk.
Bit 4: Spur 0
Bit 3: ?
Bit 2: Kopf
Bit 1: Höherwertiges  Bit der Einheit (Immer Null, Einheiten 2-3 sind nicht implementiert).
Bit 0: Niederwertiges Bit der Einheit
DD READ ID - 009Bh
Sektor-ID lesen.

Aufruf mit: C=Laufwerkseinheit (0 oder 1); D=Spur (0 basierend); IX=Adresse des XDPB.

Beendigung mit: Ohne Fehler ist Carry gesetzt, A=physikalische Sektornummer. Im Fehlerfall ist Carry nicht gesetzt, A=Fehlernummer. BC und DE sind immer zerstört und HL=Adresse des FDC Outputbuffers:
        DB      Anzahl der Ergebnis-Bytes
        DB      Ergebnis-Bytes
DD L DPB - 009Eh
Voreinstellung eines DPB von einem Boot-Rekord.

Aufruf mit: HL=Adresse des Boot-Rekords. IX=Adresse des DPB.

Beendigung mit: Ohne Fehler ist Carry gesetzt, A=Disk-Typ (wie bei DD LOGIN). Wenn Carry nicht gesetzt ist, dann hält A=Fehlernummer. BC DE und HL werden immer zerstört.

DD L XDPB - 00A1h
Voreinstellung eines XDPB von einem Boot-Rekord.

Aufruf mit: HL=Adresse des Boot-Rekords. IX=Adresse des XDPB.

Beendigung mit: Ohne Fehler ist Carry gesetzt, A=Disk-Typ (wie bei DD LOGIN). Wenn Carry nicht gesetzt ist, dann hält A=Fehlernummer. BC DE und HL werden immer zerstört.

DD L ON MOTOR - 00A4h
Schaltet den Laufwerksmotor ein.

Erhält alle Register und Flags. Wartet bis der Motor seine Drehgeschwindigkeit erreicht hat.

DD L T OFF MOTOR - 00A7h
Leitet den Countdown zum Ausschalten des Motors ein.

Erhält alle Register und Flags.

DD L OFF MOTOR - 00AAh
Schaltet Laufwerksmotor unverzüglich aus.

Zerstört Register AF, BC, DE und HL.

DD L READ - 00ADh
Ausführen eines μPD765A Lesebefehls.

Aufruf mit: HL=Adresse des Datenpuffers.
        DB      CP/M Bank
        DW      Adresse des Datenpuffers innerhalb der Bank
        DW      Anzahl der Datenbytes
        DB      Anzahl der μPD765a Befehlsbytes
        DB      μPD765a Befehlsbytes
Rückgabe AF, BC, DE zerstört; HL=Adresse des Resultpuffers:
        DB      Anzahl der Resultbytes
        DB      Resultbytes
Der Laufwerksmotor muss eingeschaltet sein.

DD L WRITE - 00B0h
Ausführen eines μPD765A Schreib-, Such- oder Formatbefehls.

Aufruf mit: HL=Adresse des Datenpuffers.
        DB      CP/M Bank
        DW      Adresse des Datenpuffers innerhalb der Bank
        DW      Anzahl der Datenbytes
        DB      Anzahl der μPD765a Befehlsbytes
        DB      μPD765a Befehlsbytes  
Rückgabe AF, BC, DE zerstört; HL=Adresse des Resultpuffers:
        DB      Anzahl der Resultbytes
        DB      Resultbytes   
Der Laufwerksmotor muss eingeschaltet sein.

DD L SEEK - 00B3h
Suchen einer Spur.

Aufruf mit: C=Laufwerkseinheit+4*Kopf, D=Zylindernummer, IX=Adresse des XDPB.

CD SA INIT - 00B6h
Seriellen Port einstellen.

Aufruf mit: A=Betriebsart oder Befehl. Wenn in A eine Betriebsart steht, D=Anzahl Stopbits, E=Parität, H=Anzahl Empfangsdatenbits, L=Anzahl Sendedatenbits.

Zerstört Register AF, BC, DE und HL.

Betriebsarten:
 00h - Keine Quittung (Handshake)
0FFh - Handshake
0FEh - Interrupt, kein Handshake
0FDh - Interrupt, Handshake
Befehle:
80h - DTR abschalten
7Fh - DTR einschalten
7Eh - RTS abschalten
7Dh - RTS einschalten
Anzahl Stopbits:
D=0   1   Stopbit
D=1   1.5 Stopbits
D=2   2   Stopbits
Parität:
E=0   Keine
E=1   Ungerade
E=2   Gerade
CD SA BAUD - 00B9h
Einstellen der SIO Baudrate.

Aufruf mit: H=Baudrate des Empfängers, L=Baudrate des Senders.

Zerstört Register AF, BC, DE, HL.

Die Baudraten sind numeriert von 1-15:
Nummer 123456789101112131415
Rate 5075110134.5150300600120018002400360048007200960019200

CD SA PARAMS - 00BCh
SIO Parameter holen.

Rückgabe B=Baudrate des Empfängers, C=Baudrate des Senders. Andere Register enthalten Parameter wie mit CD SA INIT gesetzt.

TE ASK - 00BFh
Größe des Bildschirms und Position des Cursors holen.

Beendigung mit:
B=Obere Reihe des Darstellungsfeldes in physikalischen Bildschirmkoordinaten
C=Linke Spalte des Darstellungsfeldes in physikalischen Bildschirmkoordinaten
D=Höhe des Darstellungsfeldes-1
E=Breite des Darstellungsfeldes-1
H=Cursorreihe, in Koordinaten des Darstellungsfeldes
L=Cursorspalte, in Koordinaten des Darstellungsfeldes
TE RESET - 00C2h
Terminalemulator rücksetzen.

Zerstört Register AF, BC, DE und HL.

Setzt das Darstellungsfeld auf volle Bildschirmgröße, den Zeichensatz auf Sprache 0 (USA), keine Spezialeffekte, Bildschirmfarben auf Voreinstellung, Cursor eingeschaltet usw. Sollte aufgerufen werden, wenn der Bildschirm durch andere Programme als durch den Bildchirmtreiber verändert wurde.

TE STL ASK - 00C5h
Ist die Statuszeile eingeschaltet?

Beendigung mit: A=0 wenn die Statuszeile ausgeschaltet ist, 0FFh wenn eingeschaltet. Die Zero Flag ist nicht gesetzt wenn Statuszeile sichtbar ist, gesetzt wenn unsichtbar.

TE STL ON OFF - 00C8h
Statuszeile ein- oder ausschalten.

Aufruf mit: A=0 für aus oder 0FFh für ein. Zerstört Register F, BC, DE, HL.

Wenn die Statuszeile eingeschaltet ist, werden dort BIOS Fehlermeldungen angezeigt und der Zustand des beim PCW eingebauten Druckers. Ist sie ausgeschaltet, dann werden die BIOS Fehlermeldungen auf dem Bildschirm ausgegeben.

TE SET INK - 00CBh
Farbskala für Bildschirm definieren.

Aufruf mit: A=Tintenwert; B=Farbe; C=Blinkwert.

Zerstört Register AF, BC, DE und HL.

Auf dem PCW steht der Tintenwert 0 für den Hintergrund und Tintenwert 1 für den Vordergrund. Andere Tintenwerte werden ignoriert. Wenn der Farbwert von Tinte 0 größer ist als von Tinte 1, dann wird die Bildschirmdarstellung „dunkel auf hell" benutzt; im anderen Fall „hell auf dunkel".

TE SET BORDER - 00CEh
Farbe für den Bildschirmrand setzen.

Aufruf mit: B=Farbe, wie vor.

Zerstört Register AF, BC, DE und HL.

Auf dem PCW ist Bit 7 gesetzt für invertierte Darstellung (dunkler Text auf hellem Hintergrund) und Bit 6 ist gesetzt wenn der Bildschirm gelöscht werden soll.

TE SET SPEED - 00D1h
Blinkwert für die Farbe setzen.

Aufruf mit: H=Zeit für die Hauptfarbe, L=Zeit für die Wechselfarbe, angegeben in 50. einer Sekunde.

Zerstört Register AF und HL.

KM SET EXPAND - 00D4h
Zeichen für Tastenerweiterung setzen.

Aufruf mit: B=Zeichennummer, 80h-9Eh; C=Länge der Zeichen; HL=Adresse der Zeichen.

Beendigung mit: Ohne Fehler ist Carry gesetzt. Wenn die Zeichen zu lang sind oder B ungültig ist Carry nicht gesetzt. A, BC, DE, HL sind zerstört.

KM SET KEY - 00D7h
Zuordnung eines Zeichens zu einer Taste.

Aufruf mit: B=ASCII Zeichen, C=Tastennummer, D=Bitdarstellung der Umschaltzustände.

Zerstört Register AF und HL.

Besondere ASCII Zeichenwerte sind:
  • 80h-9Eh: Tastenerweiterung
  • 9Fh: Tasteneingabe ignorieren
Ist ein Wert in der Bitdarstellung gesetzt, so wird damit angezeigt, dass die Tabelle für diese Kombination der Umschaltzustände geändert werden muss. Die Bedeutung der Bits ist:
0 - Taste ohne Umschaltung
1 - SHIFT
2 - ALT
3 - SHIFT+ALT
4 - EXTRA
KM KT GET - 00DAh
Zeichen-/Tastennummer holen.

Ist eine Taste gedrückt, steht in C=Tastennummer und in B=Umschaltzustand. Ist keine Taste gedrückt, so ist Carry nicht gesetzt, C zerstört, B=Bitdarstellung. Zerstört wird Register A.

Die Bitdarstellung ist:
Bit 0   nicht definiert
Bit 1   EXTRA
Bit 2   Gesetzt bei Tastenwiederholung
Bit 3   Feststellung der Taste Caps
Bit 4   Feststellung der Taste Num
Bit 5   SHIFT
Bit 6   Feststellung der Taste Shift
Bit 7   ALT
KM KT PUT - 00DDh
Tasteneingabe nachbilden.

Aufruf mit: B=Bitdarstellung, C=Tastennummer.

Die Bitdarstellung ist:
Bit 0   nicht definiert
Bit 1   EXTRA
Bit 2   Gesetzt bei Tastenwiederholung
Bit 3   Feststellung der Taste Caps
Bit 4   Feststellung der Taste Num
Bit 5   SHIFT
Bit 6   Feststellung der Taste Shift
Bit 7   ALT
KM SET SPEED - 00E0h
Setzen der Geschwindigkeit für das Rücksetzen der Tastatur.

Aufruf mit: H=Anfangsverzögerung, L=Folgeverzögerung.

Zerstört Register AF.

Beide Verzögerungswerte sind angegeben in 50. einer Sekunde. Eine 0 bedeutet 256, d.h. Tasten werden kaum wiederholt. Die Anfangsverzögerung wirkt bevor überhaupt eine Tastenwiederholung erfolgt; die Folgeverzögerung wirkt zwischen weiteren Wiederholungen.

CD VERSION - 00E3h
Versionsnummern holen.

Beendigung mit: A=Maschinentyp, B=BIOS Hauptversionsnummer, C=BIOS Unterversionsnummer, HL=Maschinenspezifische Versionsnummer.

Maschinentypen sind:
0  CPC6128
1  PCW8000/9000/10 series
3  Spectrum +3
65 PCW16
Die BIOS Hauptversionsnummer ist 2 für einen PCW9512 oder 9512+, sonst 1.

Bei neuesten Versionen des PCW CP/M ist H=0 und L ist eine Bitdarstellung der gefundenen Hardware:
  • Bit 0: Gesetzt wenn der PCW vom Typ 9256, 9512+ oder 10 ist; sonst nicht gesetzt.
  • Bit 1: ?
  • Bit 2: Gesetzt wenn die Druckereinheit des PCW9512 nicht vorhanden ist.
  • Bit 3: Paralleles+serielles Interface (CPS8256) ist vorhanden.
  • Bit 4: Gesetzt wenn die Druckereinheit des PCW8256 vorhanden ist.
  • Bit 5: Das parallele (aber nicht serielle) Interface ist vorhanden.
  • Bits 6-7: ?
Bei älteren PCW Versionen ist das Wort Null.

CD INFO - 00E6h
Systeminformation holen.

Beendigung mit: A=0FFh wenn zweites Laufwerk eingebaut ist, sonst 0; B=Speichergröße/16k; C=0FFh wenn serieller Port vorhanden ist, sonst 0; DE zerstört; HL=Adresse der Puffertabelle.

Die Puffertabelle zeigt auf Adresse des Diskettenpuffers:
        DB      CP/M Bank, 0FFh für Ende der Tabelle
        DW      Anfang
        DW      Länge
Bei neuesten PCW Versionen ist tatsächlich DE nicht zerstört sondern hält die Merkmale für die beiden Laufwerke (E = Merkmale für A: D = Merkmale für B:). Die Merkmale scheinen zu bedeuten:
     00h: Laufwerk nicht vorhanden 
     05h: Laufwerk ist 3" 180k Laufwerk 
     0Ah: Laufwerk ist 3" 720k Laufwerk 
     2Ah: Laufwerk ist 3.5" 720k Laufwerk 
SCR RUN ROUTINE - 00E9h
Aufruf einer Routine mit eingeblendetem Bildschirm.

Aufruf mit: BC=Adresse der Routine. DE, HL, IX und IY werden übergeben.

BC zerstört bei Beendigung; AF, DE, HL, IX, IY definiert durch Routine.

Der Aufruf erfolgt nach:
        LD      BC,routine
        CALL    USERF
        DEFW    00E9h
Der Bildschirm findet sich in Adresse 5C00h im Umfeld des Bildschirms, mit Roller-RAM ab Adresse 0B600h.

Der Zeichensatz ist abgelegt in Adresse 0B800h im Umfeld des Bildschirms.

Letzte Änderung: 17.August 2014