Daten auf seriellen Bus ausgeben ($e909; bei der 1571: $823d) Pruefen, ob die SA auch tatsaechlich Daten zum Computer senden darf AD5C: 78 SEI AD5D: 20 27 90 JSR $9027 Kanal zum Lesen suchen AD60: B0 07 BCS $AD69 Schreibkanal gefunden, ==> Einsprung von $AE3C: AD62: A6 50 LDX $50 AD64: BD 34 02 LDA $0234,X Kanalstatus holen AD67: 30 01 BMI $AD6A Lesekanal, ==> Einsprung von $AD60: AD69: 60 RTS kein Lesekanal / Dateiende ueberschritten Einsprung von $AD67: AD6A: 20 15 AD JSR $AD15 ATN-Modus testen AD6D: 20 0C AD JSR $AD0C Bus auslesen AD70: 29 01 AND #$01 DATA IN isolieren AD72: 08 PHP AD73: 20 03 AD JSR $AD03 CLOCK OUT = Lo setzen AD76: 28 PLP war DATA IN = Lo ? AD77: F0 13 BEQ $AD8C ja, (EOI senden) ==> warten, bis der Computer bereit ist Einsprung von $AD81: AD79: 20 15 AD JSR $AD15 ATN-Modus testen AD7C: 20 0C AD JSR $AD0C Bus auslesen AD7F: 29 01 AND #$01 DATA IN isolieren AD81: D0 F6 BNE $AD79 Auf Freigabe warten (DATA IN = Lo) AD83: A6 50 LDX $50 AD85: BD 34 02 LDA $0234,X Kanalstatus testen AD88: 29 08 AND #$08 b3=1: kein EOI ? AD8A: D0 14 BNE $ADA0 ja, ==> EOI senden [Da wird eigentlich gar nichts gesendet, sondern nur gewartet, bis der Computer die DATA-Leitung von Lo nach Hi gekippt hat.] Einsprung von $AD77, $AD94: AD8C: 20 15 AD JSR $AD15 ATN-Modus testen AD8F: 20 0C AD JSR $AD0C Bus auslesen AD92: 29 01 AND #$01 Warten, bis DATA IN = Lo wird AD94: D0 F6 BNE $AD8C Einsprung von $AD9E: AD96: 20 15 AD JSR $AD15 ATN-Modus testen AD99: 20 0C AD JSR $AD0C Bus auslesen AD9C: 29 01 AND #$01 AD9E: F0 F6 BEQ $AD96 Warten, bis DATA IN = Hi wird Einsprung von $AD8A, $ADAB: ADA0: 20 FA AC JSR $ACFA CLOCK OUT = Hi setzen ADA3: 20 15 AD JSR $AD15 ATN-Modus testen ADA6: 20 0C AD JSR $AD0C Bus auslesen ADA9: 29 01 AND #$01 ADAB: D0 F3 BNE $ADA0 Warten, bis DATA IN = Lo wird ADAD: A9 20 LDA #$20 Bus-Modus ADAF: 24 76 BIT $76 b5=1: FSM-Modus ? ADB1: F0 34 BEQ $ADE7 nein, ==> FSM-Betrieb [Die eigentliche Datenuebertragung dauert: 33 us Programm + 56 us Uebertragung = 89 us (bei 202 Blocks 4,5 s).] ADB3: AD 01 40 LDA $4001 4 Bustreiber auf Ausgabe schalten ADB6: 09 20 ORA #$20 2 ADB8: 8D 01 40 STA $4001 4 ADBB: AD 0E 40 LDA $400E 4 SDR auf Ausgabe schalten ADBE: 09 40 ORA #$40 2 ADC0: 8D 0E 40 STA $400E 4 ADC3: 2C 0D 40 BIT $400D 4 Flag: 'oebertragung beendet' loeschen ADC6: A6 50 LDX $50 3 ADC8: BD 3B 02 LDA $023B,X 4 Datenbyte in das SDR schreiben ADCB: 8D 0C 40 STA $400C 4 ADCE: A9 08 LDA #$08 - und die Uebertragung abwarten Einsprung von $ADD3: ADD0: 2C 0D 40 BIT $400D 4 [Warten dauert: ADD3: F0 FB BEQ $ADD0 2 Uebertragungszeit + Ende erkennen] ADD5: AD 0E 40 LDA $400E 4 SDR auf Eingabe schalten ADD8: 29 BF AND #$BF 2 ADDA: 8D 0E 40 STA $400E 4 ADDD: AD 01 40 LDA $4001 4 Bustreiber auf Eingabe schalten ADE0: 29 DF AND #$DF 2 ADE2: 8D 01 40 STA $4001 4 ADE5: D0 43 BNE $AE2A 3 ==> 65 Takte = 33 us seriell, langsam [Die eigentliche Datenuebertragung dauert: - im C64-Modus : 8*188 us. Dies entspricht bei 202 Blocks 1 min 17 sec. - im VC20-Modus: 8*109 us (= 44 sec).] Einsprung von $ADB1: ADE7: A9 08 LDA #$08 ADE9: 85 66 STA $66 Zaehler fuer 8 Datenbits initialisieren Einsprung von $AE28: ADEB: 20 0C AD JSR $AD0C 22 Bus auslesen ADEE: 29 01 AND #$01 2 ist DATA IN = Hi ? ADF0: D0 4D BNE $AE3F 2 ja, (Ausgabefehler) ==> ADF2: A6 50 LDX $50 3 ADF4: BD 3B 02 LDA $023B,X 4 naechstes Datenbit ins Carry schieben ADF7: 6A ROR 2 ADF8: 9D 3B 02 STA $023B,X 4 ADFB: B0 05 BCS $AE02 2 ist das Bit = 1 ? ja, ==> ADFD: 20 F1 AC JSR $ACF1 11:Bit=0: DATA OUT auf Hi setzen AE00: D0 03 BNE $AE05 1:[Takte/2, da Programm verzweigt] ==> Einsprung von $ADFB: AE02: 20 E8 AC JSR $ACE8 11:Bit=1: DATA OUT auf Lo setzen Einsprung von $AE00: AE05: 20 34 AD JSR $AD34 32 16 us warten AE08: A9 10 LDA #$10 2 C64 Modus ? AE0A: 24 76 BIT $76 3 AE0C: D0 03 BNE $AE11 2 nein, (VC20) ==> AE0E: 20 2F AD JSR $AD2F 80 40 us warten Einsprung von $AE0C: AE11: 20 03 AD JSR $AD03 22 CLOCK OUT auf Lo setzen AE14: 20 34 AD JSR $AD34 32 16 us warten AE17: A9 10 LDA #$10 2 b4=0: C64 Modus ? AE19: 24 76 BIT $76 3 AE1B: D0 03 BNE $AE20 2 nein, (VC20)==> AE1D: 20 2F AD JSR $AD2F 80 ja, 40 us warten Einsprung von $AE1B: AE20: 20 FA AC JSR $ACFA 22 CLOCK OUT auf Hi setzen AE23: 20 E8 AC JSR $ACE8 22 DATA OUT auf Lo setzen AE26: C6 66 DEC $66 5 sind noch Bits zu uebertragen ? AE28: D0 C1 BNE $ADEB 3 ja, ==> (C64-Modus: 376 Takte = 188 us) Warten, bis der Computer den Bus sperrt Einsprung von $ADE5, $AE32: AE2A: 20 15 AD JSR $AD15 ATN-Modus testen AE2D: 20 0C AD JSR $AD0C Bus auslesen AE30: 29 01 AND #$01 AE32: F0 F6 BEQ $AE2A warten, bis DATA IN = Hi AE34: 58 CLI AE35: 20 03 93 JSR $9303 Byte aus dem aktuellen Kanal holen AE38: 78 SEI AE39: 20 15 AD JSR $AD15 ATN-Modus testen AE3C: 4C 62 AD JMP $AD62 Byte ausgeben Einsprung von $ADF0: AE3F: 4C D9 AE JMP $AED9 Previous Page / Next Page |