10 REM Scandisk drive [,drive] 20 MODE6 30 HIMEM=HIMEM-&1000 40 OSRDCH=&FFE0 50 OSASCI=&FFE3 60 OSWORD=&FFF1 70 buffer=&70 80 FORI%=0 TO 3 STEP 3 90 P%=&900 100 [OPTI% 110 .scandisk 120 LDY #0 130 .findend 140 LDA(&F2),Y:INY:CMP#13:BEQhelp:CMP#32:BNE findend:BEQ findd1 150 .help 160 JSR print 170 EQUB10 180 EQUS"ADFS Scandisk " 190 EQUW&0A0D 200 EQUS"*Scandisk drive [,drive]" 210 EQUW&0A0D 220 EQUB0 230 RTS \ Return to Basic 310 .findd1 320 LDA(&F2),Y:CMP #32:BNE gck1 330 .skip1 340 INY:LDA(&F2),Y:CMP #32:BEQ skip1 350 .gck1 360 CMP#13:BNE clrbuf1:JMP help 370 .clrbuf1 380 LDA #32:LDX #16 390 .clr1 400 DEX:STA buffer,X:BNE clr1 410 .getd1 420 LDA (&F2),Y:STA buffer,X 430 INY:INX 440 CMP #13:BNE getd1 450 460 .loop 470 LDX xstore 480 LDA buffer,X:INX:STX xstore 490 CMP #13:BEQ end 500 CMP #32:BEQ loop 510 CMP #44:BEQ loop 520 JSR do:JMP loop 530 .end 540 LDA #13:JSR OSASCI 550 RTS \ Return to Basic 560 .do 570 SEC:SBC #48:CMP #6:BMI valid:JMP help 580 .valid 590 PHA 600 ASL A:ASL A:ASL A:ASL A:ASL A 610 STA drive 612 LDA #0:STA from_mid:STA from_low 614 LDA #48:STA errcnt 620 JSR print 630 EQUB&0D 640 EQUS"Scanning :" 650 EQUB0 660 PLA:CLC:ADC #48:JSR OSASCI 662 LDA #32:JSR OSASCI:LDA #38:JSR OSASCI:JSR pabsolute 670 JSR osword 680 LDA block:BEQ ok1:JSR doerror \ error check 690 .ok1 700 LDA HIMEM+&FD:STA hisize 710 LDA HIMEM+&FC:STA losize 720 730 .loop2 740 CLC:LDA from_low:ADC #&10:STA from_low:BCC nohi:INC from_mid 750 .nohi 752 LDA from_low:CMP losize:BNE notend 770 LDA from_mid:CMP hisize:BCS out1 771 .notend 772 JSR pabsolute 780 JSR osword 790 LDA block:BEQ ok2 \ error check 800 JSR doerror:BCS out2 810 .ok2 820 JMP loop2 822 .out1 830 LDA errcnt:CMP #48:BNE out2 831 JSR print 832 EQUW&0909 833 EQUW&0909 834 EQUW&0909 835 EQUW&0909 836 EQUS"ok" 837 EQUB0 838 RTS 839 .out2 840 JSR print 841 EQUW&0909 842 EQUW&0909 843 EQUW&0909 844 EQUW&0909 845 .errcnt EQUB 48 846 EQUS" errors" 847 EQUB0 848 RTS 850 860 .doerror 870 INC errcnt:LDA errcnt:CMP #57:BCS errend 872 LDA #10:JSR OSASCI 874 LDA #8:JSR OSASCI 876 LDA #38:JSR OSASCI 878 JSR pabsolute 879 .errend 880 RTS 890 900 .phex 910 PHA 912 LSR A:LSR A:LSR A:LSR A 920 JSR conv 930 PLA:AND #&0F 940 JSR conv:CLC:RTS 950 .conv 960 SED:CLC 970 ADC #&90:ADC #&40 980 CLD:JSR OSASCI:RTS 990 1000 .pabsolute 1010 LDA drive:AND #&1F:JSR phex 1020 LDA from_mid:JSR phex 1030 LDA from_low:JSR phex 1040 LDA #8:JSR OSASCI:JSR OSASCI 1050 JSR OSASCI:JSR OSASCI 1060 JSR OSASCI:JSR OSASCI 1070 RTS 1080 1100 .print 1110 LDY #0:PLA:STA pr1+2:PLA:STA pr1+3 1120 .pr1 1130 INY:LDA &FFFF,Y \DUMMY 1140 JSR &FFE3:BNE pr1 1150 TYA:CLC:ADC pr1+2:TAX:BCC pr2:INC pr1+3 1160 .pr2 1170 LDA pr1+3:PHA:TXA:PHA:RTS 1180 .osword 1190 LDA #&72:LDX #block MOD &100:LDY #block DIV &100:JSR OSWORD:RTS 1200 .block 1210 EQUB 0 \ return report non zero = error 1220 EQUB HIMEM MOD &100 \ pointer to data LSB 1230 EQUB HIMEM DIV &100 \ 1240 EQUB 0 \ 1250 EQUB 0 \ pointer to data MSD 1260 EQUB 8 \ command 8 = read 10 = write 1270 .drive EQUB 0 \ bits 0-4 = from_hi bits 5-7 = drive 1280 .from_mid EQUB 0 \ absolute sector address 1290 .from_low EQUB 0 1300 EQUB 16 \ number of sectors to read 1310 EQUB 0 \ not used 1320 EQUB 0 \ data length for write LSB 1330 EQUB 0 \ 1340 EQUB 0 \ 1350 EQUB 0 \ data length for write MSB 1360 .losize EQUB0 1370 .hisize EQUB0 1380 .xstore EQUB0 1400 ] 1410 NEXT 1420 PRINT'" *SAVE Scandisk "STR$~scandisk" "STR$~P%