Ü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.
|
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.
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.
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
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.
Ü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.
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...
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
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
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
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
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.
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.
Schaltet den Laufwerksmotor ein.
Erhält alle Register und Flags.
Wartet bis der Motor seine Drehgeschwindigkeit erreicht hat.
Leitet den Countdown zum Ausschalten des Motors ein.
Erhält alle Register und Flags.
Schaltet Laufwerksmotor unverzüglich aus.
Zerstört Register AF, BC, DE und HL.
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.
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.
Suchen einer Spur.
Aufruf mit:
C=Laufwerkseinheit+4*Kopf, D=Zylindernummer, IX=Adresse des XDPB.
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
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 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Rate |
50 | 75 | 110 | 134.5 | 150 | 300 | 600 | 1200 | 1800 | 2400 | 3600 | 4800 | 7200 | 9600 | 19200 |
SIO Parameter holen.
Rückgabe B=Baudrate des Empfängers, C=Baudrate des Senders.
Andere Register enthalten Parameter wie mit CD SA INIT gesetzt.
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
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.
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.
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.
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".
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.
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.
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.
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
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
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
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.
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.
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
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.
|