!!! 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
}}}