CP/M 3 System Control Block

Übersicht

Original:Jim Lopushinsky24.Juni 1986
Zusatz:Werner Cirsovius23.Juni 1993
Mehr Hinweise:Simeon Cran (ZPM3) 
 John Elliott3.November 1995

Hier folgt die komplette Beschreibung der Felder im CP/M 3.1 System Control Block, soweit ich es ermitteln kann. Die undokumentierten Felder wurden gefunden beim Disassemblieren des CCP, des residenten BDOS und der BDOS-Bank. Digital Research dokumentiert den SCB als 100 (dezimal) Bytes, aber ist er 152, oder in hexadezimal 98, Bytes lang. Der SCB belegt die letzen 152 Bytes des residenten BDOS (direkt vor dem BIOS). Es beginnt bei xx68h, wobei xx die letzte Page im BDOS darstellt; deshalb liegt der Offset 62h-63h (Höchste Adresse der TPA) auf xxFEh, direkt vor dem 'JMP BOOT' BIOS Beginn. Die Adresse des SCB kann auch wie folgt ermittelt werden:
	LXI	D,SCBPB
	MVI	C,49
	CALL	BDOS	;Page Adresse des SCB im Reg H
	..
	..
SCBPB:	DB	3AH	;Dies ist der Offset fuer die SCB-Adresse
	DB	0	;Lade-Operation
Um auf ein Feld im SCB zuzugreifen, wird die obige Routine benutzt. Dann wird das Register L mit dem Feld-Zeiger aus untenstehender Tabelle geladen. Register HL beinhaltet dann die Adresse des Feldes.
Natürlich ust auch ein Zugriff auf die SCB-Felder mit der BDOS Funktion 49 möglich, wie oben gezeigt. Der Control Block hat folgenden allgemeinen Aufbau:
SCBPB:	DB	Offset
	DB	Modus
{	DB	Lo	}
{	DB	Hi	}
  • Wenn der Modus 00H ist, hält das Register HL den 16 Bit-Wert des gewählten Feldes und der Akkumulator hält den Byte-Wert, welcher dem Inhalt des Registers L entspricht.
  • Wenn der Modus FFH ist, dann wird in das gewählte Feld der Byte-Wert Lo gespeichert.
  • Wenn der Modus FEH ist, dann werden in das gewählte Feld die Byte-Werte Lo und Hi gespeichert.
Um RSXen anzupassen, die die BIOS Sprungvektoren für die Zeichenausgabe verändern (GET und PUT RSX), steht eine zweite Gruppe Sprungvektoren für WBOOT, CONST, CONIN, CONOUT und LIST in der SCB zur Verfügung. Nur die Bankversionen des BDOS nutzen diese Vektoren. Jeder Eintrag besteht aus zwei drei Byte langen Einträgen mit normalerweise JMP Instruktionen. Eine RSX kann den ersten JMP ändern in LXI H,addr, wobei addr die umgeleitete Adresse der jeweiligen Routine in Bank 1 ist. Die zweite JMP Instruktion zeigt immer auf eine Routine zum Umschalten der Bänke im residenten BDOS-Teil, welche auf Bank 1 umschaltet, die Routine, die im Register HL geladen ist, ausführt, bei Beendigung zurück auf Bank 0 schaltet und zum Bank-BDOS zurückkehrt. Das Bank-BDOS ruft diese 5 BIOS Routinen immer über die SCB Sprungtabelle auf. Diese Einrichtung kann bei BYE RSXen genutzt werden zum sicheren Umleiten von Konsol-Ein/Ausgabe in RCP/M Systemen.

Abschnitte

