!!! Custom Disk Format Routine {{{ 10 .OPT NO LIST 20 ; 30 ; Neuer Befehl F 40 ; Formatiert eine Spur mit selbst 50 ; definiertem Format 60 ; 70 DAUX = $82 80 SPUR = $8D 90 ; 0100 PORTA = $0280 0110 BEFSTA = $0400 0120 DATEN = $0403 0130 ; 0140 CONRES = $F362 0150 MOTAN = $F239 0160 KOPFSPUR = $F2EC 0170 SENDCPL = $F48F 0180 SENDERR = $F494 0190 ; 0200 PUF = $8000 ; Format-Daten 0210 STAB = PUF ; Sektor-Nummer 0220 ETAB = PUF+30 ; Fehler-Nummer 0230 LTAB = PUF+60 ; Sektor-Laenge 0240 FTAB = PUF+90 ; Sektor-Inhalt 0250 GP1 = PUF+120 ; POST INDEX 0260 GP2 = PUF+121 ; PRE ADDRESS 0270 GP3 = PUF+122 ; POST ADDRESS 0280 GP4 = PUF+123 ; POST DATA 0290 DEN = PUF+124 ; Sng oder Enh 0300 ANZ = PUF+125 ; Anzahl der Sek. 0310 ; 0320 ; Schreibe Akku auf Diskette 0330 ; 0340 .MACRO WRT1 0350 ?W1 BIT PORTA 0360 BVS *+5 ; Fehler ? 0370 JMP SENDERR 0380 BPL ?W1 ; Data Request ? 0390 STA DATEN 0400 .ENDM 0410 ; 0420 ; Schreibe X-mal Akku auf Diskette 0430 ; 0440 .MACRO WRT 0450 ?W2 BIT PORTA 0460 BVS *+5 ; Fehler ? 0470 JMP SENDERR 0480 BPL ?W2 ; Data Request ? 0490 STA DATEN 0500 DEX 0510 BNE ?W2 0520 .ENDM 0530 ; 0540 *= $9000 0550 ; 0560 LDA DEN 0570 CMP #'S 0580 BNE ED 0590 LDA PORTA ; Aktiviere FM 0600 ORA #$20 ; Modus 0610 BNE ?L0 0620 ED LDA PORTA ; Aktiviere MFM 0630 AND #$DF ; Modus 0640 ?L0 STA PORTA 0650 ; 0660 LDY #29 ; Der Sektorinhalt 0670 ?L1 LDA FTAB,Y ; muss wegen dem 0680 EOR #$FF ; "inverted Data 0690 STA FTAB,Y ; Bus" noch 0700 DEY ; "inverted" 0710 BPL ?L1 ; werden 0720 ; 0730 JSR CONRES ; FDC reset 0740 BIT BEFSTA 0750 BMI ERR ; Write Protect 0760 BVS ERR ; Not ready 0770 JSR MOTAN ; Motor anschalten 0780 LDA DAUX ; Schreib-/Lese- 0790 STA SPUR ; Kopf auf Spur 0800 JSR KOPFSPUR ; ruecken 0810 LDA #15 ; Timer fuer 1. 0820 STA $029F ; Indeximp. setzen 0830 LDA #$F0 ; WRITE-TRACK 0840 STA BEFSTA ; Kommando an FDC 0850 ; 0860 LDY #0 ; Pointer auf 0 0870 LDA DEN 0880 CMP #'S 0890 BEQ SNG 0900 JMP ENH 0910 ; 0920 ERR JMP SENDERR 0930 ; 0940 SNG BIT PORTA ; Formatiere in 0950 BPL SNG ; Single Density 0960 LDA #0 0970 STA DATEN 0980 ?S0 BIT PORTA 0990 BPL ?S0 1000 STA DATEN 1010 LDA #$D2 ; Timer auf 210 1020 STA $029F ; ms setzen 1030 ; 1040 LDX #$AC ; $ac Gapbytes 1050 LDA #0 1060 WRT 1070 LDA #$FC ; INDEX MARK 1080 WRT1 1090 LDX GP1 ; POST INDEX 1100 LDA #0 1110 WRT 1120 ; 1130 ?S1 LDX GP2 ; PRE ADDRESS 1140 LDA #0 1150 WRT 1160 ; 1170 ; Formatiere einen Header 1180 ; 1190 LDA #$FE ; ADDRESS MARK 1200 WRT1 1210 LDA SPUR ; Spur-Nummer 1220 WRT1 1230 LDA #0 ; Seiten-Nummer 1240 WRT1 1250 LDA STAB,Y ; Sektor-Nummer 1260 WRT1 1270 LDA #0 ; Sektor-Laenge 1280 WRT1 1290 LDX ETAB,Y ; Die Pruefsummen- 1300 LDA ETB2,X ; bytes dienen zur 1310 WRT1 ; Fehlererzeugung 1320 ; 1330 LDX GP3 ; POST ADDRESS 1340 LDA #0 1350 WRT 1360 ; 1370 ; Formatiere ein Datenfeld 1380 ; 1390 LDX ETAB,Y ; DATA ADDRESS 1400 LDA ETB1,X ; dient zur 1410 WRT1 ; Fehlererzeugung 1420 LDX LTAB,Y ; Sektor-Laenge 1430 LDA FTAB,Y ; Sektor-Inhalt 1440 WRT 1450 LDX ETAB,Y ; Die Pruefsummen- 1460 LDA ETB3,X ; bytes dienen zur 1470 WRT1 ; Fehlererzeugung 1480 LDX GP4 ; POST DATA 1490 LDA #0 1500 WRT 1510 INY ; Naechster Sektor 1520 CPY ANZ ; Fertig ? 1530 BCS *+5 1540 JMP ?S1 1550 LDX #0 1560 JMP FEN 1570 ; 1580 ENH BIT PORTA ; Formatiere in 1590 BPL ENH ; Enhanced Density 1600 LDA #$4E 1610 STA DATEN 1620 ?E0 BIT PORTA 1630 BPL ?E0 1640 STA DATEN 1650 LDA #$D2 ; Timer auf 210 ms 1660 STA $029F ; setzen 1670 ; 1680 LDX #$90 ; $190 Gapbytes 1690 LDA #$4E 1700 WRT 1710 LDX #0 1720 LDA #$4E 1730 WRT 1740 LDX #$0C ; $c Gapbytes 1750 LDA #0 1760 WRT 1770 LDX #3 ; $c2 ohne Takt 1780 LDA #$F6 1790 WRT 1800 LDA #$FC ; INDEX MARK 1810 WRT1 1820 LDX GP1 ; POST INDEX 1830 LDA #$4E 1840 WRT 1850 ; 1860 ?E1 LDX GP2 ; PRE ADDRESS 1870 LDA #0 1880 WRT 1890 ; 1900 ; Formatiere einen Header 1910 ; 1920 LDX #3 ; $a1 ohne Takt 1930 LDA #$F5 1940 WRT 1950 LDA #$FE ; ADDRESS MARK 1960 WRT1 1970 LDA SPUR ; Spur-Nummer 1980 WRT1 1990 LDA #0 ; Seiten-Nummer 2000 WRT1 2010 LDA STAB,Y ; Sektor-Nummer 2020 WRT1 2030 LDA #0 ; Sektor-Laenge 2040 WRT1 2050 LDX ETAB,Y ; Die Pruefsummen- 2060 LDA ETB2,X ; bytes dienen zur 2070 WRT1 ; Fehlererzeugung 2080 ; 2090 LDX GP3 ; POST ADDRESS 2100 LDA #$4E 2110 WRT 2120 ; 2130 ; Formatiere ein Datenfeld 2140 ; 2150 LDX #3 ; $a1 ohne Takt 2160 LDA #$F5 2170 WRT 2180 LDX ETAB,Y ; DATA ADDRESS 2190 LDA ETB1,X ; dient zur 2200 WRT1 ; Fehlererzeugung 2210 LDX LTAB,Y ; Sektor-Laenge 2220 LDA FTAB,Y ; Sektor-Inhalt 2230 WRT 2240 LDX ETAB,Y ; Die Pruefsummen- 2250 LDA ETB3,X ; bytes dienen zur 2260 WRT1 ; Fehlererzeugung 2270 LDX GP4 ; POST DATA 2280 LDA #$4E 2290 WRT 2300 INY ; Naechster Sektor 2310 CPY ANZ ; Fertig ? 2320 BCS *+5 2330 JMP ?E1 2340 LDX #$4E 2350 ; 2360 FEN LDA #1 2370 ?F1 AND BEFSTA ; FDC busy ? 2380 BEQ ?F2 ; nicht mehr busy 2390 BIT PORTA ; Data Request ? 2400 BPL ?F1 ; Nein 2410 STX DATEN 2420 BMI ?F1 ; Immer 2430 ?F2 LDA $0296 2440 LDA BEFSTA 2450 PHA ; Save FDC-Status 2460 JSR CONRES ; FDC reset 2470 PLA 2480 AND #4 ; Datenverlust ? 2490 BNE *+5 ; Ja 2500 JMP SENDCPL 2510 JMP SENDERR 2520 ; 2530 ETB1 .BYTE $FB,$F8,$F8,$FB,$00,$FB 2540 ETB2 .BYTE $F7,$F7,$F7,$00,$F7,$F7 2550 ETB3 .BYTE $F7,$00,$F7,$F7,$F7,$00 }}}