4. BESCHREIBUNG DER PERMANENTEN LAUFWERKSBEFEHLE
Es folgt die Liste der SIO-Kommandos für die SPEEDY 1050 (Mini-SPEEDY). Diese
Liste ist besonders für den interessierten Maschinensprache-Programmierer gedacht,
der seine SPEEDY 1050 (Mini-SPEEDY) selber programmieren möchte.
KOMMANDO ist der Wert, der sich vor Aufruf der SIO-Routine ($E459) in der Speicherstelle
$302 befindet. AUX1 und AUX2 entsprechen den Werten, die sich in den Speicherstellen
$30A (Low Byte) und $30B (High Byte) befinden. Bei einigen Befehlen werden AUXI
und AUX2 nicht benutzt und dürfen beliebige Werte annehmen.
KOMMANDO: $52
FUNKTION: Sektor lesen
AUX1: Sektornummer Low-Byte
AUX2. Sektornummer High-Byte
BESCHREIBUNG: Es werden je nach Density 128 oder 256 Bytes zum Computer gesendet.
Bei den Sektoren 1-3 werden auch bei DOUBLE-Density nur 128 Bytes gesendet.
BEMERKUNG: Sektornummer 0000 liest die Zeropage des RAM in der SPEEDY 1050 (Mini-SPEEDY)
aus. Bei Sektoren größer $8000 wird das RAM oder das ROM ausgelesen.
($8000-9FFF = RAM / $COOO oder $EOOO-FFFF = ROM)
KOMMANDO: $50
FUNKTION: Sektor schreiben ohne Verify
AUX1: Sektornummer Low-Byte
AUX2: Sektornummer High-Byte
BESCHREIBUNG: Das Laufwerk erwartet je nach Density 128 oder 256 Bytes. Sektoren
1-3 sind immer 128 Bytes lang.
BEMERKUNG: Der SPEEDY-Arbeitsspeicher $8000- $9FFF kann gezielt beschrieben werden.
Zeropage (Sektor 0000) kann nicht beschrieben werden.
KOMMANDO: $57
FUNKTION: Sektor schreiben mit Verify
AUX1: Sektornummer Low-Byte
AUX2: Sektornummer High-Byte
BESCHREIBUNG: Wie Befehl $50
BEMERKUNG: Wie Befehl $50. Ab der SPEEDY-Version 1.4 ist bei diesem Kommando der
Verify SPEEDY-Intern abgeschaltet. Um den Verify wieder zuzulassen, muß bei
Befehl $4B das Bit 2 im Konfigurationsbyte gesetzt werden.
KOMMANDO: $53
FUNKTION: Laufwerkstatus ermitteln
AUX1: Nicht benutzt
AUX2: Nicht benutzt
BESCHREIBUNG: Das Laufwerk sendet 4 Bytes, die den Status der eingelegten Diskette
und der letzten Diskettenoperation beinhalten.
[Sorry. Ignored \begin{lyxcode} ... \end{lyxcode}]
KOMMANDO: $21
FUNKTION: Formatiere Diskette (SINGLE/DOUBLE)
AUX1: Funktionsbyte 1
A1IX2: Funktionsbyte 2
BESCHREIBUNG: Dieses Kommando wird benutzt, um Disketten in Single oder Double-Density
(720 Sektoren) zu formatierten. Das Density-Format wird durch einen vorherigen $4F-Befehl
(Laufwerkskonfiguration) eingestellt. Wird das Laufwerk nach dem Einschalten nicht
konfiguriert, wird automatisch in SINGLE-Density formatiert. Soll in Medium-Density
(1040 Sektoren) formatiert werden, muß sich in Funktionsbyte 1 der Wert $11
und in Funktionsbyte 2 der Wert 4 befinden. Das Laufwerk sendet nach dem formatieren
je nach Density 128 oder 256 Bytes an den Computer. Die ersten zwei Bytes sind nach
erfolgreichem formatiern immer $FF.
KOMMANDO: $22
FUNKTION: Formatiere Diskette (MEDIUM)
AUX1: Nicht benutzt
AUX2: Nicht benutzt
BESCHREIBUNG: Dieses Kommando wird benutzt um Disketten in 1050 Dual Density (MEDIUM
= 1040 Sektoren) zu formatieren. Es werden immer 128 Bytes zum Computer gesendet.
Die ersten zwei Bytes sind nach erfolgreichem formatiern immer $FF.
Dieses waren die Standard-Befehle einer normalen 1050. Alle folgenden Befehle können
nicht mit einer SLOW- geschalteten SPEEDY angesprochen werden.
KOMMANDO: $20
FUNKTION: Automatisches formatieren
AUX1: Funktionsbyte 1
AuX2: Funktionsbyte 2
BESCHREIBUNG: Dem Laufwerk wird nur der Befehl zum formatieren gegeben.Es wird sofort
ein 'Complete' zurückgemeldet. Mit diesem Befehl können alle drei Formate
generiert werden. Die gewünschte Dichte muß vorher mit dem Befehl $4F
(Laufwerk konfigurieren) eingestellt werden. Soll in Medium-Density (1040 Sektoren)
formatiert werden, muß sich in Funktionsbyte 1 der Wert $11 und in Funktionsbyte
2 der Wert 4 befinden. Ein Write-Protect wird sofort zurückgemeldet. Fehler
beim Formatieren können dem Computer nicht gemeldet werden, da keine Daten nach
Befehlsausführung zurückgesendet werden. Abhängig vom Drive/Display-Status
wird nach dem formatieren automatisch die VTOC (DOS 2/2.5/BIBO-DOS kompatibel) und
3 Bootsektoren geschrieben.
KOMMANDO: $3F
FUNKTION: SIO-Geschwindigkeitsbyte ermitteln
AUX1: Nicht benutzt
AUX2: Nicht benutzt
BESCHREIBUNG: Es wird ein Byte zum Computer gesendet, das die Übertragungsgeschwindigkeit
in High Speedbeinhaltet. Dieses Byte wird für die HIGH Speed SIO-Routine benötigt
und beträgt bei der SPEEDY 1050 (Mini-SPEEDY) normalerweise 09.
KOMMANDO: $4E
FUNKTION: Laufwerkskonfiguration auslesen
AUX1: Nicht benutzt
AUX2: Nicht benutzt
BESCHREIBUNG: Es werden die 12 Bytes der Konfigurationstabelle zum Computer gesendet
[Sorry. Ignored \begin{lyxcode} ... \end{lyxcode}]
KOMMANDO: $4F
FUNKTION: Laufwerk konfigurieren
AUX1: Nicht benutzt
AUX2: Nicht benutzt
BESCHREIBUNG: Dieser Befehl wird benutzt, um das Laufwerk für den nächsten
Formatierungsbefehl einzustellen. Das Laufwerk erwartet 12 Bytes, die genau der
Reihenfolge des vorherigen Befehles ($4E) entsprechen müssen.
KOMMANDO: $51
FUNKTION: Schreibvorgang beenden
AUX1: Funktionsbyte 1
AUX2: Funktionsbyte 2
BESCHREIBUNG: Nach jedem Schreibbefehl wartet das Laufwerk ca. 2 Sekunden bis die
Daten aus dem Trackbuffer auf die Diskette geschrieben werden. Dieses wird durch
den Befehl $51 beschleunigt. Alle Daten im Trackbuffer werden unverzüglich
auf die Diskette geschrieben und abhängig vom Drive/Display Status ($44) der
Motor nach erfolgtem Schreibvorgang sofort gestoppt. Sind beide Funktionsbytes $FF
werden zusätzlich alle Sektoren aus dem Cache-Buffer auf die Diskette ge schrieben.
KOMMANDO: $44
FUNKTION: Drive/Display Einstellung
AUX1: Konfigurationsbyte
AUX2: Nicht benutzt
BESCHREIBUNG: Der Wert in AUX1 setzt das Drive/Display Statusbyte im Laufwerk.
Dieses Byte kann über keinen Befehl direkt ausgelesen werden, so daß immer
alle Bits richtig gesetzt werden müssen.
[Sorry. Ignored \begin{lyxcode} ... \end{lyxcode}]
KOMMANDO: $4B
FUNKTION: Slow/Fast konfiguration
AUX1: Konfigurationsbyte
AUX2: Nicht benutzt
BESCHREIBUNG: Mit dem Wert in AUX1 wird das Drive-Slow-Statusbyte des Laufwerkes
beeinflußt. Dieses Byte kann über keinen Befehl direkt ausgelesen werden,
so daß alle Bits richtig gesetzt werden müssen.
[Sorry. Ignored \begin{lyxcode} ... \end{lyxcode}]
KOMMANDO: $4C
FUNKTION: Direkter Sprungbefehl ohne Rückmeldung
AUX1: Sprungadresse Low-Byte
AUX2: Sprungadresse High-Byte
BESCHREIBUNG: Der Mikroprozessor im Laufwerk wird durch diesen Befehl veranlaßt,
direkt zur Speicherstelle zu springen, die sich in AUX1 und AUX2 befindet. Das Laufwerk
gibt keine Meldung an den Computer zurück, so daß eine Rückmeldung
vom Programm aus gegeben werden muß, zu dem der Prozessor gesprungen ist.
KOMMANDO: $D4
FUNKTION: Direkter Sprungbefehl mit Rückmeldung
AUX1: Sprungadresse Low-Byte
AUX2: Sprungadresse High-Byte
BESCHREIBUNG: Diese Befehl gleicht dem Vorhergehenden bis auf den Unterschied, daß
das Laufwerk vor Ausführung des Programmes eine Rückmeldung (Complete)
an den Computer sendet.
KOMMANDO: $41
FUNKTION: Kommandotabelle verlängern oder verkürzen
AUX1: Nicht benutzt
AUX2: Nicht benutzt
BESCHREIBUNG: Das Laufwerk erwartet 3 Bytes vom Computer. Das 1. Byte ist das neue
Kommando. Das 2. und 3. Byte ist die Startadresse des über das neue Kommando
erreichten Programmes im low/high-Byte Format. Falls sich der neue Befehl schon in
der Kommandotabelle befindet, wird dieser mit der neuen Startadresse versehen. ist
die Startadresse 0000 wird der Befehl aus der Kommandotabelle gelöscht.
KOMMANDO: $68
FUNKTION: Länge der SIO-Routine ermitteln
AUX1: Nicht benutzt
AUX2: Nicht benutzt
BESCHREIBUNG: Mit diesem Befehl wird die Länge der SIO-Routine ermittelt, die
mit dem Befehl $69 aus dem Laufwerk in den Computer geladen wird. Das Laufwerk sendet
2 Bytes, die die Länge (low/high) beinhalten.
KOMMANDO: $69
FUNKTION: SIO-Routine zum Computer senden
AUX1: Relokator - Adresse low-Byte
AUX2: Relokator - Adresse high-Byte
BESCHREIBUNG: Dieser Befehl sendet die High-Speed SIO-Routine in der vom Befehl
S68 ermittelten Länge zum Computer. Diese Routine wird bereits im Laufwerk
zur Startadresse hin relokiert, die sich in AUX1 und AUX2 befindet.
KOMMANDO: $60
FUNKTION: Track schreiben
AUX1: Track Anfangssektor low-Byte
AUX2: Track Anfangssektor high-Byte
BESCHREIBUNG: Die kompletten Daten für einen Track werden mit diesem Befehl
auf die Diskette oder in den Trackbuffer geschrieben. Die Anzahl der zu übertragenden
Bytes errechnet sich aus der Anzahl der Sektoren mal der Bytes pro Sektor. Wegen
des sehr schwierigen Timings funktioniert dieser Befehl nur in normaler Übertragungsrate.
KOMMANDO: $62
FUNKTION: Track lesen
AUX1: Track Anfangssektor low-Byte
AUX2: Track Anfangssektor high-Byte
BESCHREIBUNG: Lesen eines kompletten Tracks mit einem Befehl von der Diskette oder
aus dem Trackbuffer. Die Anzahl der zur erwartenden Bytes errechnet sich aus der
Anzahl der Sektoren mal der Bytes pro Sektor.
Am Schluß nun noch ein Beispiel, wie diese Befehle angewandt werden. Mit diesem
kleinen Demo-Programm kann die High-Speed Routine der SPEEDY in den Computer geladen
werden. Geschrieben wurde dieses Programm mit dem BIBO-ASSEMBLER.
00010 .LI OFF
00020 .OR $4000
00030 -------------------------------
00040 ADR $5000 ADRESSE FÜR DIE SIO ROUTINE
00050 -------------------------------
00060 LDA #$31 BUS ID
00070 STA $0300
00080 LDA #1 LAUFWERKSNUMMER = 1
00090 STA S0301
00100 LDA #$68 KOMMANDO $68
00110 STA $0302
00120 LDA #$40 STATUS FÜR DATEN LESEN
00125 STA $0303
00130 LDA #8
00140 STA $0304 ADRESSE FÜR LÄNGENBYTE LOW
00150 STA $0306 WERT FÜR TIMEOUT CA. 8 SEK.
00160 LDA #3
00170 STA $0305 ADRESSE FÜR LÄNGENBYTE HIGH
00180 LDA #2
00190 STA $0308 2 BYTES LESEN
00200 LDA #0
00210 STA $0309
00220 JSR $E459 EINSPRUNG DER SIO ROUTINE IM OS
00230 BMI ERROR
00240 INC $0302 KOMMANDO $69
00250 LDA #ADR
00260 STA $0304 TARGETADRESSEDER SIO ROUTINE LOW
00270 STA $030A RELOKIERADRESSE DER SIO ROUTINE LOW
00280 LDA /ADR
00290 STA $0305 TARGET ADRESSE DER SIO ROUTINE HIGH
00300 STA $030B RELOKIERADRESSE DER SIO ROUTINE HIGH
00310 LDA #$40
00320 STA $0303 STATUS FÜR DATEN LESEN
00330 JSR $E459 EINSPRUNG DER SIO ROUTINE IM OS
00340 BMI ERROR
00350 CLC CARRY GELÖSCHT = ROUTINE GELADEN
00360 RTS
00370 ERROR SEC CARRY GESETZT = ROUTINE KONNTE NICHT
00380 RTS EINGELADEN WERDEN