;SAVE#D5:B>HDFMT.M65 ;ASM#d5:b>hdfmt.m65,,#D5:B>HDFMT.OBJ DEBUG = 0 *= $4FFF ;03/04/94 .OPT NO LIST RTS INIT LDA #$38 STA PIAPCA LDA #$FF STA RAMPAGE STA VPCR STA VPORTB LDX #$0D STX VDDRB DEX STX VPORTB LDA #$90 STA VPIER LDA #$EF STA VPCR LDA #0 STA VPACR LDA #$3C STA PIAPCA LDA #$FF STA RAMPAGE JSR SETINP JSR START LDA #$FF STA RAMPAGE LDA #4 SEI STA $D1FF LDX $D802 ;GET VERSION # LDA #0 STA $D1FF ;FIX FOR OLDER CLI ;ONES... CPX #6 BCS ?QUIT LDA #$0C STA VDDRB ?QUIT JMP ($0A) BRK ; DEVMSK = $0247 RAMPAGE = $D1BC PIAPORTB = $D1BE PIAPCA = $D1BD PIAPRB = $D1BE PIAPCB = $D1BF VPORTB = $D170 VDDRB = $D172 VPACR = $D17B VPCR = $D17C VPIER = $D17E ;Zero-page equates ; SCSIID = $36 ZWTEMP1 = $32 ZPTMP1 = $31 ZPTMP2 = $34 ZPTMP3 = $35 SECH512 = $30 ; PRTTMP = $E4 PTR1 = $E6 PTR2 = $E8 ; ; PIA Equates: PORTA = $D171 PORTB = $D170 DDRA = $D173 PPCR = $D17C ; SDATADTA = $4800 DATA = $4C00 PTEMP .DS 40 ; STACK .DS 1 RETRYS .DS 1 BYTES .DS 1 CURSY .DS 1 CTRLS .DS 1 DRIVE .DS 1 HDRLOC .DS 2 DATLOC .DS 2 INTERLEAVE .DS 1 MAXSEC .DS 3 CURSEC .DS 3 SECSLFT .DS 3 DATAPTR .DS 2 VERTYPE .DS 1 SNSBUF .DS 28 SECSTRK .DS 1 BADSECTORS .DS 2 SORTED .DS 1 TEMP .DS 1 CURBSECF .DS 1 SELECTION .DS 1 ; ;Select controller ; A=scsi # <0=7> SEL_CTRL STA ZPTMP1 LDA PPCR ORA #$0F STA PPCR ;kill any handshake LDA #$0C STA VDDRB .IF DEBUG=1 LDA #'S JSR EOUTCH .ENDIF BIT PORTB ;are we busy? BVS S_C1 LDX #$F7 ;do a RESET STX PORTB S_C5 DEX BNE S_C5 ;pause a little LDA #$FF ;maybe this will STA PORTB ;wake ctrlr up TAX TAY S_C4 NOP NOP ;waste cycles NOP NOP NOP NOP DEX BNE S_C4 DEY BNE S_C4 BIT PORTB ;let's look again BVS S_C1 ;yep, all ok LDY #142 ;else bus RTS ;'overrun'.. S_C1 JSR SETOUT ;set data out LDX ZPTMP1 LDA BITTAB,X STA PORTA LDA #$FB ;lower /SEL STA PORTB LDX #0 LDY #$80 S_C2 BIT PORTB BVC S_C3 ;is it busy? INX BNE S_C2 ;nope, loop INY BNE S_C2 BUSERR LDA #$FF STA PORTB ;oh well, LDA PPCR ORA #$0F STA PPCR S_C8 LDX #$0D STX VDDRB ;KEEP TERMINATION DEX STX PORTB ;COOL JSR SETINP ;give up LDY #138 RTS S_C3 LDA #$FF STA PORTB TAY TAX S_C6 LDA PORTB ;wait for AND #$82 ;REQ and C/D BEQ S_C7 ;to assert DEX BNE S_C6 DEY BNE S_C6 BEQ S_C8 S_C7 .IF DEBUG=1 LDA #'Ó JSR EOUTCH .ENDIF LDY #1 ;y=0, success! RTS ; BITTAB .BYTE 1,2,4,8,$10,$20,$40,$80 ; SETINP PHA ;set direction LDA #0 ;of data bus BEQ SETINP1 SETOUT PHA LDA #$FF SETINP1 STA DDRA PLA RTS ; SND_CMD STX ZWTEMP1 ;send cmd STY ZWTEMP1+1 ;frame STA BYTES JSR SETOUT .IF DEBUG=1 LDA #'C JSR EOUTCH .ENDIF ; LDA PPCR ; AND #$F0 ;enable ; ORA #9 ;handshake ; STA PPCR JSR WAITREQ LDY #0 SN_C1 LDX #0 SN_C2 LDA PORTB BPL SN_C21 BIT PORTB BVS SN_C4 BVC SN_C2 ;branch SN_C21 AND #2 BNE SN_C22 ;oops, data mode LDA (ZWTEMP1),Y STA PORTA JSR FIXSCSI INY CPY BYTES BNE SN_C1 ;always loop SN_C22 .IF DEBUG=1 LDA #'à JSR EOUTCH .ENDIF LDY #1 RTS SN_C4 JMP BUSERR ; ; RWDATA STX ZWTEMP1 STY ZWTEMP1+1 JSR FIXALF TYA ORA ZWTEMP1 BNE RWD1 RTS ;no data RWD1 .IF DEBUG=1 LDA #'R JSR EOUTCH .ENDIF JSR WAITREQ LDA PORTB LSR A BCS RW_DD2 ;writes JSR SETINP JSR FIXALF JMP RW_DA1 ;branch to reads ; RW_DD2 LDY #0 ;put data code RW_CC2 LDA PORTB BPL RW_CC3 BIT PORTB BVS RW_CC4 BVC RW_CC2 ;branch RW_CC3 AND #2 ;command or data? BEQ RW_DD3 ;out of data LDA (ZWTEMP1),Y STA PORTA INY BNE RW_CC2 INC ZWTEMP1+1 BNE RW_CC2 ;branch ; RW_DD3 TYA .IF DEBUG=1 PHA LDA #'× JSR EOUTCH PLA .ENDIF LDY #1 RTS ; RW_CC4 JMP BUSERR ; RW_DA1 .IF DEBUG=1 LDA #'r JSR EOUTCH .ENDIF LDY #0 RW_DA2 LDX #0 RW_DA3 LDA PORTB ;get data code BPL RW_DA4 BIT PORTB BVS RW_CC4 INX BEQ RW_CC4 BNE RW_DA3 RW_DA4 AND #2 BEQ RW_DA5 LDA PORTA STA (ZWTEMP1),Y INY BNE RW_DA3 ;in place of DA2 INC ZWTEMP1+1 BNE RW_DA3 ;branch ; RW_DA5 JSR FIXALF TYA .IF DEBUG=1 PHA LDA #'Ò JSR EOUTCH PLA .ENDIF LDY #0 RTS ; GETSTAT JSR SETINP LDA PPCR ORA #$0F STA PPCR .IF DEBUG=1 LDA #'E JSR EOUTCH .ENDIF JSR WAITREQ LDA PORTA ;status byte STA ZPTMP2 JSR FIXSCSI JSR WAITREQ ; LDA PORTA ;toss 2nd stat JSR FIXSCSI JSR BUSERR ;release bus LDA ZPTMP2 AND #$0A BEQ GE_ST1 .IF DEBUG=1 LDA #'å JSR EOUTCH .ENDIF LDY #144 RTS GE_ST1 .IF DEBUG=1 LDA #'Å JSR EOUTCH .ENDIF LDY #1 RTS ; FIXSCSI LDA PPCR AND #$FD STA PPCR FIXSC1 BIT PORTB BPL FIXSC1 ORA #2 STA PPCR RTS ; WAITREQ LDA #0 TAX LDY #0 ;5 min timeout WA_R1 BIT PORTB ;wait for REQ BVS WA_R2 ;not busy BMI WA_R3 RTS ;got it! WA_R3 JMP WA_R1 ;LOOP FOREVER ; ADC #1 ; BNE WA_R1 ; INX ; BNE WA_R1 ; INY ; BNE WA_R1 WA_R2 PLA PLA JMP BUSERR ; FIXALF LDA #$EF STA PPCR LDA #$E9 STA PPCR ;FIX ACK PROBLEM RTS ; DOIT PLA STA PRTTMP PLA STA PRTTMP+1 LDY #1 LDA (PRTTMP),Y STA BYTES INY LDA (PRTTMP),Y STA RETRYS INY LDA (PRTTMP),Y STA HDRLOC INY LDA (PRTTMP),Y STA HDRLOC+1 INY LDA (PRTTMP),Y STA DATLOC INY LDA (PRTTMP),Y STA DATLOC+1 TYA CLC ADC PRTTMP TAY LDA PRTTMP+1 ADC #0 PHA TYA PHA JSR DATPAGE LDA HDRLOC STA PRTTMP LDA HDRLOC+1 STA PRTTMP+1 DOI3 LDY #1 LDA (PRTTMP),Y AND #$1F STA (PRTTMP),Y LDX DRIVE LDA $D6AB,X AND #$E0 ORA (PRTTMP),Y STA (PRTTMP),Y ;set LUN # LDA $D6AB,X AND #7 JSR SEL_CTRL BMI DOI1 LDX HDRLOC LDY HDRLOC+1 LDA BYTES JSR SND_CMD BMI DOI2 ; LDY #0 ;is this a ; LDA (ZWTEMP1),Y ;REQ sns? ; CMP #3 ;(seagate bug) ; BNE ?SEAF1 JSR WAITREQ ;wait for req BMI DOI2 ?SEAF1 LDX DATLOC LDY DATLOC+1 JSR RWDATA BMI DOI2 JSR GETSTAT BPL DOI2A DOI2 ASL RETRYS ;can bit 7 LSR RETRYS DEC RETRYS ;retry 2x BPL DOI3 DOI2A RTS DOI1 BIT RETRYS BMI DOI2A LDX #NOCTRLM2&255 LDY #NOCTRLM2/256 JSR PRINT LDX STACK TXS JSR KGETCH JMP START ; DATPAGE PHA LDA #$F5 BNE DATPAGE1 PRPAGE PHA LDA #$F6 BNE DATPAGE1 JUNKPAGE PHA LDA #$FF DATPAGE1 STA RAMPAGE PLA RTS ; PRINTHEX PHA LSR A ;print a single LSR A ;byte hex number LSR A LSR A JSR PHX1 PLA AND #$0F PHX1 CLC ADC #$30 CMP #$3A BCC PHX2 ADC #6 PHX2 JMP EOUTCH ; MAKE_CLINE STX CURSY LDA #$20 LDY #32 CSS1 STA PTEMP,Y DEY BPL CSS1 LDA #$9B STA PTEMP+35 INY STY PTEMP+36 TXA CLC ADC #$41 STA PTEMP JSR DATPAGE TXA ASL A ASL A ASL A TAX LDA $D6AB,X PHA AND #7 ORA #$30 STA PTEMP+9 PLA PHA LSR A SEC ROR A SEC ROR A LSR A LSR A STA PTEMP+11 LDA #', STA PTEMP+10 LDY #3 CSS5 LDA SCSIMSG,Y STA PTEMP+3,Y DEY BPL CSS5 PLA PHA AND #$10 BEQ CSS4 LDA #'A STA PTEMP+4 CSS4 PLA AND #8 ;sec size TAY LDA SIZEM,Y STA PTEMP+32 LDA SIZEM+1,Y STA PTEMP+33 LDA SIZEM+2,Y STA PTEMP+34 LDA $D6AE,X PHA AND #$0F LDY #27 JSR A2DIGIT PLA LSR A LSR A LSR A LSR A BNE XX1 LDA #'- STA PTEMP+16 STA PTEMP+17 BNE XX1A XX1 LDY #16 ;heads JSR A2DIGIT XX1A LDA $D6AC,X STA 0 LDA $D6AD,X STA 1 ORA 0 BNE CSS01 LDX CURSY CLC ;not valid RTS CSS01 LDX #0 STX 2 LDA 1 BNE XX2 LDA 0 CMP #1 BNE XX2 LDA #'- STA PTEMP+21 STA PTEMP+22 STA PTEMP+23 STA PTEMP+24 BNE XX2A XX2 JSR A3DIGIT LDX #0 CSS8 LDA NUMBUF,Y STA PTEMP+21,X INX INY CPY #8 BCC CSS8 XX2A LDX #PTEMP&255 LDY #PTEMP/256 JSR PRINT LDX CURSY SEC ;good RTS ; SIZEM .BYTE "256 512" SCSIMSG .BYTE "SCSI" NUMBUF .BYTE " " ; A2DIGIT CMP #10 BCC A2D1 SBC #10 A2D1 PHA LDA #$18 ROL A STA PTEMP,Y PLA ORA #$30 STA PTEMP+1,Y RTS ; COMLO .BYTE $80,$40,$A0,$10,$E8,100,10,1 COMHI .BYTE $96,$42,$86,$27,3,0,0,0 COMH2 .BYTE $98,$0F,1,0,0,0,0,0 ; A3DIGIT LDA #'0 LDX #0 LDY #7 A3D1 STA NUMBUF,Y DEY BPL A3D1 INY A3D2 LDA 2,X CMP COMH2,Y BNE A3D3 LDA 1,X CMP COMHI,Y BNE A3D3 LDA 0,X CMP COMLO,Y A3D3 BCC A3D4 LDA 0,X SBC COMLO,Y STA 0,X LDA 1,X SBC COMHI,Y STA 1,X LDA 2,X SBC COMH2,Y STA 2,X CLC LDA NUMBUF,Y ADC #1 STA NUMBUF,Y BCC A3D2 ;branch A3D4 INY CPY #8 BCC A3D2 LDY #0 A3D5 LDA NUMBUF,Y CMP #'0 BNE A3D6 INY CPY #7 BCC A3D5 A3D6 RTS ; A3DIGPRT JSR A3DIGIT TYA CLC ADC #NUMBUF&255 TAX LDA #NUMBUF/256 ADC #0 TAY LDA #0 STA NUMBUF+8 ; PRINT STX PRTTMP STY PRTTMP+1 PR1 LDY #0 LDA (PRTTMP),Y BEQ PR2 JSR EOUTCH INC PRTTMP BNE PR1 INC PRTTMP+1 BNE PR1 PR2 RTS EOUTCH TAY LDA $0347 PHA LDA $0346 PHA LDX #0 TYA RTS ; KGETCH LDX #$10 LDA #$0C STA $0342,X JSR $E456 LDA #3 STA $0342,X LDA #KCOL&255 STA $0344,X LDA #KCOL/256 STA $0345,X LDA #4 STA $034A,X JSR $E456 LDA #7 STA $0342,X LDA #0 STA $0348,X STA $0349,X JSR $E456 PHA LDA #$0C STA $0342,X JSR $E456 PLA RTS KCOL .BYTE "K:",$9B ; INITMSG .BYTE $7D,$7D .BYTE "Ôèå ÂÌÁÃË ÂÏØ Õôéìéôéå󠠨é ±¹¹´ ÃÓÓ",$9B .BYTE " Hard Disk Physical Format Ver. 1.93",$9B .BYTE "",$9B,0 INITM2 .BYTE $9B," Configured Drives:",$9B,$9B .BYTE "ÉÄ Ôùðå Õ£¬Ìõî Èåáäó Ãùìó Óôåð ÓÓéúå",$9B,0 NOCTLM .BYTE $9B,$9B,"No drives are configured! Press the",$9B .BYTE "MENU button, select DRIVE CONFIG,",$9B .BYTE "press ÛÃÝ for Controller list, and",$9B .BYTE "enter the data for your hard disk.",$9B .BYTE "Press ÛÅÓÃÝ three times when finished.",$9B .BYTE $9B,"Press ÛÑÝ to Quit to DOS.",$9B,0 SELHDM .BYTE $9B,"[Ñ to Quit] Select Hard Disk Letter: ",0 CTLIST .BYTE $9B .BYTE " ÛÁÝ Adaptec 4000A (MFM)",$9B .BYTE " ÛÂÝ Adaptec 4070 (RLL)",$9B .BYTE " ÛÃÝ Seagate ST-225N",$9B .BYTE " ÛÄÝ Seagate embedded drives",$9B .BYTE " ÛÅÝ SCSI embedded drives",$9B .BYTE " ÛÆÝ OMTI 3520 or 3527",$9B .BYTE " ÛÇÝ SMS FWD-5001 (8 inch)",$9B .BYTE " ÛÈÝ Xebec S-1410, WD1002SHD (SASI)",$9B .BYTE " ÛÉÝ Konan DJ210",$9B .BYTE $9B,"Select Controller: ",0 VERMSG2 .BYTE $9B,$9B,"×òéôå ôèéó îõíâåò äï÷î¡¡¡ This is",$9B .BYTE "the number of sectors available on",$9B .BYTE "your drive. Now follow the procedure",$9B .BYTE "described in the docs on partitioning",$9B .BYTE "the drive. Press ÒÅÔÕÒÎ to exit.",$9B,0 NOCTRLM2 .BYTE $9B,$9B,"Error: Controller is not responding.",$9B .BYTE "Please check your cables. Press",$9B .BYTE "any key to continue...",0 ; START TSX STX STACK LDA PORTB AND #$40 ;BUSY? BNE RES2 LDX #$F7 STX PORTB RES1 DEX ;reset port BNE RES1 LDA #$FF STA PORTB LDA 20 ADC #120 ;WAIT 2 SECS RES3 CMP 20 BNE RES3 RES2 LDX #INITMSG&255 LDY #INITMSG/256 ;title JSR PRINT RESTART LDX #INITM2&255 LDY #INITM2/256 JSR PRINT LDA #0 STA CTRLS TAX STRL1 JSR MAKE_CLINE ROL CTRLS ;display drives INX CPX #8 BCC STRL1 LDA CTRLS ;make sure there BNE STRL2 ;is at least 1 JMP LOOK_FOR NOCTL LDX #NOCTLM&255 LDY #NOCTLM/256 JSR PRINT JSR KGETCH CMP #'Q BEQ QUITDOS JMP START ; SEXIT LDA #$9B JSR EOUTCH JSR EOUTCH JSR JUNKPAGE JMP START ;exit the formatter ; QUITDOS LDA #$9B JSR EOUTCH JMP EOUTCH ; STRL2 LDX #SELHDM&255 LDY #SELHDM/256 JSR PRINT STRL3 JSR KGETCH AND #$5F CMP #$1B ;get drive BEQ SEXIT ;choice CMP #'Q BEQ QUITDOS CMP #'A BCC STRL3 CMP #'I BCS STRL3 ; STA CURSY SBC #$40 ;(carry is clear) ASL A ASL A ;offset into ASL A ;controller table STA DRIVE TAX LDA $D6AC,X ORA $D6AD,X ;is it valid? BEQ STRL3 ; LDA CURSY ;temp save JSR EOUTCH LDX #CTLIST&255 LDY #CTLIST/256 JSR PRINT STRL5 JSR KGETCH AND #$5F CMP #$1B BNE STRL51 JMP SEXIT STRL51 CMP #'A BCC STRL5 CMP #'J BCS STRL5 PHA JSR EOUTCH LDA #$9B JSR EOUTCH JSR EOUTCH PLA CLC SBC #$40 ASL A TAX LDA FMTTAB+1,X PHA LDA FMTTAB,X PHA LDA #0 STA SELECTION RTS ; FMTTAB .WORD ADAPMFM-1 .WORD ADAPRLL-1 .WORD SEAG225-1 .WORD SEAGATE-1 .WORD MAXTOR-1 .WORD OMTI-1 .WORD SMSQUANTUM-1 .WORD SASIFMT-1 .WORD KONAN-1 ; ; FIVE12 .BYTE "Drive is capable of 512 byte secs only",$9B,0 ONMOTC .BYTE $1B,0,0,0,1,0 SEAINTL .BYTE 0,23,0,15,0,0 SEAMODSELC .BYTE $15,0,0,0,12,0 SEAMODSELD .BYTE 0,0,0,8,0,0,0,0,0,0,1,0 MODSNS .BYTE $1A,0,4,0,$80,0 MODSL .BYTE "Mode Select Command Failed!",$9B,0 FORM1 .BYTE $9B,$9B,"Formatting...",0 FMTABT .BYTE $9B,$9B,"Format Aborted. Press any key...",$9B,0 ; SEAGATE LDA #0 .BYTE $2C SEAG225 LDA #2 .BYTE $2C MAXTOR LDA #4 STA SELECTION CMP #4 ;IS IT SCSI EMBEDDED? BNE SCSIFMT JSR DOIT ;YES, TURN ON MOTOR .WORD $0106,ONMOTC,DATA .IF DEBUG=1 LDA #$9B JSR EOUTCH .ENDIF SCSIFMT JSR DATPAGE LDX DRIVE LDA $D6AB,X AND #$08 LSR A ;get sec size LSR A LSR A CLC ADC #1 STA SEAMODSELD+10 LDA SELECTION CLC ADC SEAMODSELD+10 TAX LDA SEAINTL-1,X STA INTERLEAVE JSR DOIT .WORD $0206,SEAMODSELC,SEAMODSELD BPL SEA0 LDA SEAMODSELD+10 CMP #2 ;DID WE TRY 512? BEQ BADMODSEL INC SEAMODSELD+10 JSR DOIT .WORD $0106,SEAMODSELC,SEAMODSELD BPL ONLY512 BADMODSEL LDX #MODSL&255 LDY #MODSL/256 JSR PRINT JMP REQSNS ; KERROR JSR PRINT JSR KGETCH JMP SEXIT ; SEA0 JSR DOIT ;mode sense .WORD $0106,MODSNS,DATA BPL SEA1 SEA01 LDX #MODSF&255 LDY #MODSF/256 JSR PRINT JMP REQSNS MODSF .BYTE $9B,$9B,"Mode Sense Failed!",$9B,0 ; SEA1 LDA DATA+10 CMP SEAMODSELD+10 BEQ SEA11Q CMP #2 BNE SEA11Q ONLY512 LDX #FIVE12&255 LDY #FIVE12/256 JSR PRINT LDX DRIVE JSR DATPAGE LDA $D6AB,X ;UPDATE ORA #8 ;CFG STA $D6AB,X JSR FIXCRC JMP SCSIFMT SEA11Q LDX DRIVE ;GET HEADS + CYLINDERS JSR DATPAGE LDA DATA+17 ;HEADS ASL A ASL A ASL A ASL A STA DATA LDA #7 ;$D6AE,X ;AND #$0F ;FORCE STEP OF 7 ORA DATA STA $D6AE,X LDA DATA+16 ;CYLINDERS STA $D6AC,X LDA DATA+15 STA $D6AD,X JSR FIXCRC JSR JUNKPAGE ; SEA11 JSR AREYOUSURE BCC SEA12 FMEXIT LDX #FMTABT&255 LDY #FMTABT/256 JMP SEXIT SEA12 LDX #FORM1&255 LDY #FORM1/256 JSR PRINT LDA INTERLEAVE STA SEAFMT+4 JSR DOIT .WORD $0106,SEAFMT,0 SCIENT BMI FORMATBAD JMP SEA2 FORMATBAD LDX #FORBAD&255 LDY #FORBAD/256 JSR PRINT REQSNS LDA #$FF STA SNSBUF STA SNSBUF+12 JSR DOIT .WORD $0106,BIGSNS,SNSBUF BPL SCIEN2 JSR DOIT .WORD $0106,SMALLSNS,SNSBUF BPL SCIEN2 LDX #SNSFAIL&255 LDY #SNSFAIL/256 JMP KERROR SCIEN2 LDA SNSBUF JSR PRINTHEX LDA #', JSR EOUTCH LDA SNSBUF+12 JSR PRINTHEX LDX #ISERM&255 LDY #ISERM/256 JSR PRINT LDA SNSBUF+2 JSR PRINTHEX LDX #ISKEY&255 LDY #ISKEY/256 JMP KERROR ISERM .BYTE " is error code.",$9B,0 ISKEY .BYTE " is sense key.",$9B,0 FORBAD .BYTE $9B,$9B,"Format Command Failed!",$9B,0 COMP1 .BYTE " Done",$9B,$9B,0 SEAFMT .BYTE 4,0,0,0,29,0 ; SEA2 LDX #COMP1&255 LDY #COMP1/256 JSR PRINT JSR SETSCSI JSR READCAP LDA RCAPBUF+6 ;SEE IF SAME SIZE CMP SEAMODSELD+10 BEQ ISOK1 CMP #2 BNE ISOK1 JMP ONLY512 ;NOPE! ISOK1 LDA #0 STA VERTYPE JSR VERIFY VEREND LDX #VERMSG2&255 LDY #VERMSG2/256 JSR PRINT ?VFE1 JSR KGETCH CMP #$9B BNE ?VFE1 RTS ; ; AREYOUSURE LDX #CURINL&255 LDY #CURINL/256 JSR PRINT LDA INTERLEAVE STA 0 LDA #0 STA 1 STA 2 JSR A3DIGPRT LDX #CURIN2&255 LDY #CURIN2/256 JSR PRINT AREYOU1 JSR KGETCH AND #$5F CMP #$1B BEQ AREYOU2 CMP #'A BEQ AREYOU3 CMP #'Y BNE AREYOU1 CLC AREYOU2 PHP JSR EOUTCH PLP RTS AREYOU3 LDX #CURIN3&255 LDY #CURIN3/256 JSR PRINT LDA #5 STA $0342 LDA #SDATADTA&255 STA $0344 STA $F3 LDA #SDATADTA/256 STA $0345 STA $F4 STA $0349 LDA #$0C STA $034A LDX #0 STX $F2 JSR $E456 BMI AYS1 LDA #0 STA $D1FF ;just in case JSR $D800 BCS AYS1 JSR $D9D2 BCS AYS1 LDA $D5 BNE AYS1 LDA $D4 STA INTERLEAVE AYS1 JMP AREYOUSURE CURINL .BYTE " ÛÁÝ Interleave: ",0 CURIN2 .BYTE $9B .BYTE " ÛÙÝ Æïòíáô Hard Disk",$9B,$9B .BYTE "(ÛÅÓÃÝ to abort) Select: ",0 CURIN3 .BYTE "A",$9B,$9B .BYTE "Enter New Interleave (0-42):",$9B,0 ; READCAP JSR DOIT .WORD $090A,RCAPCMD,RCAPBUF BMI ERRDCP1 LDX #DRVCM1&255 LDY #DRVCM1/256 JSR PRINT LDA RCAPBUF+3 STA 0 STA MAXSEC LDA RCAPBUF+2 STA 1 STA MAXSEC+1 LDA RCAPBUF+1 STA 2 STA MAXSEC+2 LDA RCAPBUF+6 CMP #2 BNE RCP1 ASL 0 ;sector # * 2 ROL 1 ROL 2 RCP1 JSR A3DIGPRT LDX #DRVCM2&255 LDY #DRVCM2/256 JSR PRINT LDA RCAPBUF+7 STA 0 LDA RCAPBUF+6 STA 1 LDA #0 STA 2 JSR A3DIGPRT LDX #DRVCM3&255 LDY #DRVCM3/256 JSR PRINT RTS ERRDCP1 LDX #ERRCPM&255 LDY #ERRCPM/256 PLA PLA JSR PRINT JMP REQSNS RCAPCMD .BYTE $25,0,0,0,0,0,0,0,0,0 RCAPBUF .BYTE " " DRVCM1 .BYTE " Drive Capacity:",$9B,"Total Secs: ",0 DRVCM2 .BYTE " Bytes/Sec: ",0 DRVCM3 .BYTE $9B,0 ERRCPM .BYTE $9B,"Read Capacity Command Failed!",$9B,0 ; VERPASS .BYTE $9B,"Verifying Entire Disk.",$9B,"(This will take some time!)",$9B,$9B,0 VERCOMP .BYTE $9B,$9B,"Verify Complete!",$9B,0 BLREASN1 .BYTE $9B,"Reassigning bad sectors...",0 BLREASNM .BYTE " Done!",$9B,0 RESFL .BYTE $9B,"Reassign Blocks command failed!",$9B,0 TOTSECM .BYTE $9B,"Total sectors available: ",0 ATSEC .BYTE "œCurrent Sector: ",0 VERCMD .BYTE $2F,0,0,0,0,0,0,0,1,0 REACMD .BYTE 8,0,0,0,1,0 SMALLSNS .BYTE 3,0,0,0,0,0 BIGSNS .BYTE 3,0,0,0,27,0 SECBAD .BYTE "œSector #",0 SECBAD2 .BYTE " is bad. ($",0 SECBAD3 .BYTE ")",$9B,0 SNSFAIL .BYTE "Request Sense command failed!",$9B,0 TOOMANY .BYTE $9B,"Too many Defects on drive!",$9B,0 ; VERIFY LDA #0 STA DATAPTR ;reset defect STA DATAPTR+1 ;list VERIFY2 LDA #0 STA CURSEC STA CURSEC+1 STA CURSEC+2 STA BADSECTORS STA BADSECTORS+1 STA CURBSECF LDX #VERPASS&255 LDY #VERPASS/256 JSR PRINT JMP VF2 VF1 LDX #VERCOMP&255 LDY #VERCOMP/256 JSR PRINT LDA DATAPTR ORA DATAPTR+1 BNE VF11 VF10 LDX #TOTSECM&255 LDY #TOTSECM/256 JSR PRINT LDA CURSEC STA 0 LDA CURSEC+1 STA 1 LDA CURSEC+2 STA 2 LDX DRIVE LDA $D6AB,X AND #8 BEQ VF10A ASL 0 ROL 1 ROL 2 ;sector x 2 VF10A JSR A3DIGPRT VF11B RTS VF11 LDA VERTYPE ;end of verify BEQ VF11A ;0=seagate CMP #1 ;1=sms quantum BEQ VF10 CMP #3 ;3=xebec BCS VF11B ;or adaptec ; VF11A LDA DATAPTR STA DATA+3 ;defect list length LDA DATAPTR+1 STA DATA+2 LDA #0 ;defects start STA DATA ;at data+4.. there STA DATA+1 ;is a 4 byte header LDX #BLREASN1&255 LDY #BLREASN1/256 JSR PRINT JSR DOIT .WORD 6,SEAREASN,DATA BPL VF12 LDX #RESFL&255 LDY #RESFL/256 PLA PLA JSR PRINT JMP REQSNS VF12 LDX #BLREASNM&255 LDY #BLREASNM/256 JSR PRINT JMP VF10 SEAREASN .BYTE 7,0,0,0,0,0 ; ; VF2 LDX #ATSEC&255 LDY #ATSEC/256 JSR PRINT LDA CURSEC STA 0 ;print current LDA CURSEC+1 ;sector # STA 1 LDA CURSEC+2 STA 2 LDA #0 STA 77 LDX DRIVE LDA $D6AB,X AND #8 BEQ VF02A ASL 0 ROL 1 ROL 2 ;sector x 2 VF02A JSR A3DIGPRT LDA VERTYPE CMP #4 BNE VF20 LDA MAXSEC+2 CMP CURSEC+2 ;do we have BNE VF81 ;256 secs left? LDA MAXSEC+1 SEC SBC CURSEC+1 BEQ VF20 VF81 JSR SDATAEQU ;adaptec verify BCC VF82 VF20 LDA CURSEC STA VERCMD+5 STA REACMD+3 LDA CURSEC+1 STA VERCMD+4 STA REACMD+2 LDA CURSEC+2 STA VERCMD+3 STA REACMD+1 LDA VERTYPE AND #1 ;sms/xebec? BNE ?SF1 LDA SELECTION ;DO READ CMP #2 ;FOR ST225N BNE VF201 ?SF1 JSR DOIT .WORD 6,REACMD,DATA JMP VF202 VF201 JSR DOIT .WORD 10,VERCMD,0 VF202 BMI VF23 VF21 INC CURSEC BNE VF31 VF82 INC CURSEC+1 BNE VF31 INC CURSEC+2 VF31 LDA CURSEC CMP MAXSEC BNE VF32 LDA CURSEC+1 CMP MAXSEC+1 BNE VF32 LDA CURSEC+2 CMP MAXSEC+2 BNE VF32 JMP VF1 VF32 LDA CURSEC BNE VF20 JMP VF2 ; VF23 LDA #0 ;handle defect STA SNSBUF+12 JSR DOIT ;get sense .WORD $0106,BIGSNS,SNSBUF LDA SNSBUF+12 BNE VF25 LDA SNSBUF STA SNSBUF+12 VF25 LDX #SECBAD&255 LDY #SECBAD/256 JSR PRINT LDA #[DATA+4]&255 CLC ADC DATAPTR STA PRTTMP LDA #[DATA+4]/256 ADC DATAPTR+1 STA PRTTMP+1 LDY #0 TYA STA (PRTTMP),Y LDA CURSEC+2 ;hi byte of sec# STA 2 INY STA (PRTTMP),Y LDA CURSEC+1 STA 1 INY STA (PRTTMP),Y LDA CURSEC STA 0 INY STA (PRTTMP),Y LDX DRIVE LDA $D6AB,X AND #8 BEQ SXF1 ASL 0 ROL 1 ROL 2 SXF1 JSR A3DIGPRT LDX #SECBAD2&255 LDY #SECBAD2/256 JSR PRINT LDA SNSBUF+12 AND #$7F JSR PRINTHEX LDX #SECBAD3&255 LDY #SECBAD3/256 JSR PRINT LDA VERTYPE CMP #1 ;quantum BEQ VF91 CMP #3 ;xebec BEQ VERX1 CMP #4 ;adaptec BEQ ADAP1 LDA #4 VF91 CLC ADC DATAPTR STA DATAPTR LDA DATAPTR+1 ADC #0 STA DATAPTR+1 CMP #4 BCS VF26 JMP VF21 VF26 LDX #TOOMANY&255 LDY #TOOMANY/256 PLA PLA JMP KERROR ; ADAP1 JMP ADAP2 ;br range ; VERX1 LDA MAXSEC SEC SBC CURSEC TAX LDA MAXSEC+1 ;see if we're SBC CURSEC+1 ;close to limit BNE VERX2 LDA MAXSEC+2 SBC CURSEC+2 BNE VERX2 CPX SECSTRK BCS VERX2 LDA CURSEC STA MAXSEC LDA CURSEC+1 SBC #0 STA MAXSEC+1 LDA CURSEC+2 SBC #0 STA MAXSEC+2 JMP VF1 VERX2 LDX #2 LDY #0 VERX3 LDA CURSEC,X STA FMALTRKC+1,Y LDA MAXSEC,X STA DATA,Y INY DEX BPL VERX3 LDA CURSEC+2 ORA CURSEC+1 BNE VER3X2 LDA CURSEC CMP SECSTRK BCC VER3X1 VER3X2 LDA CURSEC SEC SBC SECSTRK STA CURSEC LDA CURSEC+1 SBC #0 STA CURSEC+1 LDA CURSEC+2 SBC #0 STA CURSEC+2 ;Verify ALL! VER3X1 LDA INTERLEAVE STA FMALTRKC+4 LDX DRIVE LDA $D6AE,X AND #$0F STA FMALTRKC+5 JSR DOIT .WORD $0106,DEFLIMC,DEFLIMB JSR DOIT .WORD $0106,FMALTRKC,DATA BPL VERX4 LDX #FMALTM&255 LDY #FMALTM/256 PLA PLA JSR PRINT JMP REQSNS FMALTM .BYTE $9B,"Format Alternate Track command failed!",$9B,0 FMALTRKC .BYTE $0E,0,0,0,0,0 ; VERX4 SEC LDA MAXSEC SBC SECSTRK STA MAXSEC LDA MAXSEC+1 SBC #0 STA MAXSEC+1 LDA MAXSEC+2 SBC #0 STA MAXSEC+2 JMP VF21 ; ADAP2 LDA CURSEC STA XLATCMD+3 LDA CURSEC+1 STA XLATCMD+2 LDA CURSEC+2 STA XLATCMD+1 JSR DOIT .WORD $0706,XLATCMD,XLATBUF BPL ADAP3 INC BADSECTORS BNE ADAP2A INC BADSECTORS+1 ADAP2A LDX #BADSECM2&255 LDY #BADSECM2/256 JSR PRINT JMP VF21 BADSECM2 .BYTE " Bad sector header: cannot reassign",$9B,0 XLATCMD .BYTE $0F,0,0,0,0,0 XLATBUF .BYTE " " ADAP3 LDA DATAPTR+1 LDX #$FF STX CURBSECF CMP #4 ;>128 defects? BCC ADAP3A JMP VF26 ADAP3A LDA DATAPTR CLC ADC #[DATA+4]&255 STA PRTTMP LDA DATAPTR+1 ADC #[DATA+4]/256 STA PRTTMP+1 LDA DATAPTR CLC ADC #8 STA DATAPTR LDA DATAPTR+1 ADC #0 STA DATAPTR+1 LDY #7 ADAP3B LDA XLATBUF,Y ;add def. STA (PRTTMP),Y ;to list DEY BPL ADAP3B SORT_DEF LDA #[DATA+4]&255 STA PTR1 LDA #[DATA+4]/256 STA PTR1+1 LDA #[DATA+12]&255 STA PTR2 LDA #[DATA+12]/256 STA PTR2+1 LDA #0 STA SORTED LDA DATAPTR+1 STA TEMP LDA DATAPTR LSR TEMP ROR A LSR TEMP ROR A ;get # of defects LSR TEMP ;by dividing ROR A ;dataptr by 8 STA TEMP DEC TEMP BEQ SORT1 SORT2 LDY #0 SORT3 LDA (PTR1),Y CMP (PTR2),Y BNE SORT4 INY CPY #8 ;we will hopefully BCC SORT3 ;never have 2 BCS SORT5 ;the same, but! SORT4 BCC SORT5 LDY #7 SORT4A LDA (PTR1),Y TAX LDA (PTR2),Y STA (PTR1),Y TXA STA (PTR2),Y DEY BPL SORT4A STY SORTED SORT5 CLC LDA PTR1 ADC #8 STA PTR1 BCC SORT5A INC PTR1+1 SORT5A CLC LDA PTR2 ADC #8 STA PTR2 BCC SORT5B INC PTR2+1 SORT5B DEC TEMP BNE SORT2 SORT1 LDA SORTED BNE SORT_DEF JMP VF21 ; ; QUANTINT .BYTE 23,0,11 SMSQUANTUM JSR DATPAGE LDX DRIVE LDA $D6AB,X AND #8 ;get sec size LSR A LSR A STA SMSFMT+5 STA REACMD+5 ;for verify TAX LDA QUANTINT,X STA INTERLEAVE LDX #QTYPE&255 LDY #QTYPE/256 JSR PRINT SMS1 JSR KGETCH AND #$7F CMP #$1B BNE SMS2 SMS0 JMP SEXIT SMS2 CMP #'1 BCC SMS1 CMP #'9 BCS SMS1 PHA JSR EOUTCH LDA #$9B JSR EOUTCH JSR EOUTCH CLC PLA SBC #$30 ;-$31 STA CURSY LDX DRIVE LDA $D6AB,X AND #8 ORA CURSY ASL A ASL A TAX LDA QMAXTAB,X STA MAXSEC LDA QMAXTAB+1,X STA MAXSEC+1 LDA QMAXTAB+2,X STA MAXSEC+2 JSR AREYOUSURE BCC SMS3 JMP FMEXIT SMS3 LDX #FORM1&255 LDY #FORM1/256 JSR PRINT LDA INTERLEAVE STA SMSFMT+4 JSR DOIT .WORD $0106,SMSFMT,0 BPL SMS4 JMP FORMATBAD SMS4 LDX #COMP1&255 LDY #COMP1/256 JSR PRINT LDX DRIVE LDA $D6AB,X AND #8 ;check sec size BEQ SMS41 LDA $D6AE,X AND #$F0 ;set step rate ORA #2 ;to 2 so we can STA $D6AE,X ;read 512 bytes JSR SETSASI JMP SMS42 SMS41 JSR SETSCSI SMS42 LDA #1 STA VERTYPE ;for sms LDX #SECSTVM&255 LDY #SECSTVM/256 JSR PRINT LDA MAXSEC STA 0 LDA MAXSEC+1 STA 1 LDA MAXSEC+2 STA 2 LDX DRIVE LDA $D6AB,X AND #8 BEQ SXF2 ASL 0 ROL 1 ROL 2 SXF2 JSR A3DIGPRT JSR VERIFY ;do tot secs LDX #VERMSG2&255 LDY #VERMSG2/256 JSR PRINT LDA DATAPTR STA 0 ;# of bad sectors LDA DATAPTR+1 STA 1 ORA 0 BEQ SMS5 LDA #0 STA 2 LDX DRIVE LDA $D6AB,X AND #8 BEQ SXF3 ASL 0 ROL 1 SXF3 LDX #QBAD&255 LDY #QBAD/256 JSR PRINT JSR A3DIGPRT LDX #QBAD2&255 LDY #QBAD2/256 JSR PRINT SMS5 JSR KGETCH CMP #$9B BNE SMS5 RTS ; QTYPE .BYTE "Select Hard Disk:",$9B .BYTE " Û±Ý SA1002 ÛµÝ Q2010",$9B .BYTE " Û²Ý SA1004 Û¶Ý Q2020",$9B .BYTE " Û³Ý SA1104 Û·Ý Q2040",$9B .BYTE " Û´Ý SA1106 Û¸Ý Q2080",$9B .BYTE $9B,"Select (1-8): ",0 QMAXTAB .WORD 16383,0 ;sa1002 .WORD 32767,0 ;sa1004 .WORD 63359,0 ;sa1104 .WORD 40063,1 ;sa1106 .WORD 32767,0 ;q2010 .WORD 65535,0 ;q2020 .WORD 65535,1 ;q2040 .WORD 383,4 ;q2080 .WORD 8703,0,17407,0,33659,0,56099,0,17407,0,34815,0,$0FFF,1,$20CB,2 QBAD .BYTE $9B,"Your drive has ",0 QBAD2 .BYTE " bad sectors.",$9B .BYTE "Use the FMTDIR.COM program to map",$9B .BYTE "them out at the DOS level.",$9B,0 SMSFMT .BYTE 4,0,0,0,0,0 SECSTVM .BYTE $9B,"Sectors to verify: ",0 REMM1 .BYTE "Are you using removable disks?",0 ; SETSASI LDA #$10 .BYTE $2C SETSCSI LDA #0 LDX DRIVE EOR $D6AB,X AND #$10 EOR $D6AB,X STA $D6AB,X ; FIXCRC LDA #0 TAX TAY CLC FXC1 ADC $D600,Y PHA TXA ADC #$0E EOR $D600,Y TAX PLA INY CPY #$FE BCC FXC1 STX $D6FE STA $D6FF RTS ; KONAN LDX DRIVE LDA $D6AB,X AND #8 BEQ SAS1 LDA #18 LDY #17 BNE SAS2 SASIFMT LDX DRIVE LDA $D6AB,X AND #8 BEQ SAS1 LDA #17 ;secs/trk LDY #16 ;interleave BNE SAS2 SAS1 LDA #32 LDY #29 SAS2 STY INTERLEAVE STA SECSTRK LDA $D6AD,X STA DATA LDA $D6AC,X STA DATA+1 ;set up LDA $D6AE,X ;define limits LSR A ;parm block LSR A LSR A LSR A STA DATA+2 LDA $D6B0,X STA DATA+3 LDA $D6AF,X STA DATA+4 LDA $D6B2,X STA DATA+5 LDA $D6B1,X STA DATA+6 LDA #11 STA DATA+7 ;ecc length LDA $D6AE,X AND #$0F STA DATA+8 ;the rest for konan LDA #18 STA DATA+9 LDA #0 LDY #5 KON1 STA DATA+10,Y DEY BPL KON1 LDA SECSTRK CMP #18 BNE KON2 JSR DOIT .WORD $0106,KDEFLIMC,DATA JMP KON3 KON2 JSR DOIT .WORD $0106,DEFLIMC,DATA KON3 BPL ?SAS3 LDX #DEFFAI&255 LDY #DEFFAI/256 JSR PRINT JMP REQSNS DEFFAI .BYTE $9B,"Initialize Drive command failed!",$9B,0 DEFLIMC .BYTE $0C,0,0,0,0,0 KDEFLIMC .BYTE $11,0,0,0,0,0 SASFMT .BYTE 4,0,0,0,0,0 DEFLIMB .BYTE "" ; SAS5 JMP FORMATBAD SAS4 JMP FMEXIT ?SAS3 LDY #7 ?PA1 LDA DATA,Y STA DEFLIMB,Y DEY BPL ?PA1 SAS3 JSR AREYOUSURE BCS SAS4 LDA INTERLEAVE STA SASFMT+4 LDX #FORM1&255 LDY #FORM1/256 JSR PRINT JSR DOIT .WORD $0106,SASFMT,0 BMI SAS5 LDX #COMP1&255 LDY #COMP1/256 JSR PRINT LDA #1 STA DATA+7 ;SET ECC TO 1 JSR DOIT .WORD $0106,DEFLIMC,DATA LDA #$FF ;set to -1 STA MAXSEC STA MAXSEC+1 STA MAXSEC+2 SAS6 LDX DATA+2 ;# of heads SAS6A CLC LDA MAXSEC ADC SECSTRK STA MAXSEC BCC SAS6B INC MAXSEC+1 BNE SAS6B INC MAXSEC+2 SAS6B DEX BNE SAS6A LDA DATA+1 ;cylinders BNE SAS6C DEC DATA ;high byte SAS6C DEC DATA+1 LDA DATA ORA DATA+1 BNE SAS6 ;figure # of secs JSR SETSASI LDX #SECSTVM&255 LDY #SECSTVM/256 JSR PRINT LDA MAXSEC STA 0 LDA MAXSEC+1 STA 1 LDA MAXSEC+2 STA 2 LDX DRIVE LDA $D6AB,X AND #8 BEQ SXF5 ASL 0 ROL 1 ROL 2 SXF5 JSR A3DIGPRT LDA #3 STA VERTYPE JSR VERIFY JMP VEREND ; STEPTL .BYTE 48,32,16,136,208,188,44,150,32,248,0,0,0,0,0,0 STEPTH .BYTE 117,78,39,19,7,2,1,0,78,42,0,0,0,0,0,0 ;3ms,2ms,1ms,500us,200us,70us,30us,15us,2ms,1.1ms ; OMTI LDA #0 STA INTERLEAVE ;not used JSR DOIT .WORD $0106,OMTISNS,DATA BPL OMT1 JMP SEA01 OMTISNS .BYTE $1A,0,0,0,$FF,0 OMTISEL .BYTE $15,$10,0,0,32,0 OMTIPARM .BYTE 0,0,0,8 .BYTE 0,0,0,0,0,0,2,0 ;DENSITY PAGE4 .BYTE 4,$12,0,0,0,0,0,0 ;CYLS, HDS, WPC .BYTE 0,0,0,0,0,0,0,0 ;MORE JUNK .BYTE 0,0,0,0 ; OMT1 LDX DRIVE LDA $D6AB,X AND #8 BNE OMT1A LDX #CTRL512&255 LDY #CTRL512/256 JSR PRINT LDX DRIVE LDA $D6AB,X ;UPDATE ORA #8 ;CFG STA $D6AB,X JSR FIXCRC OMT1A LDX DRIVE LDA $D6AC,X STA PAGE4+4 ;cylinders CLC ADC #10 STA PAGE4+16 LDA $D6AD,X STA PAGE4+3 ADC #0 STA PAGE4+15 LDA $D6AE,X LSR A LSR A LSR A LSR A STA PAGE4+5 ;heads LDA $D6AF,X STA PAGE4+11 LDA $D6B0,X ;reduce write cur STA PAGE4+10 LDA $D6B1,X STA PAGE4+8 LDA $D6B2,X ;write precomp STA PAGE4+7 LDA $D6AE,X AND #$0F TAY LDA STEPTL,Y STA PAGE4+13 ;step rate LDA STEPTH,Y STA PAGE4+12 ; JSR DOIT .WORD $06,OMTISEL,OMTIPARM BPL OMT2 JMP BADMODSEL OMT3 JMP FMEXIT OMT2 JSR AREYOUSURE BCS OMT3 LDX #FORM1&255 LDY #FORM1/256 JSR PRINT ;fmt with no defects JSR DOIT .WORD $0106,OMTIFMT,TESTBUF BPL OMT4 OMT6 JMP SCIENT OMT4 LDX #COMP1&255 LDY #COMP1/256 JSR PRINT JSR SETSCSI JSR READCAP LDA #0 STA VERTYPE JSR VERIFY LDA DATAPTR ORA DATAPTR+1 ;any bad secs? BEQ OMT5 LDX #REFM1&255 LDY #REFM1/256 JSR PRINT JSR DOIT .WORD $0106,OMTIREF,TESTBUF BMI OMT6 BPL OMT4 OMT5 JMP VEREND ; OMTIFMT .BYTE 4,$18 TESTBUF .BYTE 0,0,0,0 REFM1 .BYTE $9B,$9B,"Reformatting...",0 CTRL512 .BYTE "Controller must use 512 byte sectors.",$9B,$9B,0 OMTIREF .BYTE 4,$15,0,0,0,0 ; ADAPFMT .BYTE 4,$1C,0,0,0,0 ADAPMODSEL .BYTE $15,0,0,0,$16,0 ADAPARMS .BYTE 0,0,0,8 .BYTE 0,0,0,0,0,0,1,0 ;SECSIZE .BYTE 1,0,0,0,0,0,0,0 .BYTE 0,0,0,0 ADAINT .BYTE 26,12,37,18 ; ADAPMFM LDA #0 .BYTE $2C ADAPRLL LDA #2 PHA LDX DRIVE LDA $D6AB,X LSR A LSR A ;get secsize LSR A AND #1 CLC ADC #1 STA ADAPARMS+10 PLA CLC ADC ADAPARMS+10 TAY LDA ADAINT-1,Y STA INTERLEAVE LDA $D6AC,X STA ADAPARMS+14 LDA $D6AD,X ;cylinders STA ADAPARMS+13 LDA $D6AE,X LSR A LSR A LSR A ;heads LSR A STA ADAPARMS+15 LDA $D6AE,X AND #$0F BEQ ADA1 LDA #1 ;step rate ADA1 STA ADAPARMS+21 LDA $D6AF,X STA ADAPARMS+17 ;RWC LDA $D6B0,X STA ADAPARMS+16 LDA $D6B1,X ;WPC STA ADAPARMS+19 LDA $D6B2,X STA ADAPARMS+18 LDY #19 ADA11 LDA SDATAHDR,Y STA SDATADTA,Y DEY BPL ADA11 INY ;y=0 LDA #$6C ADA12 STA SDATADTA+20,Y STA SDATADTA+$0100+20,Y INY BNE ADA12 LDX #REMM1&255 LDY #REMM1/256 JSR PRINT JSR KGETCH ;removable? CMP #'Y BEQ ADA13 LDA #'N ADA13 PHA JSR EOUTCH LDA #$9B JSR EOUTCH LDA #$9B JSR EOUTCH PLA CMP #'Y BEQ ADA14 LDA #1 .BYTE $2C ADA14 LDA #2 STA ADAPARMS+12 JSR DOIT .WORD $0106,ADAPMODSEL,ADAPARMS BPL ADA2 JMP BADMODSEL ADA3 JMP FMEXIT ADA2 JSR AREYOUSURE BCS ADA3 LDX #FORM1&255 LDY #FORM1/256 JSR PRINT LDA INTERLEAVE STA ADAPFMT+4 LDA #0 STA DATA ;init to 0 STA DATA+1 ;defects STA DATA+2 STA DATA+3 STA DATAPTR STA DATAPTR+1 ADA4 JSR DOIT .WORD $0106,ADAPFMT,DATA BMI ADA9 LDX #COMP1&255 LDY #COMP1/256 JSR PRINT JSR SETSCSI JSR READCAP LDA #4 STA VERTYPE JSR VERIFY2 LDA DATAPTR STA DATA+3 LDA DATAPTR+1 STA DATA+2 LDA CURBSECF BEQ ADA5 LDX #REFM2&255 LDY #REFM2/256 JSR PRINT JSR DOIT .WORD $0106,ADAPMODSEL,ADAPARMS BMI ADA8 JMP ADA4 ADA8 JMP BADMODSEL ADA9 JMP FORMATBAD REFM2 .BYTE $9B,"Media Defects found.",$9B,$9B,"Reformatting...",0 ADA5 JSR READCAP LDX #VERMSG2&255 LDY #VERMSG2/256 JSR PRINT LDA BADSECTORS STA 0 LDA BADSECTORS+1 STA 1 ORA 0 BEQ ADA6 LDA #0 STA 2 LDX DRIVE LDA $D6AB,X AND #8 BEQ SXF6 ASL 0 ROL 1 ROL 2 SXF6 LDX #QBAD&255 LDY #QBAD/256 JSR PRINT JSR A3DIGPRT LDX #QBAD2&255 LDY #QBAD2/256 JSR PRINT ADA6 JSR KGETCH CMP #$9B BNE ADA6 RTS ; SDATAEQU LDA CURSEC STA SDATACMD+5 LDA CURSEC+1 STA SDATACMD+4 LDA CURSEC+2 STA SDATACMD+3 LDX DRIVE LDA $D6AB,X LSR A LSR A LSR A AND #1 CLC ADC #1 STA SDATADTA+12 STA SDATADTA+18 STA SDATADTA+2 JSR DOIT .WORD $010A,SDATACMD,SDATADTA BMI SDE1 CLC RTS SDE1 SEC RTS SDATACMD .BYTE $31,$10,0,0,0,0,0,1,0,0 SDATAHDR .BYTE 0,0,0,0,0,0,0,0 .BYTE 0,0,1,0,1,6,0,0 .BYTE 0,0,1,0 ; INQCMD .BYTE $12,0,0,0,$7F,0 LOOKM1 .BYTE "œNo drives configured! Looking on bus.",$9B,0 LOOKM2 .BYTE $9B,"Sorry, no drives found!",$9B,0 LOOKM3 .BYTE "Found x: ",0 ; LOOK_FOR LDA #0 STA DRIVE STA TEMP LDX #LOOKM1&255 LDY #LOOKM1/256 JSR PRINT LF01 LDX DRIVE JSR DATPAGE LDA $D6AB,X AND #$E0 BNE LF03 ;skip if lun<>0 JSR DOIT .WORD $8106,INQCMD,DATA BPL LF02 LF03 CLC LDA DRIVE ADC #8 STA DRIVE CMP #64 BCC LF01 LDA TEMP BEQ LF09 JMP RESTART LF09 LDX #LOOKM2&255 LDY #LOOKM2/256 JSR PRINT JMP NOCTL LF02 LDX DRIVE JSR DATPAGE LDA #1 STA $D6AC,X STA TEMP JSR FIXCRC LDA DRIVE LSR A LSR A LSR A CLC ADC #'A STA LOOKM3+6 LDX #LOOKM3&255 LDY #LOOKM3/256 JSR PRINT LF04 LDY #8 LF04A STY DATA LDA DATA,Y CMP #$20 BCS LF05 LDA #$20 LF05 JSR EOUTCH LDY DATA INY CPY #32 BCC LF04A LDA #$9B JSR EOUTCH JMP LF03 ; CHKINTER LDA INTERLEAVE STA 0 LDA #0 STA 1 STA 2 JSR A3DIGPRT LDY #$0B CH1 LDA P300,Y STA $0300,Y DEY BPL CH1 JSR $E459 LDA #0 STA 20 STA 19 ; CH2 LDA #$40 STA $0303 JSR $E459 BPL CH3 BRK CH3 LDY #0 CH4 LDA $6000,Y NOP STA $6000,Y INY BNE CH4 INC $0300+10 BNE CH2 LDA 20 STA 0 LDA 19 STA 1 LDA #0 STA 2 JSR A3DIGPRT LDA #$9B JSR EOUTCH INC INTERLEAVE LDA INTERLEAVE CMP #40 BCS CH0 JMP CHKINTER2 CH0 BRK P300 .BYTE $31,3,$52,$40 .WORD DATA .BYTE 1,0,0,1,1,0 ; CHKINTER2 ; .OPT LIST .OPT NO LIST *= $02E0 .WORD INIT