Tabellen des Controller-Programms

C163: FF 00 30 00 20 00 32 30  Steuerbits fuer die allgemeinen
C16B: FF 30 00 00 00 00 00 00  Routinen der Jobbehandlung.
C173: BB 3C 3B 3B 3F 30 BB 30
C17B: 00 3A B2 FF FF 7F 7F 30
C183: 00
C184: 00 80 80 80 80 80 80 00
C18C: 20 80 80 80 80 80 80 80
C194: 00 00 40 60 00 00 00 00
C19C: 00 00 00 40 60 40 60 80
C1A4: 80
        |------------  Befehl erwartet T&S im logischen Format
        ||-----------  zum Lesem/Schreiben Cachepuffer benutzen
        |||----------  Motor einschalten
        ||||---------  Motor-Anlaufzeit abwarten
        |||| |-------  Diskettenformat abfragen
        |||| ||------  Cache schreiben, wenn noetig
        |||| |||-----  Schreib-/Lesekopf ggf. positionieren
        |||| ||||----  Diskettenseite anwaehlen
        |||| ||||
        |||| ||||              |---- 0: T&S sind im HDRS  (  $0b-  $1c)
        |||| ||||              |     1: T&S sind im HDRS2 ($01bc-$01cd)
        |||| ||||              |        bzw. keine T&S benoetigt
        |||| ||||              ||--- keine Daten kopieren
        |||| ||||              |||-- In den Cache schreiben
        |||| ||||              |||
        VVVV VVVV              VVV
C163: %1111.1111      ,C184  %0000.0000   READ_DV
C164: %0000.0000      ,C185  %1000.0000   RESET_DV
C165: %0011.0000      ,C186  %1000.0000   MOTON_DV
C166: %0000.0000      ,C187  %1000.0000   MOTOFF_DV
C167: %0010.0000      ,C188  %1000.0000   MOTONI_DV
C168: %0000.0000      ,C189  %1000.0000   MOTOFFI_DV
C169: %0011.0010      ,C18A  %1000.0000   SEEK_DV
C16A: %0011.0000      ,C18B  %0000.0000   FORMAT_DV
C16B: %1111.1111      ,C18C  %0010.0000   WRITE_DV
C16C: %0011.0000      ,C18D  %1000.0000   DISKIN_DV
C16D: %0000.0000      ,C18E  %1000.0000   LEDACTON_DV
C16E: %0000.0000      ,C18F  %1000.0000   LEDACTOFF_DV
C16F: %0000.0000      ,C190  %1000.0000   ERRLEDON_DV
C170: %0000.0000      ,C191  %1000.0000   ERRLEDOFF_DV
C171: %0000.0000      ,C192  %1000.0000   SIDE_DV
C172: %0000.0000      ,C193  %1000.0000   BUFMOV_DV
C173: %1011.1011      ,C194  %0000.0000   WRTVER_DV
C174: %0011.1100      ,C195  %0000.0000   TRKWRT_DV
C175: %0011.1011      ,C196  %0100.0000   SP_READ
C176: %0011.1011      ,C197  %0110.0000   SP_WRITE
C177: %0011.1111      ,C198  %0000.0000   PSEEK_DV
C178: %0011.0000      ,C199  %0000.0000   SEEKHD_DV
C179: %1011.1011      ,C19A  %0000.0000   SEEKPHD_DV
C17A: %0011.0000      ,C19B  %0000.0000   RESTORE_DV
C17B: %0000.0000      ,C19C  %0000.0000   JUMPC_DV
C17C: %0011.1010      ,C19D  %0000.0000   EXBUF_DV
C17D: %1011.0010      ,C19E  %0000.0000   FORMATDK_DV
C17E: %1111.1111      ,C19F  %0100.0000   TREAD_DV
C17F: %1111.1111      ,C1A0  %0110.0000   TWRT_DV
C180: %0111.1111      ,C1A1  %0100.0000   TPREAD_DV
C181: %0111.1111      ,C1A2  %0110.0000   TPWRT_DV
C182: %0011.0000      ,C1A3  %1000.0000   DETWP_DV
C183: %0000.0000      ,C1A4  %1000.0000   ungueltiger Jobcode

Adressen der Jobroutinen, Funktionsnummer, Jobcodes