[BIOS Abfangvektoren]
FELD-ZEIGEROFFSETTYPBeschreibung
BIOS Warmstart
68H Inst.Sprungvektor zum Warmstart für das Bank-BDOS. Im Normalfall ein Sprung zum BIOS WBOOT Vektor, der aber geändert werden kann in LXI H,wboot-addr zur Umleitung des Warmstarts in Bank 1.
6BH Inst.JMP Instruktion zur residenten BDOS Bankumschaltungsroutine zum Umleiten von WBOOT.
BIOS Konsolstatus
6EH Inst.Sprungvektor zum Konsolstatus für das Bank-BDOS. Im Normalfall ein Sprung zum BIOS CONST Vektor, der aber geändert werden kann in LXI H,const-addr zur Umleitung des Konsolstatus in Bank 1.
71H Inst.JMP Instruktion zur residenten BDOS Bankumschaltungsroutine zum Umleiten von CONST.
BIOS Konsoleingabe
74H Inst.Sprungvektor zur Konsoleingabe für das Bank-BDOS. Im Normalfall ein Sprung zum BIOS CONIN Vektor, der aber geändert werden kann in LXI H,conin-addr zur Umleitung der Konsoleingabe in Bank 1.
77H Inst.JMP Instruktion zur residenten BDOS Bankumschaltungsroutine zum Umleiten von CONIN.
BIOS Konsolausgabe
7AH Inst.Sprungvektor zur Konsolausgabe für das Bank-BDOS. Im Normalfall ein Sprung zum BIOS CONOUT Vektor, der aber geändert werden kann in LXI H,conout-addr zur Umleitung der Konsolausgabe in Bank 1.
7DH Inst.JMP Instruktion zur residenten BDOS Bankumschaltungsroutine zum Umleiten von CONOUT.
BIOS Druckerausgabe
80H Inst.Sprungvektor zur Druckerausgabe für das Bank-BDOS. Im Normalfall ein Sprung zum BIOS LIST Vektor, der aber geändert werden kann in LXI H,list-addr zur Umleitung der Druckerausgabe in Bank 1.
83H Inst.JMP Instruktion zur residenten BDOS Bankumschaltungsroutine zum Umleiten von LIST.
 
