1 REM +++++++++++++++++++++++++++++++++ 2 REM ! Program .... DISKSTAT 3 REM ! Utg}va 1980-01-27 4 REM ! av (c) Per Lindberg <816> 7 REM ! Minne 16 Kbytes f|r flexskiva 9 REM +++++++++++++++++++++++++++++++++ 10 REM "DISKSTAT - ABC80 DISKETTE STATUS" 11 REM Programet ger status |ver vald disk. 12 REM Funkar dock endast p} enkel densitet. 13 REM "THE MAD PROGRAMMER STRIKES AGAIN" 14 REM 15 REM Screening av 16 REM Allan Varcoe & G|ran Olsson 17 REM 19 REM +++++++++++++++++++++++++++++++++ 20 REM ** INIT ** 30 C1$="01BAL" 40 D%=1% : POKE -767%,D% 50 DEFFNP%(A%)=PEEK(A%)+SWAP%(PEEK(A%+1%)) 60 DEFFNM%(I%,J%)=I%-I%/J%*J% 70 DEFFNA%(Y%,X%)=31744%+5%*(Y% AND 24%)+128%*(Y% AND 7%)+X% 80 ; CHR$(12%); 90 ; TAB(0%)"TRACK/SECTOR MAP DRIVE 1" 100 ; " 1 2 3" 110 ; "0123456789012345678901234567890123456789"; 120 ; CUR(3%,0%)"========================================"; 130 ; CUR(12%,0%)"========================================"; 140 REM +----------------------+ 150 REM ! M E N Y ! 160 REM +----------------------+ 170 ; CUR(15%,0%)"COMMAND:" 180 ; "-------" 190 ; 200 ; "0 -SELECT DRIVE 0" 210 ; "1 -SELECT DRIVE 1" 220 ; "B -SCAN FOR BAD SECTORS" 230 ; "A -MAP FILE ALLOCATION" 240 ; "L -COMPLETE LIBRARY CHECK" 250 ; CUR(15%,9%)" ";CUR(15%,9%); 260 GET C$ : C%=ASC(C$) : IF C%>95% C%=C%-32% : C$=CHR$(C%) 270 ; C$; 280 ON 1%+INSTR(1%,C1$,C$) GOSUB 300,340,350,390,560,630 290 GOTO 170 300 ; CHR$(7%);CUR(15%,9%); : GOTO 260 310 REM +---------------------------+ 320 REM ! S E T D R I V E N R ! 330 REM +---------------------------+ 340 GOSUB 1380 : D%=0% : POKE -767%,D% : ; CUR(0%,23%)"0"; : RETURN 350 GOSUB 1380 : D%=1% : POKE -767%,D% : ; CUR(0%,23%)"1"; : RETURN 360 REM +---------------------------+ 370 REM ! SCAN FOR DISK ERRORS ! 380 REM +---------------------------+ 390 GOSUB 1380 400 ; CUR(0%,26%)"DISK STATUS:"; 410 ; CUR(15%,25%)". = GOOD SECTOR" 420 ; CUR(16%,25%)" = BAD SECTOR" 430 FOR T%=0% TO 39% 440 FOR S%=0% TO 7% 450 Z%=CALL(24678%,SWAP%(T%)+32%*S%) 460 E%=PEEK(-747%) 470 ; CUR(4%+S%,T%); 480 IF E% E1%=E1%+1% : ; ""; : ; CUR(13%,15%)"LATEST STATUS ERROR:"E%" "; ELSE ; "."; 490 NEXT S% 500 NEXT T% 510 ; CUR(13%,0%)E1%" ERRORS"; 520 RETURN 530 REM +---------------------------+ 540 REM ! MAP DISK FILES ! 550 REM +---------------------------+ 560 GOSUB 1380 570 ; CUR(0%,26%)"FILE SPACE:"; 580 F1%=0% 590 GOTO 810 600 REM +---------------------------+ 610 REM ! COMPLETE LIB CHECK ! 620 REM +---------------------------+ 630 GOSUB 1380 640 ; CUR(0%,26%)"LIB CHECK:"; 650 ; CUR(20%,25%)"a = WRONG REC" : POKE FNA%(20%,25%),PEEK(FNA%(20%,25%)) OR 128% 660 F1%=-1% 670 REM +---------------------------+ 680 REM ! S C A N L I B R A R Y ! 690 REM +---------------------------+ 700 REM S% -SECTOR IN LIB 710 REM N% -ITEM IN LIB REC 720 REM T1% S1% -DESCRIPTOR REC TRACK/SECTOR 730 REM I% -ITEM IN DESCRIPT REC 740 REM T2% S3% -FILE REC.BLOCK START 750 REM S2% -NR OF REC IN BLOCK 760 REM S4% -REC COUNTER 770 REM T2% S5% -NEXT REC IN FILE 780 REM N1% -FILE NR 790 REM N2% -REC NR 800 REM N3% N4% -FILE/REC NR TO BE TESTED 810 ; CUR(15%,25%)". = FREE RECORD" 820 ; CUR(16%,25%)" = BAD RECORD" 830 ; CUR(17%,25%)"* = LIB RECORD" 840 ; CUR(18%,25%)"A = HEAD RECORD" 850 ; CUR(19%,25%)"a = FILE RECORD" 860 Z%=CALL(24678%,192%) 870 IF PEEK(-747%) ; CUR(13%,0%)"DISK STATUS ERROR -CAN'T READ DISK MAP" : RETURN 880 S1%=0% : S2%=0% : F%=-1% 890 FOR T%=0% TO 39% 900 D%=PEEK(62720%+T%) 910 FOR R%=0% TO 7% 920 IF (D% AND 2%^(7%-R%)) THEN F%=-1% ELSE ; CUR(4%+R%,T%)"."; : S1%=S1%+1% : IF F% S2%=S2%+1% : F%=0% 930 NEXT R% : NEXT T% 940 ; CUR(13%,10%)RIGHT$(NUM$(S1%),2%)" SECTORS FREE IN"S2%" BLOCKS"; 950 REM +--------FILE ALLOC---------+ 960 N$="A" : U%=0% 970 FOR S%=0% TO 7% 980 Z%=CALL(24678%,SWAP%(2%)+32%*S%) 990 IF PEEK(-747%) ; CUR(4%+S%,2%)""; : GOTO 1320 1000 ; CUR(4%+S%,2%)"*"; 1010 FOR N%=0% TO 14% 1020 IF PEEK(62736%+N%*16%+2%)=255% THEN 1310 : REM NEXT FILE 1030 T1%=PEEK(62736%+N%*16%) : S1%=PEEK(62736%+N%*16%+1%)/32% 1040 Z%=CALL(24678%,SWAP%(T1%)+32%*S1%) 1050 IF PEEK(-747%) ; CUR(4%+S1%,T1%)""; : GOTO 1290 1060 ; CUR(4%+S1%,T1%)N$; 1070 N1%=PEEK(62720%) : N1%=N1%/16%+16%*(N1%-N1%/16%*16%) 1080 N2%=PEEK(62721%)+SWAP%(PEEK(62722%)) 1090 IF N2%<>0% POKE FNA%(4%+S1%,T1%),PEEK(FNA%(4%+S1%,T1%)) OR 128% : GOTO 1290 1100 FOR I%=4% TO 256% STEP 2% 1110 T2%=PEEK(62720%+I%) 1120 IF T2%=255% 1290 1130 S2%=PEEK(62720%+I%+1%) 1140 S3%=S2%/32% : S2%=S2%-32%*S3% 1150 S5%=S3%-1% 1160 FOR S4%=0% TO S2% 1170 S5%=S5%+1% 1180 IF S5%=8% S5%=0% : T2%=T2%+1% 1190 IF I%<>4% OR S4%<>0% ; CUR(4%+S5%,T2%)CHR$(ASC(N$)+32%); 1200 IF F1%=0% THEN 1260 1210 Z%=CALL(24678%,SWAP%(T2%)+32%*S5%) : IF PEEK(-747%) ; CUR(4%+S5%,T2%)""; : GOTO 1250 1220 N3%=PEEK(62720%) : N3%=N3%/16%+16%*(N3%-N3%/16%*16%) 1230 N4%=PEEK(62721%)+SWAP%(PEEK(62722%)) 1240 IF N3%<>N1% OR N4%<>N2% POKE FNA%(4%+S5%,T2%),PEEK(FNA%(4%+S5%,T2%)) OR 128% 1250 N2%=N2%+1% 1260 NEXT S4% 1270 Z%=CALL(24678%,SWAP%(T1%)+32%*S1%) 1280 NEXT I% : ; CUR(4%+S1%,T1%)N$; : POKE FNA%(4%+S1%,T1%),PEEK(FNA%(4%+S1%,T1%)) OR 128% : GOTO 1290 1290 U%=U%+1% : N$=CHR$(ASC(N$)+1%) : IF N$>"Z" N$="A" 1300 Z%=CALL(24678%,SWAP%(2%)+32%*S%) 1310 NEXT N% 1320 NEXT S% 1330 ; CUR(13%,0%)RIGHT$(NUM$(U%),2%)TAB(3%)"FILES,"; 1340 RETURN 1350 REM +---------------------------+ 1360 REM ! CLEANUP SCREEN ! 1370 REM +---------------------------+ 1380 FOR I%=4% TO 11% : ; CUR(I%,0%)SPACE$(40%); : NEXT I% : ; CUR(0%,24%)SPACE$(20%); 1390 FOR I%=13% TO 22% : ; CUR(I%,0%)SPACE$(40%); : NEXT I% 1400 RETURN