mads 2.0.3 1 ;Speedy 1050 ROM-Listing 2 ;(c)1986 Compy-Shop 3 4 opt h- o+ c+ f+ 5 6 ; *= $E000 7 org $e000 8 9 = 0010 VERSION = $10 10 11 12 ;Vom System verwendete Zero-Page Adressen: 13 14 = 0000 MERK1 = $00 15 = 0001 MERK2 = $01 16 = 0002 MERK3 = $02 17 = 0003 DLYT1 = $03 ;Timer LO fuer Motor-Timer Routine 18 = 0004 DLYT2 = $04 ;Timer HI fuer Motor-Timer Routine 19 = 0005 LDSW = $05 ;Letzte 'Dumm'-Schalter Position 20 = 0006 WRKEN = $06 ;Anzahl der zu schreibenden Sectoren im Ram 21 = 0007 EXSECT = $07 ;Sector # der Daten in Extended Buffer 22 = 0008 DUMKEN = $08 ;Drive 'Dumm'-Status 23 = 0009 FORKEN = $09 ;Aktuelles Density 0=DD,41=MD,82=SD 24 = 000A FORKEN2 = $0A ;Density fuer Format, wird von COM4F gesetzt 25 = 000B LWRTRA = $0B ;Track # der zu schreibenden Sectoren im RAM 26 = 000C LTRACK = $0C ;Track # des zuletzt gelesenen Sectors 27 = 000D TRACK = $0D ;Aktuelle Track # 28 = 000E SECTOR = $0E ;Aktuelle Sector # 29 = 000F CONST = $0F ;Controller Status 30 = 0010 DRSTAT = $10 ;Drive Status 31 = 0011 COMST = $11 ;Command Status 32 = 0012 RETRY = $12 ;Anzahl der Retry’s fuer Read/Write (normal 2) 33 = 0013 RWLEN = $13 ;I/O Laenge 34 = 0014 SECLEN = $14 ;Anzahl der Bytes pro Sector 35 = 0015 USKEN = $15 ;Kennung fuer Uebertragungsgeschwindigkeit 36 = 0016 DLYTIM = $16 ;Zeit, wie lange der Motor nach einem Befehl noch laeuft 37 = 0017 STPTIM = $17 ;Verzoegerung fuer Steppermotor 38 = 0018 COMPOS = $18 ;Position des letzten Befehls in Command-Tabelle 39 = 0019 IND = $19 ;Indirekt-Vektor fuer Daten-Buffer 40 = 001B CHKSUM = $1B ;Checksumme fuer Datenuebertragung 41 = 001C RDDATK = $1C ;Kennung, ob Daten von Computer geholt werden muessen 42 = 001D KLAPPE = $1D ;Letzte Klappen-Position 43 = 001F SECANZ = $1F ;Sector-Anzahl pro Track,die vorhanden sein muessen 44 = 001E SECANZ1 = $1E ;Sector-Anzahl pro Track, die vorhanden sind 45 = 0020 SECLST = $20 ;Sectorenliste 46 = 0040 STALST = $40 ;Sectoren Statusliste 47 = 0060 STPPOS = $60 ;Bit-Position fuer Steppermotor 48 = 0061 DSPCTR = $61 ;Display/Drive-Controllbyte 49 = 0062 BLOCKS = $62 ;Anzahl der Datenblocks fuer Datenuebertragung 50 = 0063 IOIND = $63 51 52 ;Die Zero-Page Adressen $90-$CF sind unbenutzt 53 54 = 8C00 DATBUF = $8C00 ;Datenbuffer fuer Sectoren 55 = 9E00 EXBUF = $9E00 ;Extended-Buffer 56 = 9F00 CMTBL = $9F00 ;Command-Tabelle 57 58 = FD00 RDPIO = $fd00 59 = FD27 SDPIO = $fd27 60 61 ;Fuer eigene Programme steht der Speicherbereich $8000-$8BFF zur Verfuegung 62 63 E000 D8 RESET CLD ;* Kaltstart * 64 E001 A2 FF LDX #$FF 65 E003 9A TXS ;Stackpointer neu setzen 66 E004 A9 38 LDA #$38 67 E006 8D 81 02 STA $0281 ;PADIR 68 E009 A9 38 LDA #$38 ;8=Motor aus 69 E00B 8D 80 02 STA $0280 ;PADAT 70 E00E A9 3D LDA #$3D 71 E010 8D 83 02 STA $0283 ;PBDIR 72 E013 8D 82 02 STA $0282 ;PBDAT 73 E016 20 78 E3 JSR CONRE2 74 E019 A9 80 LDA #$80 75 E01B 85 1A STA IND+1 ;Adresse $8000 setzen 76 E01D A9 00 LDA #0 77 E01F 85 19 STA IND 78 E021 A2 20 LDX #$20 79 E023 A8 TAY 80 E024 91 19 DRAML STA (IND),Y ;Speicherbereich $8000-$9FFF loeschen 81 E026 C8 INY 82 E027 D0 FB BNE DRAML 83 E029 E6 1A INC IND+1 84 E02B CA DEX 85 E02C D0 F6 BNE DRAML 86 87 E02E A9 60 LDA #$60 ;=RTS: Erweiterung der Reset-Routine vorgesehen 88 E030 8D 84 9F STA CMTBL+$84 89 E033 A9 55 LDA #$55 90 E035 8D 01 04 STA $0401 91 E038 8D 02 04 STA $0402 92 E03B A2 1E LDX #$1E 93 E03D CA RZS2 DEX 94 E03E D0 FD BNE RZS2 95 E040 AD 01 04 LDA $0401 96 E043 4D 02 04 EOR $0402 ;Disk-Controller auf Funktionstuechtigkeit pruefen 97 E046 D0 1B BNE SYSER0 98 E048 A9 48 LDA #$48 99 E04A 8D 00 04 STA $0400 100 E04D A2 28 LDX #$28 101 E04F 20 F2 E2 JSR XWAIT 102 E052 AD 00 04 LDA $0400 103 E055 4A LSR 104 E056 90 0B BCC SYSER0 105 E058 A2 28 LDX #$28 106 E05A 20 F2 E2 JSR XWAIT 107 E05D AD 00 04 LDA $0400 108 E060 4A LSR 109 E061 90 10 BCC RESET2 110 111 E063 20 68 E0 SYSER0 JSR SYSERR ;* System-Error Routine * 112 E066 80 0B BRA RESET2 ;* 2xBell und Reset * 113 114 E068 20 B2 EF SYSERR JSR BELL1 ;System-Error Routine 115 E06B A2 80 LDX #$80 ;gibt 2 x Bell aus 116 E06D 20 F2 E2 JSR XWAIT 117 E070 4C B2 EF JMP BELL1 118 119 E073 A2 00 RESET2 LDX #0 ;* Reset-Einsprung * 120 E075 74 00 DELL STZ 0,X 121 E077 E8 INX ;Zeropage loeschen 122 E078 D0 FB BNE DELL 123 124 E07A E6 1D INC KLAPPE ;=1 Initialisieren der System-Variablen 125 E07C E6 05 INC LDSW ;=1 126 E07E E6 62 INC BLOCKS ;=1 127 E080 A9 40 LDA #$40 128 E082 85 16 STA DLYTIM ;Zeit fuer Motor-Timer Routine 129 E084 A9 2C LDA #$2C 130 E086 85 17 STA STPTIM ;Step—Zeit fuer Steppermotor testen 131 E088 A9 82 LDA #$82 ;Single Density - Status testen 132 E08A 85 09 STA FORKEN 133 E08C 85 0A STA FORKEN2 134 E08E 20 A9 E1 JSR SDRDDP ;System auf Single Density setzen und anzeigen 135 E091 20 CC E2 JSR TROJUS ;Kopf auf Track 0 positionieren 136 E094 20 F6 EF JSR TRAANZ ;und Track 0 anzeigen 137 E097 20 78 E3 JSR CONRE2 ;2 x Controller Reset ausfuehren 138 139 E09A A2 3C LDX #COMEND-COMTBL 140 E09C BD AA E5 COMMOV LDA COMTBL,X ;Kommando-Tabelle vom Rom 141 E09F 9D 00 9F STA CMTBL,X ;ins Ram kopieren 142 E0A2 CA DEX 143 E0A3 10 F7 BPL COMMOV 144 145 E0A5 A9 00 LDA # TSTCO2 ;* gesprungen wird, muss zuvor in DLYT1 und DLYT2 die * 148 E0AC 8D 81 9F STA CMTBL+$81 ;* Zeit eingetragen werden,wie lange der Motor noch laufen * 149 E0AF A9 13 LDA # MOTIM 152 E0B6 8D 83 9F STA CMTBL+$83 153 E0B9 20 84 9F JSR CMTBL+$84 154 155 E0BC D8 BEREIT CLD ;* Bereitschaftroutine * 156 E0BD A2 FF LDX #$FF ;* Testet ob Diskette gewechselt wird * 157 E0BF 9A TXS 158 E0C0 20 79 E5 JSR TSTDSW ;'Dumm'-Schalter pruefen 159 E0C3 A5 06 LDA WRKEN ;noch Daten zu schreiben ? 160 E0C5 D0 36 BNE TSTCO 161 E0C7 AD 00 04 LDA $0400 162 E0CA 29 80 AND #$80 ;Klappe pruefen 163 E0CC C5 1D CMP KLAPPE 164 E0CE F0 2D BEQ TSTCO 165 E0D0 85 1D STA KLAPPE ;Klappen-Status setzen 166 E0D2 AA TAX 167 E0D3 10 05 BPL KLZU 168 E0D5 20 2D E1 JSR MOTOFF ;bei Klappe auf Motor ausschalten 169 E0D8 80 1E BRA CTSTAT 170 E0DA A9 FF KLZU LDA #$FF 171 E0DC 85 0B STA LWRTRA ;Kennung fuer keine zu schreibenden Daten im RAM 172 E0DE A2 00 LDX #0 173 E0E0 9E 80 8C KZDL STZ DATBUF+$80,X ;2.Haelfte der Sector-Buffer Sector 1-3 fuer 174 E0E3 9E 80 8D STZ DATBUF+$0180,X ;Double Density loeschen 175 E0E6 9E 80 8E STZ DATBUF+$0280,X 176 E0E9 E8 INX 177 E0EA 10 F4 BPL KZDL 178 E0EC 20 56 E1 JSR TSTDEN ;Density feststellen 179 E0EF 30 03 BMI TSTKLX 180 E0F1 20 CD E1 TKLOK JSR RDSFOL ;Sectorfolge lesen 181 E0F4 A9 FF TSTKLX LDA #$FF 182 E0F6 85 04 STA DLYT2 ;Delay Timer High-Byte 183 E0F8 AD 00 04 CTSTAT LDA $0400 184 E0FB 85 0F STA CONST ;Controller-Status uebernehmen 185 186 E0FD 6C 80 9F TSTCO JMP (CMTBL+$80) ;($9F80) Vector fuer Kommando-Erkennungs-Routine 187 E100 A9 02 TSTCO2 LDA #2 ;Kommando-Erkennungs-Routine 188 E102 2C 82 02 BIT $0282 189 E105 D0 0C BNE MOTIM ;Computer aus 190 E107 10 0A BPL MOTIM ;Command Bit 191 192 E109 A5 15 LDA USKEN ;Uebertragungsgeschwindigkeit feststellen 193 E10B 29 01 AND #1 194 E10D 0A ASL 195 E10E 85 63 STA IOIND ;Kennung fuer Uebertragungsgeschwindigkeit setzen 196 E110 4C 90 E3 JMP RDINF ;Befehl vom Computer empfangen 197 198 E113 E6 03 MOTIM INC DLYT1 ;Motor-Timer-Routine 199 E115 D0 A5 BNE BEREIT 200 E117 E6 04 INC DLYT2 201 E119 F0 0A BEQ MOTTOF 202 E11B A5 04 LDA DLYT2 ;bei Fast-Write nach ca. 2 Sekunden die Daten 203 E11D C9 98 CMP #$98 ;aus dem RAM-Speicher auf die Diskette schreiben 204 E11F D0 9B BNE BEREIT 205 E121 A5 06 LDA WRKEN 206 E123 F0 97 BEQ BEREIT 207 E125 20 64 EB MOTTOF JSR TSTWR ;noch Daten zu schreiben ? 208 E128 20 2D E1 JSR MOTOFF ;Motor ausschalten 209 E12B 80 8F BRA BEREIT 210 211 E12D A9 08 MOTOFF LDA #8 ;Motor ausschalten 212 E12F 0C 80 02 TSB $0280 ;'Motor on' Bit zuruecksetzen 213 E132 A9 3C LDA #$3C 214 E134 0C 82 02 TSB $0282 ;Die 4 Bits des Steppermotors zuruecksetzen 215 E137 A9 10 LDA #$10 ;Drive-Status (Motor aus) setzen 216 E139 14 10 TRB DRSTAT 217 E13B 60 RTS 218 219 E13C 2C 00 04 TSTMON BIT $0400 ;Klappe auf ? 220 E13F 30 14 BMI TMOEX ;ja 221 E141 48 MOTON PHA ;sonst Motor einschalten 222 E142 A9 08 LDA #8 ;'Motor on' Bit setzen 223 E144 1C 80 02 TRB $0280 224 E147 F0 09 BEQ TMOX 225 E149 A9 10 LDA #$10 ;Motor On Status setzen 226 E14B 04 10 TSB DRSTAT 227 E14D A2 05 LDX #5 228 E14F 20 FB E2 JSR X2WAIT ;Verzoegerungsschleife, dem Motor Zeit geben, 229 E152 68 TMOX PLA ;auf Touren zu kommen 230 E153 A2 00 LDX #0 ;OK-Status 231 E155 60 TMOEX RTS 232 233 E156 20 3C E1 TSTDEN JSR TSTMON ;* Density von Diskette feststellen * 234 E159 A9 2C LDA #$2C 235 E15B 85 17 STA STPTIM ;Zeit fuer Stepwechsel kurz setzen 236 E15D 20 D1 E2 JSR TRACK0 ;Kopf auf Track 0 positionieren 237 E160 64 0D STZ TRACK 238 E162 A0 00 TSTD0 LDY #0 ;OK-Kennung 239 E164 2C 00 04 TSTD1 BIT $0400 240 E167 30 35 BMI TDERR 241 E169 5A PHY ;Status retten 242 E16A 20 2F E3 JSR TRADJA ;Kopf positionieren 243 E16D 7A PLY 244 E16E A9 20 LDA #$20 245 E170 1C 80 02 TRB $0280 ;Set MFM 246 E173 20 30 EB TSTDER JSR RDHDV ;Sector lesen 247 E176 B0 0E BCS SETFM ;Lesefehler 248 E178 A9 41 LDA #$41 ;Medium Density - Status 249 E17A A6 7D LDX $7D ;Sector Laenge 250 E17C 30 F5 BMI TSTDER ;Daten ungueltig 251 E17E F0 02 BEQ SMFMF 252 E180 A9 00 LDA #0 ;Double Density - Status 253 E182 85 09 SMFMF STA FORKEN 254 E184 80 1D BRA TSTDEX 255 E186 A9 20 SETFM LDA #$20 256 E188 0C 80 02 TSB $0280 ;Set FM 257 E18B A9 82 LDA #$82 258 E18D 85 09 STA FORKEN 259 E18F 20 30 EB RDHSD JSR RDHDV ;Sector Header lesen (SD) 260 E192 90 0F BCC TSTDEX ;OK ? 261 E194 A5 0D LDA TRACK 262 E196 C9 03 CMP #3 ;Density bis Track 3 suchen 263 E198 F0 04 BEQ TDERR 264 E19A E6 0D INC TRACK ;Track # 1 265 E19C 80 C6 BRA TSTD1 266 E19E 20 2D E2 TDERR JSR RSFE80 ;Drive 'Dumm'-Status setzen 267 E1A1 A0 80 LDY #$80 ;Error-Kennung 268 E1A3 5A TSTDEX PHY 269 E1A4 20 A9 E1 JSR SDRDDP ;Drive Density und Read/Write-Laenge einstellen 270 E1A7 68 PLA 271 E1A8 60 RTS 272 273 E1A9 20 1F F0 SDRDDP JSR DENDSP ;Density auf Display anzeigen 274 E1AC A9 20 SETDRD LDA #$20 ;DD 275 E1AE 1C 80 02 TRB $0280 ;MFM 276 E1B1 A2 12 LDX #18 ;18 Sektoren/Track 277 E1B3 A4 09 LDY FORKEN 278 E1B5 F0 0F BEQ SDRD 279 E1B7 30 06 BMI SSD ;SD 280 E1B9 A9 80 LDA #$80 ;MD 281 E1BB A2 1A LDX #26 ;26 Sektoren/Track 282 E1BD 80 05 BRA SDDL80 283 E1BF 0C 80 02 SSD TSB $0280 ;Set FM 284 E1C2 A9 00 LDA #0 285 E1C4 A0 80 SDDL80 LDY #$80 ;128 Bytes/Sector 286 E1C6 85 10 SDRD STA DRSTAT ;Drive-Status setzen 287 E1C8 86 1F STX SECANZ ;Sectoren/Track setzen 288 E1CA 84 14 STY SECLEN ;Bytes/Sector setzen 289 E1CC 60 RTS 290 291 ;Sectorfolge auf aktuellem Track lesen 292 293 E1CD A2 02 RDSFOL LDX #2 294 E1CF 20 FB E2 JSR X2WAIT ;warten bis Klappe vollstaendig geschlossen ist 295 E1D2 20 3D EB RDSFO1 JSR RDHEAD 296 E1D5 B0 56 BCS RSFE80 297 E1D7 A5 1F LDA SECANZ ;Sektoren/Track 298 E1D9 1A INA 299 E1DA 85 00 STA MERK1 300 E1DC 64 1E STZ SECANZ1 301 E1DE A9 CF LDA #$CF 302 E1E0 8D 9F 02 STA $029F ;Timer setzen 303 E1E3 20 42 EB RDSFL JSR RDHD1 304 E1E6 B0 27 BCS RDSFT 305 E1E8 A5 7A LDA $7A 306 E1EA 30 F7 BMI RDSFL 307 E1EC C5 0D CMP TRACK ;Track Nummer ueberpruefen 308 E1EE D0 3D BNE RSFE80 309 E1F0 A5 7C LDA $7C ;SECTOR Nummer 310 E1F2 F0 EF BEQ RDSFL ;ungueltig 311 E1F4 30 ED BMI RDSFL ;ungueltig 312 E1F6 C5 00 CMP MERK1 ;>SECANZ ? 313 E1F8 B0 33 BCS RSFE80 314 E1FA A6 1E LDX SECANZ1 315 E1FC 95 20 STA SECLST,X ;Sector in Sectorliste eintragen 316 E1FE F0 0B BEQ RSFI 317 E200 A2 00 LDX #0 318 E202 D5 20 RSFCL CMP SECLST,X ;Sector schon in Sectorliste ? 319 E204 F0 27 BEQ RSFE80 ;ja - Dumm schalten 320 E206 E8 INX 321 E207 E4 1E CPX SECANZ1 322 E209 90 F7 BCC RSFCL 323 E20B E6 1E RSFI INC SECANZ1 324 E20D D0 D4 BNE RDSFL 325 E20F A5 1E RDSFT LDA SECANZ1 ;gefundene Sectoranzahl=vorgegebene Sectoranzahl ? 326 E211 C5 1F CMP SECANZ 327 E213 D0 18 BNE RSFE80 ;nein - 'Dumm' schalten 328 E215 A5 08 RDSFOK LDA DUMKEN ;Status 'Sector-Folge OK' 329 E217 29 7F AND #$7F 330 E219 85 08 SETDK STA DUMKEN ;Drive dennoch Dumm schalten ? 331 E21B 29 38 AND #$38 332 E21D D0 15 BNE DSPD2 333 E21F A9 FF SNEWTR LDA #$FF 334 E221 85 0C STA LTRACK 335 E223 64 07 STZ EXSECT 336 E225 64 06 STZ WRKEN 337 E227 A9 2C LDA #$2C ;Steppmotor Verzoegerungswert kurz stellen 338 E229 85 17 STA STPTIM 339 E22B 18 CLC 340 E22C 60 RTS 341 E22D A9 80 RSFE80 LDA #$80 ;Status 'Sector-Folge ERROR' 342 E22F 04 08 TSB DUMKEN 343 E231 20 B2 EF DSPDUM JSR BELL1 344 E234 A9 6D DSPD2 LDA #$6D ;'SL' - Anzeige auf Display 345 E236 8D 01 40 STA DISP10 346 E239 A9 38 LDA #$38 347 E23B 8D 00 40 STA DISP1 348 E23E A9 64 LDA #$64 ;Steppmotor Verzoegerung normal 349 E240 85 17 STA STPTIM 350 E242 38 SEC 351 E243 60 RTS 352 353 E244 20 E4 E9 RDTRAV JSR CALCTS ;* Aktuellen Track ins ROM einiesen - mit Verify * 354 E247 F0 24 BEQ RDTRVE ;Sector # = 0 355 E249 B0 22 BCS RDTRVE ;Sector # groesser als zulaessig 356 E24B 20 6F E2 JSR RDTRA ;alle Sectoren vom Track lesen 357 E24E B0 1D BCS RDTRVE 358 E250 A5 1F RDTRV2 LDA SECANZ 359 E252 85 00 STA MERK1 360 E254 E8 RDTRVL INX 361 E255 E4 1F CPX SECANZ 362 E257 90 02 BCC RDTRT 363 E259 A2 00 LDX #0 364 E25B B4 20 RDTRT LDY SECLST,X ;Sector-Status in Statusliste pruefen 365 E25D B9 40 00 LDA STALST,Y 366 E260 F0 05 BEQ RDTRD ;Status OK 367 E262 20 B6 E2 JSR RDSS2 ;Sector noch einmal lesen 368 E265 D0 06 BNE RDTRVE 369 E267 C6 00 RDTRD DEC MERK1 370 E269 D0 E9 BNE RDTRVL 371 E26B 18 CLC ;'Carry' = 0 OK-Status 372 E26C 60 RTS 373 E26D 38 RDTRVE SEC ;'Carry' = 1 Error-Status 374 E26E 60 RTS 375 376 E26F A9 40 RDTRA LDA #$40 ;* Aktuellen Track ins RAM einlesen - ohne Verify * 377 E271 04 08 TSB DUMKEN 378 E273 20 1D EB JSR RDHDSP ;Sector-Track-Position feststellen 379 E276 B0 2F BCS RDTRAX 380 E278 A6 7A LDX $7A 381 E27A E4 0D CPX TRACK ;Track # in Ordnung ? 382 E27C D0 29 BNE RDTRAX 383 E27E A2 00 LDX #0 384 E280 D5 20 RDTRSL CMP SECLST,X ;Sector in Liste suchen 385 E282 F0 07 BEQ RDTRA2 386 E284 E8 INX 387 E285 E4 1F CPX SECANZ 388 E287 90 F7 BCC RDTRSL 389 E289 80 1C BRA RDTRAX 390 E28B A5 1F RDTRA2 LDA SECANZ ;Anzahl Sectoren/Track 391 E28D 85 00 STA MERK1 392 E28F 20 1F E2 JSR SNEWTR ;Kennung fuer neuen Track setzen 393 E292 20 AF E2 RDTR1L JSR RDSSPE 394 E295 29 16 AND #$16 ;CRC/AM-ERR zulassen 395 E297 D0 0E BNE RDTRAX 396 E299 C6 00 RDTRA3 DEC MERK1 397 E29B D0 F5 BNE RDTR1L 398 399 E29D A9 40 LDA #$40 ;Track-Read Error-Status ruecksetzen 400 E29F 14 08 TRB DUMKEN 401 E2A1 A5 0D LDA TRACK 402 E2A3 85 0C STA LTRACK ;Track # fuer zuletzt gelesenen Track merken 403 E2A5 18 CLC 404 E2A6 60 RTS 405 E2A7 20 7B E3 RDTRAX JSR CONRES ;Controller zuruecksetzen 406 E2AA 2C 00 04 BIT $0400 ;Klappe auf ? 407 E2AD 38 SEC 408 E2AE 60 RTS 409 410 E2AF E8 RDSSPE INX ;* Unterprogramm zum lesen der Sectoren nach * 411 E2B0 E4 1F CPX SECANZ ;* Sector-Liste * 412 E2B2 90 02 BCC RDSS2 413 E2B4 A2 00 LDX #0 414 E2B6 B5 20 RDSS2 LDA SECLST,X 415 E2B8 8D 02 04 STA $0402 ;Sector # 416 E2BB 20 1C EA JSR SETBUF2 ;Buffer fuer Sector setzen 417 E2BE 20 7B E3 JSR CONRES 418 E2C1 20 D4 EA JSR RDSEC1 ;Sector lesen 419 E2C4 B4 20 LDY SECLST,X ;Sector-Status in Statusliste eintragen 420 E2C6 29 3F AND #$3F 421 E2C8 99 40 00 STA STALST,Y 422 E2CB 60 RTS 423 424 E2CC A9 04 TROJUS LDA #4 ;* Track 0 Justierung * 425 E2CE 20 45 E3 JSR TRADJ1 ;4 Tracks vorwaerts 426 E2D1 20 78 E3 TRACK0 JSR CONRE2 427 E2D4 A0 FF LDY #$FF ;Step-Rueckwaerts-Kennung 428 E2D6 AD 00 04 SENSOR LDA $0400 429 E2D9 29 04 AND #4 ;Track-0 Sensor pruefen 430 E2DB F0 05 BEQ B5TST 431 E2DD 20 0F E3 JSR TRVR ;1 Track zurueck 432 E2E0 80 F4 BRA SENSOR 433 E2E2 A5 60 B5TST LDA STPPOS ;Track 0 nach Stepperposition fein justieren 434 E2E4 C9 03 CMP #3 435 E2E6 F0 05 BEQ SETTR0 436 E2E8 20 0F E3 JSR TRVR 437 E2EB D0 F5 BNE B5TST 438 E2ED 9C 01 04 SETTR0 STZ $0401 ;Track-Register des Controllers = 0 439 E2F0 A6 16 LDX DLYTIM 440 441 E2F2 A9 12 XWAIT LDA #18 ;* Verzoegerungsschleife * 442 E2F4 3A XWA1 DEA ;* Wert der Verzoegerung im X-Register * 443 E2F5 D0 FD BNE XWA1 ;* 1 X-Wert ca. 100 Taktzyklen * 444 E2F7 CA DEX 445 E2F8 D0 F8 BNE XWAIT 446 E2FA 60 RTS 447 448 E2FB 86 04 X2WAIT STX DLYT2 ;* Schleife fuer lange Verzoegerungen * 449 E2FD A9 04 X2WA1 LDA #4 ;* 1 X-Wert ca. 100000 Taktzyklen * 450 E2FF 85 03 STA DLYT1 451 E301 A2 FA X2WA2 LDX #$FA 452 E303 20 F2 E2 JSR XWAIT 453 E306 C6 03 DEC DLYT1 454 E308 D0 F7 BNE X2WA2 455 E30A C6 04 DEC DLYT2 456 E30C D0 EF BNE X2WA1 457 E30E 60 RTS 458 459 E30F DA TRVR PHX ;* Trackwechsel Routine * 460 E310 A6 60 LDX STPPOS 461 E312 E8 INX ;* Y=00-7F 1 Step vorwaerts * 462 E313 98 TYA ;* Y=80-FF 1 Step rueckwaerts * 463 E314 30 02 BMI RWARTS 464 E316 CA DEX 465 E317 CA DEX 466 E318 8A RWARTS TXA 467 E319 29 03 AND #3 468 E31B 85 60 STA STPPOS ;Bitposition des Steppermotors merken 469 E31D AA TAX 470 E31E BD 2B E3 LDA SMDAT,X ;Bitmuster setzen 471 E321 8D 82 02 STA $0282 472 E324 A6 17 LDX STPTIM ;Wert fuer Step-Verzoegerung 473 E326 20 F2 E2 JSR XWAIT 474 E329 FA PLX 475 E32A 60 RTN1 RTS 476 E32B 39 35 2D 1D SMDAT .BYTE $39,$35,$2D,$1D 477 E32F 20 F6 EF TRADJA JSR TRAANZ ;Track-Justierung mit Trackanzeige 478 E332 20 7B E3 TRADJ JSR CONRES ;-- ohne Trackanzeige 479 E335 20 3C E1 JSR TSTMON ;Motor einschalten wenn Klappe geschlossen ist 480 E338 30 1C BMI JPE80 ;Klappe war auf 481 E33A A5 0D LDA TRACK ;neue Track # 482 E33C 38 TRADJ0 SEC 483 E33D ED 01 04 SBC $0401 ;Track-Register Controller 484 E340 F0 E8 BEQ RTN1 ;neuer Track=alter Track 485 E342 20 F6 EF JSR TRAANZ ;bei Trackwechsel - Trackanzeige 486 E345 A8 TRADJ1 TAY 487 E346 10 03 BPL TRADJ2 488 E348 49 FF EOR #$FF 489 E34A 1A INA 490 E34B 0A TRADJ2 ASL ;Steps x2 491 E34C C9 50 CMP #80 492 E34E 90 09 BCC TRADJ3 ;mehr als 40 Tracks nicht zu lassen 493 E350 20 68 E0 JSR SYSERR ;2 x Bell ausgeben 494 E353 20 D1 E2 JSR TRACK0 ;Track 0 Justage 495 E356 4C 50 E5 JPE80 JMP STELL2 ;=ERR80 496 E359 AA TRADJ3 TAX 497 E35A 20 0F E3 TRADJL JSR TRVR ;1 Step ausfuehren 498 E35D CA DEX 499 E35E D0 FA BNE TRADJL 500 E360 A6 0D SETTRN LDX TRACK ;Track # in Trackregister Controller kopieren 501 E362 8E 01 04 STX $0401 502 E365 A9 10 LDA #$10 503 E367 E0 14 CPX #20 504 E369 90 05 BCC TRKL20 ;Track groesser 20 505 E36B 0C 80 02 TSB $0280 ;Controller umschalten 506 E36E 80 03 BRA TRADJX 507 E370 1C 80 02 TRKL20 TRB $0280 508 E373 A2 28 TRADJX LDX #$28 ;Kurze Verzoegerung 509 E375 4C F2 E2 JMP XWAIT 510 511 E378 20 7B E3 CONRE2 JSR CONRES 512 E37B A9 D0 CONRES LDA #$D0 ;Controller Reset 513 E37D 8D 00 04 STA $0400 514 E380 A9 07 LDA #7 515 E382 3A CONRL DEA 516 E383 D0 FD BNE CONRL 517 518 E385 A9 01 WREADY LDA #1 ;Warten auf Controller 519 E387 2D 00 04 WRDYL AND $0400 520 E38A D0 FB BNE WRDYL 521 E38C AD 00 04 LDA $0400 ;Controller-Status 522 E38F 60 RTS 523 524 E390 64 11 RDINF STZ COMST 525 E392 A9 04 LDA #4 ;4 Bytes nach Buffer $80 526 E394 A2 80 LDX #$80 527 E396 A0 00 LDY #0 528 E398 20 BC E4 JSR RDBTS ;Kommando vom Computer empfangen 529 E39B AD 82 02 CWAIT LDA $0282 ;Warten bis Command - Leitung zurueckgesetzt ist 530 E39E 30 FB BMI CWAIT 531 E3A0 A2 04 LDX #4 532 E3A2 20 F2 E2 JSR XWAIT 533 534 E3A5 24 11 BIT COMST ;Fehler bei Datenuebertragung ? 535 E3A7 70 2F BVS DELINF 536 E3A9 20 F7 E3 JSR TSTCOM ;Kommando auf Gueltigkeit ueberpruefen 537 E3AC 24 11 BIT COMST 538 E3AE 30 28 BMI DELINF 539 E3B0 70 31 BVS ERR4E1 540 E3B2 20 FB E4 JSR SEND41 541 E3B5 24 1C BIT RDDATK ;Flag fuer Datenblock lesen 542 E3B7 10 0A BPL EXECCO 543 E3B9 20 C2 E4 JSR RDBYTS 544 E3BC 24 11 BIT COMST 545 E3BE 70 27 BVS ERR4E2 546 E3C0 20 FB E4 JSR SEND41 ;'A' senden 547 E3C3 20 A5 E5 EXECCO JSR EXEC ;Kommando ausfuehren 548 E3C6 20 7B E3 JSR CONRES 549 E3C9 A9 03 LDA #3 550 E3CB 14 10 TRB DRSTAT ;BIT 0+1=0 551 E3CD A9 3C LDA #$3C 552 E3CF 0C 82 02 TSB $0282 ;Steppmotor aus 553 554 E3D2 A5 16 SDELAY LDA DLYTIM ;'Motor aus' Zeit setzen 555 E3D4 85 04 STA DLYT2 556 E3D6 64 03 STZ DLYT1 557 558 559 E3D8 64 80 DELINF STZ $80 ;Kommandobuffer loeschen 560 E3DA 64 81 STZ $81 561 E3DC 64 82 STZ $82 562 E3DE 64 83 STZ $83 563 E3E0 6C 82 9F JMP (CMTBL+$82) ;Ruecksprungvector in Motor-Timer Routine 564 565 E3E3 A9 01 ERR4E1 LDA #1 566 E3E5 80 02 BRA ERR4E 567 E3E7 A9 02 ERR4E2 LDA #2 568 E3E9 04 10 ERR4E TSB DRSTAT 569 E3EB 20 07 E5 JSR SEND4E ;'N' senden 570 E3EE 80 E8 BRA DELINF 571 572 E3F0 33 32 34 31 DRKEN .BYTE '3','2','4','1' ;Laufwerksnummer Tabelle 573 574 E3F4 4C 50 E5 ERR80 JMP STELL2 575 576 E3F7 AD 80 02 TSTCOM LDA $0280 ;* Kommando vom Computer auf Gueltigkeit pruefen 577 E3FA 29 03 AND #3 578 E3FC AA TAX 579 E3FD BD F0 E3 LDA DRKEN,X ;Drive # OK ? 580 E400 C5 80 CMP $80 581 E402 D0 F0 BNE ERR80 582 E404 A2 00 LDX #0 583 E406 BD 00 9F VERCOM LDA CMTBL,X ;Kommando in COM-Tabelle suchen 584 E409 F0 75 BEQ ERR40 ;Ende COM-Tabelle 585 E40B 0A ASL 586 E40C 66 1C ROR RDDATK 587 E40E 4A LSR 588 E40F C5 81 CMP $81 ;Kommando gefunden ? 589 E411 F0 11 BEQ COMFND 590 E413 E8 INX 591 E414 E8 INX 592 E415 E8 INX 593 E416 30 68 BMI ERR40 594 E418 A5 08 LDA DUMKEN ;Kommando aus erweiterter Kommandotabelle zulassen ? 595 E41A 29 38 AND #$38 596 E41C F0 E8 BEQ VERCOM 597 E41E E0 16 CPX #$16 598 E420 90 E4 BCC VERCOM 599 E422 80 5C BRA ERR40 600 601 E424 86 18 COMFND STX COMPOS 602 E426 E0 09 CPX #9 ;Kommando Position <3 603 E428 B0 4A BCS TSTCOX 604 E42A 20 E4 E9 JSR CALCTS ;Track+Sector errechnen 605 E42D B0 51 BCS ERR40 ;Sector unzulaessig 606 E42F 30 43 BMI TSTCOX ;RAM oder ROM-Adresse 607 E431 D0 06 BNE COMF2 608 E433 A5 1C LDA RDDATK 609 E435 30 49 BMI ERR40 610 E437 80 3B BRA TSTCOX 611 E439 A5 08 COMF2 LDA DUMKEN 612 E43B 29 B8 AND #$B8 613 E43D D0 22 BNE WSEBUF 614 E43F 20 1A EA JSR SETBUF ;RAM-Buffer nach Sector # setzen 615 E442 A6 18 NOSEC LDX COMPOS ;Kommando = Read/Write Sector ? 616 E444 F0 0B BEQ WRSTD 617 E446 E0 03 CPX #3 ;Write Sector verify ? 618 E448 F0 17 BEQ WSEBUF 619 E44A A5 08 LDA DUMKEN ;Read Sector 'Dumm' geschaltet ? 620 E44C 4A LSR 621 E44D 90 25 BCC TSTCOX 622 E44F B0 10 BCS WSEBUF 623 E451 A5 08 WRSTD LDA DUMKEN ;Write Sector ’Dumm' geschaltet ? 624 E453 29 FA AND #$FA 625 E455 D0 0A BNE WSEBUF 626 E457 A6 0E LDX SECTOR 627 E459 A5 0D LDA TRACK ;neuer Track=letzter Track ? 628 E45B C5 0B CMP LWRTRA 629 E45D F0 07 BEQ TSTRS ;Sector # fuer Extended-Buffer merken 630 E45F 86 07 STX EXSECT 631 E461 20 DB E9 WSEBUF JSR SEXBUF ;Extended Buffer als Sector-Buffer 632 E464 80 0E BRA TSTCOX 633 E466 A5 06 TSTRS LDA WRKEN ;schon ein Sector auf diesem Track geschrieben (ins RAM) ? 634 E468 F0 04 BEQ TSTRS2 635 E46A B5 40 LDA STALST,X ;Sector schon einmal geschrieben ? 636 E46C 30 06 BMI TSTCOX 637 E46E A9 80 TSTRS2 LDA #$80 ;Write Status setzen 638 E470 95 40 STA STALST,X 639 E472 E6 06 INC WRKEN ;zu schreibende Sectoren+1 640 E474 A9 00 TSTCOX LDA #0 641 E476 24 1C BIT RDDATK 642 E478 10 01 BPL RTN2 643 E47A 1A INA 644 E47B 04 11 RTN2 TSB COMST 645 E47D 60 RTS 646 647 E47E E6 15 ER40UK INC USKEN ;Umschalten zwischen normal oder High-Speed 648 E480 AD 96 02 ERR40 LDA $0296 649 E483 A9 40 LDA #$40 650 E485 04 11 TSB COMST 651 E487 60 RTS 652 653 ;Test, ob Klappe geschlossen und Write-Protect 654 655 E488 20 7B E3 TSTWRP JSR CONRES 656 E48B 29 C0 AND #$C0 657 E48D 60 RTS 658 659 E48E A6 07 TSTMEB LDX EXSECT ;Zu schreibender Sector im Extended-Buffer ? 660 E490 F0 20 BEQ TMEBX 661 E492 A9 80 LDA #$80 662 E494 95 40 STA STALST,X ;Write-Status setzen 663 E496 20 F6 EF JSR TRAANZ ;Trackanzeige 664 E499 20 1A EA JSR SETBUF ;RAM Buffer setzen 665 E49C A0 00 LDY #0 666 E49E B9 00 9E MEBL LDA EXBUF,Y ;Sectordaten in Sectorbuffer kopieren 667 E4A1 91 19 STA (IND),Y 668 E4A3 C8 INY 669 E4A4 C4 13 CPY RWLEN 670 E4A6 D0 F6 BNE MEBL 671 E4A8 64 07 STZ EXSECT 672 E4AA A9 01 LDA #1 673 E4AC 85 06 STA WRKEN ;Anzahl der zu schreibenden Sectoren = 1 674 E4AE A5 0D LDA TRACK ;Track # fuer zu schreibenden Sector merken 675 E4B0 85 0B STA LWRTRA 676 E4B2 60 TMEBX RTS 677 678 679 E4B3 A9 80 RD128B LDA #$80 ;128 Bytes 680 E4B5 2C .BYTE $2C ;=BIT ABS. (Dummy) 681 E4B6 A9 00 RD256B LDA #0 ;256 Bytes empfangen 682 E4B8 A2 00 LDX # EXBUF 684 E4BC 85 13 RDBTS STA RWLEN 685 E4BE 86 19 STX IND 686 E4C0 84 1A STY IND+1 687 E4C2 64 1B RDBYTS STZ CHKSUM ;Checksumme loeschen 688 E4C4 A9 90 RD1BLK LDA #$90 ;maximale Zeit fuer Datenuebertragung fest legen 689 E4C6 8D 9F 02 STA $029F 690 E4C9 A0 00 LDY #0 691 E4CB 20 F0 E4 RDBL JSR RDBYTE ;1 Byte vom Computer empfangen 692 E4CE 91 19 STA (IND),Y 693 E4D0 18 CLC 694 E4D1 65 1B ADC CHKSUM 695 E4D3 69 00 ADC #0 696 E4D5 85 1B STA CHKSUM 697 E4D7 C8 INY 698 E4D8 C4 13 CPY RWLEN ;letztes Byte ? 699 E4DA D0 EF BNE RDBL 700 E4DC 20 41 EA JSR ADDBUF ;mehrere Datenblocks lesen (z. B. COM 60) ? 701 E4DF D0 E3 BNE RD1BLK 702 E4E1 20 F0 E4 JSR RDBYTE 703 E4E4 AC 96 02 RDEXIT LDY $0296 704 E4E7 45 1B EOR CHKSUM ;Checksumme OK ? 705 E4E9 D0 93 BNE ER40UK 706 E4EB 64 11 STZ COMST ;COM-Status 'Datenuebertragung Ok' 707 E4ED 4C 2C EA JMP SETRWL 708 709 E4F0 A6 63 RDBYTE LDX IOIND ;1 Byte lesen 710 E4F2 7C F5 E4 JMP (RDIND,X) 711 E4F5 12 FE 3B FE 00 FD RDIND .WORD NORDB,USRDB,RDPIO ;Tabelle I/O - Routinen 712 ; (RDPIO fuer spaetere Erweiterung vorgesehen) 713 714 715 716 717 718 E4FB A9 41 SEND41 LDA #$41 ;'A' Status-Rueckmeldung an den Computer 719 E4FD D0 0A BNE SENDW 720 E4FF A9 43 SEND43 LDA #$43 ;'C' 721 E501 D0 06 BNE SENDW 722 E503 A9 45 SEND45 LDA #$45 ;'E' 723 E505 D0 02 BNE SENDW 724 E507 A9 4E SEND4E LDA #$4E ;'N' 725 E509 85 00 SENDW STA MERK1 726 E50B A2 02 LDX #2 727 E50D 20 F2 E2 JSR XWAIT 728 E510 80 2F BRA SDBYT2 729 730 E512 A9 80 SD128B LDA #$80 ;128 Bytes 731 E514 2C .BYTE $2C ;=BIT ABS. 732 E515 A9 00 SD256B LDA #0 ;256 Bytes senden 733 E517 A2 00 LDX # EXBUF 735 E51B 85 13 SDBTS STA RWLEN 736 E51D 86 19 STX IND 737 E51F 84 1A STY IND+1 738 739 ;Datenblocks zum Computer senden 740 741 E521 64 1B SDBYTS STZ CHKSUM ;Checksum loeschen 742 E523 A0 00 SD1BLK LDY #0 743 E525 B1 19 SDBL LDA (IND),Y 744 E527 85 00 STA MERK1 745 E529 18 CLC 746 E52A 65 1B ADC CHKSUM 747 E52C 69 00 ADC #0 748 E52E 85 1B STA CHKSUM 749 E530 20 41 E5 JSR SDBYT2 750 E533 C8 INY 751 E534 C4 13 CPY RWLEN 752 E536 D0 ED BNE SDBL 753 E538 20 41 EA JSR ADDBUF 754 E53B D0 E6 BNE SD1BLK 755 E53D A5 1B LDA CHKSUM ;Cheksumme senden 756 757 E53F 85 00 SDBYTE STA MERK1 758 E541 A6 63 SDBYT2 LDX IOIND ;1 Byte senden 759 E543 7C 46 E5 JMP (SDIND,X) 760 E546 76 FE A5 FE 27 FD SDIND .WORD NOSDB,USSDB,SDPIO ;Tabelle der I/O - Routinen 761 ; (SDPIO = fuer spaetere Erweiterung vorgesehen) 762 763 764 765 E54C A9 02 STELL LDA #2 ;2 Versuche setzen 766 E54E 85 12 STA RETRY 767 E550 A9 80 STELL2 LDA #$80 ;Command-Error setzen 768 E552 04 11 TSB COMST 769 E554 60 RTS 770 771 E555 AD 00 04 QUITT LDA $0400 ;* Quittungsbyte an Computer senden * 772 E558 85 0F QUITT2 STA CONST 773 E55A 24 11 BIT COMST 774 E55C 30 07 BMI SERR45 775 E55E A9 44 LDA #$44 776 E560 14 10 TRB DRSTAT 777 E562 4C FF E4 JMP SEND43 ;'C' Senden 778 E565 20 DB EF SERR45 JSR ERRDSP 779 E568 20 AD EF JSR BELL 780 E56B A9 04 LDA #4 781 E56D 04 10 TSB DRSTAT 782 E56F 4C 03 E5 JMP SEND45 ;'E' Senden 783 784 E572 8D 96 02 SETTIM STA $0296 ;Set Timer Routine 785 E575 8D 9F 02 STA $029F 786 E578 60 RTS 787 788 E579 AD 80 02 TSTDSW LDA $0280 ;'Dumm' Schalter abfragen 789 E57C 29 04 AND #4 790 E57E C5 05 CMP LDSW 791 E580 F0 22 BEQ TSTDSX ;gleiche Stellung wie vorher 792 E582 85 05 STA LDSW 793 E584 A8 TAY 794 E585 D0 0A BNE NODSW 795 E587 A9 08 LDA #8 ;Dumm - Modus setzen 796 E589 04 08 TSB DUMKEN 797 E58B 20 34 E2 JSR DSPD2 ;'SL' anzeigen 798 E58E 4C 04 E6 JMP TSTDAT ;Testen ob noch Sectoren zu schreiben sind 799 E591 A5 08 NODSW LDA DUMKEN ;Dumm - Modus zuruecksetzen 800 E593 29 F7 AND #$F7 801 E595 85 08 STA DUMKEN 802 E597 29 B0 AND #$B0 803 E599 D0 06 BNE NOFAST 804 E59B 20 1F E2 JSR SNEWTR ;Kennung fuer 'kein Sector im RAM' setzen 805 E59E 4C F6 EF JMP TRAANZ ;Track # neu anzeigen 806 E5A1 4C 34 E2 NOFAST JMP DSPD2 807 E5A4 60 TSTDSX RTS 808 809 E5A5 A6 18 EXEC LDX COMPOS ;Kommando ausfuehren 810 E5A7 7C 01 9F JMP (CMTBL+1,X) 811 812 ;Normale Kommando - Tabelle: 813 814 E5AA D0 COMTBL .BYTE $D0 ;Write Sector 815 E5AB 00 EC .WORD COM50 816 E5AD D7 .BYTE $D7 ;Write Sector+Verify 817 E5AE 00 EC .WORD COM50 818 E5B0 52 .BYTE $52 ;Read Sector 819 E5B1 56 EA .WORD COM52 820 E5B3 53 .BYTE $53 ;Drive Status 821 E5B4 80 EF .WORD COM53 822 E5B6 21 .BYTE $21 ;Format Single/Double 823 E5B7 E7 EC .WORD COM21 824 E5B9 22 .BYTE $22 ;Format Medium 825 E5BA E3 EC .WORD COM22 826 E5BC 4E .BYTE $4E ;Read Drive - Options 827 E5BD 28 EF .WORD COM4E 828 E5BF 4F .BYTE $4F ;Write Drive - Options 829 E5C0 5A EF .WORD COM4F 830 831 ;Erweiterte Kommando-Tabelle: 832 833 E5C2 3F .BYTE $3F ;Read High-Speed-Wert 834 E5C3 00 FE .WORD COM3F 835 E5C5 44 .BYTE $44 ;Display/Bell/Drive Control 836 E5C6 E7 E5 .WORD COM44 837 E5C8 4C .BYTE $4C ;Jump Adresse 838 E5C9 14 E6 .WORD COM4C 839 E5CB 4D .BYTE $4D ;Jump/Quitt 840 E5CC 11 E6 .WORD COM4D 841 E5CE 51 .BYTE $51 ;Write all + Stop Motor 842 E5CF 17 E6 .WORD COM51 843 E5D1 4B .BYTE $4B ;Set/Reset 'Dumm' 844 E5D2 EE E5 .WORD COM4B 845 E5D4 60 .BYTE $60 ;Write Track (normal Speed) 846 E5D5 4A E6 .WORD COM60 847 E5D7 62 .BYTE $62 ;Read Track 848 E5D8 26 E6 .WORD COM62 849 E5DA 68 .BYTE $68 ;SIO-Laenge senden 850 E5DB 9F E6 .WORD COM68 851 E5DD 69 .BYTE $69 ;SIO Routine senden 852 E5DE AD E6 .WORD COM69 853 E5E0 41 .BYTE $41 ;Kommando einfuegen/loeschen 854 E5E1 16 E7 .WORD COM41 855 E5E3 20 .BYTE $20 ;Spezial Format 856 E5E4 7E E7 .WORD COM20 857 E5E6 00 COMEND .BYTE 0 858 859 ;Bedeutung der Bits bei COM 44 860 861 ;$80 : Error Anzeige zulassen 862 ;$40 : Trackanzeige in Hexa-Dezimal 863 ;$20 : Format ohne Verify 864 ;$10 : bei COM 20 Sectoren 1,2,3,360,1024 nicht schreiben 865 ;$08 : bei COM 51 Motor anlassen 866 ;$01 : Bell bei Error zulassen 867 868 E5E7 A5 82 COM44 LDA $82 ;* Display/Drive Kontrolle neu setzen * 869 E5E9 85 61 STA DSPCTR 870 E5EB 4C FF E4 JMP SEND43 871 872 E5EE 20 04 E6 COM4B JSR TSTDAT ;* Slow/Fast - Mode Kontrolle * 873 E5F1 A5 82 LDA $82 874 E5F3 85 08 STA DUMKEN 875 E5F5 29 B8 AND #$B8 876 E5F7 F0 05 BEQ C4BHI 877 E5F9 20 31 E2 JSR DSPDUM ;'SL' anzeigen 878 E5FC 80 03 BRA COM4BX 879 E5FE 20 68 ED C4BHI JSR COPSLT 880 E601 4C FF E4 COM4BX JMP SEND43 ;'C' Senden 881 882 E604 20 64 EB TSTDAT JSR TSTWR ;Noch zu schreibende Sectoren schreiben 883 E607 A6 1F LDX SECANZ 884 E609 A9 40 LDA #$40 885 E60B 95 40 TSTDSL STA STALST,X ;Status 'kein Sector in RAM' setzen 886 E60D CA DEX 887 E60E D0 FB BNE TSTDSL 888 E610 60 RTS 889 890 E611 20 55 E5 COM4D JSR QUITT 891 E614 6C 82 00 COM4C JMP ($82) ;Sprung ueber 'Jump Adresse' 892 893 E617 20 64 EB COM51 JSR TSTWR ;noch zu schreibende Sectoren schreiben 894 E61A A5 61 LDA DSPCTR 895 E61C 29 08 AND #8 ;Motor ausschalten ? 896 E61E D0 03 BNE C51Q 897 E620 20 2D E1 JSR MOTOFF 898 E623 4C FF E4 C51Q JMP SEND43 ;'C' senden 899 900 E626 A5 83 COM62 LDA $83 ;RAM - oder ROM - Adresse ? 901 E628 30 0A BMI C62X 902 E62A 20 50 E5 JSR STELL2 ;Error - Status setzen 903 E62D 20 44 E2 JSR RDTRAV ;Read Track mit Verify 904 E630 B0 02 BCS C62X 905 E632 64 11 C620K STZ COMST ;OK Status senden 906 E634 20 55 E5 C62X JSR QUITT ;Quittung senden 907 E637 A5 1F LDA SECANZ 908 E639 85 62 STA BLOCKS ;Anzahl der Datenblocks setzen 909 E63B A5 14 LDA SECLEN 910 E63D A6 82 LDX $82 911 E63F A4 83 LDY $83 ;RAM - oder ROM - Adresse ? 912 E641 30 04 BMI C62SD 913 E643 A2 00 LDX # DATBUF 915 E647 4C 1B E5 C62SD JMP SDBTS ;alle Datenblocks senden 916 917 E64A 20 50 E5 COM60 JSR STELL2 ;Error Status setzen 918 E64D 20 E4 E9 JSR CALCTS 919 E650 F0 47 BEQ C60X ;Sector 0 nicht zulassen 920 E652 B0 45 BCS C60X ;Track >39 921 E654 30 0D BMI C60RD ;Daten ins RAM 922 E656 A5 0E LDA SECTOR 923 E658 3A DEA 924 E659 D0 3E BNE C60X 925 E65B A9 00 LDA # DATBUF 928 E661 85 1A STA IND+1 929 E663 A5 1F C60RD LDA SECANZ 930 E665 A6 14 LDX SECLEN 931 E667 F0 01 BEQ C60RD2 932 E669 4A LSR 933 E66A 85 62 C60RD2 STA BLOCKS ;Anzahl der Datenblocks setzen 934 E66C 64 13 STZ RWLEN 935 E66E 20 C2 E4 JSR RDBYTS ;alle Datenblocks lesen 936 E671 24 11 BIT COMST ;Fehler in Datenuebertragung ? 937 E673 70 27 BVS C60E4E 938 E675 20 FB E4 JSR SEND41 ;'A' Senden 939 E678 A5 83 LDA $83 940 E67A 30 1B BMI C60OK 941 E67C A5 0D LDA TRACK ;Track # uebernehmen 942 E67E 85 0B STA LWRTRA 943 E680 20 88 E4 JSR TSTWRP ;Write Protect oder Klappe auf ? 944 E683 D0 14 BNE C60X 945 E685 A6 1F LDX SECANZ 946 E687 86 06 STX WRKEN 947 E689 A9 80 LDA #$80 ;Write Status fuer alle Sectoren setzen 948 E68B 95 40 C60L STA STALST, X 949 E68D CA DEX 950 E68E D0 FB BNE C60L 951 E690 20 64 EB JSR TSTWR ;den ganzen Track schreiben 952 E693 A5 01 LDA MERK2 953 E695 D0 02 BNE C60X 954 E697 64 11 C60OK STZ COMST ;OK Status setzen 955 E699 4C 55 E5 C60X JMP QUITT ;Quittung senden 956 E69C 4C 07 E5 C60E4E JMP SEND4E ;'N' Senden 957 958 E69F 20 FF E4 COM68 JSR SEND43 ;* Diese Routine gibt die Laenge der SIO-Rouitne * 959 E6A2 A9 02 LDA #2 ;* an den Computer zurueck * 960 E6A4 A2 AB LDX # SIOLEN 962 E6A8 4C 1B E5 JMP SDBTS 963 E6AB 16 02 SIOLEN .WORD SIOEND-SIO 964 965 E6AD A9 53 COM69 LDA # SIO ;Unterschied zwischen ORG- und TARGET-Adresse errechnen 971 E6B8 85 1A STA IND+1 972 E6BA E5 83 SBC $83 973 E6BC 85 83 STA $83 974 E6BE 20 FF E4 JSR SEND43 975 E6C1 A0 00 LDY #0 976 E6C3 84 1B STY CHKSUM 977 E6C5 B9 69 F2 C69L LDA ABSTBL,Y ;eine zu relocierende Adresse ? 978 E6C8 C5 19 CMP IND 979 E6CA D0 1E BNE C69SB 980 E6CC B9 6A F2 LDA ABSTBL+1,Y 981 E6CF C5 1A CMP IND+1 982 E6D1 D0 17 BNE C69SB 983 E6D3 20 01 E7 JSR C69LDB 984 E6D6 38 SEC ;absolute Adresse relocieren 985 E6D7 E5 82 SBC $82 986 E6D9 08 PHP 987 E6DA 20 0A E7 JSR C69SDB 988 E6DD 20 01 E7 JSR C69LDB 989 E6E0 28 PLP 990 E6E1 E5 83 SBC $83 991 E6E3 20 0A E7 JSR C69SDB 992 E6E6 C8 INY 993 E6E7 C8 INY 994 E6E8 D0 06 BNE C69TE 995 E6EA 20 01 E7 C69SB JSR C69LDB 996 E6ED 20 0A E7 JSR C69SDB 997 E6F0 A5 19 C69TE LDA IND 998 E6F2 C9 69 CMP # SIOEND 1002 E6FA D0 C9 BNE C69L 1003 E6FC A5 1B LDA CHKSUM 1004 E6FE 4C 3F E5 JMP SDBYTE 1005 E701 B2 19 C69LDB LDA (IND) ;naechstes Byte der SIO-Routine empfangen 1006 E703 E6 19 INC IND 1007 E705 D0 02 BNE C69LDX 1008 E707 E6 1A INC IND+1 1009 E709 60 C69LDX RTS 1010 E70A 85 00 C69SDB STA MERK1 ;1 Byte zum Computer senden 1011 E70C 18 CLC 1012 E70D 65 1B ADC CHKSUM 1013 E70F 69 00 ADC #0 1014 E711 85 1B STA CHKSUM 1015 E713 4C 41 E5 JMP SDBYT2 1016 1017 E716 A9 03 COM41 LDA #3 ;3 Bytes in den Extended-Buffer holen 1018 E718 A2 00 LDX # EXBUF 1020 E71C 20 BC E4 JSR RDBTS 1021 E71F 24 11 BIT COMST ;Fehler bei Datenuebertragung ? 1022 E721 70 58 BVS C41E4E 1023 E723 20 FB E4 JSR SEND41 ;'A' senden 1024 E726 20 50 E5 JSR STELL2 1025 E729 AD 00 9E LDA EXBUF 1026 E72C 29 7F AND #$7F 1027 E72E 85 00 STA MERK1 ;Kommando ohne Bit 7 merken 1028 E730 A2 00 LDX #0 1029 E732 BD 00 9F C41SL LDA CMTBL,X ;Testen ob das Kommando schon in der Kommando-Tabelle ist 1030 E735 08 PHP 1031 E736 F0 26 BEQ C41AC2 ;Tabellenende 1032 E738 29 7F AND #$7F 1033 E73A C5 00 CMP MERK1 1034 E73C F0 0A BEQ C41AC1 1035 E73E 28 PLP 1036 E73F E8 INX 1037 E740 E8 INX 1038 E741 E8 INX 1039 E742 E0 7E CPX #126 1040 E744 90 EC BCC C41SL 1041 E746 80 30 BRA C41X ;Command-Tabelle voll 1042 E748 AD 01 9E C41AC1 LDA EXBUF+1 ;Command-Adresse = 0000 ? 1043 E74B 0D 02 9E ORA EXBUF+2 1044 E74E D0 0E BNE C41AC2 1045 E750 BD 03 9F C41ML LDA CMTBL+3,X ;Kommando loeschen und Tabelle kuerzen 1046 E753 9D 00 9F STA CMTBL,X 1047 E756 E8 INX 1048 E757 E0 7B CPX #123 1049 E759 90 F5 BCC C41ML 1050 E75B 28 PLP 1051 E75C 80 18 BRA C41OK 1052 E75E AD 00 9E C41AC2 LDA EXBUF ;Kommando anhaengen 1053 E761 9D 00 9F STA CMTBL,X 1054 E764 AD 01 9E LDA EXBUF+1 1055 E767 9D 01 9F STA CMTBL+1,X 1056 E76A AD 02 9E LDA EXBUF+2 1057 E76D 9D 02 9F STA CMTBL+2,X 1058 E770 28 PLP ;war eine '0' am Tabellenende vorhanden ? 1059 E771 D0 03 BNE C41OK 1060 E773 9E 03 9F STZ CMTBL+3,X ;wieder ein '0' anhaengen 1061 E776 64 11 C41OK STZ COMST 1062 E778 4C 55 E5 C41X JMP QUITT ;Quittung senden 1063 E77B 4C 07 E5 C41E4E JMP SEND4E 1064 1065 ;Spezial Formatierungsroutine 1066 ;'Complete' wird sofort zurueckgegeben 1067 ;Das Laufwerk schreibt bei Bedarf selbststaendig 1068 ;die Sectoren 1,2,3,360 und 1024 (mit COM44, Bit 4 einzustellen) 1069 1070 E77E 20 50 E5 COM20 JSR STELL2 1071 E781 20 88 E4 JSR TSTWRP ;Klappe + Write-Protect testen 1072 E784 D0 02 BNE C20E1 1073 E786 64 11 STZ COMST 1074 E788 20 55 E5 C20E1 JSR QUITT ;Quittung vor dem Formatieren zuruecksenden 1075 E78B A5 11 LDA COMST 1076 E78D D0 0C BNE RTN4 1077 E78F 24 0A BIT FORKEN2 1078 E791 70 09 BVS GC22 1079 E793 20 E7 EC JSR COM21 ;Format SD oder DD 1080 E796 80 07 BRA TFORER 1081 E798 4C B2 EF C20ERR JMP BELL1 1082 E79B 60 RTN4 RTS 1083 E79C 20 E3 EC GC22 JSR COM22 ;Format MD 1084 E79F A5 11 TFORER LDA COMST 1085 E7A1 D0 F5 BNE C20ERR 1086 E7A3 A5 61 LDA DSPCTR 1087 E7A5 29 10 AND #$10 ;Display/Drive Control - Bit 4 gesetzt ? 1088 E7A7 D0 76 BNE WRVTX 1089 E7A9 A2 00 LDX #0 ;ja, Sectoren nicht schreiben 1090 E7AB BD 6B E8 C20ML LDA BOOTID,X ;Daten fuer Sector 1 in den Extended-Buffer kopieren 1091 E7AE 9D 00 9E STA EXBUF,X 1092 E7B1 9E 80 9E STZ EXBUF+$80,X ;fuer DD 2.Sectorhaelfte loeschen 1093 E7B4 E8 INX 1094 E7B5 10 F4 BPL C20ML 1095 E7B7 20 DB E9 JSR SEXBUF ;Extended Buffer setzen 1096 E7BA A9 01 LDA #1 1097 E7BC 20 6B EC JSR WRSECN ;Sector 1 schreiben 1098 E7BF A2 00 LDX #0 1099 E7C1 BD EB E8 C20M2L LDA BOOTID+$80,X ;Daten fuer Sector 2 in den Extended-Buffer kopieren 1100 E7C4 9D 00 9E STA EXBUF,X 1101 E7C7 E8 INX 1102 E7C8 10 F7 BPL C20M2L 1103 E7CA A9 02 LDA #2 1104 E7CC 20 6B EC JSR WRSECN ;Sector 2 schreiben 1105 E7CF A2 00 LDX #0 1106 E7D1 BD 6B E9 C20M3L LDA BOOTID+$0100,X ;Daten fuer Sector 3 in den Extended-Buffer kopieren 1107 E7D4 9D 00 9E STA EXBUF,X 1108 E7D7 E8 INX 1109 E7D8 E0 F0 CPX # <(BIDEND-BOOTID-$80) ;Bufferende loeschen 1110 E7DA D0 F5 BNE C20M3L 1111 E7DC 9E 00 9E C20DL STZ EXBUF,X 1112 E7DF E8 INX 1113 E7E0 D0 FA BNE C20DL 1114 E7E2 A9 03 LDA #3 1115 E7E4 20 6B EC JSR WRSECN ;Sector 3 schreiben 1116 E7E7 A2 0B LDX #11 1117 E7E9 BD 41 E8 C20SVT LDA VTTBL1,X 1118 E7EC BC 4D E8 LDY VTTBL2,X 1119 E7EF 92 19 C20VTL STA (IND) ;VTOC erzeugen 1120 E7F1 E6 19 INC IND 1121 E7F3 88 DEY 1122 E7F4 D0 F9 BNE C20VTL 1123 E7F6 CA DEX 1124 E7F7 10 F0 BPL C20SVT 1125 E7F9 A9 68 LDA #$68 1126 E7FB 85 82 STA $82 1127 E7FD A9 01 LDA #1 1128 E7FF 85 83 STA $83 1129 E801 20 E4 E9 JSR CALCTS ;Track errechnen 1130 E804 20 2F E3 JSR TRADJA ;Kopf positionieren + Track # anzeigen 1131 E807 24 0A BIT FORKEN2 1132 E809 50 0A BVC WRVTOC 1133 E80B A9 F2 LDA #$F2 1134 E80D 8D 01 9E STA EXBUF+1 1135 E810 A9 03 LDA #3 1136 E812 8D 02 9E STA EXBUF+2 1137 E815 20 DB E9 WRVTOC JSR SEXBUF 1138 E818 20 69 EC JSR WRSECT ;Sector 360 (VTOC) schreiben 1139 E81B 24 0A BIT FORKEN2 ;Medium Density ? 1140 E81D 70 01 BVS C20MD ;ja. 1141 E81F 60 WRVTX RTS 1142 E820 A9 27 C20MD LDA #39 1143 E822 85 0D STA TRACK 1144 E824 20 2F E3 JSR TRADJA ;Track 39 positionieren 1145 E827 A2 08 LDX #8 1146 E829 BC 62 E8 MDVTL LDY MDVT2,X 1147 E82C BD 59 E8 LDA MDVT1,X 1148 E82F 92 19 MDVTL2 STA (IND) ;VTOC 2 (fuer Dos 2.5 Format) erzeugen 1149 E831 E6 19 INC IND 1150 E833 88 DEY 1151 E834 D0 F9 BNE MDVTL2 1152 E836 CA DEX 1153 E837 10 F0 BPL MDVTL 1154 E839 20 DB E9 JSR SEXBUF 1155 E83C A9 0A LDA #10 1156 E83E 4C 6B EC JMP WRSECN ;Sector 1024 schreiben (nur bei MD) 1157 1158 ;Daten fuer VTOC - Single Density 1159 1160 E841 00 FF 7F 00 FF 0F + VTTBL1 .BYTE 0,$FF,$7F,0,$FF,15,0,2,$C3,2,$C3,2 1161 1162 1163 1164 E84D 9C 2B 01 01 2C 01 + VTTBL2 .BYTE $9C,43,1,1,44,1,5,1,1,1,1,1 1165 1166 1167 1168 ;Daten fuer VTOC - Medium Density 1169 1170 E859 00 01 2F FF 7F FF + MDVT1 .BYTE 0,1,$2F,$FF,$7F,$FF,$7F,0,$FF 1171 1172 1173 1174 E862 04 01 01 25 01 2B + MDVT2 .BYTE 4,1,1,37,1,43,1,1,39 1175 1176 1177 1178 ;Es folgt das Bootprogramm fuer die Sectoren 1-3 1179 1180 = 00D6 COLOR = $D6 1181 = 00E1 MASK = $E1 1182 1183 E86B 00 03 00 07 77 E4 BOOTID .BYTE 0,3,0,7,$77,$E4 1184 1185 1186 E871 A9 D6 LDA # <(IDTEXT-BOOTID+$0700) 1187 E873 85 00 STA $00 1188 E875 A9 07 LDA # >(IDTEXT-BOOTID+$0700) 1189 E877 85 01 STA $01 1190 E879 A9 50 LDA #$50 ;Screen-Buffer $5000 1191 E87B 85 D5 STA $D5 1192 E87D A2 00 LDX #0 1193 E87F 86 D4 STX $D4 1194 E881 A0 00 LDY #0 1195 E883 A1 00 L2 LDA ($00,X) ;Text in Screen-Buffer kopieren 1196 E885 30 0B BMI OV ;naechste Zeile 1197 E887 91 D4 STA ($D4),Y 1198 E889 C8 LLP INY 1199 E88A E6 00 INC $00 1200 E88C D0 F5 BNE L2 1201 E88E E6 01 INC $01 1202 E890 D0 F1 BNE L2 1203 1204 E892 C9 FF OV CMP #$FF ;Text-Ende ? 1205 E894 F0 0F BEQ PICOK 1206 E896 29 7F AND #$7F ;X-Position naechste Zeile uebernehmen 1207 E898 A8 TAY 1208 E899 A5 D4 LDA $D4 1209 E89B 69 28 ADC #40 ;Screen-Buffer fuer 1 Zeile heraufzaehlen 1210 E89D 85 D4 STA $D4 1211 E89F 90 E8 BCC LLP 1212 E8A1 E6 D5 INC $D5 1213 E8A3 D0 E4 BNE LLP 1214 1215 E8A5 A9 54 PICOK LDA # <(DLIST-BOOTID+$0700) ;Display-List fuer Screen-Buffer setzen 1216 E8A7 8D 30 02 STA $0230 1217 E8AA A9 08 LDA # >(DLIST-BOOTID+$0700) 1218 E8AC 8D 31 02 STA $0231 1219 E8AF A9 00 LDA #0 1220 E8B1 8D C8 02 STA $02C8 1221 E8B4 8D C6 02 STA $02C6 1222 E8B7 8D 0E D4 STA $D40E ;Antic-Zugriff ausschalten 1223 E8BA 85 D6 STA COLOR 1224 E8BC 85 E1 STA MASK 1225 E8BE A9 20 LDA #$20 1226 E8C0 8D F4 02 STA $02F4 ;Zeichensatz-Basisadresse auf $2000 1227 E8C3 A9 B7 LDA # <(DLI-BOOTID+$0700) 1228 E8C5 8D 00 02 STA $0200 1229 E8C8 A9 07 LDA # >(DLI-BOOTID+$0700) 1230 E8CA 8D 01 02 STA $0201 1231 E8CD A9 C0 DS LDA #$C0 1232 E8CF 8D 0E D4 STA $D40E ;Antic-Zugriff und DLI zulassen 1233 E8D2 AC 0A D2 LP LDY $D20A 1234 E8D5 B9 00 E0 LDA $E000,Y ;Zeichensatz per Bit-Mapping kopieren 1235 E8D8 20 8E 07 JSR CODE-BOOTID+$0700 1236 E8DB 99 00 20 STA $2000,Y 1237 E8DE AC 0A D2 LDY $D20A 1238 E8E1 B9 00 E1 LDA $E100,Y 1239 E8E4 20 8E 07 JSR CODE-BOOTID+$0700 1240 E8E7 99 00 21 STA $2100,Y 1241 E8EA AC 0A D2 LDY $D20A 1242 E8ED B9 00 E3 LDA $E300,Y 1243 E8F0 20 8E 07 JSR CODE-BOOTID+$0700 1244 E8F3 99 00 23 STA $2300,Y 1245 E8F6 4C 67 07 JMP LP-BOOTID+$0700 1246 E8F9 48 CODE PHA 1247 E8FA E6 D6 INC COLOR 1248 E8FC A5 D6 LDA COLOR 1249 E8FE 2C 63 07 BIT DS-BOOTID+$0701 1250 E901 10 0C BPL A1 1251 E903 50 0A BVC A1 1252 E905 A9 00 LDA #0 1253 E907 85 D6 STA COLOR 1254 E909 E6 E1 INC MASK ;Bit-Maske + 1 1255 E90B D0 02 BNE A1 1256 E90D C6 E1 DEC MASK 1257 E90F A5 E1 A1 LDA MASK 1258 E911 C9 FF CMP #$FF ;alle Bits gesetzt 1259 E913 D0 02 BNE DO 1260 E915 68 PLA 1261 E916 60 RTS 1262 E917 AD 0A D2 DO LDA $D20A 1263 E91A 25 E1 AND MASK 1264 E91C 85 E0 STA $E0 1265 E91E 68 PLA 1266 E91F 25 E0 AND $E0 ;Bits vom Zeichensatz ausblenden 1267 E921 60 RTS 1268 E922 48 DLI PHA 1269 E923 98 TYA 1270 E924 48 PHA 1271 E925 A0 0F LDY #15 1272 E927 98 DLIL TYA 1273 E928 09 20 ORA #$20 1274 E92A 8D 0A D4 STA $D40A 1275 E92D 8D 16 D0 STA $D016 ;setzen der Farbhelligkeit 1276 E930 49 AF EOR #$AF 1277 E932 8D 17 D0 STA $D017 ;Setzen der Helligkeit fuer Schrift 1278 E935 88 DEY 1279 E936 10 EF BPL DLIL 1280 E938 A9 0C LDA #$0C 1281 E93A 8D 17 D0 STA $D017 1282 E93D 68 PLA 1283 E93E A8 TAY 1284 E93F 68 PLA 1285 E940 40 RTI 1286 1287 ;Texte der Bootsectoren 1288 1289 E941 24 69 73 6B 00 66 + IDTEXT .BYTE "Disk formatiert mit:" 1290 1291 1292 1293 1294 E955 81 .BYTE $81 1295 E956 33 30 25 25 24 39 + .BYTE "SPEEDY " 1296 1297 E95D 51 50 55 50 00 .BYTE 81,80,85,80,0 1298 1299 E962 36 .BYTE "V" 1300 E963 11 .BYTE [VERSION/16]^16 1301 E964 0E .BYTE "." 1302 E965 10 .BYTE VERSION&15^16 1303 E966 83 .BYTE $83 1304 E967 08 63 09 00 22 69 + .BYTE "(c) Bibosoft -- COMPY SHOP 1986" 1305 1306 1307 1308 1309 1310 1311 1312 E986 80 .BYTE $80 1313 E987 37 65 69 74 65 72 + .BYTE "Weitere informationen bei:" 1314 1315 1316 1317 1318 1319 1320 E9A1 90 .BYTE $90 1321 E9A2 23 2F 2D 30 39 00 + .BYTE "COMPY SHOP" 1322 1323 1324 E9AC 90 .BYTE $90 1325 E9AD 34 65 6C 0E 1A 00 + .BYTE "Tel.: 0208/497169" 1326 1327 1328 1329 1330 E9BE FF .BYTE $FF 1331 1332 ;Display - List 1333 1334 E9BF 70 70 70 70 70 70 + DLIST .BYTE $70,$70,$70,$70,$70,$70,$70,$42,0,$50 1335 1336 1337 E9C9 70 70 F0 07 06 70 + .BYTE $70,$70,$F0,7,6,$70,$70,2,$70,$70,2,$70,$70,2,2,$41 1338 1339 1340 1341 E9D9 54 08 .WORD DLIST-BOOTID+$0700 1342 1343 1344 E9DB BIDEND 1345 1346 1347 E9DB A9 00 SEXBUF LDA # EXBUF 1350 E9E1 85 1A STA IND+1 1351 E9E3 60 RTS 1352 1353 E9E4 A5 82 CALCTS LDA $82 ;Routine zum errechnen der Track- und Sectornummer 1354 E9E6 85 19 STA IND 1355 E9E8 A5 83 LDA $83 1356 E9EA 85 1A STA IND+1 1357 E9EC 30 04 BMI CTSD ;Sector # >$7FFF -> Buffer Adresse ROM/RAM 1358 E9EE 05 82 ORA $82 ;Sector 0 ? 1359 E9F0 D0 0B BNE CALC2 ;nein 1360 E9F2 A5 08 CTSD LDA DUMKEN 1361 E9F4 29 38 AND #$38 1362 E9F6 C9 01 CMP #1 ;Bei 'Dumm' Carry setzen 1363 E9F8 A5 82 LDA $82 1364 E9FA 05 83 ORA $83 1365 E9FC 60 RTS 1366 E9FD A0 FF CALC2 LDY #$FF 1367 E9FF C8 CALCL INY 1368 EA00 A5 19 LDA IND 1369 EA02 85 0E STA SECTOR 1370 EA04 38 SEC 1371 EA05 E5 1F SBC SECANZ 1372 EA07 85 19 STA IND 1373 EA09 B0 04 BCS ADDTRA 1374 EA0B C6 1A DEC IND+1 1375 EA0D 30 04 BMI CALCT 1376 EA0F 05 1A ADDTRA ORA IND+1 1377 EA11 D0 EC BNE CALCL 1378 EA13 C0 28 CALCT CPY #40 ;'Carry' - Flag fuer Sector # - Error setzen 1379 EA15 84 0D STY TRACK 1380 EA17 A5 0E LDA SECTOR 1381 EA19 60 CALCX RTS 1382 1383 EA1A A5 0E SETBUF LDA SECTOR ;* Diese Routine errechnet den RAM-Buffer * 1384 EA1C 64 19 SETBUF2 STZ IND ;* aus der Sectornummer * 1385 EA1E 3A DEA 1386 EA1F 18 CLC 1387 EA20 24 14 BIT SECLEN 1388 EA22 10 03 BPL ADDHIB 1389 EA24 4A LSR 1390 EA25 66 19 ROR IND 1391 EA27 69 8C ADDHIB ADC # >DATBUF 1392 EA29 85 1A STA IND+1 1393 EA2B 60 SETBX RTS 1394 1395 EA2C A4 14 SETRWL LDY SECLEN ;* Routine zum richtigen setzen der Read/Write - Laenge * 1396 EA2E A5 83 LDA $83 1397 EA30 D0 08 BNE SRWL 1398 EA32 A5 82 LDA $82 1399 EA34 C9 04 CMP #4 ;Sector # < 4 ? 1400 EA36 B0 02 BCS SRWL 1401 EA38 A0 80 LDY #$80 ;128 Bytes 1402 EA3A 84 13 SRWL STY RWLEN 1403 EA3C A9 01 LDA #1 1404 EA3E 85 62 STA BLOCKS ;Anzahl der Datenblocks = 1 1405 EA40 60 RTS 1406 1407 EA41 A5 62 ADDBUF LDA BLOCKS ;* Buffer erhoehen falls meherere Daten-Buffer uebertragen * 1408 EA43 3A DEA ;* werden sollen * 1409 EA44 F0 0F BEQ ADDB4 1410 EA46 A5 13 LDA RWLEN 1411 EA48 F0 07 BEQ ADDB2 1412 EA4A 18 CLC 1413 EA4B 65 19 ADC IND 1414 EA4D 85 19 STA IND 1415 EA4F 90 02 BCC ADDB3 1416 EA51 E6 1A ADDB2 INC IND+1 1417 EA53 C6 62 ADDB3 DEC BLOCKS 1418 EA55 60 ADDB4 RTS 1419 1420 EA56 A5 83 COM52 LDA $83 ;* READ-SECTOR Routine * 1421 EA58 30 6D BMI C52OK ;verzweigen bei Read RAM oder ROM 1422 EA5A 05 82 ORA $82 1423 EA5C F0 69 BEQ C52OK ;verzweigen bei Read Zero-Page 1424 1425 EA5E 20 4C E5 JSR STELL ;Retry's und ERROR-Status setzen 1426 EA61 20 7B E3 JSR CONRES 1427 EA64 30 63 BMI C52X 1428 EA66 A5 08 LDA DUMKEN ;Wenn 'Dumm'-geschaltet, den Sector normal lesen 1429 EA68 29 B9 AND #$B9 1430 EA6A D0 44 BNE C52TRA 1431 1432 EA6C A5 0D LDA TRACK ;richtiger Track schon im RAM ? 1433 EA6E C5 0C CMP LTRACK 1434 EA70 F0 06 BEQ TRAOK 1435 EA72 20 64 EB C52TRR JSR TSTWR ;muss ein neuer Track komplett eingelesen werden, RAM vorher 1436 EA75 20 6F E2 JSR RDTRA ;auf noch zu schreibende Sectoren pruefen 1437 EA78 24 08 TRAOK BIT DUMKEN 1438 EA7A 70 31 BVS C52DUM 1439 EA7C A6 0E LDX SECTOR 1440 EA7E B5 40 LDA STALST,X ;Status des zu lesenden Sectors OK ? 1441 EA80 C9 40 CMP #$40 1442 EA82 B0 EE BCS C52TRR ;Sector befindet sich noch nicht im RAM 1443 EA84 29 1F AND #$1F 1444 EA86 D0 25 BNE C52DUM 1445 EA88 20 1A EA JSR SETBUF ;Buffer fuer entsprechenden Sector setzen 1446 EA8B B5 40 LDA STALST,X 1447 EA8D F0 38 BEQ C52OK 1448 EA8F 20 58 E5 JSR QUITT2 ;Quittung und Daten senden 1449 EA92 4C 21 E5 JMP SDBYTS 1450 1451 EA95 C6 12 C52RTY DEC RETRY ;Retry bei Read-Sector 1452 EA97 30 30 BMI C52X 1453 EA99 29 2F AND #$2F 1454 EA9B D0 05 BNE FLIP 1455 EA9D 20 D1 E2 JSR TRACK0 ;bei defektem Datenfeld Track 0 1456 EAA0 80 0E BRA C52TRA 1457 EAA2 A0 FF FLIP LDY #$FF ;1 Track Rueckwaerts 1458 EAA4 20 0F E3 JSR TRVR 1459 EAA7 C8 INY ;1 Track vorwaerts 1460 EAA8 20 0F E3 JSR TRVR 1461 EAAB 80 03 BRA C52TRA 1462 1463 EAAD 20 1A EA C52DUM JSR SETBUF 1464 EAB0 20 32 E3 C52TRA JSR TRADJ ;* Normale Read-Sector Routine * 1465 EAB3 D0 14 BNE C52X 1466 EAB5 A6 0E LDX SECTOR 1467 EAB7 20 CF EA JSR RDSECT 1468 EABA A8 TAY 1469 EABB A5 08 LDA DUMKEN ;wenn nicht 'Dumm' geschaltet 1470 EABD 29 B9 AND #$B9 ;Status in Status liste uebernehmen 1471 EABF D0 03 BNE C52NSS 1472 EAC1 98 TYA 1473 EAC2 95 40 STA STALST,X 1474 EAC4 98 C52NSS TYA 1475 EAC5 D0 CE BNE C52RTY 1476 1477 EAC7 64 11 C52OK STZ COMST 1478 EAC9 20 55 E5 C52X JSR QUITT ;Quittung und Daten senden 1479 EACC 4C 21 E5 JMP SDBYTS 1480 1481 EACF A5 0E RDSECT LDA SECTOR ;* Einzelnen Sector in vor bezeichneten RAM einlesen * 1482 EAD1 8D 02 04 STA $0402 1483 EAD4 A9 88 RDSEC1 LDA #$88 ;Read Sector fuer Controller 1484 EAD6 8D 00 04 STA $0400 1485 EAD9 A0 00 LDY #0 1486 EADB A9 E6 RDSST LDA #$E6 1487 EADD 8D 9F 02 STA $029F ;Timer setzen 1488 EAE0 2C 80 02 RDSL BIT $0280 1489 EAE3 50 29 BVC RDSTO ;Time out 1490 EAE5 10 F9 BPL RDSL 1491 EAE7 AD 03 04 LDA $0403 ;1 Byte vom Controller uebernehmen 1492 EAEA 49 FF EOR #$FF 1493 EAEC 91 19 STA (IND),Y ;und in den Sectorbuffer schreiben 1494 EAEE AD 96 02 LDA $0296 1495 EAF1 C8 INY 1496 EAF2 2C 80 02 RDSL2 BIT $0280 1497 EAF5 50 17 BVC RDSTO 1498 EAF7 10 F9 BPL RDSL2 1499 EAF9 AD 03 04 LDA $0403 1500 EAFC 49 FF EOR #$FF 1501 EAFE 91 19 STA (IND),Y 1502 EB00 C8 INY 1503 EB01 C4 14 CPY SECLEN 1504 EB03 D0 ED BNE RDSL2 1505 EB05 20 85 E3 JSR WREADY ;Warten auf Controller 'Ready' 1506 EB08 AD 00 04 RDSRS LDA $0400 1507 EB0B 29 3E AND #$3E ;Status pruefen 1508 EB0D 60 RTS 1509 EB0E AD 00 04 RDSTO LDA $0400 1510 EB11 4A LSR ;'In Use' Flag noch gesetzt ? 1511 EB12 B0 C7 BCS RDSST 1512 EB14 AC 96 02 LDY $0296 1513 EB17 4A LSR ;'Lost Data' Flag gesetzt ? 1514 EB18 4A LSR 1515 EB19 B0 B9 BCS RDSEC1 1516 EB1B 80 EB BRA RDSRS 1517 EB1D 20 32 E3 RDHDSP JSR TRADJ ;* Diese Routine fuehrt 3 Header-Read Operationen aus * 1518 EB20 D0 0D BNE RTN3 ;* und gibt bei erfolgreichem Leseversuch die Sector # * 1519 EB22 A0 03 RDHDS1 LDY #3 ;* im Accu zurueck * 1520 EB24 20 30 EB RDHSL JSR RDHDV 1521 EB27 A5 7C LDA $7C 1522 EB29 90 04 BCC RTN3 ;Leseversuch erfolgreich: 'Carry' = 0 1523 EB2B 88 DEY 1524 EB2C D0 F6 BNE RDHSL 1525 EB2E 38 SEC 1526 EB2F 60 RTN3 RTS 1527 1528 EB30 A9 20 RDHDV LDA #$20 ;Zeit fuer den Controller setzen einen Header zu finden 1529 EB32 8D 9F 02 STA $029F 1530 EB35 20 42 EB RDHDVL JSR RDHD1 1531 EB38 B0 02 BCS RDHVX ;wird kein Header gefunden, so ist das 'Carry'-Flag gesetzt 1532 EB3A D0 F9 BNE RDHDVL 1533 EB3C 60 RDHVX RTS 1534 1535 EB3D A9 D8 RDHEAD LDA #$D8 ;* Hier liegt die gleiche Funktion wie bei RDHDV vor, nur wird * 1536 EB3F 8D 9F 02 STA $029F ;* dem Controller etwas ueber eine komplette Umdreheung der * 1537 EB42 A2 7A RDHD1 LDX #$7A ;* Diskette Zeit gegeben. * 1538 EB44 A9 C8 LDA #$C8 1539 EB46 8D 00 04 STA $0400 ;Der Header besteht aus 6 Bytes, die ab Adresse $7A abgelegt 1540 EB49 2C 80 02 RDHDL BIT $0280 ;werden: 1541 EB4C 50 11 BVC INFTO 1542 EB4E 10 F9 BPL RDHDL ;1.Byte ($7A) Track Nr. 1543 EB50 AD 03 04 LDA $0403 ;2.Byte ($7B) Side Nr. 1544 EB53 95 00 STA $00,X ;3.Byte ($7C) Sector Nr. 1545 EB55 E8 INX ;4.Byte ($7D) Sector laenge 1546 EB56 10 F1 BPL RDHDL ;5.+6. Byte ($7E,$7F) 2 CRC Bytes 1547 EB58 20 85 E3 JSR WREADY 1548 EB5B 29 0C AND #$0C 1549 EB5D 18 CLC 1550 EB5E 60 RTS 1551 EB5F 20 7B E3 INFTO JSR CONRES 1552 EB62 38 SEC 1553 EB63 60 RTS 1554 1555 1556 ;Die Sectoren, die als zu schreibend in der Statusliste gekennzeichnet sind 1557 ;auf die Diskette schreiben 1558 1559 EB64 A5 06 TSTWR LDA WRKEN ;Anzahl der zu schreibenden Sectoren 1560 EB66 F0 6A BEQ TWREX 1561 EB68 20 41 E1 JSR MOTON ;Motor zwingend einschalten 1562 EB6B A5 0D LDA TRACK ;aktuellen Track merken 1563 EB6D 48 PHA 1564 EB6E A5 0B LDA LWRTRA 1565 EB70 85 0D STA TRACK 1566 EB72 20 F6 EF JSR TRAANZ ;Track Nr. anzeigen. 1567 EB75 20 3C E3 JSR TRADJ0 ;Kopf positionieren 1568 EB78 20 22 EB JSR RDHDS1 ;1. Header suchen 1569 EB7B FA PLX 1570 EB7C 86 0D STX TRACK ;Track # zurueckholen 1571 EB7E 64 01 STZ MERK2 1572 EB80 B0 20 BCS TWRERR 1573 EB82 A2 00 LDX #0 1574 EB84 D5 20 TW1L CMP SECLST,X ;Sector in Sectorliste suchen 1575 EB86 F0 3B BEQ NOWRS 1576 EB88 E8 INX 1577 EB89 E4 1F CPX SECANZ 1578 EB8B 90 F7 BCC TW1L 1579 EB8D 20 B2 EF TWERR2 JSR BELL1 ;Sector nicht in Sectorliste gefunden, 1 Bell ausgeben 1580 EB90 80 31 BRA NOWRS 1581 1582 EB92 B4 20 TSTWL LDY SECLST,X 1583 EB94 B9 40 00 LDA STALST,Y ;ein zu schreibender Sector ? 1584 EB97 10 2A BPL NOWRS ;nein 1585 EB99 20 88 E4 JSR TSTWRP ;Write Protect + Klappe testen 1586 EB9C F0 0B BEQ TSTW1 1587 EB9E A5 01 LDA MERK2 1588 EBA0 D0 18 BNE TSTW2 1589 EBA2 20 D3 EB TWRERR JSR WRERR ;5 Sekunden auf dem Display herunterzaehlen und Bell ausgeben 1590 EBA5 85 01 STA MERK2 1591 EBA7 80 1A BRA NOWRS 1592 EBA9 98 TSTW1 TYA 1593 EBAA 8D 02 04 STA $0402 ;Sector # ins Sectorregister des Contollers schreiben 1594 EBAD 20 1C EA JSR SETBUF2 1595 EBB0 20 6E EC JSR WRSEC1 ;Sector schreiben 1596 EBB3 F0 05 BEQ TSTW2 ;Status OK 1597 EBB5 20 88 E4 JSR TSTWRP ;Write Protect + Klappe testen 1598 EBB8 D0 09 BNE NOWRS 1599 EBBA B4 20 TSTW2 LDY SECLST,X ;'Sector written'-Status setzen 1600 EBBC A9 40 LDA #$40 1601 EBBE 99 40 00 STA STALST,Y 1602 EBC1 C6 06 DEC WRKEN 1603 1604 EBC3 E8 NOWRS INX ;naechste Position in Sectorliste setzen 1605 EBC4 E4 1F CPX SECANZ 1606 EBC6 90 02 BCC TSTWE 1607 EBC8 A2 00 LDX #0 1608 EBCA A5 06 TSTWE LDA WRKEN 1609 EBCC D0 C4 BNE TSTWL 1610 EBCE A9 FF LDA #$FF 1611 EBD0 85 0B STA LWRTRA ;'Track written'-Status setzen 1612 EBD2 60 TWREX RTS 1613 1614 ;Diese Routine wird von der Write-Track Routine aufgerufen 1615 ;wenn die Diskette vor einer abgeschlossenen Write-Sequenz 1616 ;aus dem Laufwerk genommen oder Write-Protected wird. 1617 ;5 Sekunden werden auf dem Display herabgezaehlt und 1618 ;nach jeder Sekunde wird ein Warnton abgegeben 1619 1620 EBD3 DA WRERR PHX 1621 EBD4 5A PHY 1622 EBD5 A0 05 LDY #5 ;5 Sekunden setzen 1623 EBD7 98 WRERRL TYA 1624 EBD8 20 D1 EF JSR ANZEIGE ;Sekunden zur Anzeige bringen 1625 EBDB 20 B2 EF JSR BELL1 ;1 Bell ausgeben 1626 EBDE A2 03 LDX #3 ;grosse Verzoegerungsschleife (ca. 1 Sekunde) setzen 1627 EBE0 A9 FF WEWL1 LDA #$FF 1628 EBE2 8D 9F 02 STA $029F 1629 EBE5 20 88 E4 WEWL2 JSR TSTWRP ;noch Write-Protected oder Klappe auf ? 1630 EBE8 F0 0B BEQ WRERX 1631 EBEA 2C 80 02 BIT $0280 1632 EBED 70 F6 BVS WEWL2 1633 EBEF CA DEX 1634 EBF0 D0 EE BNE WEWL1 1635 EBF2 88 DEY 1636 EBF3 10 E2 BPL WRERRL 1637 EBF5 20 F6 EF WRERX JSR TRAANZ ;aktuelle Track # wieder anzeigen 1638 EBF8 AE 96 02 LDX $0296 ;Timer IRQ zuruecksetzen 1639 EBFB 7A PLY ;Y-Register zurueckholen 1640 EBFC FA PLX ;X-Register zurueckholen 1641 EBFD 4C 88 E4 JMP TSTWRP 1642 1643 EC00 20 4C E5 COM50 JSR STELL ;* Write Sector Routine * 1644 EC03 A5 83 LDA $83 1645 EC05 30 5D BMI C50OK2 ;Sector # > 7FFF -> RAM - oder ROM - Adresse 1646 EC07 A5 81 LDA $81 1647 EC09 C9 57 CMP #$57 ;Write mit Verify ? 1648 EC0B F0 22 BEQ C50DUM 1649 EC0D 20 88 E4 JSR TSTWRP ;Write Protect + Klappe testen 1650 EC10 D0 54 BNE C50X 1651 EC12 20 3C E1 JSR TSTMON ;Motor einschalten 1652 EC15 A5 08 LDA DUMKEN 1653 EC17 29 FA AND #$FA ;'Dumm' geschaltet ? 1654 EC19 D0 14 BNE C50DUM 1655 1656 EC1B A5 0D LDA TRACK ;einen kompletten Track im RAM ? 1657 EC1D C5 0B CMP LWRTRA 1658 EC1F D0 06 BNE C50B 1659 EC21 A5 06 LDA WRKEN 1660 EC23 C5 1F CMP SECANZ 1661 EC25 D0 3D BNE C50OK2 1662 EC27 20 64 EB C50B JSR TSTWR ;alle zu schreibenden Sectoren schreiben 1663 EC2A 20 8E E4 C50C JSR TSTMEB ;falls vorhanden, Sectordaten aus Extended Buffer 1664 ;in den Sectorbuffer kopieren 1665 EC2D 80 35 BRA C50OK2 1666 1667 ;Normale Write-Sector Routine 1668 1669 EC2F 20 88 E4 C50DUM JSR TSTWRP ;Disk 'Write Protect' oder Klappe auf ? 1670 EC32 D0 32 BNE C50X ;js 1671 EC34 A5 0D LDA TRACK 1672 EC36 C5 0C CMP LTRACK 1673 EC38 D0 04 BNE C50TRA 1674 EC3A A6 0E LDX SECTOR ;zu schreibenden Sector als im RAM stehende Daten Markieren 1675 EC3C 74 40 STZ STALST,X ;braucht bei 'Read Sector' nicht mehr gelesen zu werden 1676 EC3E 20 32 E3 C50TRA JSR TRADJ ;Kopf positionieren 1677 EC41 D0 23 BNE C50X 1678 EC43 20 69 EC JSR WRSECT ;Sector vom angegebenen Buffer schreiben 1679 EC46 F0 09 BEQ C50OK 1680 EC48 C6 12 DEC RETRY 1681 EC4A F0 1A BEQ C50X 1682 EC4C 20 D1 E2 JSR TRACK0 ;Track 0 positionieren 1683 EC4F 80 DE BRA C50DUM ;Retry ausfuehren 1684 1685 EC51 A5 81 C50OK LDA $81 1686 EC53 C9 57 CMP #$57 ;Write mit Verify 1687 EC55 D0 0D BNE C50OK2 1688 EC57 A5 08 LDA DUMKEN 1689 EC59 29 04 AND #4 ;Verify bei COM57 ausfuehren ? 1690 EC5B D0 07 BNE C50OK2 1691 EC5D 20 A4 EC JSR VERSEC ;Verify Sector 1692 EC60 B0 04 BCS C50X 1693 EC62 D0 02 BNE C50X 1694 EC64 64 11 C50OK2 STZ COMST ;OK-Status setzen 1695 EC66 4C 55 E5 C50X JMP QUITT ;Quittung senden 1696 1697 EC69 A5 0E WRSECT LDA SECTOR ;* Einzelnen Sector aus vorbezeichneter RAM-Adresse * 1698 EC6B 8D 02 04 WRSECN STA $0402 ;* auf die Diskette schreiben * 1699 EC6E A0 00 WRSEC1 LDY #0 1700 EC70 A9 A8 LDA #$A8 ;Write Sector Befehl an Controller 1701 EC72 8D 00 04 STA $0400 1702 EC75 A9 E6 WRSST LDA #$E6 1703 EC77 8D 9F 02 STA $029F ;Timer setzen 1704 EC7A B1 19 WRSL LDA (IND),Y ;1 Byte invertiert 1705 EC7C 49 FF EOR #$FF 1706 EC7E 2C 80 02 WRSDR BIT $0280 1707 EC81 50 13 BVC WRSTO ;Time out 1708 EC83 10 F9 BPL WRSDR 1709 EC85 8D 03 04 STA $0403 ;Byte an den Controller uebergeben 1710 EC88 AD 96 02 LDA $0296 1711 EC8B C8 INY 1712 EC8C C4 14 CPY SECLEN ;alle Bytes geschrieben ? 1713 EC8E D0 EA BNE WRSL 1714 EC90 20 85 E3 JSR WREADY ;auf Controller 'Ready' warten 1715 EC93 29 0C AND #$0C 1716 EC95 60 RTS 1717 EC96 AD 00 04 WRSTO LDA $0400 1718 EC99 4A LSR ;'In Use' Bit gesetzt ? 1719 EC9A B0 D9 BCS WRSST 1720 EC9C 4A LSR ;'Data Request' gesetzt ? 1721 EC9D 4A LSR 1722 EC9E B0 CE BCS WRSEC1 1723 ECA0 AD 00 04 LDA $0400 1724 ECA3 60 RTS 1725 1726 ECA4 A5 0E VERSEC LDA SECTOR ;* Sector mit Datenbuffer vergleichen * 1727 ECA6 8D 02 04 STA $0402 1728 ECA9 A9 88 VERSE1 LDA #$88 ;Read Sector an Controller 1729 ECAB 8D 00 04 STA $0400 1730 ECAE A0 00 LDY #0 1731 ECB0 A9 D8 VERSST LDA #$D8 1732 ECB2 8D 9F 02 STA $029F ;Timer setzen 1733 ECB5 B1 19 VERSL LDA (IND),Y 1734 ECB7 49 FF EOR #$FF 1735 ECB9 2C 80 02 VERSL2 BIT $0280 1736 ECBC 50 1A BVC VERSTO ;Time out 1737 ECBE 10 F9 BPL VERSL2 1738 ECC0 CD 03 04 CMP $0403 1739 ECC3 D0 0C BNE VERSER 1740 ECC5 C8 INY 1741 ECC6 C4 14 CPY SECLEN ;alle Daten verglichen ? 1742 ECC8 D0 EB BNE VERSL 1743 ECCA 20 85 E3 JSR WREADY ;auf Controller 'Ready' warten 1744 ECCD A9 00 LDA #0 ;alle Daten verglichen und OK 1745 ECCF 18 CLC ;kein Fehler aufgetreten 1746 ECD0 60 RTS 1747 ECD1 20 7B E3 VERSER JSR CONRES 1748 ECD4 A9 80 LDA #$80 ;Daten ungleich 1749 ECD6 18 CLC ;kein Lesefehler aufgetreten 1750 ECD7 60 RTS 1751 ECD8 AD 00 04 VERSTO LDA $0400 1752 ECDB 4A LSR ;Kommando noch 'In Use' 1753 ECDC B0 D2 BCS VERSST 1754 ECDE 20 7B E3 JSR CONRES 1755 ECE1 38 SEC ;'Carry' = ERROR-Flag 1756 ECE2 60 RTS 1757 1758 ;Formatierungs-Routinen 1759 1760 ECE3 A9 41 COM22 LDA #$41 ;Medium Density (MD)-Kennung 1761 ECE5 D0 14 BNE FSDATB 1762 1763 ECE7 A5 82 COM21 LDA $82 1764 ECE9 C9 11 CMP #$11 ;Sector Nr. 1041 ? 1765 ECEB D0 06 BNE C21TSD 1766 ECED A5 83 LDA $83 1767 ECEF C9 04 CMP #4 1768 ECF1 F0 F0 BEQ COM22 1769 ECF3 A9 82 C21TSD LDA #$82 ;Single Density (SD)-Kennung 1770 ECF5 A6 0A LDX FORKEN2 1771 ECF7 D0 02 BNE FSDATB 1772 1773 ECF9 A9 00 C21DD LDA #0 ;Double Density (DD)-Kennung 1774 1775 ECFB 85 09 FSDATB STA FORKEN 1776 ECFD 20 50 E5 JSR STELL2 1777 ED00 20 68 ED JSR COPSLT ;Neue Sectorliste in die Zeropage kopieren 1778 ED03 A5 08 LDA DUMKEN 1779 ED05 29 3F AND #$3F 1780 ED07 20 19 E2 JSR SETDK 1781 ED0A A5 09 LDA FORKEN 1782 ED0C 29 01 AND #1 1783 ED0E 49 01 EOR #1 1784 ED10 85 01 STA MERK2 ;0/1 = Sectorlaenge-Kennung 1785 ED12 A9 27 LDA #39 ;40 Tracks 1786 ED14 85 0D STA TRACK 1787 ED16 20 EF ED FORM1L JSR FORMTR ;1 Track formatieren 1788 ED19 B0 18 BCS FORM1X 1789 ED1B A5 61 LDA DSPCTR 1790 ED1D 29 20 AND #$20 ;Bit 5 (Display+Drive-Kontrollbyte) 1791 ED1F D0 0C BNE NOVER ;schaltet Verify beim Formatieren aus 1792 ED21 A6 1F LDX SECANZ 1793 ED23 20 8B E2 JSR RDTRA2 ;alle Sectoren lesen 1794 ED26 B0 0B BCS FORM1X 1795 ED28 20 50 E2 JSR RDTRV2 ;falls Lesefehler 1 Retry 1796 ED2B B0 06 BCS FORM1X 1797 ED2D C6 0D NOVER DEC TRACK 1798 ED2F 10 E5 BPL FORM1L 1799 ED31 64 11 STZ COMST ;gesamte Formatierung OK 1800 1801 ED33 A9 FF FORM1X LDA #$FF 1802 ED35 A2 00 LDX #0 1803 ED37 9D 00 9E FORDL STA EXBUF,X ;Datenbuffer mit Sector OK-Bits fuellen 1804 ED3A E8 INX 1805 ED3B E4 13 CPX RWLEN 1806 ED3D D0 F8 BNE FORDL 1807 ED3F 24 11 BIT COMST 1808 ED41 10 12 BPL SFSTAT 1809 ED43 9C 00 9E STZ EXBUF ;bei Formaterror OK-Bits loeschen 1810 ED46 9C 01 9E STZ EXBUF+1 1811 ED49 20 88 E4 JSR TSTWRP ;bei Write Protect nicht 'Dumm' schalten 1812 ED4C D0 07 BNE SFSTAT 1813 ED4E A9 80 LDA #$80 ;bei Fornaterror 'Dumm' schalten 1814 ED50 04 08 TSB DUMKEN 1815 ED52 20 34 E2 JSR DSPD2 1816 ED55 A6 18 SFSTAT LDX COMPOS ;bei Befehl aus erweiterter Kommando-Tabelle 1817 ED57 E0 12 CPX #18 ;keine Daten an den Computer senden 1818 ED59 B0 26 BCS CSLX 1819 ED5B 20 55 E5 JSR QUITT 1820 ED5E 20 DB E9 JSR SEXBUF ;Extended Buffer setzen 1821 ED61 A5 14 LDA SECLEN 1822 ED63 85 13 STA RWLEN 1823 ED65 4C 21 E5 JMP SDBYTS 1824 1825 ED68 20 A9 E1 COPSLT JSR SDRDDP ;Drive Density setzen und Anzeigen 1826 ED6B A5 09 LDA FORKEN 1827 ED6D 29 03 AND #3 1828 ED6F A8 TAY 1829 ED70 BE 82 ED LDX SLTBEG,Y 1830 ED73 A0 00 LDY #0 ;aktuelle Sector-Liste in die Zeropage kopieren 1831 ED75 BD 85 ED CSLTL LDA SDSTBL,X 1832 ED78 99 20 00 STA SECLST,Y 1833 ED7B E8 INX 1834 ED7C C8 INY 1835 ED7D C4 1F CPY SECANZ 1836 ED7F D0 F4 BNE CSLTL 1837 ED81 60 CSLX RTS 1838 ED82 2C 12 00 SLTBEG .BYTE DDSTBL-SDSTBL,MDSTBL-SDSTBL,0 1839 1840 ;Single Density Sectorliste 1841 1842 ED85 01 03 05 07 09 0B + SDSTBL .BYTE 1,3,5,7,9,11,13,15,17,2,4,6,8,10,12,14,16,18 1843 1844 1845 1846 1847 1848 ;Medium Density Sectorliste 1849 1850 ED97 01 03 05 07 09 0B + MDSTBL .BYTE 1,3,5,7,9,11,13,15,17,19,21,23,25,2,4,6,8,10,12,14,16,18,20,22,24,26 1851 1852 1853 1854 1855 1856 1857 1858 ;Double Density Sectorliste 1859 1860 EDB1 06 0C 12 05 0B 11 + DDSTBL .BYTE 6,12,18,5,11,17,4,10,16,3,9,15,2,8,14,1,7,13 1861 1862 1863 1864 1865 1866 EDC3 38 FORERR SEC ;'Carry'=Format ERROR-Flag 1867 EDC4 60 RTS 1868 1869 ;Write Track Kommando starten 1870 1871 EDC5 20 2F E3 FSTART JSR TRADJA ;Kopf positionieren und Track # anzeigen 1872 EDC8 D0 F9 BNE FORERR 1873 EDCA 20 88 E4 JSR TSTWRP ;Write Protect und Klappe pruefen 1874 EDCD D0 F4 BNE FORERR 1875 EDCF A9 05 LDA #5 1876 EDD1 8D 9F 02 STA $029F 1877 EDD4 A9 F8 LDA #$F8 ;Write Track an Controller geben 1878 EDD6 8D 00 04 STA $0400 1879 EDD9 A5 00 LDA MERK1 1880 EDDB A2 02 LDX #2 1881 EDDD 2C 80 02 FORWA1 BIT $0280 1882 EDE0 10 FB BPL FORWA1 1883 EDE2 8D 03 04 STA $0403 1884 EDE5 CA DEX 1885 EDE6 D0 F5 BNE FORWA1 1886 EDE8 A0 D0 LDY #$D0 1887 EDEA 8C 9F 02 STY $029F ;Timer setzen 1888 EDED 18 CLC 1889 EDEE 60 RTS 1890 1891 EDEF 24 09 FORMTR BIT FORKEN 1892 EDF1 10 64 BPL FORMMD ;in 'MFM' (MD/DD) formatieren 1893 1894 EDF3 A9 00 FORMSD LDA #0 ;in 'FM' (Single Density) formatieren 1895 EDF5 85 00 STA MERK1 1896 EDF7 20 C5 ED JSR FSTART ;'Write Track' Kommando starten 1897 EDFA B0 C7 BCS FORERR 1898 EDFC A0 50 LDY #80 1899 EDFE 20 F1 EE JSR WRBYTS 1900 EE01 A9 FC LDA #$FC 1901 EE03 20 E6 EE JSR WRBYTE ;Track AM schreiben 1902 1903 EE06 98 FSDL TYA 1904 EE07 A0 19 LDY #25 1905 EE09 20 F1 EE JSR WRBYTS 1906 1907 EE0C A9 FE LDA #$FE 1908 EE0E 20 E6 EE JSR WRBYTE ;ID AM 1909 EE11 A5 0D LDA TRACK 1910 EE13 20 E6 EE JSR WRBYTE ;Track # 1911 EE16 98 TYA 1912 EE17 20 E6 EE JSR WRBYTE ;Side # 1913 EE1A B5 20 LDA SECLST,X 1914 EE1C 20 E6 EE JSR WRBYTE ;Sector # 1915 EE1F 98 TYA 1916 EE20 20 E6 EE JSR WRBYTE ;Sectorlaenge + 0 1917 EE23 A9 F7 LDA #$F7 1918 EE25 20 E6 EE JSR WRBYTE ;2 CRC-Byte schreiben 1919 EE28 E8 INX 1920 1921 EE29 98 TYA 1922 EE2A A0 11 LDY #17 1923 EE2C 20 F1 EE JSR WRBYTS 1924 1925 EE2F A9 FB LDA #$FB 1926 EE31 20 E6 EE JSR WRBYTE ;DATA AM 1927 EE34 A9 FF LDA #$FF 1928 EE36 A0 80 LDY #$80 ;128 Bytes 1929 EE38 20 F1 EE JSR WRBYTS ;Datenfeld schreiben 1930 EE3B A9 F7 LDA #$F7 1931 EE3D 20 E6 EE JSR WRBYTE ;2 CRC-Bytes schreiben 1932 1933 EE40 E4 1F CPX SECANZ 1934 EE42 D0 C2 BNE FSDL 1935 1936 EE44 A9 01 FSDEX LDA #1 1937 EE46 2D 00 04 FSDEL AND $0400 ;Warten auf 'In Use'-Flag=0 1938 EE49 F0 0A BEQ FORM2X 1939 EE4B 2C 80 02 BIT $0280 1940 EE4E 10 F6 BPL FSDEL 1941 EE50 8C 03 04 STY $0403 1942 EE53 80 F1 BRA FSDEL 1943 EE55 18 FORM2X CLC ;Format Track OK 1944 EE56 60 RTN5 RTS 1945 1946 EE57 A9 4E FORMMD LDA #$4E ;In 'MFM' (MD/DD) formatieren 1947 EE59 85 00 STA MERK1 1948 EE5B 20 C5 ED JSR FSTART ;'Write Track' Kommando starten 1949 EE5E B0 F6 BCS RTN5 1950 EE60 A0 80 LDY #$80 1951 EE62 20 F1 EE JSR WRBYTS 1952 EE65 98 TYA 1953 EE66 A0 0C LDY #12 1954 EE68 20 F1 EE JSR WRBYTS 1955 EE6B A9 F6 LDA #$F6 1956 EE6D A0 03 LDY #3 1957 EE6F 20 F1 EE JSR WRBYTS 1958 EE72 A9 FC LDA #$FC 1959 EE74 20 E6 EE JSR WRBYTE ;Track AM schreiben 1960 EE77 A9 4E LDA #$4E 1961 EE79 A0 32 LDY #$32 1962 EE7B 20 F1 EE JSR WRBYTS 1963 1964 EE7E 98 FMDL TYA 1965 EE7F A0 0C LDY #12 1966 EE81 20 F1 EE JSR WRBYTS 1967 EE84 A9 F5 LDA #$F5 1968 EE86 A0 03 LDY #3 1969 EE88 20 F1 EE JSR WRBYTS 1970 1971 EE8B A9 FE LDA #$FE 1972 EE8D 20 E6 EE JSR WRBYTE ;ID AM 1973 EE90 A5 0D LDA TRACK 1974 EE92 20 E6 EE JSR WRBYTE ;Track # 1975 EE95 98 TYA 1976 EE96 20 E6 EE JSR WRBYTE ;Side # 1977 EE99 B5 20 LDA SECLST,X 1978 EE9B 20 E6 EE JSR WRBYTE ;Sector # 1979 EE9E A5 01 LDA MERK2 1980 EEA0 20 E6 EE JSR WRBYTE ;Sectorlaenge (0=$80/1=$100) 1981 EEA3 A9 F7 LDA #$F7 1982 EEA5 20 E6 EE JSR WRBYTE ;2 CRC-Bytes schreiben 1983 EEA8 E8 INX 1984 1985 EEA9 98 TYA 1986 EEAA 20 E6 EE JSR WRBYTE 1987 EEAD A9 4E LDA #$4E 1988 EEAF A0 16 LDY #22 1989 EEB1 20 F1 EE JSR WRBYTS 1990 EEB4 98 TYA 1991 EEB5 A0 0C LDY #12 1992 EEB7 20 F1 EE JSR WRBYTS 1993 EEBA A9 F5 LDA #$F5 1994 EEBC A0 03 LDY #3 1995 EEBE 20 F1 EE JSR WRBYTS 1996 1997 EEC1 A9 FB LDA #$FB 1998 EEC3 20 E6 EE JSR WRBYTE ;DATA AM 1999 EEC6 A9 FF LDA #$FF 2000 EEC8 A4 14 LDY SECLEN ;128 oder 256 Bytes 2001 EECA 20 F1 EE JSR WRBYTS ;Datenfeld schreiben 2002 EECD A9 F7 LDA #$F7 2003 EECF 20 E6 EE JSR WRBYTE ;2 CRC-Bytes 2004 2005 EED2 E4 1F CPX SECANZ ;letzten Sector formatiert ? 2006 EED4 F0 09 BEQ FMDEX 2007 2008 EED6 A9 4E LDA #$4E 2009 EED8 A0 29 LDY #41 2010 EEDA 20 F1 EE JSR WRBYTS 2011 EEDD 80 9F BRA FMDL 2012 2013 EEDF A0 4E FMDEX LDY #$4E 2014 EEE1 4C 44 EE JMP FSDEX ;warten auf 'In Use' - Flag = 0 2015 2016 EEE4 50 17 WRBTL BVC FORTO 2017 EEE6 2C 80 02 WRBYTE BIT $0280 ;1 Byte an Controller uebergeben 2018 EEE9 10 F9 BPL WRBTL 2019 EEEB 8D 03 04 STA $0403 2020 EEEE 60 RTS 2021 2022 EEEF 50 0C WRBTSL BVC FORTO 2023 EEF1 2C 80 02 WRBYTS BIT $0280 ;Y-Register = Anzahl der an den Controller zu 2024 EEF4 10 F9 BPL WRBTSL ;uebergebenden Bytes 2025 EEF6 8D 03 04 STA $0403 2026 EEF9 88 DEY 2027 EEFA D0 F5 BNE WRBYTS 2028 EEFC 60 RTS 2029 2030 EEFD 68 FORTO PLA ;Format Time-Out 2031 EEFE 68 PLA 2032 EEFF 38 SEC 2033 EF00 60 RTS 2034 2035 EF01 A9 27 CLRDSK LDA #39 ;* Routine zum 'loeschen' einer kompletten Diskette * 2036 EF03 85 0D STA TRACK ;* Es wird ein unlesbares Format erzeugt * 2037 EF05 20 0F EF CLRDKL JSR CLRTRA 2038 EF08 B0 04 BCS CLRDKX 2039 EF0A C6 0D DEC TRACK 2040 EF0C 10 F7 BPL CLRDKL 2041 EF0E 60 CLRDKX RTS 2042 2043 EF0F A9 AA CLRTRA LDA #$AA ;* Einen Track ' loeschen' * 2044 EF11 85 00 STA MERK1 2045 EF13 20 C5 ED JSR FSTART ;'Write Track' - Kommando starten 2046 EF16 B0 F6 BCS CLRDKX 2047 EF18 AD 00 04 CLRLOP LDA $0400 2048 EF1B 4A LSR ;'In Use' - Flag = 0 ? 2049 EF1C 90 F0 BCC CLRDKX 2050 EF1E 2C 80 02 BIT $0280 2051 EF21 10 F5 BPL CLRLOP 2052 EF23 8D 03 04 STA $0403 2053 EF26 80 F0 BRA CLRLOP 2054 2055 EF28 A2 75 COM4E LDX #$75 ;Diese Routine gibt folgende Werte an den Computer zurueck: 2056 EF2A 74 00 C4EDL STZ $00,X ;Tracks/Disk 2057 EF2C E8 INX ;Sectoren/Track 2058 EF2D 10 FB BPL C4EDL ;Side # 2059 EF2F A9 28 LDA #$28 ;FM/MFM-Kennung 2060 EF31 85 74 STA $74 ;Bytes/Sector 2061 EF33 E6 75 INC $75 2062 EF35 A5 1F LDA SECANZ 2063 EF37 85 77 STA $77 2064 EF39 24 09 BIT FORKEN 2065 EF3B 30 04 BMI SETSEL 2066 EF3D A9 04 LDA #4 ;MFM-Kennung 2067 EF3F 85 79 STA $79 2068 EF41 A9 80 SETSEL LDA #$80 ;128 Bytes/Sector 2069 EF43 A6 09 LDX FORKEN 2070 EF45 D0 03 BNE LOLEN 2071 EF47 0A ASL 2072 EF48 26 7A ROL $7A ;Sectoren/Track HI 2073 EF4A 85 7B LOLEN STA $7B ;Sectoren/Track LO 2074 EF4C C6 7C DEC $7C ;=FF 2075 EF4E 20 FB E4 JSR SEND41 2076 EF51 A9 0C LDA #12 2077 EF53 A2 74 LDX #$74 ;12 Bytes ab Adresse $74 an den Computer senden 2078 EF55 A0 00 LDY #0 2079 EF57 4C 1B E5 JMP SDBTS 2080 2081 EF5A A9 0C COM4F LDA #12 ;* Diese Routine ist das Gegenstueck von COM4E * 2082 EF5C A2 74 LDX #$74 ;* Laufwerk konfigurieren * 2083 EF5E A0 00 LDY #0 2084 EF60 20 BC E4 JSR RDBTS 2085 EF63 20 FB E4 JSR SEND41 ;'A' senden 2086 EF66 A9 82 LDA #$82 ;SD-Kennung 2087 EF68 A6 79 LDX $79 2088 EF6A F0 0A BEQ C4FSD 2089 EF6C A9 41 LDA #$41 ;MD-Kennung 2090 EF6E A6 77 LDX $77 2091 EF70 E0 1A CPX #26 2092 EF72 B0 02 BCS C4FSD 2093 EF74 A9 00 LDA #0 ;DD-Kennung 2094 EF76 85 09 C4FSD STA FORKEN 2095 EF78 85 0A STA FORKEN2 2096 EF7A 20 A9 E1 JSR SDRDDP ;Drive Density stellen und anzeigen 2097 EF7D 4C FF E4 JMP SEND43 ;'C' senden 2098 2099 EF80 20 78 E3 COM53 JSR CONRE2 ;* 'Status' - Kommando * 2100 EF83 A5 10 LDA DRSTAT ;Diese Routine gibt folgende Werte an den Computer: 2101 EF85 29 F7 AND #$F7 ;Drive Status + Time-Out-Wert 2102 EF87 2C 00 04 BIT $0400 2103 EF8A 50 02 BVC ST7C 2104 EF8C 09 08 ORA #8 ;Write Protect Flag 2105 EF8E 85 7C ST7C STA $7C 2106 EF90 A5 0F LDA CONST ;Controller - Status invertieren 2107 EF92 49 FF EOR #$FF 2108 EF94 85 7D STA $7D 2109 EF96 A9 E0 LDA #$E0 2110 EF98 85 7E STA $7E 2111 EF9A 64 7F STZ $7F 2112 EF9C AD 00 04 LDA $0400 2113 EF9F 85 0F STA CONST 2114 EFA1 20 FF E4 JSR SEND43 ;'C' senden 2115 EFA4 A9 04 LDA #4 2116 EFA6 A2 7C LDX #$7C ;A Bytes ab Adresse $7C 2117 EFA8 A0 00 LDY #0 2118 EFAA 4C 1B E5 JMP SDBTS ;an den Computer senden 2119 2120 2121 = 4000 DISP1 = $4000 2122 = 4001 DISP10 = $4001 2123 = 4002 DENSITY = $4002 2124 = 4003 BUZZER = $4003 2125 2126 EFAD A5 61 BELL LDA DSPCTR ;* Beil-Routine - akustische Unterstuetzung diverser * 2127 EFAF 4A LSR ;* Laufwerksfunktionen und Meldungen * 2128 EFB0 90 14 BCC BELLX 2129 EFB2 5A BELL1 PHY ;Y-Register merken 2130 EFB3 A0 02 LDY #2 2131 EFB5 A2 00 BELL2 LDX #0 2132 EFB7 A9 23 SO1 LDA #$23 2133 EFB9 3A SO2 DEA 2134 EFBA D0 FD BNE SO2 2135 EFBC 8D 03 40 STA BUZZER ;Summer ansprechen 2136 EFBF CA DEX 2137 EFC0 D0 F5 BNE SO1 2138 EFC2 88 DEY 2139 EFC3 D0 F0 BNE BELL2 2140 EFC5 7A PLY ;Y-Register zurueckholen 2141 EFC6 60 BELLX RTS 2142 2143 EFC7 9C 00 40 CLRDSP STZ DISP1 ;* Display loeschen * 2144 EFCA 9C 01 40 STZ DISP10 2145 EFCD 9C 02 40 STZ DENSITY 2146 EFD0 60 RTS 2147 2148 EFD1 48 ANZEIGE PHA ;* Diese Routine wird zur Hex-Darstellung von Werten * 2149 EFD2 DA PHX ;* in Accu auf den Display verwendet, es werden keine * 2150 EFD3 5A PHY ;* Register ausser des Status-Registers veraendert * 2151 EFD4 20 DF EF JSR HEXOUT 2152 EFD7 7A PLY 2153 EFD8 FA PLX 2154 EFD9 68 PLA 2155 EFDA 60 RTS 2156 2157 EFDB 24 61 ERRDSP BIT DSPCTR 2158 EFDD 10 16 BPL HEXX 2159 EFDF 48 HEXOUT PHA ;Hex-Darstel lung auf dem Display 2160 EFE0 29 0F AND #$0F 2161 EFE2 AA TAX 2162 EFE3 BD 2B F0 LDA SEGTBL,X 2163 EFE6 8D 00 40 STA DISP1 ;rechtes Display 2164 EFE9 68 PLA 2165 EFEA 4A LSR 2166 EFEB 4A LSR 2167 EFEC 4A LSR 2168 EFED 4A LSR 2169 EFEE AA TAX 2170 EFEF BD 2B F0 LDA SEGTBL,X 2171 EFF2 8D 01 40 STA DISP10 ;linkes Display 2172 EFF5 60 HEXX RTS 2173 2174 EFF6 48 TRAANZ PHA ;* Anzeige der Track # auf dem Display * 2175 EFF7 A5 0D LDA TRACK 2176 EFF9 24 61 BIT DSPCTR 2177 EFFB 70 05 BVS TRAHEX 2178 EFFD 20 07 F0 JSR DEZOUT ;Dezimal-Darstellung 2179 F000 68 PLA 2180 F001 60 RTS 2181 F002 20 DF EF TRAHEX JSR HEXOUT ;Hex-Darstellung 2182 F005 68 PLA 2183 F006 60 RTS 2184 2185 F007 A2 00 DEZOUT LDX #0 ;* Wert in Accu in dezimaler Form auf dem Display ausgeben * 2186 F009 38 SEC 2187 F00A A8 DEZ1 TAY 2188 F00B E9 0A SBC #10 ;10'er Stellen abzaehlen 2189 F00D 30 03 BMI DEZ2 2190 F00F E8 INX 2191 F010 80 F8 BRA DEZ1 2192 F012 BD 2B F0 DEZ2 LDA SEGTBL,X 2193 F015 8D 01 40 STA DISP10 ;linkes Display 2194 F018 B9 2B F0 LDA SEGTBL,Y 2195 F01B 8D 00 40 STA DISP1 ;rechtes Display 2196 F01E 60 RTS 2197 2198 F01F A5 09 DENDSP LDA FORKEN ;* Drive-Density zur Anzeige bringen * 2199 F021 29 03 AND #3 2200 F023 AA TAX 2201 F024 BD 3B F0 LDA DENSEG,X ;Segmenttabeile fuer Density-Anzeige 2202 F027 8D 02 40 STA DENSITY 2203 F02A 60 RTS 2204 2205 ;Segment-Code Tabelle 2206 2207 F02B 3F 06 5B 4F 66 6D + SEGTBL .BYTE $3F,6,$5B,$4F,$66,$6D,$7D,7,$7F,$6F,$77,$7C,$39,$5E,$79,$71 2208 2209 2210 2211 2212 ;Density-Code Tabelle 2213 2214 F03B 04 02 01 DENSEG .BYTE 4,2,1 2215 2216 2217 F03E A2 7C BREAK LDX #$7C ;* Break-Routine * 2218 F040 A0 50 LDY #$50 ;* Sollte der Prozessor auf einen BRK-Befehl stossen, * 2219 F042 8E 01 40 STX DISP10 ;* wird ein 'br' + 2 x Bell ausgegeben und ein * 2220 F045 8C 00 40 STY DISP1 ;* Sytem-Warmstart ausgefuehrt * 2221 F048 20 68 E0 JSR SYSERR 2222 F04B A2 10 LDX #$10 2223 F04D 20 FB E2 JSR X2WAIT ;Warteschleife 2224 F050 4C 73 E0 JMP RESET2 ;Warmstart 2225 2226 2227 ;High-Speed SIO-Routine, wird in relocierter Form zum Computer geschickt 2228 2229 F053 SIO ; STATUS = $30 2230 ; CHKSU2 = $31 2231 ; BUF = $32 2232 ; LEN = $34 2233 ; CRETRY = $36 2234 ; DRETRY = $37 2235 ; STACKP = $3F 2236 2237 F053 AD 01 03 LDA $0301 2238 F056 D0 09 BNE SIO2 2239 F058 A2 04 LDX #4 ;bei Laufwerk Nr.=0 2240 F05A 9D 64 F2 DLWTBLL STA LWTBL-1,X ;Laufwerk-Tabelle loeschen 2241 F05D CA DEX 2242 F05E D0 FA BNE DLWTBLL 2243 F060 60 RTS 2244 F061 AA SIO2 TAX 2245 F062 BD 64 F2 ABS21 LDA LWTBL-1,X ;Laufwerk schon auf High-Speed gesetzt ? 2246 F065 D0 34 BNE SIO3 2247 F067 FE 64 F2 ABS22 INC LWTBL-1,X 2248 F06A A2 07 LDX #7 2249 F06C BD 02 03 SIOCL LDA $0302,X ;SIO-Kommando retten 2250 F06F 48 PHA 2251 F070 BD 59 F2 ABS23 LDA C3F,X 2252 F073 9D 02 03 STA $0302,X ;COM3F - Tabelle kopieren 2253 F076 CA DEX 2254 F077 10 F3 BPL SIOCL 2255 F079 A9 31 LDA #$31 2256 F07B 8D 00 03 STA $0300 2257 F07E 20 59 E4 JSR $E459 ;Computer SIO - Routine aufrufen 2258 F081 A9 28 LDA #$28 ;fuer ERROR normale Baudrate setzen 2259 F083 AE 01 03 LDX $0301 2260 F086 AC 03 03 LDY $0303 2261 F089 30 02 BMI SIO21 2262 F08B A5 01 LDA $01 2263 F08D 9D 60 F2 SIO21 STA SPTBL-1,X ;Baud-Rate in Speed-Tabelle eintragen 2264 F090 A0 00 LDY #0 2265 F092 68 SIO21CL PLA 2266 F093 99 02 03 STA $0302,Y ;urspruengliches SIO-Kommando zurueckholen 2267 F096 C8 INY 2268 F097 C0 08 CPY #8 2269 F099 90 F7 BCC SIO21CL 2270 F09B 78 SIO3 SEI 2271 F09C 8A TXA 2272 F09D 09 30 ORA #$30 ;Drive # + Bus ID 2273 F09F 8D 3A 02 STA $023A 2274 F0A2 AD 02 03 LDA $0302 2275 F0A5 8D 3B 02 STA $023B ;SIO - Kommando 2276 F0A8 AD 0A 03 LDA $030A ;Sector LO 2277 F0AB 8D 3C 02 STA $023C 2278 F0AE AD 0B 03 LDA $030B ;Sector HI 2279 F0B1 8D 3D 02 STA $023D 2280 F0B4 BD 60 F2 ABS31 LDA SPTBL-1,X 2281 F0B7 8D 04 D2 STA $D204 ;Baud-Rate setzen 2282 F0BA BA TSX 2283 F0BB 86 3F STX $3F ;Stackpointer retten 2284 F0BD A9 02 LDA #2 2285 F0BF 85 37 STA $37 ;2 Device-Retry's setzen 2286 F0C1 A9 04 IO11 LDA #4 2287 F0C3 85 36 STA $36 ;4 Command-Retry's setzen 2288 F0C5 A9 34 IO12 LDA #$34 2289 F0C7 8D 03 D3 STA $D303 ;Command-Leitung setzen 2290 F0CA A9 00 LDA #0 2291 F0CC 85 30 STA $30 ;Status = 0 2292 F0CE 85 3E STA $3E 2293 F0D0 85 35 STA $35 2294 F0D2 8D 06 D2 STA $D206 2295 F0D5 A9 3A LDA #$3A 2296 F0D7 85 32 STA $32 2297 F0D9 A9 02 LDA #2 2298 F0DB 85 33 STA $33 ;Buffer $23A 2299 F0DD 0A ASL ;Laenge 4 Bytes 2300 F0DE 85 34 STA $34 2301 F0E0 20 27 F1 ABS32 JSR SEND1 ;Buffer+Checksumme senden, auf Quittung warten 2302 F0E3 AD 04 03 LDA $0304 2303 F0E6 85 32 STA $32 ;Datenbuffer setzen 2304 F0E8 AD 05 03 LDA $0305 2305 F0EB 85 33 STA $33 2306 F0ED AD 08 03 LDA $0308 2307 F0F0 85 34 STA $34 2308 F0F2 AD 09 03 LDA $0309 ;Datenlaenge setzen 2309 F0F5 85 35 STA $35 2310 F0F7 AD 03 03 LDA $0303 ;Daten zum Laufwerk senden ? 2311 F0FA 10 03 BPL IO2 2312 F0FC 20 27 F1 ABS33 JSR SEND1 ;Datenbuffer+Checksumme senden, auf Quittung warten 2313 F0FF C6 3E IO2 DEC $3E 2314 F101 20 BE F1 ABS41 JSR SETTI1 ;Ausfuehrungszeit begrenzen (Time-Out) 2315 F104 2C 03 03 BIT $0303 ;Daten vom Laufwerk uebernehemen ? 2316 F107 50 03 BVC IO3 2317 F109 20 6C F1 ABS42 JSR GETA1 ;auf 'C' vom Laufwerk warten 2318 F10C A9 A0 IO3 LDA #$A0 2319 F10E 8D 07 D2 STA $D207 ;Soundregister zuruecksetzen 2320 F111 A5 10 LDA $10 2321 F113 8D 0E D2 STA $D20E ;Pokey-Maske zuruecksetzen 2322 F116 20 E6 F1 ABS51 JSR CLRTI 2323 F119 A5 30 LDA $30 2324 F11B F0 04 BEQ IO4 ;Status OK ? 2325 F11D C6 37 DEC $37 ;Device-Retry abzaehlen 2326 F11F D0 A0 BNE IO11 ;und ausfuehren 2327 F121 A8 IO4 TAY 2328 F122 8C 03 03 STY $0303 ;Status setzen 2329 F125 58 CLI 2330 F126 60 RTS 2331 2332 F127 A0 00 SEND1 LDY #0 2333 F129 C8 SE1 INY 2334 F12A D0 FD BNE SE1 2335 F12C A9 23 LDA #$23 2336 F12E 20 43 F2 ABS61 JSR POKEY ;Pokey auf senden steiler. 2337 F131 B1 32 LDA ($32),Y 2338 F133 85 31 STA $31 2339 F135 8D 0D D2 STA $D20D ;Pokey starten 2340 F138 C8 INY 2341 F139 D0 11 BNE SE3 2342 F13B B1 32 SE2 LDA ($32),Y 2343 F13D 20 20 F2 ABS62 JSR PUTBYTE ;Buffer senden 2344 F140 C8 INY 2345 F141 D0 09 BNE SE3 2346 F143 E6 33 INC $33 2347 F145 C6 35 DEC $35 2348 F147 A2 E0 LDX #$E0 2349 F149 E8 SEWL INX 2350 F14A D0 FD BNE SEWL 2351 F14C C4 34 SE3 CPY $34 2352 F14E D0 EB BNE SE2 2353 F150 A5 35 LDA $35 2354 F152 D0 E7 BNE SE2 2355 F154 A5 31 LDA $31 2356 F156 20 20 F2 ABS63 JSR PUTBYTE ;Checksummen senden 2357 F159 AD 0E D2 SEO1 LDA $D20E 2358 F15C 29 08 AND #8 2359 F15E D0 F9 BNE SEO1 2360 F160 A0 03 LDY #3 2361 F162 20 E8 F1 ABS64 JSR STOUTX0 ;Time-Out setzen 2362 F165 A9 C0 LDA #$C0 2363 F167 8D 0E D2 STA $D20E ;IRQ-Status zuruecksetzen 2364 F16A D0 59 BNE RDQUIT 2365 2366 F16C A0 00 GETA1 LDY #0 2367 F16E 84 31 STY $31 2368 F170 20 FD F1 GE1 JSR GETBYTE ;Datenblock vom Laufwerk holen 2369 F173 91 32 STA ($32),Y 2370 F175 20 3B F2 ABS71 JSR ADDSUM 2371 F178 C8 INY 2372 F179 D0 04 BNE GE2 2373 F17B E6 33 INC $33 2374 F17D C6 35 DEC $35 2375 F17F C4 34 GE2 CPY $34 2376 F181 D0 ED BNE GE1 2377 F183 A5 35 LDA $35 2378 F185 D0 E9 BNE GE1 2379 F187 20 FD F1 ABS72 JSR GETBYTE ;Cheksumme holen 2380 F18A C5 31 CMP $31 2381 F18C D0 0B BNE ERR8F 2382 F18E 60 RTS 2383 2384 F18F A9 80 IOER80 LDA #$80 ;Break-Status 2385 F191 85 30 STA $30 2386 F193 A6 3F LDX $3F 2387 F195 9A TXS ;Stackpointer zuruecksetzen 2388 F196 4C 0C F1 EABS0 JMP IO3 2389 F199 A9 8F ERR8F LDA #$8F ;Checksummen - Error 2390 F19B 2C .BYTE $2C 2391 F19C A9 8A ERR8A LDA #$8A ;Time-Out - Error 2392 F19E 85 30 ERROR STA $30 2393 F1A0 A6 3F LDX $3F 2394 F1A2 9A TXS ;Stackpointer zuruecksetzen 2395 F1A3 A5 3E LDA $3E 2396 F1A5 30 07 BMI ERRA 2397 F1A7 C6 36 DEC $36 2398 F1A9 F0 03 BEQ ERRA 2399 F1AB 4C C5 F0 EABS1 JMP IO12 2400 F1AE A9 28 ERRA LDA #$28 2401 F1B0 8D 04 D2 STA $D204 ;Baudrate normal setzen 2402 F1B3 A9 00 LDA #0 2403 F1B5 AE 01 03 LDX $0301 2404 F1B8 9D 64 F2 EABS2 STA LWTBL-1,X ;Eintrag in Laufwerktabelle loeschen 2405 F1BB 4C 0C F1 EABS3 JMP IO3 2406 2407 F1BE A2 01 SETTI1 LDX #1 2408 F1C0 A0 5E LDY #$5E 2409 F1C2 20 EA F1 ABS81 JSR STOUT ;Time-Out fuer Datenfeld setzen 2410 2411 F1C5 A9 3C RDQUIT LDA #$3C 2412 F1C7 8D 03 D3 STA $D303 2413 F1CA A9 13 LDA #$13 2414 F1CC 20 43 F2 RDA1 JSR POKEY ;Pokey auf lesen stellen 2415 F1CF 20 FD F1 RDA2 JSR GETBYTE ;Quittung holen 2416 F1D2 C9 41 CMP #$41 ;'A' 2417 F1D4 F0 10 BEQ CLRTI 2418 F1D6 C9 43 CMP #$43 ;'C' 2419 F1D8 F0 0C BEQ CLRTI 2420 F1DA C9 45 CMP #$45 ;'E' 2421 F1DC F0 04 BEQ ERR90 2422 F1DE A9 8B LDA #$8B ;Drive not ready 2423 F1E0 D0 BC BNE ERROR 2424 F1E2 A9 90 ERR90 LDA #$90 2425 F1E4 85 30 STA $30 ;Status setzen 2426 2427 F1E6 A0 00 CLRTI LDY #0 ;Timer loeschen 2428 F1E8 A2 00 STOUTX0 LDX #0 2429 F1EA AD FB F1 STOUT LDA ERRABS 2430 F1ED 8D 26 02 STA $0226 ;Timer 1 Sprungvector setzen 2431 F1F0 AD FC F1 STO2 LDA ERRABS+1 2432 F1F3 8D 27 02 STA $0227 2433 F1F6 A9 01 LDA #1 2434 F1F8 4C 5C E4 JMP $E45C 2435 F1FB 9C F1 ERRABS .WORD ERR8A 2436 2437 2438 F1FD AD 0E D2 GETBYTE LDA $D20E ;1 Byte vom Pokey holen 2439 F200 10 8D JMPE80 BPL IOER80 2440 F202 29 20 AND #$20 ;auf 'Shiftregister voll' warten 2441 F204 D0 F7 BNE GETBYTE 2442 F206 A9 DF LDA #$DF 2443 F208 8D 0E D2 STA $D20E ;IRQ - Flag zuruecksetzen 2444 F20B A9 E0 LDA #$E0 2445 F20D 8D 0E D2 STA $D20E ;IRQ - Status neu setzen 2446 F210 AD 0F D2 LDA $D20F 2447 F213 8D 0A D2 STA $D20A 2448 F216 10 84 BPL ERR8A 2449 F218 29 20 AND #$20 2450 F21A F0 80 BEQ ERR8A 2451 F21C AD 0D D2 LDA $D20D ;Shift - Register uebernehmen 2452 F21F 60 RTS 2453 2454 F220 48 PUTBYTE PHA ;1 Byte an den Pokey uebergeben 2455 F221 AD 0E D2 PUTA1 LDA $D20E 2456 F224 29 10 AND #$10 ;Warten auf 'Shift - Register leer' 2457 F226 D0 F9 BNE PUTA1 2458 F228 A9 EF LDA #$EF 2459 F22A 8D 0E D2 STA $D20E ;IRQ - Flag zuruecksetzen 2460 F22D A9 D0 LDA #$D0 2461 F22F 8D 0E D2 STA $D20E ;IRQ - Status neu setzen 2462 F232 68 PLA 2463 F233 8D 0D D2 STA $D20D ;Byte an Shift - Register uebergeben 2464 F236 AE 0E D2 LDX $D20E 2465 F239 10 C5 BPL JMPE80 2466 2467 2468 F23B 18 ADDSUM CLC ;Checksumme errechnen 2469 F23C 65 31 ADC $31 2470 F23E 69 00 ADC #0 2471 F240 85 31 STA $31 2472 F242 60 RTS 2473 2474 F243 8D 0F D2 POKEY STA $D20F ;Pokey fuer Datenein- und ausgabe vorbereiten 2475 F246 8D 0A D2 STA $D20A 2476 F249 A9 28 LDA #$28 2477 F24B 8D 08 D2 STA $D208 2478 F24E A9 A8 LDA #$A8 2479 F250 8D 07 D2 STA $D207 ;Sound - Register vorbereiten 2480 F253 A9 F8 LDA #$F8 2481 F255 8D 0E D2 STA $D20E ;IRQ - Enable setzen 2482 F258 60 RTS 2483 2484 ;COM3F - Tabelle 2485 2486 F259 3F 40 01 00 01 00 + C3F .BYTE 63,64,1,0,1,0,1,0 2487 2488 F261 28 28 28 28 SPTBL .BYTE 40,40,40,40 ;Baudraten - Tabelle fuer Laufwerke 1-4 2489 F265 00 00 00 00 LWTBL .BYTE 0,0,0,0 ;Pruef - Tabelle fuer Laufwerke 1-4 2490 2491 F269 SIOEND 2492 2493 ;Absolute Adressen Tabelle fuer Relocator 2494 2495 F269 5B F0 63 F0 68 F0 + ABSTBL .WORD DLWTBLL+1,ABS21+1,ABS22+1,ABS23+1,SIO21+1,ABS31+1 2496 2497 2498 2499 2500 2501 F275 E1 F0 FD F0 02 F1 + .WORD ABS32+1,ABS33+1,ABS41+1,ABS42+1,ABS51+1,ABS61+1,ABS62+1 2502 2503 2504 2505 2506 2507 2508 F283 57 F1 63 F1 71 F1 + .WORD ABS63+1,ABS64+1,GE1+1,ABS71+1,ABS72+1,EABS0+1,EABS1+1,EABS2+1 2509 2510 2511 2512 2513 2514 2515 2516 F293 BC F1 C3 F1 CD F1 + .WORD EABS3+1,ABS81+1,RDA1+1,RDA2+1,STOUT+1,STO2+1,ERRABS 2517 2518 2519 2520 2521 2522 2523 2524 ;Laufwerks - Testroutinen (werden in spaeteren Versionen erweitert) 2525 2526 F2A1 20 50 E5 ROMTST JSR STELL2 ;* ROM-Testroutine * 2527 F2A4 A2 00 LDX #0 2528 F2A6 A9 E0 LDA #$E0 2529 F2A8 85 1A STA IND+1 ;ROM - Adresse $E000 2530 F2AA A0 00 LDY #0 2531 F2AC 84 19 STY IND 2532 F2AE 98 ROMT2 TYA 2533 F2AF 18 CLC 2534 F2B0 71 19 ROMTL ADC (IND),Y ;Checksumme fuer 1 ROM-Page errechnen 2535 F2B2 C8 INY 2536 F2B3 D0 FB BNE ROMTL 2537 F2B5 DD E0 FE CMP ROMCHK,X ;Checksumme OK 2538 F2B8 D0 09 BNE ROMTX 2539 F2BA E6 1A INC IND+1 2540 F2BC E8 INX 2541 F2BD E0 20 CPX #$20 ;32 Pages getestet ? 2542 F2BF 90 ED BCC ROMT2 2543 F2C1 64 11 STZ COMST ;OK - Status setzen 2544 F2C3 4C 55 E5 ROMTX JMP QUITT 2545 2546 F2C6 20 50 E5 RAMTST JSR STELL2 ;* RAM-Testroutine * 2547 F2C9 A9 55 LDA #$55 2548 F2CB 8D 00 9E STA EXBUF 2549 F2CE A0 00 LDY #0 2550 F2D0 B9 00 00 RT1L LDA $00,Y 2551 F2D3 8D 01 9E STA EXBUF+1 2552 F2D6 AD 00 9E LDA EXBUF 2553 F2D9 99 00 00 STA $00,Y 2554 F2DC D9 00 00 CMP $00,Y ;Zeropage testen 2555 F2DF D0 3B BNE ZPERR 2556 F2E1 AD 01 9E LDA EXBUF+1 2557 F2E4 99 00 00 STA $00,Y 2558 F2E7 C8 INY 2559 F2E8 D0 E6 BNE RT1L 2560 F2EA 0E 00 9E ASL EXBUF 2561 F2ED 90 E1 BCC RT1L 2562 2563 F2EF A9 80 LDA #$80 2564 F2F1 85 91 STA $91 ;RAM - Adresse $8000 setzen 2565 F2F3 A0 00 LDY #0 2566 F2F5 84 90 STY $90 2567 F2F7 A9 55 RTABSL LDA #$55 2568 F2F9 85 00 STA MERK1 2569 F2FB B1 90 RT2L LDA ($90),Y 2570 F2FD 85 01 STA MERK2 2571 F2FF A5 00 LDA MERK1 2572 F301 91 90 STA ($90),Y 2573 F303 D1 90 CMP ($90),Y ;RAM von $8000 bis RAMTOP testen 2574 F305 D0 17 BNE RTERR 2575 F307 A5 01 LDA MERK2 2576 F309 91 90 STA ($90),Y 2577 F30B C8 INY 2578 F30C D0 ED BNE RT2L 2579 F30E 06 00 ASL MERK1 2580 F310 90 E9 BCC RT2L 2581 F312 E6 91 INC $91 2582 F314 A5 91 LDA $91 2583 F316 C9 A0 CMP # >(CMTBL+$0100) ;RAMTOP erreicht ? 2584 F318 90 DD BCC RTABSL 2585 F31A 80 71 BRA SPCAX 2586 2587 F31C 64 91 ZPERR STZ $91 ;fehlerhafte RAM-Adresse zum senden zwischenspeichern 2588 F31E 84 90 RTERR STY $90 2589 F320 80 6D BRA SPTEX 2590 2591 F322 20 50 E5 SPEEDT JSR STELL2 ;* Motor - Speed - Test * 2592 F325 64 0D STZ TRACK 2593 F327 20 2F E3 JSR TRADJA ;Track 0 positionieren 2594 F32A 20 9B F3 JSR FDSEC1 ;Abstand zwischen SEctor 1 und Sector 1 testen 2595 F32D B0 60 BCS SPTEX 2596 F32F 20 9B F3 JSR FDSEC1 2597 F332 B0 5B BCS SPTEX 2598 2599 F334 64 90 STZ $90 2600 F336 64 91 STZ $91 ;Counter loeschen 2601 F338 A9 E4 LDA #$E4 2602 F33A 85 92 STA $92 2603 F33C A9 E1 LDA #$E1 2604 F33E 85 93 STA $93 2605 F340 A9 C0 LDA #$C0 ;von Konstante $E4E1C0 die gezaehlten Taktzyklen abzaehlen 2606 F342 85 94 STA $94 2607 F344 A5 94 SPCAL LDA $94 2608 F346 38 SEC 2609 F347 E5 01 SBC MERK2 2610 F349 85 94 STA $94 2611 F34B A5 93 LDA $93 2612 F34D E5 02 SBC MERK3 2613 F34F 85 93 STA $93 2614 F351 B0 08 BCS SPCAD 2615 F353 A5 92 LDA $92 2616 F355 E9 00 SBC #0 2617 F357 85 92 STA $92 2618 F359 90 15 BCC SPCEND 2619 F35B 20 60 F3 SPCAD JSR SPCADD 2620 F35E 80 E4 BRA SPCAL 2621 2622 F360 F8 SPCADD SED ;Counter in Dezimalmodus heraufzaehlen 2623 F361 A5 91 LDA $91 2624 F363 18 CLC 2625 F364 69 01 ADC #1 2626 F366 85 91 STA $91 2627 F368 A5 90 LDA $90 2628 F36A 69 00 ADC #0 2629 F36C 85 90 STA $90 2630 F36E D8 CLD 2631 F36F 60 RTS 2632 2633 F370 A5 94 SPCEND LDA $94 2634 F372 49 FF EOR #$FF 2635 F374 85 94 STA $94 2636 F376 A5 93 LDA $93 2637 F378 49 FF EOR #$FF 2638 F37A 85 93 STA $93 2639 F37C 46 02 LSR MERK3 2640 F37E A5 01 LDA MERK2 ;eine Stelle hinter dem Komma runden 2641 F380 6A ROR 2642 F381 38 SEC 2643 F382 E5 94 SBC $94 2644 F384 A5 02 LDA MERK3 2645 F386 E5 93 SBC $93 2646 F388 90 03 BCC SPCAX 2647 F38A 20 60 F3 JSR SPCADD 2648 2649 F38D 64 11 SPCAX STZ COMST 2650 F38F 20 55 E5 SPTEX JSR QUITT ;Speed-Wert zum Computer senden 2651 F392 A9 02 LDA #2 2652 F394 A2 90 LDX #$90 2653 F396 A0 00 LDY #0 2654 F398 4C 1B E5 JMP SDBTS 2655 2656 F39B A9 01 FDSEC1 LDA #1 2657 F39D 8D 02 04 STA $0402 ;Sector # in Sector-Register des Controllers setzen 2658 F3A0 A9 88 LDA #$88 2659 F3A2 8D 00 04 STA $0400 2660 F3A5 A9 D8 LDA #$D8 2661 F3A7 8D 9F 02 STA $029F ;Time-Out setzen 2662 F3AA 64 01 STZ MERK2 2663 F3AC 64 02 STZ MERK3 ;Counter zuruecksetzen 2664 F3AE A2 07 LDX #7 2665 F3B0 CA FDS1WL DEX 2666 F3B1 D0 FD BNE FDS1WL 2667 F3B3 2C 80 02 FDS1L BIT $0280 2668 F3B6 50 16 BVC FDS1TO 2669 F3B8 30 10 BMI FDS1DR 2670 F3BA E6 01 INC MERK2 2671 F3BC D0 04 BNE FDS1NI 2672 F3BE E6 02 INC MERK3 2673 F3C0 80 02 BRA FDS1TZ 2674 F3C2 48 FDS1NI PHA ;Zeit nach Maschinenzyklen (1 Mhz) festlegen 2675 F3C3 68 PLA 2676 F3C4 48 FDS1TZ PHA 2677 F3C5 68 PLA 2678 F3C6 48 PHA 2679 F3C7 68 PLA 2680 F3C8 80 E9 BRA FDS1L 2681 2682 F3CA 18 FDS1DR CLC 2683 F3CB 4C 7B E3 JMP CONRES 2684 2685 F3CE 38 FDS1TO SEC ;Time-Out - Error Kennzeichnen 2686 F3CF 4C 78 E3 JMP CONRE2 2687 2688 2689 ;Freier ROM-Speicher fuer zukuenftige Erweiterungen 2690 2691 ; *= $FE00 2692 F3D2 org $fe00 2693 2694 FE00 20 FB E4 COM3F JSR SEND41 2695 FE03 A9 09 LDA #$09 ;High-Speed Wert fuer Pokey an den Computer senden 2696 FE05 20 3F E5 JSR SDBYTE 2697 FE08 A9 09 LDA #$09 2698 FE0A 20 3F E5 JSR SDBYTE 2699 FE0D A9 01 LDA #1 2700 FE0F 85 15 STA USKEN ;Datenuebertragung auf High-Speed stellen 2701 FE11 60 RTS 2702 2703 FE12 2C 80 02 NORDB BIT $0280 ;* Read-Byte Routine fuer normale Uebertragungsrate * 2704 FE15 50 1F BVC RDBTO 2705 FE17 2C 82 02 BIT $0282 2706 FE1A 50 F6 BVC NORDB ;auf Startbit warten 2707 FE1C A2 06 LDX #6 2708 FE1E CA RDBL1 DEX 2709 FE1F D0 FD BNE RDBL1 2710 FE21 A9 80 LDA #$80 2711 FE23 A2 07 RDNBIT LDX #7 2712 FE25 CA RDBL2 DEX 2713 FE26 D0 FD BNE RDBL2 2714 FE28 2C 82 02 BIT $0282 ;1 Bit uebernehmen 2715 FE2B 50 03 BVC SETC 2716 FE2D 18 CLC 2717 FE2E 90 02 BCC RDBSB 2718 FE30 38 SETC SEC 2719 FE31 EA NOP 2720 FE32 6A RDBSB ROR 2721 FE33 90 EE BCC RDNBIT 2722 FE35 60 RTS 2723 2724 FE36 68 RDBTO PLA ;Ruecksprungadresse vom Stack holen 2725 FE37 68 PLA 2726 FE38 4C 7E E4 JMP ER40UK ;Kennung fuer Uebertragungsrate umschalten 2727 2728 FE3B 2C 82 02 USRDB BIT $0282 2729 FE3E 50 FB BVC USRDB 2730 FE40 A2 08 LDX #8 2731 FE42 AD 82 02 USBITL LDA $0282 ;* 1 Datenblock in High-Speed von Computer holen * 2732 FE45 0A ASL 2733 FE46 0A ASL 2734 FE47 66 00 ROR MERK1 2735 FE49 CA DEX 2736 FE4A 10 F6 BPL USBITL 2737 FE4C 8A SVSDB TXA 2738 FE4D 45 00 EOR MERK1 2739 FE4F 2C 82 02 USW1 BIT $0282 ;1 Bit uebernehmen 2740 FE52 50 FB BVC USW1 2741 FE54 91 19 STA (IND),Y 2742 FE56 18 CLC 2743 FE57 65 1B ADC CHKSUM ;Checksumme heraufzaehlen 2744 FE59 69 00 ADC #0 2745 FE5B 85 1B STA CHKSUM 2746 FE5D A2 07 LDX #7 ;Bit - Zaehler fuer 8 Bits 2747 FE5F AD 82 02 USW2 LDA $0282 2748 FE62 0A ASL 2749 FE63 0A ASL 2750 FE64 66 00 ROR MERK1 2751 FE66 CA DEX 2752 FE67 10 F6 BPL USW2 2753 FE69 C8 INY 2754 FE6A C4 13 CPY RWLEN ;Checksumme empfangen ? 2755 FE6C D0 DE BNE SVSDB 2756 FE6E 68 USRDBX PLA 2757 FE6F 68 PLA 2758 FE70 8A TXA 2759 FE71 45 00 EOR MERK1 2760 FE73 4C E4 E4 JMP RDEXIT 2761 2762 FE76 A9 01 NOSDB LDA #1 ;* 1 Byte in Normal Speed an den Computer senden * 2763 FE78 1C 82 02 TRB $0282 ;Startbit setzen 2764 FE7B DA PHX 2765 FE7C 5A PHY 2766 FE7D A0 08 LDY #8 ;8 Bit Zaehler 2767 FE7F A2 05 LDX #5 2768 FE81 CA SBWL1 DEX 2769 FE82 D0 FD BNE SBWL1 2770 2771 FE84 AD 82 02 SDBITL LDA $0282 2772 FE87 4A LSR 2773 FE88 46 00 LSR MERK1 ;1 Bit ins PIO-Register shiften 2774 FE8A 2A ROL 2775 FE8B 8D 82 02 STA $0282 2776 FE8E A2 05 LDX #5 2777 FE90 CA SBWL2 DEX 2778 FE91 D0 FD BNE SBWL2 2779 FE93 EA NOP 2780 FE94 EA NOP 2781 FE95 88 DEY 2782 FE96 D0 EC BNE SDBITL ;alle Bits gesendet 2783 2784 FE98 09 01 ORA #1 2785 FE9A 8D 82 02 STA $0282 ;Stopbit setzen 2786 2787 FE9D A2 03 LDX #3 2788 FE9F CA SBWL3 DEX 2789 FEA0 D0 FD BNE SBWL3 2790 FEA2 7A PLY 2791 FEA3 FA PLX 2792 FEA4 60 RTS 2793 2794 FEA5 AD 82 02 USSDB LDA $0282 2795 FEA8 29 FE AND #$FE ;Startbit setzen 2796 FEAA 8D 82 02 STA $0282 2797 FEAD A2 08 LDX #8 ;Bitzaehler 2798 FEAF 4A USSBL LSR 2799 FEB0 66 00 ROR MERK1 2800 FEB2 2A ROL ;1 Bit ins PIO-Register shiften 2801 FEB3 8D 82 02 STA $0282 2802 FEB6 CA DEX 2803 FEB7 D0 F6 BNE USSBL 2804 FEB9 4A LSR 2805 FEBA 38 SEC ;Stopbit setzen 2806 FEBB 2A ROL 2807 FEBC C5 00 CMP $00 2808 FEBE 8D 82 02 STA $0282 2809 FEC1 60 RTS 2810 2811 2812 ; *= $FEE0 2813 FEC2 org $fee0 2814 2815 ;Checksummenbytes fuer Romtest 2816 ;(werden bei'm assemblieren nicht richtig gesetzt 2817 2818 FEE0 01 02 03 04 05 06 + ROMCHK .BYTE 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 2819 2820 2821 2822 FEF0 11 12 13 14 15 16 + .BYTE 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 2823 2824 2825 2826 2827 2828 ;Vektortabelle 2829 ;Von eigenen Programmen sollte nur ueber diese Vectortabelle gesprungen werden, 2830 ;da die Programme sonst auf den folgenden Speedy-Versionen nicht laufen koennten. 2831 2832 ; *= $FF00 2833 FF00 org $ff00 2834 2835 FF00 4C 00 E0 JMP RESET ;Drive Kaltstart 2836 FF03 4C 73 E0 JMP RESET2 ;Warmstart 2837 FF06 4C BC E0 JMP BEREIT ;Bereitschaftroutine 2838 FF09 4C 41 E1 JMP MOTON ;Motor zwingend einschalten 2839 FF0C 4C 3C E1 JMP TSTMON ;Motor einschalten wenn Klappe zu ist 2840 FF0F 4C 2D E1 JMP MOTOFF ;Motor ausschalten 2841 FF12 4C D2 E3 JMP SDELAY ;Motor Timer stellen 2842 FF15 4C A9 E1 JMP SDRDDP ;Drive Density stellen und anzeigen 2843 FF18 4C F2 E2 JMP XWAIT ;Warteschleife kurz 2844 FF1B 4C FB E2 JMP X2WAIT ;Warteschleife lang 2845 FF1E 4C D1 E2 JMP TRACK0 ;Track 0 positionieren 2846 FF21 4C 2F E3 JMP TRADJA ;Track # anzeigen und Kopf positionieren 2847 FF24 4C 32 E3 JMP TRADJ ;Kopf positionieren, Track # nur anzeigen, wenn Trackwechsel 2848 FF27 4C 0F E3 JMP TRVR ;1 Step vorwaerts oder rueckwaerts gehen 2849 FF2A 4C 7B E3 JMP CONRES ;Disk Controller stoppen 2850 FF2D 4C 78 E3 JMP CONRE2 ;2 mal CONRES 2851 FF30 4C 85 E3 JMP WREADY ;auf Controller 'In Use'-Flag=0 warten 2852 FF33 4C B3 E4 JMP RD128B ;128 Bytes vom Computer nach EXBUF holen 2853 FF36 4C B6 E4 JMP RD256B ;256 Bytes vom Computer nach EXBUF holen 2854 FF39 4C BC E4 JMP RDBTS ;Accu=Anzahl der Bytes nach Buffer (X/Y-Register) holen 2855 FF3C 4C CD E1 JMP RDSFOL ;nach Verzoegerung Sectorfolge vom aktuellen Track lesen 2856 FF3F 4C D2 E1 JMP RDSFO1 ;sofort Sectorfolge vom aktuellen Track lesen 2857 FF42 4C 6F E2 JMP RDTRA ;alle Sectoren des aktuellen Track ins RAM einiesen 2858 FF45 4C 44 E2 JMP RDTRAV ;wie RDTRA aber mit Verify und einem Retry 2859 FF48 4C 64 EB JMP TSTWR ;noch zu schreibende Sectoren aus RAM auf Diskette schreiben 2860 FF4B 4C 04 E6 JMP TSTDAT ;TSTWR ausfuehren und alle Sectoren als nicht gelesen markieren 2861 FF4E 4C 12 E5 JMP SD128B ;128 Bytes vom EXBUF zum Computer senden 2862 FF51 4C 15 E5 JMP SD256B ;256 Bytes vom EXBUF zum Computer senden 2863 FF54 4C 1B E5 JMP SDBTS ;Accu=Anzahl der Bytes aus Buffer (X/Y-Reg.) senden 2864 FF57 4C FB E4 JMP SEND41 ;'A' zum Computer senden 2865 FF5A 4C FF E4 JMP SEND43 ;'C' zum Computer senden 2866 FF5D 4C 03 E5 JMP SEND45 ;'E' zum Computer senden 2867 FF60 4C 07 E5 JMP SEND4E ;'N' zum Computer senden 2868 FF63 4C CF EA JMP RDSECT ;aktuellen Sector von Diskette in vorbezeichneten RAM einlesen 2869 FF66 4C D4 EA JMP RDSEC1 ;bezeichneten Sector in bezeichneten RAM einlesen 2870 FF69 4C 69 EC JMP WRSECT ;aktuellen Sector von vorbezeichneter RAM-Adr. auf Disk schreiben 2871 FF6C 4C 6E EC JMP WRSEC1 ;bezeichnten Sector von vorbezeichneter RAM-Adr. schreiben 2872 FF6F 4C 88 E4 JMP TSTWRP ;Write Protect und Klappe testen 2873 FF72 4C A4 EC JMP VERSEC ;aktuellen Sector mit angegebenem RAM vergleichen 2874 FF75 4C A9 EC JMP VERSE1 ;bezeichenten Sector mit angegebenem RAM vergleichen 2875 FF78 4C 4C E5 JMP STELL ;COM-Status auf 'Error' und 2 Retry's setzen 2876 FF7B 4C 55 E5 JMP QUITT ;Quittung 'C' oder 'E' je nach COM-Status senden 2877 FF7E 4C 3D EB JMP RDHEAD ;Die nachsten 'Header'-Daten lesen 2878 FF81 4C 42 EB JMP RDHD1 ;wie RDHEAD aber Timer nicht setzen 2879 FF84 4C 1D EB JMP RDHDSP ;Kopf positionieren und nachsten 'Header' lesen 2880 FF87 4C E4 E9 JMP CALCTS ;Track- und Sectornummer errechnen 2881 FF8A 4C 1A EA JMP SETBUF ;Buffer nach aktuellem Sector setzen 2882 FF8D 4C 1C EA JMP SETBUF2 ;Buffer nach Sectornummer im Accu setzen 2883 FF90 4C DB E9 JMP SEXBUF ;Adresse des Extended-Buffers setzen 2884 FF93 4C 2C EA JMP SETRWL ;Anzahl der Bytes fuer zu uebertragenden Datenblock setzen 2885 FF96 4C 68 ED JMP COPSLT ;Sectorliste fuer aktuelles Density in Zeropage kopieren 2886 FF99 4C B2 EF JMP BELL1 ;1 Bell (Buzzer) ausgeben 2887 FF9C 4C C7 EF JMP CLRDSP ;Display abschalten 2888 FF9F 4C F6 EF JMP TRAANZ ;aktuelle Track # anzeigen 2889 FFA2 4C 07 F0 JMP DEZOUT ;Wert in Accu in dezimaler Form anzeigen 2890 FFA5 4C DF EF JMP HEXOUT ;Wert im Accu in Hexadezimaler Form anzeigen 2891 FFA8 4C 1F F0 JMP DENDSP ;aktuelles Density anzeigen 2892 FFAB 4C 72 E5 JMP SETTIM ;Timer mit Wert im Accu setzen 2893 FFAE 4C 0F EF JMP CLRTRA ;Einen Track mit unlesbarem Format versehen (reformatieren) 2894 FFB1 4C 01 EF JMP CLRDSK ;ganze Diskette reformatieren 2895 FFB4 4C C6 F2 JMP RAMTST ;Einsprung fuer RAM-Test, 2 Bytes werden gesendet 2896 FFB7 4C A1 F2 JMP ROMTST ;ROM-Test Einsprung, es wird nur quittiert 2897 FFBA 4C 22 F3 JMP SPEEDT ;Einsprung fuer Speed-Test, 2 Bytes werden gesendet 2898 2899 2900 ; *=$FFF8 2901 FFBD org $fffb 2902 2903 FFFB 10 .BYTE VERSION ;Speedy Verions Nummer 2904 FFFC 00 E0 .WORD RESET ;Reset - Vektor fuer den Prozessor 2905 FFFE 3E F0 .WORD BREAK ;Break - Vektor fuer den Prozessor 2906 2907 end