C1A5: 00 C9      W $C900       00 $80: READ_DV
C1A7: E7 C2      W $C2E7       01 $82: RESET_DV
C1A9: 90 C3      W $C390       02 $84: MOTON_DV
C1AB: 93 C3      W $C393       03 $86: MOTOFF_DV
C1AD: 96 C3      W $C396       04 $88: MOTONI_DV
C1AF: A9 C3      W $C3A9       05 $8a: MOTOFFI_DV
C1B1: AF C3      W $C3AF       06 $8c: SEEK_DV
C1B3: BB C3      W $C3BB       07 $8e: FORMAT_DV
C1B5: 00 C9      W $C900       08 $90: WRITE_DV
C1B7: D7 C6      W $C6D7       09 $92: DISKIN_DV
C1B9: 46 C5      W $C546       0a $94: LEDACTON_DV
C1BB: 4F C5      W $C54F       0b $96: LEDACTOFF_DV
C1BD: 58 C5      W $C558       0c $98: ERRLEDON_DV
C1BF: 61 C5      W $C561       0d $9a: ERRLEDOFF_DV
C1C1: 6A C5      W $C56A       0e $9c: SIDE_DV
C1C3: 89 C5      W $C589       0f $9e: BUFMOV_DV
C1C5: E1 C9      W $C9E1       10 $a0: WRTVER_DV
C1C7: AC C5      W $C5AC       11 $a2: TRKWRT_DV
C1C9: 00 C8      W $C800       12 $a4: SP_READ
C1CB: 00 C7      W $C700       13 $a6: SP_WRITE
C1CD: D7 C6      W $C6D7       14 $a8: PSEEK_DV
C1CF: 09 CB      W $CB09       15 $b0: SEEKHD_DV
C1D1: E4 CA      W $CAE4       16 $b8: SEEKPHD_DV
C1D3: 0F CB      W $CB0F       17 $c0: RESTORE_DV
C1D5: 26 CB      W $CB26       18 $d0: JUMPC_DV
C1D7: 26 CB      W $CB26       19 $e0: EXBUF_DV
C1D9: 35 CB      W $CB35       1a $f0: FORMATDK_DV
C1DB: 00 C9      W $C900       1b $aa: TREAD_DV
C1DD: 00 C9      W $C900       1c $ac: TWRT_DV
C1DF: 00 C9      W $C900       1d $b2: TPREAD_DV
C1E1: 00 C9      W $C900       1e $b4: TPWRT_DV
C1E3: 76 CB      W $CB76       1f $b6: DETWP_DV

C1E5: 85 CB      W $CB85       20 ungueltiger Jobcode

Jobcodes

C1E7: 20 20 20 20 20 20 20 20  $00-$7f unbenutzt
C1EF: 20 20 20 20 20 20 20 20  Der Jobcode wird als Index in
C1F7: 20 20 20 20 20 20 20 20  diese Tabelle benutzt.
C1FF: 20 20 20 20 20 20 20 20  Der Wert in der entsprechenden
C207: 20 20 20 20 20 20 20 20  Zelle ergibt die Funktionsnummer.
C20F: 20 20 20 20 20 20 20 20  Diese wird als Index( * 2) in die
C217: 20 20 20 20 20 20 20 20  vorhergehende Tabelle benutzt,
C21F: 20 20 20 20 20 20 20 20  in der die Adresse der
C227: 20 20 20 20 20 20 20 20  aufzurufenden Routine steht.
C22F: 20 20 20 20 20 20 20 20
C237: 20 20 20 20 20 20 20 20
C23F: 20 20 20 20 20 20 20 20
C247: 20 20 20 20 20 20 20 20
C24F: 20 20 20 20 20 20 20 20
C257: 20 20 20 20 20 20 20 20
C25F: 20 20 20 20 20 20 20 20

C267: 00 20 01 20 02 20 03 20  Funktionen der vorhergehenden
C26F: 04 20 05 20 06 20 07 20  Tabelle entnehmen
C277: 08 20 09 20 0A 20 0B 20
C27F: 0C 20 0D 20 0E 20 0F 20
C287: 10 20 11 20 12 20 13 20
C28F: 14 20 1B 20 1C 20 20 20
C297: 15 20 1D 20 1E 20 1F 20
C29F: 16 20 20 20 20 20 20 20
C2A7: 17 20 20 20 20 20 20 20
C2AF: 20 20 20 20 20 20 20 20
C2B7: 18 20 20 20 20 20 20 20
C2BF: 20 20 20 20 20 20 20 20
C2C7: 19 20 20 20 20 20 20 20
C2CF: 20 20 20 20 20 20 20 20
C2D7: 1A 20 20 20 20 20 20 20
C2DF: 20 20 20 20 20 20 20 20
-----------------------------
JOB $82: RESET_DV
-----------------------------

