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 |