Byte aus beliebigem Kanal holen ($d3aa)
Diese Routine wird von DOS jedesmal aufgerufen, wenn ein Byte zum Computer
uebertragen werden soll. Es werden sowohl Daten aus 'normalen' Dateien
gelesen, als auch Daten aus dem Directory, aus REL-Dateien, oder
Direktzugriffen ('#').
E: $50: aktueller Kanal
A: Byte im Ausgabepuffer $023b+KN (Kanalnummer $50)
Kanalstatus $0234+KN
[kleiner Zeitvergleich:
Die Routine benoetigt ca. 140 Taktzyklen, um bei LOAD ein Byte zu holen,
bei SA 2-14 (PRG,SEQ,USR) sind es ca. 162 Zyklen. Dies entspricht bei
202 Blocks einer Zeit von 3,6 - 4,2 sec.
Wenn ein Block nachgeladen werden muss, werden ca. 910 Taktzyklen
zusaetzlich gebraucht (reiner DOS-Aufwand, ohne Controllerprogramm)
= 0,1 sec. bei 202 Blocks.
Um die reale Geschwindigkeit der Routine zu testen, verwenden wir den
Append-Befehl (SA=2). Der Vorgang dauert bei 202 Blocks 12 sec. Er selbst
benoetigt ca. 130 Zyklen pro Byte (= 3,3 sec).
Also braucht diese Routine tatsaechlich ca. 8,7 sec. fuer 202 Blocks. Wir
hatten aber nur 4,3 sec. (4,2 + 0,1) ausgerechnet.
Die restlichen 4,4 sec. werden verbraucht:
- vom Controller (min. 3,0 sec):
- Lesen der benoetigten Spuren (mindestens 2,8 sec.):
- 11 x ersten Blockheader finden ( = 0,1 sec.),
- 11 x 2 folgende Datenbereiche ueberlesen ( = 0,4 sec.)
- 11 Spuren lesen bei 5 Umdrehungen/sec. ( = 2,2 sec.),
- Positionieren der Schreib-/Lesekoepfe (ca. 0,3 sec.),
- vom Controller-Programm (min. 0,5 sec.):
- Abfragen der Jobspeicher: 266 Takte x 1200 (Timer-IRQ) +
180 Takte x 202 x 4 (BRK) (ca. 0,2 sec.),
- Kopieren der Daten vom Cache in den DOS-Puffer (0,3 sec.).
Die restlichen 0.9 sec. verteilen sich auf die vielen verschiedenen
kleineren Routinen (Log. in Phy. Format umwandeln, ...).
(Die angegebenen Zeiten sind uebrigens alle 'Mindest-Zeiten'.)]
Einsprung von $92FA, $AE35:
9303: A6 50 LDX $50
9305: 20 5F 90 JSR $905F Filetyp holen
9308: D0 03 BNE $930D kein Rel-File, ==>
930A: 4C A6 A0 JMP $A0A6 Byte aus Record-Puffer holen
Einsprung von $9308:
930D: A5 52 LDA $52 SA = 15 ?
930F: C9 0F CMP #$0F
9311: F0 5D BEQ $9370 ja, Fehlermeldung bzw. M-R-Byte holen
9313: BD 34 02 LDA $0234,X Kanalstatus holen
9316: 29 08 AND #$08 EOI gesetzt ?
9318: D0 15 BNE $932F nein, ==>
931A: 20 5F 90 JSR $905F Filetyp holen
931D: C9 07 CMP #$07 Direktzugriff ?
931F: D0 08 BNE $9329 nein, ==>
9321: A9 89 LDA #$89 b7=1: Lesen und b0=1: Schreiben ermoeglichen
9323: 9D 34 02 STA $0234,X b4=1: EOI loeschen
9326: 4C 3A 93 JMP $933A 1. Byte zur Ausgabe bereitstellen
Einsprung von $931F:
9329: A9 00 LDA #$00 Kanal verriegeln (weder Lesen noch
932B: 9D 34 02 STA $0234,X Schreiben ist gesetzt)
932E: 60 RTS
Einsprung von $9318:
932F: A5 52 LDA $52 SA=0: LOAD ?
9331: F0 32 BEQ $9365 ja, ==>
9333: 20 5F 90 JSR $905F Filetyp holen
9336: C9 04 CMP #$04 <4 (SEQ,PRG,USR)
9338: 90 22 BCC $935C ja, ==>
Byte aus Direktzugriffskanal holen
Einsprung von $9326:
933A: 20 69 90 JSR $9069 Kanal- und Puffernummer holen
933D: B5 BB LDA $BB,X Pufferende erreicht ?
933F: D9 42 02 CMP $0242,Y
9342: D0 04 BNE $9348 nein, ==>
9344: A9 00 LDA #$00 Zeiger auf Pufferanfang setzen (1. Byte
9346: 95 BB STA $BB,X ueberlesen (es enthaelt die Blocklaenge bei
M-R bzw. M-W))
Einsprung von $9342, $8B88:
9348: F6 BB INC $BB,X Pufferzeiger erhoehen
Einsprung von $8C09, $8E96:
934A: A1 BB LDA ($BB,X) Byte aus Puffer holen
934C: 99 3B 02 STA $023B,Y und in Ausgabepuffer schreiben
934F: B5 BB LDA $BB,X Pufferende erreicht ?
9351: D9 42 02 CMP $0242,Y
9354: D0 05 BNE $935B nein, ==>
9356: A9 81 LDA #$81 b4=0: EOI ausgeben
9358: 99 34 02 STA $0234,Y
Einsprung von $9354:
935B: 60 RTS
Byte aus PRG-/SEQ-/USR-Dateien holen
Einsprung von $9338, $9368:
935C: 20 9B 90 JSR $909B Byte holen (im 2-Puffer-Modus)
Einsprung von $936D:
935F: A6 50 LDX $50
9361: 9D 3B 02 STA $023B,X und in Ausgabepuffer schreiben
9364: 60 RTS
Einsprung von $9331:
9365: AD 6E 02 LDA $026E <-- SA=0: DIRECTORY-Modus aktiv ?
9368: F0 F2 BEQ $935C nein, ==>
936A: 20 45 B2 JSR $B245 Byte aus Directory holen
936D: 4C 5F 93 JMP $935F und zur Ausgabe bereitstellen
Previous Page / Next Page
|