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 |