REM > Form/src REM Disk formatter REM Extracted from HADFS rom REM 15/11/1992 Form staggers by -3 REM and gap1=16, gap3=16 : DIM mcode% &800:load%=&FFFF6000 PageF=&0900:tracks=80 : OSWRCH=&FFEE:OSNEWL=&FFE7 OSRDCH=&FFE0:OSWORD=&FFF1 OSARGS=&FFDA : FOR P=0 TO 1 P%=load%:O%=mcode% [OPT P*3+4 .TextTable .TxtDrv:EQUS "Format drive ":BRK .TxtForm:EQUS "Formatting ":BRK : .PrText:.PrTextX LDA TextTable,X:BEQ PrTextEnd JSR OSWRCH:INX:BNE PrTextX .PrTextEnd RTS : .PrHex PHA:LSR A:LSR A:LSR A:LSR A JSR PrNyb:PLA .PrNyb AND #15:CMP #10:BCC PrDigit:ADC #6 .PrDigit ADC #ASC"0":JMP OSWRCH : .go% .Format LDA #tracks:PHA :\ Set number of tracks LDA #1:LDY #0:LDX #&A8:JSR OSARGS LDA (&A8),Y:CMP #ASC"0":BCC BadDrive CMP #ASC"4":BCC GoodDrive .BadDrive BRK:EQUB 205:EQUS "Bad drive":BRK : .GoodDrive AND #3:STA PageF+&90 :\ Drive number LDA #0:STA PageF+&94:STA PageF+&92 PLA:STA PageF+&91 :\ Tracks STA PageF+&95:CMP #101:BCC FormDsk5 AND #&FE:STA PageF+&95 :\ Force tracks even if 2*side DEC PageF+&92:.FormDsk5 :\ Set doubleside flag LDA PageF+&90:CMP #2:BCC FormDsk6 LDA #0:STA PageF+&92:.FormDsk6 :\ If drv2/3, can only do single side LDX #TxtDrv-TextTable:JSR PrText :\ "Format drive " LDA PageF+&90:JSR PrNyb LDA #ASC"?":JSR OSWRCH JSR OSRDCH:PHA:JSR OSNEWL:PLA :\ Wait for confirmation AND #&DF:CMP #ASC"Y":BEQ FormatYes RTS .FormatYes : BIT PageF+&92:BPL FormDskTrackZero :\ Double sided? LDA PageF+&95:LSR A:STA PageF+&95 :\ Divide TracksThisSide by 2 .FormDskTrackZero LDA #7:STA PageF+&93 :\ Initial sector start .FormDskLoop LDA PageF+&90:JSR FormatTrack :\ Format a track BIT &FF:BPL P%+5:JMP FormEsc INC PageF+&94:LDA PageF+&94 :\ Inc ThisTrack, at end yet? CMP PageF+&95:BNE FormDskLoop :\ Loop to do next track : BIT PageF+&92:BPL FormDsk7a :\ If singlesided, jump to finish LDA PageF+&90:AND #2:BNE FormDsk7a :\ If side2, jump to finish LDA PageF+&90:ORA #2:STA PageF+&90 :\ Set drive to side 2 LDA #0:STA PageF+&94:BEQ FormDskLoop:\ Loop to do second side : \ Now initialise formatted disk: : .FormDsk7a JSR OSNEWL:LDA PageF+&91:PHA :\ Tracks LDY PageF+&90 :\ Drive : \ Initialise sector 0: : LDX #0:LDA #ASC" ":.FormDsk7Lp CPX #8:BNE P%+4:LDA #0 :\ Spaces for 0..7, zeros for rest STA PageF+&00,X:INX:BNE FormDsk7Lp TYA:PHA:JSR WriteToDisk :\ Y=Drive PLA:TAY :\ Save drive in Y : \ Initialise sector 1: : LDA #0:STA PageF+&04:STA PageF+&05 :\ Cycle=0, no entries STA PageF+&06:PLA:STA PageF+&07 :\ Sectors=Tracks ASL PageF+&07:ROL PageF+&06 :\ Sectors=Tracks*2 ASL PageF+&07:ROL PageF+&06 :\ Sectors=Tracks*4 CLC:ADC PageF+&07:STA PageF+&07 LDA #0:ADC PageF+&06:STA PageF+&06 :\ Sectors=Tracks*5 ASL PageF+&07:ROL PageF+&06 :\ Sectors=Tracks*10 LDA #1:STA OswFDC_Sector :\ Sector 1, Y=drive : .WriteToDisk STY OswFDC_Drive :\ Y=drive LDA #10 :\ Number of retries to attempt .WriteToDiskLp TXA:PHA :\ Save retries LDX #9 .WriteToDiskSave :\ Save parameter block LDA OswFDC,X:PHA:DEX:BPL WriteToDiskSave LDX #OswFDC AND 255:LDY #OswFDC DIV 256 LDA #127:JSR OSWORD :\ Do the call LDX #0 .WriteToDiskLoad :\ Restore parameter block PLA:STA OswFDC,X:INX:CPX #10:BNE WriteToDiskLoad PLA:TAX :\ Get retries counter LDA OswFDC_Result:BEQ WriteOk :\ Get the result CMP #&12:BEQ WriteProtected DEX:BNE WriteToDiskLp :\ Retry if not given up yet BRK:EQUB 199:EQUS "Write error":BRK .WriteProtected BRK:EQUB 201:EQUS "Disk write protected":BRK .WriteOk .FormEsc RTS : : .FormatTrack \ A=dfs drive number STA PageF+&80:PHA:LDA #13:JSR OSWRCH LDX #TxtForm-TextTable:JSR PrText :\ "Formatting " PLA:JSR PrNyb LDA #ASC":":JSR OSWRCH LDA PageF+&94:JSR PrHex .FormDskGoLp LDX #10:BIT &FF:BMI FormEsc .FormSectLp1 LDA FormTable,X:STA PageF+&81,X DEX:BPL FormSectLp1 LDA PageF+&94:STA PageF+&87:\ track \ Set up sector table LDX #0:.FormSectLp2 LDA PageF+&94:STA PageF+&00,X LDA #0:STA PageF+&01,X LDA PageF+&93:STA PageF+&02,X:INC PageF+&93 CMP #9:BCC FormSect2 LDA #0:STA PageF+&93 .FormSect2 LDA #1:STA PageF+&03,X INX:INX:INX:INX:CPX #40 BNE FormSectLp2 LDA PageF+&93:SBC #3:BPL FormSect3 ADC #10:.FormSect3:STA PageF+&93 LDX #(PageF+&80)AND&FF:LDY #(PageF+&80)DIV256:LDA #&7F JSR OSWORD LDA PageF+&8C:BEQ FormGoEnd CMP #&12:BNE P%+5:JMP WriteProtected:BCC FormDskGoLp CMP #&14:BEQ FormDskGoLp LDA #ASC"?":JSR OSWRCH:JMP OSNEWL .FormGoEnd RTS : .OswFDC .OswFDC_Drive :EQUB 0 .OswFDC_Addr :EQUD PageF OR &FFFF0000 :\ Address of sector data EQUB 3:EQUB &4B :\ "Write" .OswFDC_Track :EQUB 0 .OswFDC_Sector:EQUB 0 .OswFDC_Number:EQUB &21 .OswFDC_Result:EQUB 0 : .FormTable EQUD PageF OR &FFFF0000:\ =sectab EQUB &5:EQUB &63:\ =format EQUB 0:\ track EQUB &10:\ gap3 EQUB &2A:\ sector num + size EQUB &00:\ gap5 EQUB &10:\ gap1 : : ] NEXT PRINT"*Save Form";tracks;" ";~mcode%;" ";~O%;" ";~go%OR&FFFF0000;" ";~load%