;///////////////////////////// ;/ FORMAT AND COPY UTIITY / ;/ COPYRIGHT SEP 84 / ;/ BY KIN-PING KWOK / ;///////////////////////////// .BA $200 .OS FMTWRK .DE $FE SECCTR .DE $FF SECLEN .DE $03 FTERMA .DE %11000100 ERMSG .DE $8171 INCHR .DE $8A1B OUTCHR .DE $8A47 PARM .DE $8220 CRLF .DE $834D PSHOVE .DE $8208 WRKBUF .DE $A609 PARNR .DE $A649 P1L .DE $A64E P2L .DE $A64C P3H .DE $A64B P3L .DE $A64A UFLAGS .DE $A61B FMTCPY JSR ACCESS LDX #MSG1-MSG :Display message JSR OUTMSG JSR INCHR JSR CRLF CMP #'Q BEQ QUIT CMP #'J BCS FMTCPY CMP #'A BCC FMTCPY AND #$0F ASL A TAX LDA FCDTBL-1,X PHA LDA FCDTBL-2,X PHA RTS QUIT JMP $8000 CMDA LDX #MSG2-MSG :DISPLAY MESSAGE TO ASK FOR INOUT JSR OUTMSG JSR PARM BNE F50ERR LDA PARNR CMP #3 ;must be 3 parms BNE F50ERR LDA #0 ;start from track 0 STA ITRACK JSR SETU LDA #L,FMTCPY STA RETVEC LDA #H,FMTCPY STA RETVEC+1 LDA #$3 ;distance between sectors. STA ISECTR LDA P3L ;get sector length ASL A LSR P2L ;get density ROR A AND #$83 ORA #$20 STA DFLAGS FMTDSK LDA #$C0 STA IFLAGS LDA #$4C ;JMP STA RDADBUF STA RDADBUF+3 LDA #L,DDIFT STA RDADBUF+1 :Set up vector for calling the LDA #H,DDIFT :Format track routine. STA RDADBUF+2 LDA #L,FTIRQ STA RDADBUF+4 LDA #H,FTIRQ STA RDADBUF+5 LDA #2 ;restore drive JSR DISKIO BCS FD2 CLI FD1 LDA #$6 ;format 1 track JSR DISKIO BCS FD2 INC ITRACK LDA ITRACK AND #$7F CMP NOTRKS ;check for last track BCC FD1 ;if not format next track FDDESEL LDA #$00 ;format completed STA IFLAGS JSR DESELECT :Deselect drive JMP (RETVEC) F50ERR LDA #$50 ;display error message BNE FD3 FD2 PHA LDA #$00 STA IFLAGS JSR DESELECT PLA FD3 SEC JSR ERMSG JMP FMTCPY CMDC LDX #MSG3-MSG LDA #4 BNE CMDC.4 CMDD LDX #MSG4-MSG LDA #5 CMDC.4 PHA JSR OUTMSG JSR PARM BNE F50ERR LDA PARNR CMP #1 BEQ C34.1 CMP #2 TF50ERR BNE F50ERR LDX P3L LDY P3H LDA #1 STA ISECTR LDA P2L BCS SETOTH C34.1 STA ISECTR LDX #L,BUFFER LDY #H,BUFFER LDA P3L SETOTH STX IADDRS STY IADDRS+1 LDX #0 STX ITRACK JSR STUNIT LDA #1 JSR DISKIO PLA JSR DISKIO TOFD2 BCS FD2 JMP FMTCPY FCERR2 LDX #MSG8-MSGA JSR OUTMSGA JMP FMTCPY CMDB LDX #MSG5-MSG JSR OUTMSG JSR PARM BNE F50ERR LDA PARNR CMP #2 BCC TF50ERR BEQ SETHIH LDA P3L LDX P3H BCS SH1 SETHIH JSR PSHOVE LDA WRKBUF LDX WRKBUF+1 DEX SEC SH1 SBC #L,BUFFER TXA SBC #H,BUFFER AND #$FC BEQ FCERR2 BCC FCERR2 ADC #H,BUFFER-$101 STA BUFTOP+1 LDA #L,BUFFER-1 STA BUFTOP LDA #$7F STA FLAG LDA P2L STA DESDV LDA P1L STA SOUDV LDA #0 STA ITRACK STA SOUTRK STA DESTRK LDA #1 STA SOUSEC STA DESSEC CPY1 LDX #MSG6-MSGA LDY SOUDV JSR CKDV JSR RDDSK TTFD2 BCS TOFD2 LDX #MSG7-MSGA LDY DESDV JSR CKDV LDA FLAG BMI WDK1 ASL FLAG LDA #L,WDK0 STA RETVEC LDA #H,WDK0 STA RETVEC+1 LDA #3 STA ISECTR LDA ITRACK AND #$80 STA ITRACK JMP FMTDSK WDK0 LDA #$C0 STA IFLAGS WDK1 JSR WRDSK BCS TTFD2 LDA FLAG BNE CPY1 JMP FMTCPY FDRTS RTS DDIFT JSR SEEK ;format track routine start here BCS FDRTS JSR MOVEPARMS BCS FDRTS JSR BLDSEQ FMTT.1 LDA DFLAGS AND #SECLEN CMP #$03 ADC #0 STA *FMTWRK STA *RETRIES LDX #12 LDA #0 STA *SECCTR LDA #C.WRITTRK CLV CLI LDY #3 STA CMDREG LDA PADCHR JSR WRTMCHR BIT FFLAGS BMI FORM.2 LDY NOPAD5 JSR WRTMCHR TYA LDY NOZERO JSR WRTMCHR LDY NOSPCH BEQ FORM.1 LDA #$F6 JSR WRTMCHR FORM.1 LDA #$FC JSR WRTCHR FORM.2 LDY NOPAD1 LDA PADCHR JSR WRTMCHR WRTSEC TYA LDY NOZERO JSR WRTMCHR LDY NOSPCH BEQ FORM.3 LDA #$F5 JSR WRTMCHR FORM.3 LDA #$FE JSR WRTCHR LDA ITRACK AND #$7F JSR WRTCHR LDA ITRACK ASL A LDA #0 ROL A JSR WRTCHR LDY *SECCTR LDA SECSEQ,Y JSR WRTCHR LDA DFLAGS AND #SECLEN JSR WRTCHR LDA #$F7 JSR WRTCHR LDY NOPAD2 LDA PADCHR JSR WRTMCHR TYA LDY NOZERO JSR WRTMCHR LDY NOSPCH BEQ FORM.5 LDA #$F5 JSR WRTMCHR FORM.5 LDA #$FB JSR WRTCHR LDY #$80 LDA *FMTWRK BEQ FT2 LDY #0 FT2 LDA DATPAT FT3 JSR WRTMCHR DEC *RETRIES BEQ FT4 BPL FT3 FT4 LDA #$F7 JSR WRTCHR LDA *FMTWRK STA *RETRIES INC *SECCTR LDY *SECCTR LDA PADCHR JSR WRTCHR CPY NOSECS BEQ FINAL LDY NOPAD3 JSR WRTMCHR JMP WRTSEC FINAL LDY #$02 FL1 DEY FL2 BVC FL2 STA DATREG CLV INY BNE FL2 BEQ FL1 FTIRQ AND #FTERMA BNE FTI1 STY *RETRIES CLC FTRTS RTS FTI1 LDY #0 STY *RETRIES AND #$FF JSR RECOVER BCC FTRTS LDX #$FF TXS JMP FD2 WRTMCHR BVC WRTMCHR STA DATREG CLV DEY BNE WRTMCHR RTS WRTCHR BVC WRTCHR STA DATREG CLV RTS MOVEPARMS LDY #$00 BIT DFLAGS BPL MVP.1 INY MVP.1 LDX #$05 MVP.2 LDA FMTTBL,Y STA FMTPRM,X INY INY DEX BPL MVP.2 TYA AND #$01 TAY BIT FFLAGS BMI MVP.3 INY INY MVP.3 LDA GAP1TB,Y STA NOPAD1 LDA DFLAGS AND #SECLEN STA *WKAREA TYA ASL A ASL A ORA *WKAREA TAY LDA SECTBL@,Y STA NOSECS LDA GAP3TB,Y STA NOPAD3 RTS BLDSEQ LDY NOSECS DEY LDA #$FF BLSQ.1 STA SECSEQ,Y DEY BPL BLSQ.1 INY LDA #$01 STA SECSEQ,Y LDX #$02 BLSQ.2 TYA CLC ADC ISECTR BLSQ.3 TAY SEC SBC NOSECS BCS BLSQ.3 LDA SECSEQ,Y BMI BLSQ.4 INY TYA BNE BLSQ.3 BLSQ.4 TXA STA SECSEQ,Y INX CPX NOSECS BEQ BLSQ.2 BCC BLSQ.2 RTS OUTMSG LDA MSG,X BEQ OMRTS JSR OUTCHR INX BNE OUTMSG OMRTS RTS OUTMSGA LDA MSGA,X BEQ OMRTS JSR OUTCHR INX BNE OUTMSGA OMARTS RTS STUNIT STA P1L LDA #0 SETU LSR P1L ;get drive no. ROL A STA IDRIVE LDA P1L ASL ITRACK LSR A ;get side bit ROR ITRACK STA UFLAGS RTS RDDSK LDA FLAG BMI RDK1 LDA #1 JSR DISKIO RDK1 LDA ITRACK AND #$80 ORA SOUTRK STA ITRACK LDA SOUSEC STA ISECTR JSR STADDR RDK2 LDA #$4 JSR DISKIO LDX ISECTR CPX NOSECS BCC RDK2.5 LDA #1 STA ISECTR INC ITRACK LDA ITRACK AND #$7F CMP NOTRKS BCC RDK3 CLC RTS RDK2.5 INC ISECTR RDK3 JSR ADJUST BCS RDK2 LDA ITRACK STA SOUTRK LDA ISECTR STA SOUSEC RTS WRDSK LDA ITRACK AND #$80 ORA DESTRK STA ITRACK LDA DESSEC STA ISECTR JSR STADDR WDK2 LDA #5 JSR DISKIO LDX ISECTR CPX NOSECS BCC WDK2.5 LDA #1 STA ISECTR INC ITRACK LDA ITRACK AND #$7F CMP NOTRKS BCC WDK3 LDA #$00 STA FLAG STA IFLAGS JSR DESELECT CLC RTS WDK2.5 INC ISECTR WDK3 JSR ADJUST BCS WDK2 LDA ITRACK STA DESTRK LDA ISECTR STA DESSEC RTS CKDV LDA SOUDV EOR DESDV AND #$F9 BNE CK1 LDA #$00 STA IFLAGS JSR DESELECT JSR OUTMSGA CK2 JSR INCHR CMP #$0D BNE CK2 CK1 LDA #$C0 STA IFLAGS TYA JMP STUNIT STADDR LDA #L,BUFFER STA IADDRS LDA #H,BUFFER STA IADDRS+1 RTS ADJUST LDA DFLAGS AND #$03 TAX LDA #0 STA TEMP LDA #$40 SIZADJ ASL A ROL TEMP DEX BPL SIZADJ ADC IADDRS STA IADDRS LDA TEMP ADC IADDRS+1 STA IADDRS+1 LDA BUFTOP CMP IADDRS LDA BUFTOP+1 SBC IADDRS+1 RTS FCDTBL .SI CMDA-1 .SI CMDB-1 .SI CMDC-1 .SI CMDD-1 .SI FMTCPY-1 .SI FMTCPY-1 .SI FMTCPY-1 .SI FMTCPY-1 .SI FMTCPY-1 MSG MSG1 .BY $0D $0A 'FORMAT UTILITY PROGRAM' $0D $0A .BY 'SELECT ONE OF THE FOLLOWING' $0D $0A .BY 'A) FORMAT DISKETTE' $0D $0A .BY 'B) DISK COPY' $0D $0A .BY 'C) READ ID SECTOR' $0D $0A .BY 'D) WRITE ID SECTOR' $0D $0A .BY 'Q) QUIT' $0D $0A .BY $0D $0A 'ENTER ' $00 MSG2 .BY 'unit,den,seclen ' $00 MSG3 .BY 'read ID sector from unit -> ' $00 MSG4 .BY 'write ID sector to unit -> ' $00 MSG5 .BY 'copy disk from unit,to unit -> ' $00 MSGA MSG6 .BY $D $A $A 'insert SOURCE disk and then press RETURN ' $0 MSG7 .BY $D $A 'insert DEST. disk and then press RETURN ' $00 MSG8 .BY $D $A 'Not sufficient memory !!!' $D $A $0 FMTTBL DATATB .BY $E5 $40 PADTBL .BY $FF $4E GAP2TB .BY 11 22 GAP5TB .BY 37 77 ZEROTB .BY 06 12 SPCHTB .BY 00 03 GAP1TB .BY 13 27 26 SECTBL@ .BY 18 10 05 02 .BY 30 18 09 05 .BY 26 15 08 04 GAP3TB .BY 09 19 73 254 .BY 13 23 69 119 .BY 26 47 89 223 FMTPRM NOSPCH .DS 1 NOZERO .DS 1 NOPAD5 .DS 1 NOPAD2 .DS 1 PADCHR .DS 1 DATPAT .DS 1 NOPAD1 .DS 1 NOPAD3 .DS 1 SECSEQ .DS 26 BUFTOP .DS 2 TEMP .DS 1 FLAG .DS 1 SOUDV .DS 1 DESDV .DS 1 RETVEC .DS 2 SOUTRK .DS 1 SOUSEC .DS 1 DESTRK .DS 1 DESSEC .DS 1 .CT BUFFER .EN