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