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