86H-8FH  Unbekannt.
90H WortBitdarstellung des Laufwerkvektors mit offenen Dateien.
92H WortBitdarstellung des Vektors auf zugegriffene Laufwerke.
94H-97H  Unbekannt.
98H WortStartadresse des BDOS.
9AH WortReserviert für den Gebrauch des nicht Bank-BDOS
[System Control Block]
[Erweiterungsbereich - 6 Bytes]
FELD-ZEIGEROFFSETTYPBeschreibung
9CH00HByteHash-Länge 0, 2, oder 3
9DH-A0H01H2 WorteHash-Eintrag
A1H05HByteCP/M Version. Enthält 31H.
[Betriebsabschnitt - 8 Bytes]
FELD-ZEIGEROFFSETTYPBeschreibung
A2H-A5H06H 4 Bytes zur freien Benutzung.
A6H-A9H0AH Unbekannt.
[CLP Abschnitt - 4 Bytes]
FELD-ZEIGEROFFSETTYPBeschreibung
AAH0EH Unbekannt.
ABH0FHByteLaufwerk für Submit.
ACH10HWortProgramm Return-Kode.
[CCP Abschnitt - 8 Bytes]
FELD-ZEIGEROFFSETTYPBeschreibung
AEH12HByte Basis-Page der RSX, die das zweite von mehreren Kommandos enthält (wird als nächstes ausgeführt).
AFH13HByteLaufwerk des CCP.
B0H14HByteNutzernummer des CCP.
B1H15HWortWenn nicht 0, Adresse des zweiten von mehreren Kommandos.
B3H17HByteDarstellung von CCP Bits:
0Merker für Submit
1Merker für RSX
2-5Unbekannt
6CCP Laufwerk/Nutzer auf aktuelles Laufwerk/Nutzer setzen.
7Merker für Verkettung. Das nächste Kommando wird aus dem Default-DMA-Puffer (80H) geholt.
B4H18HByteDarstellung von CCP Bits:
0-1Anzeige Laufwerk/Nutzer.
2Unbekannt
3-4Reihenfolge zum Suchen von Dateien:
00Nur .COM
01Erst .COM, dann .SUB
10Erst .SUB, dann .COM
11Erst .PRL, dann .COM
5Alle Laufwerke rücksetzen
6Merker für die GET RSX. Gesetzt, wenn die GET RSX umleitet.
7Der CCP wird ausgeführt (genutzt beim ^W Aufruf)
B5H19HByteDarstellung von CCP Bits:
0Unbekannt
1Merker für Kaltstart (0=Kalt)
2-7Unbekannt
[Geräte I/O Abschnitt - 32 Bytes]
FELD-ZEIGEROFFSETTYPBeschreibung
B6H1AHByteKonsolbreite [z.B. 79 für Konsole mit 80 Zeichen]
B7H1BHByteAktuelle Position der Konsolspalte
B8H1CHByteKonsolseitenlänge [z.B. 23 für Konsole mit 24 Zeilen]
B9H1DH Unbekannt
BAH1EHWortWenn nicht Null, dann Adresse der umgeleiteten Konsoleingabe.
BCH20HWortWenn nicht Null, dann Adresse der nächsten Zeile der umgeleiteten Konsoleingabe.
BEH22HWortBitdarstellung der physikalischen Geräte für die Konsoleingabe.
C0H24HWortBitdarstellung der physikalischen Geräte für die Konsolausgabe.
C2H26HWortBitdarstellung der physikalischen Geräte für die AUX-Eingabe.
C4H28HWortBitdarstellung der physikalischen Geräte für die AUX-Ausgabe.
C6H2AHWortBitdarstellung der physikalischen Geräte für die Druckausgabe.
C8H2CHByteSeitenausgabe der Konsole (0 = Pause nach Seitenausgabe).
C9H2DHByteVoreinstellung der Seitenausgabe.
CAH2EHByteCtrl-H Einstellung (Backspace, Cursor ein Zeichen zurück). [0 => Backspace, sonst Ausgabe des gelöschten Zeichens]
CBH2FHByteKorrektur-/Löschzeichen Einstellung (Rubout/Delete) [0 => Ausgabe des gelöschten Zeichens, sonst Backspace]
CCH30HByteIst das Byte 0FFh, dann testet BDOS nicht die Eingabe von Control-S beim Konsolen-Status-Aufruf.
CDH31HWortNutzung durch Konsolen-Routinen. Nutzung Unbekannt.
CFH33HWortKonsolen-Einstellung.
D1H35HWortAdresse eines 128 Byte Puffers im Common Memory. Dieser Puffer wird nur während BDOS-Aufrufen durch das System benutzt, so dass er beliebig zwischen BDOS-Aufrufen als Arbeitsspeicher genutzt werden kann. Das BIOS nutzt diesen Puffer ebenfalls während eines Warm-Starts.
D3H37HByte Endezeichen für Zeichenkettenausgabe. [normalerweise '$']
D4H38HByteMerker für List Echo (ungleich Null = Echo der Konsolausgabe).
D5H39HByteMerker für das Scrollen (benutzt von den Konsol-Routinen), Darstellung der Bits:
7Gesetzt, wenn der nächste Aufruf von CONST Control-C prüft.
6Gesetzt, wenn der nächste Aufruf von CONST oder CONIN Control-S oder Control-Q prüft.
[BDOS Abschnitt - 42 Bytes]
FELD-ZEIGEROFFSETTYPBeschreibung
D6H3AHWortAdresse des System Control Blocks.
D8H3CHWortAktuelle DMA Adresse.
DAH3EHByteAktuelles Laufwerk.
DBH3FHWortAktuelle FCB Adresse (im Common Memory).
DDH41HByteMerker für FCB Fehler. Wenn dieses Byte FFH ist, dann ist das Wort in 3FH eine gültige FCB Adresse.
DEH42HByteMerker für gleiches Laufwerk.
DFH43HByteAktuelle BDOS Funktionsnummer.
E0H44HByteAktuelle Nutzernummer.
E1H45HWortLetzter Sucheintrag für Dateisuche (Erster = 0)
E3H47HWortAdresse des FCB für Funktion 18 (Suche nächsten Eintrag).
E5H49HByte Art der Suche für Funktionen 17, 18 (0 = ? in Laufwerksangabe, 0FH = normale Suche).
E6H4AHByteAnzahl Multisektoren.
E7H4BHByteBDOS Fehlereinstellung.
E8H4CH4 BytesKette der zu durchsuchenden Laufwerke 1..4. [0=Aktuell, 1-16 = Laufwerk A-P, 255=Ende der Kette]
ECH50HByteTemporäres Laufwerk. [0=Aktuell, 1-16 = Laufwerk A-P]
EDH51HByteLaufwerk für Fehler.
EEH-EFH52H Unbekannt.
F0H54HByteMerker für geöffnetes Laufwerk.
F1-F2H55H Unbekannt.
F3H57HByteBitdarstellung für BDOS:
0-5Unbekannt.
6Einzelne Belegungsvektoren.
7Erweiterte Fehlermeldungen.
F4H58HWortDatum (in Tagen seit dem 1.Januar 1978).
F6H5AHByteStunden (BCD).
F7H5BHByteMinuten (BCD).
F8H5CHByteSekunden (BCD).
F9H5DHWortBasisadresse des Common Memory (keine Bankversion = 0).
FBH5FHInst.JMP Instruktion zu einer Routine zur Fehlerausgabe im Bank-BDOS.
FDH61HByteBDOS Seite in Bank 0.
FEH62HWortAktuelle höchste TPA-Adresse (zeigt auf den Einsprung der untersten RSX).

Letzte Änderung: 17.Mai 2004