C2E7: A0 FF     LDY #$FF         Warten, Warten, Warten
C2E9: 20 D5 CB  JSR $CBD5        (1/2 s insgesamt)
C2EC: A0 FF     LDY #$FF
C2EE: 20 D5 CB  JSR $CBD5
C2F1: A9 80     LDA #$80         Track im Cache = $80 (kein Track)
C2F3: 85 95     STA $95
C2F5: A9 00     LDA #$00         Cachepuffer nicht veraendert
C2F7: 85 87     STA $87
C2F9: 20 CF B0  JSR $B0CF        physikalisches 1581-Format festlegen
C2FC: 20 B3 B0  JSR $B0B3        ganze Diskette als Partition setzen
C2FF: A9 4E     LDA #$4E         Wert $4e20 fuer Timer B
C301: 8D D7 01  STA $01D7        20000 Taktzyklen bei 2 Mhz
C304: A9 20     LDA #$20         ergibt 100 Durchlaeufe / sec
C306: 8D D8 01  STA $01D8
C309: 20 9F CB  JSR $CB9F        Timer B setzen

Controllerbefehle

C30C: A9 08     LDA #$08         Restore
C30E: 8D DA 01  STA $01DA        Schrittmotor auf 6 ms / Schritt einstellen
C311: A9 18     LDA #$18         Seek: Spur suchen
C313: 8D DB 01  STA $01DB
C316: A9 28     LDA #$28         Step
C318: 8D DC 01  STA $01DC
C31B: A9 48     LDA #$48         Step-in
C31D: 8D DD 01  STA $01DD
C320: A9 68     LDA #$68         Step-out
C322: 8D DE 01  STA $01DE
C325: A9 88     LDA #$88         Read Sector
C327: 8D DF 01  STA $01DF
C32A: A9 AA     LDA #$AA         Write Sector
C32C: 8D E0 01  STA $01E0
C32F: A9 C8     LDA #$C8         Read Adress
C331: 8D E1 01  STA $01E1
C334: A9 E8     LDA #$E8         Read Track
C336: 8D E2 01  STA $01E2
C339: A9 FA     LDA #$FA         Write Track
C33B: 8D E3 01  STA $01E3
C33E: A9 D0     LDA #$D0         Force Interrupt (Controller Init)
C340: 8D E4 01  STA $01E4
C343: A9 12     LDA #$12         Zeit fuer Beruhigung des Schrittmotors
C345: 85 98     STA $98          ca. 18 ms

Controller testen

C347: A0 FF     LDY #$FF         Controller testen

Einsprung von $C365:

C349: 8C 01 60  STY $6001        Spur-, Sektor- und Datenregister mit allen
C34C: 8C 02 60  STY $6002        Werten von $ff-$00 beschreiben,
C34F: 8C 03 60  STY $6003
C352: 20 34 AD  JSR $AD34        15 us warten,
C355: CC 01 60  CPY $6001        alle Register testen.
C358: D0 2E     BNE $C388        weichen die Werte ab, dann ist der
C35A: CC 02 60  CPY $6002        Controller defekt
C35D: D0 29     BNE $C388        (defekt, ==>)
C35F: CC 03 60  CPY $6003
C362: D0 24     BNE $C388        (defekt, ==>)
C364: 88        DEY              alle Kombinationen testen
C365: D0 E2     BNE $C349        noch nicht fertig, ==>
C367: 20 D1 CF  JSR $CFD1        Controller initialisieren
C36A: A9 00     LDA #$00
C36C: 8D 08 40  STA $4008        ???
C36F: 20 2F AD  JSR $AD2F        35 us warten
C372: AD 08 40  LDA $4008
C375: D0 0F     BNE $C386
C377: EE DA 01  INC $01DA        Kopftransport-Geschwindigkeit
C37A: EE DB 01  INC $01DB        auf 12 ms pro Schritt einstellen
C37D: EE DC 01  INC $01DC        [passiert bei mir immer]
C380: EE DD 01  INC $01DD
C383: EE DE 01  INC $01DE

Einsprung von $C375:

C386: D0 03     BNE $C38B

Einsprung von $C358, $C35D, $C362:

C388: A9 0D     LDA #$0D         CONTROLLER_ER
C38A: 2C         B $2C

Einsprung von $C386, $C393, $C3B8, $C5A3, $C5A9, $C5AC, $C6DA, $CB0C, $CB23:

C38B: A9 00     LDA #$00         Ok.
C38D: 4C CC CD  JMP $CDCC        Rueckmeldung des Jobs

    Previous Page / Next Page