1 REM Ins{nd av Erik Wetterberg <5948> 1987-01-21 Diskett
2 !
10 ! LIST READISC.BAS
11 !
20 ! READISC - L[SNING FR]N DISK
21 ! L{ser sektorer fr}n disk. Kan tolka directorys och bitmap
22 ! |ver lediga cluster. Testad under UFD-DOS mot h}rddisk (HD),
23 ! flexskiva (MF) och RAM-disk. F|ruts{tter att bitmapen finns
24 ! p} sektor 14 (vilket kanske inte st{mmer f|r alla minnen)
25 ! och att directoryt b|rjar i sektor 16. Hur det klarar gamla
26 ! DOS har jag ingen aning om.
27 !
30 ! utvecklat p} Facit DTC 2
40 ! testat p} Facit DTC 2 med HD, MF och RAM
50 ! anpassat (efter b{sta f|rm}ga) ocks} till ABC806
60 ! anpassning till andra datorer kan g|ras i FNInittang
70 ! Erik Wetterberg <5948>
80 ! ----------------
81 ! Rev 19870314.1916 Bengt Sandgren <2776>
82 ! rad 2135 tillkommit f|r att ge alla ABC80x sammma tangentfunktioner
83 ! P} rad 2300 har "CHAIN NUL:" tagits bort
84 ! Text p} rad 2170 {ndrad
85 !
86 !
87 !
88 ! Vad g|r Pf3 ???
89 !
90 ! ------------------------------------------------------
100 EXTEND
110 INTEGER
120 ON ERROR GOTO 420
130 DIM Bitbl$=256%,Aktbuf$=256%,Filnamn$=14%,Drive$=3%
140 DIM Ti$=0% : POKE VAROOT(Ti$),0%,17%,30783%,SWAP%(30783%),0%,17%
150 DIM Visa$=0% : POKE VAROOT(Visa$),1840%,SWAP%(1840%),30800%,SWAP%(30800%),1840%,SWAP%(1840%)
160 Nextprog$=FNInarg$
170 PRINT CHR$(12%)
180 Z%=FNInittang%
190 True%=(1%=1%)
200 Hex%=True% : Dirmode%=True%
210 Blnr%=16%
220 Drive$=SPACE$(3%) : Drive$=FNSetdrive$
230 Dirbl%=FNReaddir%(16%)
240 Kom$=FNGet$
250 WHILE Kom$<>"Q" AND Kom$<>Esc$
260 IF Kom$=Ret$ THEN IF Dirmode% THEN Dirbl%=FNReaddir%(Dirbl%) ELSE Blnr%=FNVisabl%(Blnr%)
270 IF Kom$=Fram$ THEN IF Dirmode% THEN Dirbl%=FNReaddir%(Dirbl%+3%) ELSE Blnr%=FNVisabl%(Blnr%+1%)
280 IF Kom$=Back$ THEN IF Dirmode% THEN Dirbl%=FNReaddir%(Dirbl%-3%) ELSE Blnr%=FNVisabl%(Blnr%-1%)
290 IF Kom$=Pf$(1%) THEN Blnr%=FNVisabl%(FNReadtal%("BLOCK: ",Blnr%,0%,12%))
300 IF Kom$=Pf$(2%) THEN Dirbl%=FNReaddir%(FNReadtal%("DIR: ",16%,0%,12%))
310 IF Kom$=Pf$(3%) THEN Slask%=FNMapread%
320 IF Kom$=Pf$(4%) THEN Drive$=FNSetdrive$
330 IF Kom$=Pf$(5%) THEN Hex%=NOT Hex%
340 Kom$=FNGet$
350 WEND
360 Rad25$=SPACE$(80%)
370 PRINT CUR(22%,0%);
380 ON ERROR GOTO 400
390 IF Nextprog$<>"" THEN CHAIN Nextprog$
400 END
410 ! ----- FELHANTERING huvudprogrammet
420 IF ERRCODE=53% THEN RESUME
430 PRINT "ERRCODE: ";ERRCODE
440 STOP
450 ! ================== funktioner ==================
460 !
470 DEF FNGet$ LOCAL T$=1
480 WHILE SYS(5%)=0%
490 Ti$=MID$(TIME$,3%,17%)
500 WEND
510 GET T$
520 RETURN T$
530 FNEND
540 !
550 DEF FNBlanka$=CUR(1%,0%)+SPACE$(1840%)
560 DEF FNBlankstat$=CUR(0%,12%)+SPACE$(26%)
570 !
580 DEF FNSetdrive$ LOCAL Dr$=3
590 ! -- inst{llning av aktuell drive
600 Dr$=FNReadtxt$("DRIVE: ",Drive$,0%,0%)
610 WHILE NOT FNPokedr%(Dr$)
620 PRINT CHR$(7%);
630 Dr$=FNReadtxt$("DRIVE: ",Drive$,0%,0%)
640 WEND
650 Bitbl$=FNReadbl$(14%)
660 IF FNGetstatus%>0% THEN PRINT CHR$(7%) CUR(0%,24%) "Felkod: ";FNGetstatus%;
670 RETURN Dr$
680 FNEND
690 !
700 DEF FNPokedr%(In$)
710 IF In$="RAM" THEN POKE -767%,29% : RETURN True%
720 IF RIGHT$(In$,3%)<"0" OR RIGHT$(In$,3%)>"3" THEN RETURN NOT True%
730 IF INSTR(1%,"DRHDMFMOSF",LEFT$(In$,2%))=0% THEN RETURN NOT True%
740 POKE -767%,(INSTR(1%,"DRHDMFMOSF",LEFT$(In$,2%))-1%)*2%+VAL(RIGHT$(In$,3%))
750 RETURN True%
760 FNEND
770 !
780 DEF FNReadbl$(Innr%) LOCAL Buff$=0
790 ! l{sning av block fr}n disk
800 Slask%=FNPokedr%(Drive$)
810 POKE VAROOT(Buff$),0%,1%,62720%,SWAP%(62720%),0%,1%
820 Slask%=CALL(24678%,Innr%)
830 RETURN Buff$
840 FNEND
850 !
860 DEF FNGetstatus%=PEEK(-747%)
870 !
880 DEF FNGetclust%
890 IF (PEEK(-767%) AND 28%)=4% THEN RETURN 32%
900 IF (PEEK(-767%) AND 28%)=12% THEN RETURN 1%
910 RETURN 4%
920 FNEND
930 !
940 DEF FNUsedcl%(Clnr%)=ASCII(MID$(Bitbl$,(Clnr%/8%)+1%,1%)) AND (2%^(7%-MOD(Clnr%,8%)))
950 !
960 DEF FNVisabl%(Innr%) LOCAL C$=1,Rad%,Rpos%,Pos%
970 ! visning av block p} sk{rmen
980 Dirmode%=NOT True%
990 PRINT FNBlankstat$;
1000 PRINT CUR(0%,0%) "DRIVE: ";Drive$;
1010 PRINT CUR(0%,12%) "BLOCK:";Innr%;
1020 PRINT CUR(0%,24%);
1030 Aktbuf$=FNReadbl$(Innr%)
1040 IF FNGetstatus%>0% THEN PRINT CHR$(7%) "Felkod: ";FNGetstatus%; : RETURN Innr%
1050 IF FNUsedcl%(Innr%/FNGetclust%) THEN PRINT "ANV[NT CLUSTER"; ELSE PRINT "LEDIGT CLUSTER";
1060 PRINT FNBlanka$; : PRINT CUR(2%,0%);
1070 Pos%=1% : L$=""
1080 WHILE Pos%<=256%
1090 C$=MID$(Aktbuf$,Pos%,1%)
1100 IF Hex% THEN Ct$=HEX$(ASCII(C$)) ELSE Ct$=NUM$(ASCII(C$))
1110 PRINT SPACE$(3%-LEN(Ct$))+Ct$+" ";
1120 IF ASCII(C$)<32% OR ASCII(C$)>126% THEN L$=L$+"." ELSE L$=L$+C$
1130 Pos%=Pos%+1%
1140 IF MOD(Pos%,16%)=1% THEN PRINT L$; : L$=""
1150 WEND
1160 RETURN Innr%
1170 FNEND
1180 !
1190 DEF FNMapread% LOCAL Kol%,Pos%,Rad%,Clfakt%
1200 IF FNGetstatus%>0% THEN PRINT CHR$(7%) CUR(0%,24%) "Felkod: ";FNGetstatus%; : RETURN 0%
1210 PRINT FNBlanka$;
1220 Kol%=1% : Pos%=1% : Rad%=2% : Clfakt%=8%*FNGetclust%
1230 WHILE Pos%<89%
1240 PRINT CUR(Rad%,Kol%);
1250 PRINT USING "#####" (Pos%-1%)*Clfakt%;
1260 PRINT " (" FNVisabit$(MID$(Bitbl$,Pos%,1%)) ") ";
1270 Pos%=Pos%+1%
1280 IF Rad%=23% THEN Rad%=2% : Kol%=Kol%+20% ELSE Rad%=Rad%+1%
1290 WEND
1300 RETURN 0%
1310 FNEND
1320 ! ------------------
1330 DEF FNVisabit$(In$) LOCAL Bit%,Innr%,Ut$=8
1340 Innr%=ASCII(In$)
1350 Ut$=SPACE$(8%)
1360 Bit%=1%
1370 WHILE Bit%<=8%
1380 IF 2%^(Bit%-1%) AND Innr% THEN MID$(Ut$,9%-Bit%,1%)="*"
1390 Bit%=Bit%+1%
1400 WEND
1410 RETURN Ut$
1420 FNEND
1430 ! ------------------
1440 DEF FNReaddir%(In%) LOCAL Buff$=256,Kol%,Pos%,Rad%,Block%,Maxblock%,Clfakt%
1450 Dirmode%=True%
1460 Kol%=0% : Block%=In% : Rad%=2% : Maxblock%=Block%+3%
1470 PRINT FNBlankstat$+FNBlanka$;
1480 PRINT CUR(0%,0%) "DRIVE: ";Drive$;
1490 PRINT CUR(0%,12%) "DIR:";Block%;"-";Maxblock%;
1500 Clfakt%=32%/FNGetclust%
1510 WHILE Block%<=Maxblock%
1520 Buff$=FNReadbl$(Block%)
1530 IF Block%=16% THEN Pos%=17% ELSE Pos%=1%
1540 WHILE Pos%<256%
1550 IF CVT$%(MID$(Buff$,Pos%+2%,2%))<1% THEN GOTO 1610
1560 PRINT CUR(Rad%,Kol%);
1570 PRINT USING "#####" (ASCII(MID$(Buff$,Pos%,1%))*256%+ASCII(MID$(Buff$,Pos%+1%,1%)))/Clfakt%;
1580 PRINT CUR(Rad%,Kol%+7%) MID$(Buff$,Pos%+4%,11%);
1590 PRINT CUR(Rad%,Kol%+19%);
1600 PRINT USING "###" CVT$%(MID$(Buff$,Pos%+2%,2%));
1610 Pos%=Pos%+16%
1620 IF Rad%=22% AND Block%