10 ;SAVE#D5:B>HDFMT.M65›20 ;ASM#d5:b>hdfmt.m65,,#D5:B>HDFMT.OBJ›30 DEBUG = 0›40 *= $4FFF ;03/04/94›50 .OPT NO LIST›60 RTS ›70 INIT LDA #$38›80 STA PIAPCA›90 LDA #$FF›0100 STA RAMPAGE›0110 STA VPCR›0120 STA VPORTB›0130 LDX #$0D›0140 STX VDDRB›0150 DEX ›0160 STX VPORTB›0170 LDA #$90›0180 STA VPIER›0190 LDA #$EF›0200 STA VPCR›0210 LDA #0›0220 STA VPACR›0230 LDA #$3C›0240 STA PIAPCA›0250 LDA #$FF›0260 STA RAMPAGE›0270 JSR SETINP›0280 JSR START›0290 LDA #$FF›0300 STA RAMPAGE›0310 LDA #4›0320 SEI ›0330 STA $D1FF›0340 LDX $D802 ;GET VERSION #›0350 LDA #0›0360 STA $D1FF ;FIX FOR OLDER›0370 CLI ;ONES...›0380 CPX #6›0390 BCS ?QUIT›0400 LDA #$0C›0410 STA VDDRB›0420 ?QUIT JMP ($0A)›0430 BRK ›0440 ;›0450 DEVMSK = $0247›0460 RAMPAGE = $D1BC›0470 PIAPORTB = $D1BE›0480 PIAPCA = $D1BD›0490 PIAPRB = $D1BE›0500 PIAPCB = $D1BF›0510 VPORTB = $D170›0520 VDDRB = $D172›0530 VPACR = $D17B›0540 VPCR = $D17C›0550 VPIER = $D17E›0560 ;Zero-page equates›0570 ;›0580 SCSIID = $36›0590 ZWTEMP1 = $32›0600 ZPTMP1 = $31›0610 ZPTMP2 = $34›0620 ZPTMP3 = $35›0630 SECH512 = $30›0640 ;›0650 PRTTMP = $E4›0660 PTR1 = $E6›0670 PTR2 = $E8›0680 ;›0690 ; PIA Equates:›0700 PORTA = $D171›0710 PORTB = $D170›0720 DDRA = $D173›0730 PPCR = $D17C›0740 ;›0750 SDATADTA = $4800›0760 DATA = $4C00›0770 PTEMP .DS 40›0780 ;›0790 STACK .DS 1›0800 RETRYS .DS 1›0810 BYTES .DS 1›0820 CURSY .DS 1›0830 CTRLS .DS 1›0840 DRIVE .DS 1›0850 HDRLOC .DS 2›0860 DATLOC .DS 2›0870 INTERLEAVE .DS 1›0880 MAXSEC .DS 3›0890 CURSEC .DS 3›0900 SECSLFT .DS 3›0910 DATAPTR .DS 2›0920 VERTYPE .DS 1›0930 SNSBUF .DS 28›0940 SECSTRK .DS 1›0950 BADSECTORS .DS 2›0960 SORTED .DS 1›0970 TEMP .DS 1›0980 CURBSECF .DS 1›0990 SELECTION .DS 1›1000 ;›1010 ;Select controller›1020 ; A=scsi # <0=7>›1030 SEL_CTRL STA ZPTMP1›1040 LDA PPCR›1050 ORA #$0F›1060 STA PPCR ;kill any handshake›1070 LDA #$0C›1080 STA VDDRB›1090 .IF DEBUG=1›1100 LDA #'S›1110 JSR EOUTCH›1120 .ENDIF ›1130 BIT PORTB ;are we busy?›1140 BVS S_C1›1150 LDX #$F7 ;do a RESET›1160 STX PORTB›1170 S_C5 DEX ›1180 BNE S_C5 ;pause a little›1190 LDA #$FF ;maybe this will›1200 STA PORTB ;wake ctrlr up›1210 TAX ›1220 TAY ›1230 S_C4 NOP ›1240 NOP ;waste cycles›1250 NOP ›1260 NOP ›1270 NOP ›1280 NOP ›1290 DEX ›1300 BNE S_C4›1310 DEY ›1320 BNE S_C4›1330 BIT PORTB ;let's look again›1340 BVS S_C1 ;yep, all ok›1350 LDY #142 ;else bus›1360 RTS ;'overrun'..›1370 S_C1 JSR SETOUT ;set data out›1380 LDX ZPTMP1›1390 LDA BITTAB,X›1400 STA PORTA›1410 LDA #$FB ;lower /SEL›1420 STA PORTB›1430 LDX #0›1440 LDY #$80›1450 S_C2 BIT PORTB›1460 BVC S_C3 ;is it busy?›1470 INX ›1480 BNE S_C2 ;nope, loop›1490 INY ›1500 BNE S_C2›1510 BUSERR LDA #$FF›1520 STA PORTB ;oh well,›1530 LDA PPCR›1540 ORA #$0F›1550 STA PPCR›1560 S_C8 LDX #$0D›1570 STX VDDRB ;KEEP TERMINATION›1580 DEX ›1590 STX PORTB ;COOL›1600 JSR SETINP ;give up›1610 LDY #138›1620 RTS ›1630 S_C3 LDA #$FF›1640 STA PORTB›1650 TAY ›1660 TAX ›1670 S_C6 LDA PORTB ;wait for›1680 AND #$82 ;REQ and C/D›1690 BEQ S_C7 ;to assert›1700 DEX ›1710 BNE S_C6›1720 DEY ›1730 BNE S_C6›1740 BEQ S_C8›1750 S_C7 .IF DEBUG=1›1760 LDA #'Ó›1770 JSR EOUTCH›1780 .ENDIF ›1790 LDY #1 ;y=0, success!›1800 RTS ›1810 ;›1820 BITTAB .BYTE 1,2,4,8,$10,$20,$40,$80›1830 ;›1840 SETINP PHA ;set direction›1850 LDA #0 ;of data bus›1860 BEQ SETINP1›1870 SETOUT PHA ›1880 LDA #$FF›1890 SETINP1 STA DDRA›1900 PLA ›1910 RTS ›1920 ;›1930 SND_CMD STX ZWTEMP1 ;send cmd›1940 STY ZWTEMP1+1 ;frame›1950 STA BYTES›1960 JSR SETOUT›1970 .IF DEBUG=1›1980 LDA #'C›1990 JSR EOUTCH›2000 .ENDIF ›2010 ; LDA PPCR›2020 ; AND #$F0 ;enable›2030 ; ORA #9 ;handshake›2040 ; STA PPCR›2050 JSR WAITREQ›2060 LDY #0›2070 SN_C1 LDX #0›2080 SN_C2 LDA PORTB›2090 BPL SN_C21›2100 BIT PORTB›2110 BVS SN_C4›2120 BVC SN_C2 ;branch›2130 SN_C21 AND #2›2140 BNE SN_C22 ;oops, data mode›2150 LDA (ZWTEMP1),Y›2160 STA PORTA›2170 JSR FIXSCSI›2180 INY ›2190 CPY BYTES›2200 BNE SN_C1 ;always loop›2210 SN_C22 .IF DEBUG=1›2220 LDA #'Û2230 JSR EOUTCH›2240 .ENDIF ›2250 LDY #1›2260 RTS ›2270 SN_C4 JMP BUSERR›2280 ;›2290 ;›2300 RWDATA›2310 STX ZWTEMP1›2320 STY ZWTEMP1+1›2330 JSR FIXALF›2340 TYA ›2350 ORA ZWTEMP1›2360 BNE RWD1›2370 RTS ;no data›2380 RWD1 .IF DEBUG=1›2390 LDA #'R›2400 JSR EOUTCH›2410 .ENDIF ›2420 JSR WAITREQ›2430 LDA PORTB›2440 LSR A›2450 BCS RW_DD2 ;writes›2460 JSR SETINP›2470 JSR FIXALF›2480 JMP RW_DA1 ;branch to reads›2490 ;›2500 RW_DD2 LDY #0 ;put data code›2510 RW_CC2 LDA PORTB›2520 BPL RW_CC3›2530 BIT PORTB›2540 BVS RW_CC4›2550 BVC RW_CC2 ;branch›2560 RW_CC3 AND #2 ;command or data?›2570 BEQ RW_DD3 ;out of data›2580 LDA (ZWTEMP1),Y›2590 STA PORTA›2600 INY ›2610 BNE RW_CC2›2620 INC ZWTEMP1+1›2630 BNE RW_CC2 ;branch›2640 ;›2650 RW_DD3 TYA ›2660 .IF DEBUG=1›2670 PHA ›2680 LDA #'×›2690 JSR EOUTCH›2700 PLA ›2710 .ENDIF ›2720 LDY #1›2730 RTS ›2740 ;›2750 RW_CC4 JMP BUSERR›2760 ;›2770 RW_DA1 .IF DEBUG=1›2780 LDA #'r›2790 JSR EOUTCH›2800 .ENDIF ›2810 LDY #0›2820 RW_DA2 LDX #0›2830 RW_DA3 LDA PORTB ;get data code›2840 BPL RW_DA4›2850 BIT PORTB›2860 BVS RW_CC4›2870 INX ›2880 BEQ RW_CC4›2890 BNE RW_DA3›2900 RW_DA4 AND #2›2910 BEQ RW_DA5›2920 LDA PORTA›2930 STA (ZWTEMP1),Y›2940 INY ›2950 BNE RW_DA3 ;in place of DA2›2960 INC ZWTEMP1+1›2970 BNE RW_DA3 ;branch›2980 ;›2990 RW_DA5 JSR FIXALF›3000 TYA ›3010 .IF DEBUG=1›3020 PHA ›3030 LDA #'Ò›3040 JSR EOUTCH›3050 PLA ›3060 .ENDIF ›3070 LDY #0›3080 RTS ›3090 ;›3100 GETSTAT JSR SETINP›3110 LDA PPCR›3120 ORA #$0F›3130 STA PPCR›3140 .IF DEBUG=1›3150 LDA #'E›3160 JSR EOUTCH›3170 .ENDIF ›3180 JSR WAITREQ›3190 LDA PORTA ;status byte›3200 STA ZPTMP2›3210 JSR FIXSCSI›3220 JSR WAITREQ›3230 ; LDA PORTA ;toss 2nd stat›3240 JSR FIXSCSI›3250 JSR BUSERR ;release bus›3260 LDA ZPTMP2›3270 AND #$0A›3280 BEQ GE_ST1›3290 .IF DEBUG=1›3300 LDA #'å›3310 JSR EOUTCH›3320 .ENDIF ›3330 LDY #144›3340 RTS ›3350 GE_ST1 .IF DEBUG=1›3360 LDA #'Å›3370 JSR EOUTCH›3380 .ENDIF ›3390 LDY #1›3400 RTS ›3410 ;›3420 FIXSCSI LDA PPCR›3430 AND #$FD›3440 STA PPCR›3450 FIXSC1 BIT PORTB›3460 BPL FIXSC1›3470 ORA #2›3480 STA PPCR›3490 RTS ›3500 ;›3510 WAITREQ LDA #0›3520 TAX ›3530 LDY #0 ;5 min timeout›3540 WA_R1 BIT PORTB ;wait for REQ›3550 BVS WA_R2 ;not busy›3560 BMI WA_R3›3570 RTS ;got it!›3580 WA_R3 JMP WA_R1 ;LOOP FOREVER›3590 ; ADC #1›3600 ; BNE WA_R1›3610 ; INX›3620 ; BNE WA_R1›3630 ; INY›3640 ; BNE WA_R1›3650 WA_R2 PLA ›3660 PLA ›3670 JMP BUSERR›3680 ;›3690 FIXALF›3700 LDA #$EF›3710 STA PPCR›3720 LDA #$E9›3730 STA PPCR ;FIX ACK PROBLEM›3740 RTS ›3750 ;›3760 DOIT PLA ›3770 STA PRTTMP›3780 PLA ›3790 STA PRTTMP+1›3800 LDY #1›3810 LDA (PRTTMP),Y›3820 STA BYTES›3830 INY ›3840 LDA (PRTTMP),Y›3850 STA RETRYS›3860 INY ›3870 LDA (PRTTMP),Y›3880 STA HDRLOC›3890 INY ›3900 LDA (PRTTMP),Y›3910 STA HDRLOC+1›3920 INY ›3930 LDA (PRTTMP),Y›3940 STA DATLOC›3950 INY ›3960 LDA (PRTTMP),Y›3970 STA DATLOC+1›3980 TYA ›3990 CLC ›4000 ADC PRTTMP›4010 TAY ›4020 LDA PRTTMP+1›4030 ADC #0›4040 PHA ›4050 TYA ›4060 PHA ›4070 JSR DATPAGE›4080 LDA HDRLOC›4090 STA PRTTMP›4100 LDA HDRLOC+1›4110 STA PRTTMP+1›4120 DOI3 LDY #1›4130 LDA (PRTTMP),Y›4140 AND #$1F›4150 STA (PRTTMP),Y›4160 LDX DRIVE›4170 LDA $D6AB,X›4180 AND #$E0›4190 ORA (PRTTMP),Y›4200 STA (PRTTMP),Y ;set LUN #›4210 LDA $D6AB,X›4220 AND #7›4230 JSR SEL_CTRL›4240 BMI DOI1›4250 LDX HDRLOC›4260 LDY HDRLOC+1›4270 LDA BYTES›4280 JSR SND_CMD›4290 BMI DOI2›4300 ; LDY #0 ;is this a›4310 ; LDA (ZWTEMP1),Y ;REQ sns?›4320 ; CMP #3 ;(seagate bug)›4330 ; BNE ?SEAF1›4340 JSR WAITREQ ;wait for req›4350 BMI DOI2›4360 ?SEAF1 LDX DATLOC›4370 LDY DATLOC+1›4380 JSR RWDATA›4390 BMI DOI2›4400 JSR GETSTAT›4410 BPL DOI2A›4420 DOI2 ASL RETRYS ;can bit 7›4430 LSR RETRYS›4440 DEC RETRYS ;retry 2x›4450 BPL DOI3›4460 DOI2A RTS ›4470 DOI1 BIT RETRYS›4480 BMI DOI2A›4490 LDX #NOCTRLM2&255›4500 LDY #NOCTRLM2/256›4510 JSR PRINT›4520 LDX STACK›4530 TXS ›4540 JSR KGETCH›4550 JMP START›4560 ;›4570 DATPAGE PHA ›4580 LDA #$F5›4590 BNE DATPAGE1›4600 PRPAGE PHA ›4610 LDA #$F6›4620 BNE DATPAGE1›4630 JUNKPAGE PHA ›4640 LDA #$FF›4650 DATPAGE1 STA RAMPAGE›4660 PLA ›4670 RTS ›4680 ;›4690 PRINTHEX PHA ›4700 LSR A ;print a single›4710 LSR A ;byte hex number›4720 LSR A›4730 LSR A›4740 JSR PHX1›4750 PLA ›4760 AND #$0F›4770 PHX1 CLC ›4780 ADC #$30›4790 CMP #$3A›4800 BCC PHX2›4810 ADC #6›4820 PHX2 JMP EOUTCH›4830 ;›4840 MAKE_CLINE›4850 STX CURSY›4860 LDA #$20›4870 LDY #32›4880 CSS1 STA PTEMP,Y›4890 DEY ›4900 BPL CSS1›4910 LDA #$9B›4920 STA PTEMP+35›4930 INY ›4940 STY PTEMP+36›4950 TXA ›4960 CLC ›4970 ADC #$41›4980 STA PTEMP›4990 JSR DATPAGE›5000 TXA ›5010 ASL A›5020 ASL A›5030 ASL A›5040 TAX ›5050 LDA $D6AB,X›5060 PHA ›5070 AND #7›5080 ORA #$30›5090 STA PTEMP+9›5100 PLA ›5110 PHA ›5120 LSR A›5130 SEC ›5140 ROR A›5150 SEC ›5160 ROR A›5170 LSR A›5180 LSR A›5190 STA PTEMP+11›5200 LDA #',›5210 STA PTEMP+10›5220 LDY #3›5230 CSS5 LDA SCSIMSG,Y›5240 STA PTEMP+3,Y›5250 DEY ›5260 BPL CSS5›5270 PLA ›5280 PHA ›5290 AND #$10›5300 BEQ CSS4›5310 LDA #'A›5320 STA PTEMP+4›5330 CSS4 PLA ›5340 AND #8 ;sec size›5350 TAY ›5360 LDA SIZEM,Y›5370 STA PTEMP+32›5380 LDA SIZEM+1,Y›5390 STA PTEMP+33›5400 LDA SIZEM+2,Y›5410 STA PTEMP+34›5420 LDA $D6AE,X›5430 PHA ›5440 AND #$0F›5450 LDY #27›5460 JSR A2DIGIT›5470 PLA ›5480 LSR A›5490 LSR A›5500 LSR A›5510 LSR A›5520 BNE XX1›5530 LDA #'-›5540 STA PTEMP+16›5550 STA PTEMP+17›5560 BNE XX1A›5570 XX1 LDY #16 ;heads›5580 JSR A2DIGIT›5590 XX1A LDA $D6AC,X›5600 STA 0›5610 LDA $D6AD,X›5620 STA 1›5630 ORA 0›5640 BNE CSS01›5650 LDX CURSY›5660 CLC ;not valid›5670 RTS ›5680 CSS01 LDX #0›5690 STX 2›5700 LDA 1›5710 BNE XX2›5720 LDA 0›5730 CMP #1›5740 BNE XX2›5750 LDA #'-›5760 STA PTEMP+21›5770 STA PTEMP+22›5780 STA PTEMP+23›5790 STA PTEMP+24›5800 BNE XX2A›5810 XX2 JSR A3DIGIT›5820 LDX #0›5830 CSS8 LDA NUMBUF,Y›5840 STA PTEMP+21,X›5850 INX ›5860 INY ›5870 CPY #8›5880 BCC CSS8›5890 XX2A LDX #PTEMP&255›5900 LDY #PTEMP/256›5910 JSR PRINT›5920 LDX CURSY›5930 SEC ;good›5940 RTS ›5950 ;›5960 SIZEM .BYTE "256 512"›5970 SCSIMSG .BYTE "SCSI"›5980 NUMBUF .BYTE " "›5990 ;›6000 A2DIGIT CMP #10›6010 BCC A2D1›6020 SBC #10›6030 A2D1 PHA ›6040 LDA #$18›6050 ROL A›6060 STA PTEMP,Y›6070 PLA ›6080 ORA #$30›6090 STA PTEMP+1,Y›6100 RTS ›6110 ;›6120 COMLO .BYTE $80,$40,$A0,$10,$E8,100,10,1›6130 COMHI .BYTE $96,$42,$86,$27,3,0,0,0›6140 COMH2 .BYTE $98,$0F,1,0,0,0,0,0›6150 ;›6160 A3DIGIT LDA #'0›6170 LDX #0›6180 LDY #7›6190 A3D1 STA NUMBUF,Y›6200 DEY ›6210 BPL A3D1›6220 INY ›6230 A3D2 LDA 2,X›6240 CMP COMH2,Y›6250 BNE A3D3›6260 LDA 1,X›6270 CMP COMHI,Y›6280 BNE A3D3›6290 LDA 0,X›6300 CMP COMLO,Y›6310 A3D3 BCC A3D4›6320 LDA 0,X›6330 SBC COMLO,Y›6340 STA 0,X›6350 LDA 1,X›6360 SBC COMHI,Y›6370 STA 1,X›6380 LDA 2,X›6390 SBC COMH2,Y›6400 STA 2,X›6410 CLC ›6420 LDA NUMBUF,Y›6430 ADC #1›6440 STA NUMBUF,Y›6450 BCC A3D2 ;branch›6460 A3D4 INY ›6470 CPY #8›6480 BCC A3D2›6490 LDY #0›6500 A3D5 LDA NUMBUF,Y›6510 CMP #'0›6520 BNE A3D6›6530 INY ›6540 CPY #7›6550 BCC A3D5›6560 A3D6 RTS ›6570 ;›6580 A3DIGPRT JSR A3DIGIT›6590 TYA ›6600 CLC ›6610 ADC #NUMBUF&255›6620 TAX ›6630 LDA #NUMBUF/256›6640 ADC #0›6650 TAY ›6660 LDA #0›6670 STA NUMBUF+8›6680 ;›6690 PRINT STX PRTTMP›6700 STY PRTTMP+1›6710 PR1 LDY #0›6720 LDA (PRTTMP),Y›6730 BEQ PR2›6740 JSR EOUTCH›6750 INC PRTTMP›6760 BNE PR1›6770 INC PRTTMP+1›6780 BNE PR1›6790 PR2 RTS ›6800 EOUTCH TAY ›6810 LDA $0347›6820 PHA ›6830 LDA $0346›6840 PHA ›6850 LDX #0›6860 TYA ›6870 RTS ›6880 ;›6890 KGETCH LDX #$10›6900 LDA #$0C›6910 STA $0342,X›6920 JSR $E456›6930 LDA #3›6940 STA $0342,X›6950 LDA #KCOL&255›6960 STA $0344,X›6970 LDA #KCOL/256›6980 STA $0345,X›6990 LDA #4›7000 STA $034A,X›7010 JSR $E456›7020 LDA #7›7030 STA $0342,X›7040 LDA #0›7050 STA $0348,X›7060 STA $0349,X›7070 JSR $E456›7080 PHA ›7090 LDA #$0C›7100 STA $0342,X›7110 JSR $E456›7120 PLA ›7130 RTS ›7140 KCOL .BYTE "K:",$9B›7150 ;›7160 INITMSG .BYTE $7D,$7D›7170 .BYTE "Ôèå ÂÌÁÃË ÂÏØ Õôéìéôéå󠠨é ±¹¹´ ÃÓÓ",$9B›7180 .BYTE " Hard Disk Physical Format Ver. 1.93",$9B›7190 .BYTE "",$9B,0›7200 INITM2 .BYTE $9B," Configured Drives:",$9B,$9B›7210 .BYTE "ÉÄ Ôùðå Õ£¬Ìõî Èåáäó Ãùìó Óôåð ÓÓéúå",$9B,0›7220 NOCTLM .BYTE $9B,$9B,"No drives are configured! Press the",$9B›7230 .BYTE "MENU button, select DRIVE CONFIG,",$9B›7240 .BYTE "press ÛÃÝ for Controller list, and",$9B›7250 .BYTE "enter the data for your hard disk.",$9B›7260 .BYTE "Press ÛÅÓÃÝ three times when finished.",$9B›7270 .BYTE $9B,"Press ÛÑÝ to Quit to DOS.",$9B,0›7280 SELHDM .BYTE $9B,"[Ñ to Quit] Select Hard Disk Letter: ",0›7290 CTLIST .BYTE $9B›7300 .BYTE " ÛÁÝ Adaptec 4000A (MFM)",$9B›7310 .BYTE " ÛÂÝ Adaptec 4070 (RLL)",$9B›7320 .BYTE " ÛÃÝ Seagate ST-225N",$9B›7330 .BYTE " ÛÄÝ Seagate embedded drives",$9B›7340 .BYTE " ÛÅÝ SCSI embedded drives",$9B›7350 .BYTE " ÛÆÝ OMTI 3520 or 3527",$9B›7360 .BYTE " ÛÇÝ SMS FWD-5001 (8 inch)",$9B›7370 .BYTE " ÛÈÝ Xebec S-1410, WD1002SHD (SASI)",$9B›7380 .BYTE " ÛÉÝ Konan DJ210",$9B›7390 .BYTE $9B,"Select Controller: ",0›7400 VERMSG2 .BYTE $9B,$9B,"×òéôå ôèéó îõíâåò äï÷î¡¡¡ This is",$9B›7410 .BYTE "the number of sectors available on",$9B›7420 .BYTE "your drive. Now follow the procedure",$9B›7430 .BYTE "described in the docs on partitioning",$9B›7440 .BYTE "the drive. Press ÒÅÔÕÒÎ to exit.",$9B,0›7450 NOCTRLM2 .BYTE $9B,$9B,"Error: Controller is not responding.",$9B›7460 .BYTE "Please check your cables. Press",$9B›7470 .BYTE "any key to continue...",0›7480 ;›7490 START TSX ›7500 STX STACK›7510 LDA PORTB›7520 AND #$40 ;BUSY?›7530 BNE RES2›7540 LDX #$F7›7550 STX PORTB›7560 RES1 DEX ;reset port›7570 BNE RES1›7580 LDA #$FF›7590 STA PORTB›7600 LDA 20›7610 ADC #120 ;WAIT 2 SECS›7620 RES3 CMP 20›7630 BNE RES3›7640 RES2 LDX #INITMSG&255›7650 LDY #INITMSG/256 ;title›7660 JSR PRINT›7670 RESTART LDX #INITM2&255›7680 LDY #INITM2/256›7690 JSR PRINT›7700 LDA #0›7710 STA CTRLS›7720 TAX ›7730 STRL1 JSR MAKE_CLINE›7740 ROL CTRLS ;display drives›7750 INX ›7760 CPX #8›7770 BCC STRL1›7780 LDA CTRLS ;make sure there›7790 BNE STRL2 ;is at least 1›7800 JMP LOOK_FOR›7810 NOCTL LDX #NOCTLM&255›7820 LDY #NOCTLM/256›7830 JSR PRINT›7840 JSR KGETCH›7850 CMP #'Q›7860 BEQ QUITDOS›7870 JMP START›7880 ;›7890 SEXIT LDA #$9B›7900 JSR EOUTCH›7910 JSR EOUTCH›7920 JSR JUNKPAGE›7930 JMP START ;exit the formatter›7940 ;›7950 QUITDOS LDA #$9B›7960 JSR EOUTCH›7970 JMP EOUTCH›7980 ;›7990 STRL2 LDX #SELHDM&255›8000 LDY #SELHDM/256›8010 JSR PRINT›8020 STRL3 JSR KGETCH›8030 AND #$5F›8040 CMP #$1B ;get drive›8050 BEQ SEXIT ;choice›8060 CMP #'Q›8070 BEQ QUITDOS›8080 CMP #'A›8090 BCC STRL3›8100 CMP #'I›8110 BCS STRL3›8120 ;›8130 STA CURSY›8140 SBC #$40 ;(carry is clear)›8150 ASL A›8160 ASL A ;offset into›8170 ASL A ;controller table›8180 STA DRIVE›8190 TAX ›8200 LDA $D6AC,X›8210 ORA $D6AD,X ;is it valid?›8220 BEQ STRL3›8230 ;›8240 LDA CURSY ;temp save›8250 JSR EOUTCH›8260 LDX #CTLIST&255›8270 LDY #CTLIST/256›8280 JSR PRINT›8290 STRL5 JSR KGETCH›8300 AND #$5F›8310 CMP #$1B›8320 BNE STRL51›8330 JMP SEXIT›8340 STRL51 CMP #'A›8350 BCC STRL5›8360 CMP #'J›8370 BCS STRL5›8380 PHA ›8390 JSR EOUTCH›8400 LDA #$9B›8410 JSR EOUTCH›8420 JSR EOUTCH›8430 PLA ›8440 CLC ›8450 SBC #$40›8460 ASL A›8470 TAX ›8480 LDA FMTTAB+1,X›8490 PHA ›8500 LDA FMTTAB,X›8510 PHA ›8520 LDA #0›8530 STA SELECTION›8540 RTS ›8550 ;›8560 FMTTAB .WORD ADAPMFM-1›8570 .WORD ADAPRLL-1›8580 .WORD SEAG225-1›8590 .WORD SEAGATE-1›8600 .WORD MAXTOR-1›8610 .WORD OMTI-1›8620 .WORD SMSQUANTUM-1›8630 .WORD SASIFMT-1›8640 .WORD KONAN-1›8650 ;›8660 ;›8670 FIVE12 .BYTE "Drive is capable of 512 byte secs only",$9B,0›8680 ONMOTC .BYTE $1B,0,0,0,1,0›8690 SEAINTL .BYTE 0,23,0,15,0,0›8700 SEAMODSELC .BYTE $15,0,0,0,12,0›8710 SEAMODSELD .BYTE 0,0,0,8,0,0,0,0,0,0,1,0›8720 MODSNS .BYTE $1A,0,4,0,$80,0›8730 MODSL .BYTE "Mode Select Command Failed!",$9B,0›8740 FORM1 .BYTE $9B,$9B,"Formatting...",0›8750 FMTABT .BYTE $9B,$9B,"Format Aborted. Press any key...",$9B,0›8760 ;›8770 SEAGATE LDA #0›8780 .BYTE $2C›8790 SEAG225 LDA #2›8800 .BYTE $2C›8810 MAXTOR LDA #4›8820 STA SELECTION›8830 CMP #4 ;IS IT SCSI EMBEDDED?›8840 BNE SCSIFMT›8850 JSR DOIT ;YES, TURN ON MOTOR›8860 .WORD $0106,ONMOTC,DATA›8870 .IF DEBUG=1›8880 LDA #$9B›8890 JSR EOUTCH›8900 .ENDIF ›8910 SCSIFMT›8920 JSR DATPAGE›8930 LDX DRIVE›8940 LDA $D6AB,X›8950 AND #$08›8960 LSR A ;get sec size›8970 LSR A›8980 LSR A›8990 CLC ›9000 ADC #1›9010 STA SEAMODSELD+10›9020 LDA SELECTION›9030 CLC ›9040 ADC SEAMODSELD+10›9050 TAX ›9060 LDA SEAINTL-1,X›9070 STA INTERLEAVE›9080 JSR DOIT›9090 .WORD $0206,SEAMODSELC,SEAMODSELD›9100 BPL SEA0›9110 LDA SEAMODSELD+10›9120 CMP #2 ;DID WE TRY 512?›9130 BEQ BADMODSEL›9140 INC SEAMODSELD+10›9150 JSR DOIT›9160 .WORD $0106,SEAMODSELC,SEAMODSELD›9170 BPL ONLY512›9180 BADMODSEL LDX #MODSL&255›9190 LDY #MODSL/256›9200 JSR PRINT›9210 JMP REQSNS›9220 ;›9230 KERROR JSR PRINT›9240 JSR KGETCH›9250 JMP SEXIT›9260 ;›9270 SEA0 JSR DOIT ;mode sense›9280 .WORD $0106,MODSNS,DATA›9290 BPL SEA1›9300 SEA01 LDX #MODSF&255›9310 LDY #MODSF/256›9320 JSR PRINT›9330 JMP REQSNS›9340 MODSF .BYTE $9B,$9B,"Mode Sense Failed!",$9B,0›9350 ;›9360 SEA1 LDA DATA+10›9370 CMP SEAMODSELD+10›9380 BEQ SEA11Q›9390 CMP #2›9400 BNE SEA11Q›9410 ONLY512 LDX #FIVE12&255›9420 LDY #FIVE12/256›9430 JSR PRINT›9440 LDX DRIVE›9450 JSR DATPAGE›9460 LDA $D6AB,X ;UPDATE›9470 ORA #8 ;CFG›9480 STA $D6AB,X›9490 JSR FIXCRC›9500 JMP SCSIFMT›9510 SEA11Q LDX DRIVE›9520 ;GET HEADS + CYLINDERS›9530 JSR DATPAGE›9540 LDA DATA+17 ;HEADS›9550 ASL A›9560 ASL A›9570 ASL A›9580 ASL A›9590 STA DATA›9600 LDA #7 ;$D6AE,X›9610 ;AND #$0F ;FORCE STEP OF 7›9620 ORA DATA›9630 STA $D6AE,X›9640 LDA DATA+16 ;CYLINDERS›9650 STA $D6AC,X›9660 LDA DATA+15›9670 STA $D6AD,X›9680 JSR FIXCRC›9690 JSR JUNKPAGE›9700 ;›9710 SEA11 JSR AREYOUSURE›9720 BCC SEA12›9730 FMEXIT LDX #FMTABT&255›9740 LDY #FMTABT/256›9750 JMP SEXIT›9760 SEA12 LDX #FORM1&255›9770 LDY #FORM1/256›9780 JSR PRINT›9790 LDA INTERLEAVE›9800 STA SEAFMT+4›9810 JSR DOIT›9820 .WORD $0106,SEAFMT,0›9830 SCIENT BMI FORMATBAD›9840 JMP SEA2›9850 FORMATBAD LDX #FORBAD&255›9860 LDY #FORBAD/256›9870 JSR PRINT›9880 REQSNS LDA #$FF›9890 STA SNSBUF›9900 STA SNSBUF+12›9910 JSR DOIT›9920 .WORD $0106,BIGSNS,SNSBUF›9930 BPL SCIEN2›9940 JSR DOIT›9950 .WORD $0106,SMALLSNS,SNSBUF›9960 BPL SCIEN2›9970 LDX #SNSFAIL&255›9980 LDY #SNSFAIL/256›9990 JMP KERROR›010000 SCIEN2 LDA SNSBUF›010010 JSR PRINTHEX›010020 LDA #',›010030 JSR EOUTCH›010040 LDA SNSBUF+12›010050 JSR PRINTHEX›010060 LDX #ISERM&255›010070 LDY #ISERM/256›010080 JSR PRINT›010090 LDA SNSBUF+2›010100 JSR PRINTHEX›010110 LDX #ISKEY&255›010120 LDY #ISKEY/256›010130 JMP KERROR›010140 ISERM .BYTE " is error code.",$9B,0›010150 ISKEY .BYTE " is sense key.",$9B,0›010160 FORBAD .BYTE $9B,$9B,"Format Command Failed!",$9B,0›010170 COMP1 .BYTE " Done",$9B,$9B,0›010180 SEAFMT .BYTE 4,0,0,0,29,0›010190 ;›010200 SEA2 LDX #COMP1&255›010210 LDY #COMP1/256›010220 JSR PRINT›010230 JSR SETSCSI›010240 JSR READCAP›010250 LDA RCAPBUF+6 ;SEE IF SAME SIZE›010260 CMP SEAMODSELD+10›010270 BEQ ISOK1›010280 CMP #2›010290 BNE ISOK1›010300 JMP ONLY512 ;NOPE!›010310 ISOK1 LDA #0›010320 STA VERTYPE›010330 JSR VERIFY›010340 VEREND LDX #VERMSG2&255›010350 LDY #VERMSG2/256›010360 JSR PRINT›010370 ?VFE1 JSR KGETCH›010380 CMP #$9B›010390 BNE ?VFE1›010400 RTS ›010410 ;›010420 ;›010430 AREYOUSURE LDX #CURINL&255›010440 LDY #CURINL/256›010450 JSR PRINT›010460 LDA INTERLEAVE›010470 STA 0›010480 LDA #0›010490 STA 1›010500 STA 2›010510 JSR A3DIGPRT›010520 LDX #CURIN2&255›010530 LDY #CURIN2/256›010540 JSR PRINT›010550 AREYOU1 JSR KGETCH›010560 AND #$5F›010570 CMP #$1B›010580 BEQ AREYOU2›010590 CMP #'A›010600 BEQ AREYOU3›010610 CMP #'Y›010620 BNE AREYOU1›010630 CLC ›010640 AREYOU2 PHP ›010650 JSR EOUTCH›010660 PLP ›010670 RTS ›010680 AREYOU3 LDX #CURIN3&255›010690 LDY #CURIN3/256›010700 JSR PRINT›010710 LDA #5›010720 STA $0342›010730 LDA #SDATADTA&255›010740 STA $0344›010750 STA $F3›010760 LDA #SDATADTA/256›010770 STA $0345›010780 STA $F4›010790 STA $0349›010800 LDA #$0C›010810 STA $034A›010820 LDX #0›010830 STX $F2›010840 JSR $E456›010850 BMI AYS1›010860 LDA #0›010870 STA $D1FF ;just in case›010880 JSR $D800›010890 BCS AYS1›010900 JSR $D9D2›010910 BCS AYS1›010920 LDA $D5›010930 BNE AYS1›010940 LDA $D4›010950 STA INTERLEAVE›010960 AYS1 JMP AREYOUSURE›010970 CURINL›010980 .BYTE " ÛÁÝ Interleave: ",0›010990 CURIN2 .BYTE $9B›011000 .BYTE " ÛÙÝ Æïòíáô Hard Disk",$9B,$9B›011010 .BYTE "(ÛÅÓÃÝ to abort) Select: ",0›011020 CURIN3 .BYTE "A",$9B,$9B›011030 .BYTE "Enter New Interleave (0-42):",$9B,0›011040 ;›011050 READCAP JSR DOIT›011060 .WORD $090A,RCAPCMD,RCAPBUF›011070 BMI ERRDCP1›011080 LDX #DRVCM1&255›011090 LDY #DRVCM1/256›011100 JSR PRINT›011110 LDA RCAPBUF+3›011120 STA 0›011130 STA MAXSEC›011140 LDA RCAPBUF+2›011150 STA 1›011160 STA MAXSEC+1›011170 LDA RCAPBUF+1›011180 STA 2›011190 STA MAXSEC+2›011200 LDA RCAPBUF+6›011210 CMP #2›011220 BNE RCP1›011230 ASL 0 ;sector # * 2›011240 ROL 1›011250 ROL 2›011260 RCP1 JSR A3DIGPRT›011270 LDX #DRVCM2&255›011280 LDY #DRVCM2/256›011290 JSR PRINT›011300 LDA RCAPBUF+7›011310 STA 0›011320 LDA RCAPBUF+6›011330 STA 1›011340 LDA #0›011350 STA 2›011360 JSR A3DIGPRT›011370 LDX #DRVCM3&255›011380 LDY #DRVCM3/256›011390 JSR PRINT›011400 RTS ›011410 ERRDCP1 LDX #ERRCPM&255›011420 LDY #ERRCPM/256›011430 PLA ›011440 PLA ›011450 JSR PRINT›011460 JMP REQSNS›011470 RCAPCMD .BYTE $25,0,0,0,0,0,0,0,0,0›011480 RCAPBUF .BYTE " "›011490 DRVCM1 .BYTE " Drive Capacity:",$9B,"Total Secs: ",0›011500 DRVCM2 .BYTE " Bytes/Sec: ",0›011510 DRVCM3 .BYTE $9B,0›011520 ERRCPM .BYTE $9B,"Read Capacity Command Failed!",$9B,0›011530 ;›011540 VERPASS .BYTE $9B,"Verifying Entire Disk.",$9B,"(This will take some time!)",$9B,$9B,0›011550 VERCOMP .BYTE $9B,$9B,"Verify Complete!",$9B,0›011560 BLREASN1 .BYTE $9B,"Reassigning bad sectors...",0›011570 BLREASNM .BYTE " Done!",$9B,0›011580 RESFL .BYTE $9B,"Reassign Blocks command failed!",$9B,0›011590 TOTSECM .BYTE $9B,"Total sectors available: ",0›011600 ATSEC .BYTE "œCurrent Sector: ",0›011610 VERCMD .BYTE $2F,0,0,0,0,0,0,0,1,0›011620 REACMD .BYTE 8,0,0,0,1,0›011630 SMALLSNS .BYTE 3,0,0,0,0,0›011640 BIGSNS .BYTE 3,0,0,0,27,0›011650 SECBAD .BYTE "œSector #",0›011660 SECBAD2 .BYTE " is bad. ($",0›011670 SECBAD3 .BYTE ")",$9B,0›011680 SNSFAIL .BYTE "Request Sense command failed!",$9B,0›011690 TOOMANY .BYTE $9B,"Too many Defects on drive!",$9B,0›011700 ;›011710 VERIFY LDA #0›011720 STA DATAPTR ;reset defect›011730 STA DATAPTR+1 ;list›011740 VERIFY2 LDA #0›011750 STA CURSEC›011760 STA CURSEC+1›011770 STA CURSEC+2›011780 STA BADSECTORS›011790 STA BADSECTORS+1›011800 STA CURBSECF›011810 LDX #VERPASS&255›011820 LDY #VERPASS/256›011830 JSR PRINT›011840 JMP VF2›011850 VF1 LDX #VERCOMP&255›011860 LDY #VERCOMP/256›011870 JSR PRINT›011880 LDA DATAPTR›011890 ORA DATAPTR+1›011900 BNE VF11›011910 VF10 LDX #TOTSECM&255›011920 LDY #TOTSECM/256›011930 JSR PRINT›011940 LDA CURSEC›011950 STA 0›011960 LDA CURSEC+1›011970 STA 1›011980 LDA CURSEC+2›011990 STA 2›012000 LDX DRIVE›012010 LDA $D6AB,X›012020 AND #8›012030 BEQ VF10A›012040 ASL 0›012050 ROL 1›012060 ROL 2 ;sector x 2›012070 VF10A JSR A3DIGPRT›012080 VF11B RTS ›012090 VF11 LDA VERTYPE ;end of verify›012100 BEQ VF11A ;0=seagate›012110 CMP #1 ;1=sms quantum›012120 BEQ VF10›012130 CMP #3 ;3=xebec›012140 BCS VF11B ;or adaptec›012150 ;›012160 VF11A LDA DATAPTR›012170 STA DATA+3 ;defect list length›012180 LDA DATAPTR+1›012190 STA DATA+2›012200 LDA #0 ;defects start›012210 STA DATA ;at data+4.. there›012220 STA DATA+1 ;is a 4 byte header›012230 LDX #BLREASN1&255›012240 LDY #BLREASN1/256›012250 JSR PRINT›012260 JSR DOIT›012270 .WORD 6,SEAREASN,DATA›012280 BPL VF12›012290 LDX #RESFL&255›012300 LDY #RESFL/256›012310 PLA ›012320 PLA ›012330 JSR PRINT›012340 JMP REQSNS›012350 VF12 LDX #BLREASNM&255›012360 LDY #BLREASNM/256›012370 JSR PRINT›012380 JMP VF10›012390 SEAREASN .BYTE 7,0,0,0,0,0›012400 ;›012410 ;›012420 VF2 LDX #ATSEC&255›012430 LDY #ATSEC/256›012440 JSR PRINT›012450 LDA CURSEC›012460 STA 0 ;print current›012470 LDA CURSEC+1 ;sector #›012480 STA 1›012490 LDA CURSEC+2›012500 STA 2›012510 LDA #0›012520 STA 77›012530 LDX DRIVE›012540 LDA $D6AB,X›012550 AND #8›012560 BEQ VF02A›012570 ASL 0›012580 ROL 1›012590 ROL 2 ;sector x 2›012600 VF02A JSR A3DIGPRT›012610 LDA VERTYPE›012620 CMP #4›012630 BNE VF20›012640 LDA MAXSEC+2›012650 CMP CURSEC+2 ;do we have›012660 BNE VF81 ;256 secs left?›012670 LDA MAXSEC+1›012680 SEC ›012690 SBC CURSEC+1›012700 BEQ VF20›012710 VF81 JSR SDATAEQU ;adaptec verify›012720 BCC VF82›012730 VF20 LDA CURSEC›012740 STA VERCMD+5›012750 STA REACMD+3›012760 LDA CURSEC+1›012770 STA VERCMD+4›012780 STA REACMD+2›012790 LDA CURSEC+2›012800 STA VERCMD+3›012810 STA REACMD+1›012820 LDA VERTYPE›012830 AND #1 ;sms/xebec?›012840 BNE ?SF1›012850 LDA SELECTION ;DO READ›012860 CMP #2 ;FOR ST225N›012870 BNE VF201›012880 ?SF1 JSR DOIT›012890 .WORD 6,REACMD,DATA›012900 JMP VF202›012910 VF201 JSR DOIT›012920 .WORD 10,VERCMD,0›012930 VF202 BMI VF23›012940 VF21 INC CURSEC›012950 BNE VF31›012960 VF82 INC CURSEC+1›012970 BNE VF31›012980 INC CURSEC+2›012990 VF31 LDA CURSEC›013000 CMP MAXSEC›013010 BNE VF32›013020 LDA CURSEC+1›013030 CMP MAXSEC+1›013040 BNE VF32›013050 LDA CURSEC+2›013060 CMP MAXSEC+2›013070 BNE VF32›013080 JMP VF1›013090 VF32 LDA CURSEC›013100 BNE VF20›013110 JMP VF2›013120 ;›013130 VF23 LDA #0 ;handle defect›013140 STA SNSBUF+12›013150 JSR DOIT ;get sense›013160 .WORD $0106,BIGSNS,SNSBUF›013170 LDA SNSBUF+12›013180 BNE VF25›013190 LDA SNSBUF›013200 STA SNSBUF+12›013210 VF25›013220 LDX #SECBAD&255›013230 LDY #SECBAD/256›013240 JSR PRINT›013250 LDA #[DATA+4]&255›013260 CLC ›013270 ADC DATAPTR›013280 STA PRTTMP›013290 LDA #[DATA+4]/256›013300 ADC DATAPTR+1›013310 STA PRTTMP+1›013320 LDY #0›013330 TYA ›013340 STA (PRTTMP),Y›013350 LDA CURSEC+2 ;hi byte of sec#›013360 STA 2›013370 INY ›013380 STA (PRTTMP),Y›013390 LDA CURSEC+1›013400 STA 1›013410 INY ›013420 STA (PRTTMP),Y›013430 LDA CURSEC›013440 STA 0›013450 INY ›013460 STA (PRTTMP),Y›013470 LDX DRIVE›013480 LDA $D6AB,X›013490 AND #8›013500 BEQ SXF1›013510 ASL 0›013520 ROL 1›013530 ROL 2›013540 SXF1 JSR A3DIGPRT›013550 LDX #SECBAD2&255›013560 LDY #SECBAD2/256›013570 JSR PRINT›013580 LDA SNSBUF+12›013590 AND #$7F›013600 JSR PRINTHEX›013610 LDX #SECBAD3&255›013620 LDY #SECBAD3/256›013630 JSR PRINT›013640 LDA VERTYPE›013650 CMP #1 ;quantum›013660 BEQ VF91›013670 CMP #3 ;xebec›013680 BEQ VERX1›013690 CMP #4 ;adaptec›013700 BEQ ADAP1›013710 LDA #4›013720 VF91 CLC ›013730 ADC DATAPTR›013740 STA DATAPTR›013750 LDA DATAPTR+1›013760 ADC #0›013770 STA DATAPTR+1›013780 CMP #4›013790 BCS VF26›013800 JMP VF21›013810 VF26 LDX #TOOMANY&255›013820 LDY #TOOMANY/256›013830 PLA ›013840 PLA ›013850 JMP KERROR›013860 ;›013870 ADAP1 JMP ADAP2 ;br range›013880 ;›013890 VERX1 LDA MAXSEC›013900 SEC ›013910 SBC CURSEC›013920 TAX ›013930 LDA MAXSEC+1 ;see if we're›013940 SBC CURSEC+1 ;close to limit›013950 BNE VERX2›013960 LDA MAXSEC+2›013970 SBC CURSEC+2›013980 BNE VERX2›013990 CPX SECSTRK›014000 BCS VERX2›014010 LDA CURSEC›014020 STA MAXSEC›014030 LDA CURSEC+1›014040 SBC #0›014050 STA MAXSEC+1›014060 LDA CURSEC+2›014070 SBC #0›014080 STA MAXSEC+2›014090 JMP VF1›014100 VERX2 LDX #2›014110 LDY #0›014120 VERX3 LDA CURSEC,X›014130 STA FMALTRKC+1,Y›014140 LDA MAXSEC,X›014150 STA DATA,Y›014160 INY ›014170 DEX ›014180 BPL VERX3›014190 LDA CURSEC+2›014200 ORA CURSEC+1›014210 BNE VER3X2›014220 LDA CURSEC›014230 CMP SECSTRK›014240 BCC VER3X1›014250 VER3X2 LDA CURSEC›014260 SEC ›014270 SBC SECSTRK›014280 STA CURSEC›014290 LDA CURSEC+1›014300 SBC #0›014310 STA CURSEC+1›014320 LDA CURSEC+2›014330 SBC #0›014340 STA CURSEC+2 ;Verify ALL!›014350 VER3X1 LDA INTERLEAVE›014360 STA FMALTRKC+4›014370 LDX DRIVE›014380 LDA $D6AE,X›014390 AND #$0F›014400 STA FMALTRKC+5›014410 JSR DOIT›014420 .WORD $0106,DEFLIMC,DEFLIMB›014430 JSR DOIT›014440 .WORD $0106,FMALTRKC,DATA›014450 BPL VERX4›014460 LDX #FMALTM&255›014470 LDY #FMALTM/256›014480 PLA ›014490 PLA ›014500 JSR PRINT›014510 JMP REQSNS›014520 FMALTM .BYTE $9B,"Format Alternate Track command failed!",$9B,0›014530 FMALTRKC .BYTE $0E,0,0,0,0,0›014540 ;›014550 VERX4 SEC ›014560 LDA MAXSEC›014570 SBC SECSTRK›014580 STA MAXSEC›014590 LDA MAXSEC+1›014600 SBC #0›014610 STA MAXSEC+1›014620 LDA MAXSEC+2›014630 SBC #0›014640 STA MAXSEC+2›014650 JMP VF21›014660 ;›014670 ADAP2 LDA CURSEC›014680 STA XLATCMD+3›014690 LDA CURSEC+1›014700 STA XLATCMD+2›014710 LDA CURSEC+2›014720 STA XLATCMD+1›014730 JSR DOIT›014740 .WORD $0706,XLATCMD,XLATBUF›014750 BPL ADAP3›014760 INC BADSECTORS›014770 BNE ADAP2A›014780 INC BADSECTORS+1›014790 ADAP2A LDX #BADSECM2&255›014800 LDY #BADSECM2/256›014810 JSR PRINT›014820 JMP VF21›014830 BADSECM2 .BYTE " Bad sector header: cannot reassign",$9B,0›014840 XLATCMD .BYTE $0F,0,0,0,0,0›014850 XLATBUF .BYTE " "›014860 ADAP3 LDA DATAPTR+1›014870 LDX #$FF›014880 STX CURBSECF›014890 CMP #4 ;>128 defects?›014900 BCC ADAP3A›014910 JMP VF26›014920 ADAP3A LDA DATAPTR›014930 CLC ›014940 ADC #[DATA+4]&255›014950 STA PRTTMP›014960 LDA DATAPTR+1›014970 ADC #[DATA+4]/256›014980 STA PRTTMP+1›014990 LDA DATAPTR›015000 CLC ›015010 ADC #8›015020 STA DATAPTR›015030 LDA DATAPTR+1›015040 ADC #0›015050 STA DATAPTR+1›015060 LDY #7›015070 ADAP3B LDA XLATBUF,Y ;add def.›015080 STA (PRTTMP),Y ;to list›015090 DEY ›015100 BPL ADAP3B›015110 SORT_DEF LDA #[DATA+4]&255›015120 STA PTR1›015130 LDA #[DATA+4]/256›015140 STA PTR1+1›015150 LDA #[DATA+12]&255›015160 STA PTR2›015170 LDA #[DATA+12]/256›015180 STA PTR2+1›015190 LDA #0›015200 STA SORTED›015210 LDA DATAPTR+1›015220 STA TEMP›015230 LDA DATAPTR›015240 LSR TEMP›015250 ROR A›015260 LSR TEMP›015270 ROR A ;get # of defects›015280 LSR TEMP ;by dividing›015290 ROR A ;dataptr by 8›015300 STA TEMP›015310 DEC TEMP›015320 BEQ SORT1›015330 SORT2 LDY #0›015340 SORT3 LDA (PTR1),Y›015350 CMP (PTR2),Y›015360 BNE SORT4›015370 INY ›015380 CPY #8 ;we will hopefully›015390 BCC SORT3 ;never have 2›015400 BCS SORT5 ;the same, but!›015410 SORT4 BCC SORT5›015420 LDY #7›015430 SORT4A LDA (PTR1),Y›015440 TAX ›015450 LDA (PTR2),Y›015460 STA (PTR1),Y›015470 TXA ›015480 STA (PTR2),Y›015490 DEY ›015500 BPL SORT4A›015510 STY SORTED›015520 SORT5 CLC ›015530 LDA PTR1›015540 ADC #8›015550 STA PTR1›015560 BCC SORT5A›015570 INC PTR1+1›015580 SORT5A CLC ›015590 LDA PTR2›015600 ADC #8›015610 STA PTR2›015620 BCC SORT5B›015630 INC PTR2+1›015640 SORT5B DEC TEMP›015650 BNE SORT2›015660 SORT1 LDA SORTED›015670 BNE SORT_DEF›015680 JMP VF21›015690 ;›015700 ;›015710 QUANTINT .BYTE 23,0,11›015720 SMSQUANTUM›015730 JSR DATPAGE›015740 LDX DRIVE›015750 LDA $D6AB,X›015760 AND #8 ;get sec size›015770 LSR A›015780 LSR A›015790 STA SMSFMT+5›015800 STA REACMD+5 ;for verify›015810 TAX ›015820 LDA QUANTINT,X›015830 STA INTERLEAVE›015840 LDX #QTYPE&255›015850 LDY #QTYPE/256›015860 JSR PRINT›015870 SMS1 JSR KGETCH›015880 AND #$7F›015890 CMP #$1B›015900 BNE SMS2›015910 SMS0 JMP SEXIT›015920 SMS2 CMP #'1›015930 BCC SMS1›015940 CMP #'9›015950 BCS SMS1›015960 PHA ›015970 JSR EOUTCH›015980 LDA #$9B›015990 JSR EOUTCH›016000 JSR EOUTCH›016010 CLC ›016020 PLA ›016030 SBC #$30 ;-$31›016040 STA CURSY›016050 LDX DRIVE›016060 LDA $D6AB,X›016070 AND #8›016080 ORA CURSY›016090 ASL A›016100 ASL A›016110 TAX ›016120 LDA QMAXTAB,X›016130 STA MAXSEC›016140 LDA QMAXTAB+1,X›016150 STA MAXSEC+1›016160 LDA QMAXTAB+2,X›016170 STA MAXSEC+2›016180 JSR AREYOUSURE›016190 BCC SMS3›016200 JMP FMEXIT›016210 SMS3 LDX #FORM1&255›016220 LDY #FORM1/256›016230 JSR PRINT›016240 LDA INTERLEAVE›016250 STA SMSFMT+4›016260 JSR DOIT›016270 .WORD $0106,SMSFMT,0›016280 BPL SMS4›016290 JMP FORMATBAD›016300 SMS4 LDX #COMP1&255›016310 LDY #COMP1/256›016320 JSR PRINT›016330 LDX DRIVE›016340 LDA $D6AB,X›016350 AND #8 ;check sec size›016360 BEQ SMS41›016370 LDA $D6AE,X›016380 AND #$F0 ;set step rate›016390 ORA #2 ;to 2 so we can›016400 STA $D6AE,X ;read 512 bytes›016410 JSR SETSASI›016420 JMP SMS42›016430 SMS41 JSR SETSCSI›016440 SMS42 LDA #1›016450 STA VERTYPE ;for sms›016460 LDX #SECSTVM&255›016470 LDY #SECSTVM/256›016480 JSR PRINT›016490 LDA MAXSEC›016500 STA 0›016510 LDA MAXSEC+1›016520 STA 1›016530 LDA MAXSEC+2›016540 STA 2›016550 LDX DRIVE›016560 LDA $D6AB,X›016570 AND #8›016580 BEQ SXF2›016590 ASL 0›016600 ROL 1›016610 ROL 2›016620 SXF2 JSR A3DIGPRT›016630 JSR VERIFY›016640 ;do tot secs›016650 LDX #VERMSG2&255›016660 LDY #VERMSG2/256›016670 JSR PRINT›016680 LDA DATAPTR›016690 STA 0 ;# of bad sectors›016700 LDA DATAPTR+1›016710 STA 1›016720 ORA 0›016730 BEQ SMS5›016740 LDA #0›016750 STA 2›016760 LDX DRIVE›016770 LDA $D6AB,X›016780 AND #8›016790 BEQ SXF3›016800 ASL 0›016810 ROL 1›016820 SXF3 LDX #QBAD&255›016830 LDY #QBAD/256›016840 JSR PRINT›016850 JSR A3DIGPRT›016860 LDX #QBAD2&255›016870 LDY #QBAD2/256›016880 JSR PRINT›016890 SMS5 JSR KGETCH›016900 CMP #$9B›016910 BNE SMS5›016920 RTS ›016930 ;›016940 QTYPE .BYTE "Select Hard Disk:",$9B›016950 .BYTE " Û±Ý SA1002 ÛµÝ Q2010",$9B›016960 .BYTE " Û²Ý SA1004 Û¶Ý Q2020",$9B›016970 .BYTE " Û³Ý SA1104 Û·Ý Q2040",$9B›016980 .BYTE " Û´Ý SA1106 Û¸Ý Q2080",$9B›016990 .BYTE $9B,"Select (1-8): ",0›017000 QMAXTAB›017010 .WORD 16383,0 ;sa1002›017020 .WORD 32767,0 ;sa1004›017030 .WORD 63359,0 ;sa1104›017040 .WORD 40063,1 ;sa1106›017050 .WORD 32767,0 ;q2010›017060 .WORD 65535,0 ;q2020›017070 .WORD 65535,1 ;q2040›017080 .WORD 383,4 ;q2080›017090 .WORD 8703,0,17407,0,33659,0,56099,0,17407,0,34815,0,$0FFF,1,$20CB,2›017100 QBAD .BYTE $9B,"Your drive has ",0›017110 QBAD2 .BYTE " bad sectors.",$9B›017120 .BYTE "Use the FMTDIR.COM program to map",$9B›017130 .BYTE "them out at the DOS level.",$9B,0›017140 SMSFMT .BYTE 4,0,0,0,0,0›017150 SECSTVM .BYTE $9B,"Sectors to verify: ",0›017160 REMM1 .BYTE "Are you using removable disks?",0›017170 ;›017180 SETSASI LDA #$10›017190 .BYTE $2C›017200 SETSCSI LDA #0›017210 LDX DRIVE›017220 EOR $D6AB,X›017230 AND #$10›017240 EOR $D6AB,X›017250 STA $D6AB,X›017260 ;›017270 FIXCRC›017280 LDA #0›017290 TAX ›017300 TAY ›017310 CLC ›017320 FXC1 ADC $D600,Y›017330 PHA ›017340 TXA ›017350 ADC #$0E›017360 EOR $D600,Y›017370 TAX ›017380 PLA ›017390 INY ›017400 CPY #$FE›017410 BCC FXC1›017420 STX $D6FE›017430 STA $D6FF›017440 RTS ›017450 ;›017460 KONAN LDX DRIVE›017470 LDA $D6AB,X›017480 AND #8›017490 BEQ SAS1›017500 LDA #18›017510 LDY #17›017520 BNE SAS2›017530 SASIFMT LDX DRIVE›017540 LDA $D6AB,X›017550 AND #8›017560 BEQ SAS1›017570 LDA #17 ;secs/trk›017580 LDY #16 ;interleave›017590 BNE SAS2›017600 SAS1 LDA #32›017610 LDY #29›017620 SAS2 STY INTERLEAVE›017630 STA SECSTRK›017640 LDA $D6AD,X›017650 STA DATA›017660 LDA $D6AC,X›017670 STA DATA+1 ;set up›017680 LDA $D6AE,X ;define limits›017690 LSR A ;parm block›017700 LSR A›017710 LSR A›017720 LSR A›017730 STA DATA+2›017740 LDA $D6B0,X›017750 STA DATA+3›017760 LDA $D6AF,X›017770 STA DATA+4›017780 LDA $D6B2,X›017790 STA DATA+5›017800 LDA $D6B1,X›017810 STA DATA+6›017820 LDA #11›017830 STA DATA+7 ;ecc length›017840 LDA $D6AE,X›017850 AND #$0F›017860 STA DATA+8 ;the rest for konan›017870 LDA #18›017880 STA DATA+9›017890 LDA #0›017900 LDY #5›017910 KON1 STA DATA+10,Y›017920 DEY ›017930 BPL KON1›017940 LDA SECSTRK›017950 CMP #18›017960 BNE KON2›017970 JSR DOIT›017980 .WORD $0106,KDEFLIMC,DATA›017990 JMP KON3›018000 KON2 JSR DOIT›018010 .WORD $0106,DEFLIMC,DATA›018020 KON3 BPL ?SAS3›018030 LDX #DEFFAI&255›018040 LDY #DEFFAI/256›018050 JSR PRINT›018060 JMP REQSNS›018070 DEFFAI .BYTE $9B,"Initialize Drive command failed!",$9B,0›018080 DEFLIMC .BYTE $0C,0,0,0,0,0›018090 KDEFLIMC .BYTE $11,0,0,0,0,0›018100 SASFMT .BYTE 4,0,0,0,0,0›018110 DEFLIMB .BYTE ""›018120 ;›018130 SAS5 JMP FORMATBAD›018140 SAS4 JMP FMEXIT›018150 ?SAS3 LDY #7›018160 ?PA1 LDA DATA,Y›018170 STA DEFLIMB,Y›018180 DEY ›018190 BPL ?PA1›018200 SAS3 JSR AREYOUSURE›018210 BCS SAS4›018220 LDA INTERLEAVE›018230 STA SASFMT+4›018240 LDX #FORM1&255›018250 LDY #FORM1/256›018260 JSR PRINT›018270 JSR DOIT›018280 .WORD $0106,SASFMT,0›018290 BMI SAS5›018300 LDX #COMP1&255›018310 LDY #COMP1/256›018320 JSR PRINT›018330 LDA #1›018340 STA DATA+7 ;SET ECC TO 1›018350 JSR DOIT›018360 .WORD $0106,DEFLIMC,DATA›018370 LDA #$FF ;set to -1›018380 STA MAXSEC›018390 STA MAXSEC+1›018400 STA MAXSEC+2›018410 SAS6 LDX DATA+2 ;# of heads›018420 SAS6A CLC ›018430 LDA MAXSEC›018440 ADC SECSTRK›018450 STA MAXSEC›018460 BCC SAS6B›018470 INC MAXSEC+1›018480 BNE SAS6B›018490 INC MAXSEC+2›018500 SAS6B DEX ›018510 BNE SAS6A›018520 LDA DATA+1 ;cylinders›018530 BNE SAS6C›018540 DEC DATA ;high byte›018550 SAS6C DEC DATA+1›018560 LDA DATA›018570 ORA DATA+1›018580 BNE SAS6 ;figure # of secs›018590 JSR SETSASI›018600 LDX #SECSTVM&255›018610 LDY #SECSTVM/256›018620 JSR PRINT›018630 LDA MAXSEC›018640 STA 0›018650 LDA MAXSEC+1›018660 STA 1›018670 LDA MAXSEC+2›018680 STA 2›018690 LDX DRIVE›018700 LDA $D6AB,X›018710 AND #8›018720 BEQ SXF5›018730 ASL 0›018740 ROL 1›018750 ROL 2›018760 SXF5 JSR A3DIGPRT›018770 LDA #3›018780 STA VERTYPE›018790 JSR VERIFY›018800 JMP VEREND›018810 ;›018820 STEPTL .BYTE 48,32,16,136,208,188,44,150,32,248,0,0,0,0,0,0›018830 STEPTH .BYTE 117,78,39,19,7,2,1,0,78,42,0,0,0,0,0,0›018840 ;3ms,2ms,1ms,500us,200us,70us,30us,15us,2ms,1.1ms›018850 ;›018860 OMTI LDA #0›018870 STA INTERLEAVE ;not used›018880 JSR DOIT›018890 .WORD $0106,OMTISNS,DATA›018900 BPL OMT1›018910 JMP SEA01›018920 OMTISNS .BYTE $1A,0,0,0,$FF,0›018930 OMTISEL .BYTE $15,$10,0,0,32,0›018940 OMTIPARM .BYTE 0,0,0,8›018950 .BYTE 0,0,0,0,0,0,2,0 ;DENSITY›018960 PAGE4 .BYTE 4,$12,0,0,0,0,0,0 ;CYLS, HDS, WPC›018970 .BYTE 0,0,0,0,0,0,0,0 ;MORE JUNK›018980 .BYTE 0,0,0,0›018990 ;›019000 OMT1 LDX DRIVE›019010 LDA $D6AB,X›019020 AND #8›019030 BNE OMT1A›019040 LDX #CTRL512&255›019050 LDY #CTRL512/256›019060 JSR PRINT›019070 LDX DRIVE›019080 LDA $D6AB,X ;UPDATE›019090 ORA #8 ;CFG›019100 STA $D6AB,X›019110 JSR FIXCRC›019120 OMT1A LDX DRIVE›019130 LDA $D6AC,X›019140 STA PAGE4+4 ;cylinders›019150 CLC ›019160 ADC #10›019170 STA PAGE4+16›019180 LDA $D6AD,X›019190 STA PAGE4+3›019200 ADC #0›019210 STA PAGE4+15›019220 LDA $D6AE,X›019230 LSR A›019240 LSR A›019250 LSR A›019260 LSR A›019270 STA PAGE4+5 ;heads›019280 LDA $D6AF,X›019290 STA PAGE4+11›019300 LDA $D6B0,X ;reduce write cur›019310 STA PAGE4+10›019320 LDA $D6B1,X›019330 STA PAGE4+8›019340 LDA $D6B2,X ;write precomp›019350 STA PAGE4+7›019360 LDA $D6AE,X›019370 AND #$0F›019380 TAY ›019390 LDA STEPTL,Y›019400 STA PAGE4+13 ;step rate›019410 LDA STEPTH,Y›019420 STA PAGE4+12›019430 ;›019440 JSR DOIT›019450 .WORD $06,OMTISEL,OMTIPARM›019460 BPL OMT2›019470 JMP BADMODSEL›019480 OMT3 JMP FMEXIT›019490 OMT2 JSR AREYOUSURE›019500 BCS OMT3›019510 LDX #FORM1&255›019520 LDY #FORM1/256›019530 JSR PRINT ;fmt with no defects›019540 JSR DOIT›019550 .WORD $0106,OMTIFMT,TESTBUF›019560 BPL OMT4›019570 OMT6 JMP SCIENT›019580 OMT4 LDX #COMP1&255›019590 LDY #COMP1/256›019600 JSR PRINT›019610 JSR SETSCSI›019620 JSR READCAP›019630 LDA #0›019640 STA VERTYPE›019650 JSR VERIFY›019660 LDA DATAPTR›019670 ORA DATAPTR+1 ;any bad secs?›019680 BEQ OMT5›019690 LDX #REFM1&255›019700 LDY #REFM1/256›019710 JSR PRINT›019720 JSR DOIT›019730 .WORD $0106,OMTIREF,TESTBUF›019740 BMI OMT6›019750 BPL OMT4›019760 OMT5 JMP VEREND›019770 ;›019780 OMTIFMT .BYTE 4,$18›019790 TESTBUF .BYTE 0,0,0,0›019800 REFM1 .BYTE $9B,$9B,"Reformatting...",0›019810 CTRL512 .BYTE "Controller must use 512 byte sectors.",$9B,$9B,0›019820 OMTIREF .BYTE 4,$15,0,0,0,0›019830 ;›019840 ADAPFMT .BYTE 4,$1C,0,0,0,0›019850 ADAPMODSEL .BYTE $15,0,0,0,$16,0›019860 ADAPARMS .BYTE 0,0,0,8›019870 .BYTE 0,0,0,0,0,0,1,0 ;SECSIZE›019880 .BYTE 1,0,0,0,0,0,0,0›019890 .BYTE 0,0,0,0›019900 ADAINT .BYTE 26,12,37,18›019910 ;›019920 ADAPMFM LDA #0›019930 .BYTE $2C›019940 ADAPRLL LDA #2›019950 PHA ›019960 LDX DRIVE›019970 LDA $D6AB,X›019980 LSR A›019990 LSR A ;get secsize›020000 LSR A›020010 AND #1›020020 CLC ›020030 ADC #1›020040 STA ADAPARMS+10›020050 PLA ›020060 CLC ›020070 ADC ADAPARMS+10›020080 TAY ›020090 LDA ADAINT-1,Y›020100 STA INTERLEAVE›020110 LDA $D6AC,X›020120 STA ADAPARMS+14›020130 LDA $D6AD,X ;cylinders›020140 STA ADAPARMS+13›020150 LDA $D6AE,X›020160 LSR A›020170 LSR A›020180 LSR A ;heads›020190 LSR A›020200 STA ADAPARMS+15›020210 LDA $D6AE,X›020220 AND #$0F›020230 BEQ ADA1›020240 LDA #1 ;step rate›020250 ADA1 STA ADAPARMS+21›020260 LDA $D6AF,X›020270 STA ADAPARMS+17 ;RWC›020280 LDA $D6B0,X›020290 STA ADAPARMS+16›020300 LDA $D6B1,X ;WPC›020310 STA ADAPARMS+19›020320 LDA $D6B2,X›020330 STA ADAPARMS+18›020340 LDY #19›020350 ADA11 LDA SDATAHDR,Y›020360 STA SDATADTA,Y›020370 DEY ›020380 BPL ADA11›020390 INY ;y=0›020400 LDA #$6C›020410 ADA12 STA SDATADTA+20,Y›020420 STA SDATADTA+$0100+20,Y›020430 INY ›020440 BNE ADA12›020450 LDX #REMM1&255›020460 LDY #REMM1/256›020470 JSR PRINT›020480 JSR KGETCH ;removable?›020490 CMP #'Y›020500 BEQ ADA13›020510 LDA #'N›020520 ADA13 PHA ›020530 JSR EOUTCH›020540 LDA #$9B›020550 JSR EOUTCH›020560 LDA #$9B›020570 JSR EOUTCH›020580 PLA ›020590 CMP #'Y›020600 BEQ ADA14›020610 LDA #1›020620 .BYTE $2C›020630 ADA14 LDA #2›020640 STA ADAPARMS+12›020650 JSR DOIT›020660 .WORD $0106,ADAPMODSEL,ADAPARMS›020670 BPL ADA2›020680 JMP BADMODSEL›020690 ADA3 JMP FMEXIT›020700 ADA2 JSR AREYOUSURE›020710 BCS ADA3›020720 LDX #FORM1&255›020730 LDY #FORM1/256›020740 JSR PRINT›020750 LDA INTERLEAVE›020760 STA ADAPFMT+4›020770 LDA #0›020780 STA DATA ;init to 0›020790 STA DATA+1 ;defects›020800 STA DATA+2›020810 STA DATA+3›020820 STA DATAPTR›020830 STA DATAPTR+1›020840 ADA4 JSR DOIT›020850 .WORD $0106,ADAPFMT,DATA›020860 BMI ADA9›020870 LDX #COMP1&255›020880 LDY #COMP1/256›020890 JSR PRINT›020900 JSR SETSCSI›020910 JSR READCAP›020920 LDA #4›020930 STA VERTYPE›020940 JSR VERIFY2›020950 LDA DATAPTR›020960 STA DATA+3›020970 LDA DATAPTR+1›020980 STA DATA+2›020990 LDA CURBSECF›021000 BEQ ADA5›021010 LDX #REFM2&255›021020 LDY #REFM2/256›021030 JSR PRINT›021040 JSR DOIT›021050 .WORD $0106,ADAPMODSEL,ADAPARMS›021060 BMI ADA8›021070 JMP ADA4›021080 ADA8 JMP BADMODSEL›021090 ADA9 JMP FORMATBAD›021100 REFM2 .BYTE $9B,"Media Defects found.",$9B,$9B,"Reformatting...",0›021110 ADA5 JSR READCAP›021120 LDX #VERMSG2&255›021130 LDY #VERMSG2/256›021140 JSR PRINT›021150 LDA BADSECTORS›021160 STA 0›021170 LDA BADSECTORS+1›021180 STA 1›021190 ORA 0›021200 BEQ ADA6›021210 LDA #0›021220 STA 2›021230 LDX DRIVE›021240 LDA $D6AB,X›021250 AND #8›021260 BEQ SXF6›021270 ASL 0›021280 ROL 1›021290 ROL 2›021300 SXF6 LDX #QBAD&255›021310 LDY #QBAD/256›021320 JSR PRINT›021330 JSR A3DIGPRT›021340 LDX #QBAD2&255›021350 LDY #QBAD2/256›021360 JSR PRINT›021370 ADA6 JSR KGETCH›021380 CMP #$9B›021390 BNE ADA6›021400 RTS ›021410 ;›021420 SDATAEQU LDA CURSEC›021430 STA SDATACMD+5›021440 LDA CURSEC+1›021450 STA SDATACMD+4›021460 LDA CURSEC+2›021470 STA SDATACMD+3›021480 LDX DRIVE›021490 LDA $D6AB,X›021500 LSR A›021510 LSR A›021520 LSR A›021530 AND #1›021540 CLC ›021550 ADC #1›021560 STA SDATADTA+12›021570 STA SDATADTA+18›021580 STA SDATADTA+2›021590 JSR DOIT›021600 .WORD $010A,SDATACMD,SDATADTA›021610 BMI SDE1›021620 CLC ›021630 RTS ›021640 SDE1 SEC ›021650 RTS ›021660 SDATACMD .BYTE $31,$10,0,0,0,0,0,1,0,0›021670 SDATAHDR .BYTE 0,0,0,0,0,0,0,0›021680 .BYTE 0,0,1,0,1,6,0,0›021690 .BYTE 0,0,1,0›021700 ;›021710 INQCMD .BYTE $12,0,0,0,$7F,0›021720 LOOKM1 .BYTE "œNo drives configured! Looking on bus.",$9B,0›021730 LOOKM2 .BYTE $9B,"Sorry, no drives found!",$9B,0›021740 LOOKM3 .BYTE "Found x: ",0›021750 ;›021760 LOOK_FOR LDA #0›021770 STA DRIVE›021780 STA TEMP›021790 LDX #LOOKM1&255›021800 LDY #LOOKM1/256›021810 JSR PRINT›021820 LF01 LDX DRIVE›021830 JSR DATPAGE›021840 LDA $D6AB,X›021850 AND #$E0›021860 BNE LF03 ;skip if lun<>0›021870 JSR DOIT›021880 .WORD $8106,INQCMD,DATA›021890 BPL LF02›021900 LF03 CLC ›021910 LDA DRIVE›021920 ADC #8›021930 STA DRIVE›021940 CMP #64›021950 BCC LF01›021960 LDA TEMP›021970 BEQ LF09›021980 JMP RESTART›021990 LF09 LDX #LOOKM2&255›022000 LDY #LOOKM2/256›022010 JSR PRINT›022020 JMP NOCTL›022030 LF02 LDX DRIVE›022040 JSR DATPAGE›022050 LDA #1›022060 STA $D6AC,X›022070 STA TEMP›022080 JSR FIXCRC›022090 LDA DRIVE›022100 LSR A›022110 LSR A›022120 LSR A›022130 CLC ›022140 ADC #'A›022150 STA LOOKM3+6›022160 LDX #LOOKM3&255›022170 LDY #LOOKM3/256›022180 JSR PRINT›022190 LF04 LDY #8›022200 LF04A STY DATA›022210 LDA DATA,Y›022220 CMP #$20›022230 BCS LF05›022240 LDA #$20›022250 LF05 JSR EOUTCH›022260 LDY DATA›022270 INY ›022280 CPY #32›022290 BCC LF04A›022300 LDA #$9B›022310 JSR EOUTCH›022320 JMP LF03›022330 ;›022340 CHKINTER›022350 LDA INTERLEAVE›022360 STA 0›022370 LDA #0›022380 STA 1›022390 STA 2›022400 JSR A3DIGPRT›022410 LDY #$0B›022420 CH1 LDA P300,Y›022430 STA $0300,Y›022440 DEY ›022450 BPL CH1›022460 JSR $E459›022470 LDA #0›022480 STA 20›022490 STA 19›022500 ;›022510 CH2 LDA #$40›022520 STA $0303›022530 JSR $E459›022540 BPL CH3›022550 BRK ›022560 CH3 LDY #0›022570 CH4 LDA $6000,Y›022580 NOP ›022590 STA $6000,Y›022600 INY ›022610 BNE CH4›022620 INC $0300+10›022630 BNE CH2›022640 LDA 20›022650 STA 0›022660 LDA 19›022670 STA 1›022680 LDA #0›022690 STA 2›022700 JSR A3DIGPRT›022710 LDA #$9B›022720 JSR EOUTCH›022730 INC INTERLEAVE›022740 LDA INTERLEAVE›022750 CMP #40›022760 BCS CH0›022770 JMP CHKINTER2›022780 CH0 BRK ›022790 P300 .BYTE $31,3,$52,$40›022800 .WORD DATA›022810 .BYTE 1,0,0,1,1,0›022820 ;›022830 CHKINTER2›022840 ;›022850 .OPT LIST›022860 .OPT NO LIST›022870 *= $02E0›022880 .WORD INIT›