1 REM Ins{nd av Bo Kullmar SYSOP <1789> 1986-01-05 20.28.16 2 ! ********************************************************************** 3 ! Program RESCUE.BAS Utg}va 1.0 1986-01-05 4 ! av B|rje Gustavsson <3374>, {ndrad av Bo Kullmar <1789> 5 ! Ins{nd av Bo Kullmar <1789> 6 ! F|r ABC800M ABC800C ABC802 ABC806 7 ! F|r disk 832/834, med UFD-DOS 8 ! Testad p} ABC806 9 ! Programmet r{ddar filer p} en skiva som f|rlorat informationen i bibl. 10 ! 11 ! L{ngst bak i programmet finns n}gra funktioner som underl{ttar f|r 12 ! dig att anpassa programmet till ditt DOS. Uppgifter finns ocks} p} v{rden 13 ! f|r andra DOS och diskar. Programmet {r dock ej testat i annat skick {n 14 ! som det nu befinner sig. 15 ! 16 ! Orginal: Versin 1.4 f|r ABC80 17 ! 18 ! ********************************************************************** 20 EXTEND : INTEGER : OPTION BASE 0 110 ! 120 ! *=*=*=*=*=*=*=*=*=*=*=*=*=*=* huvudprogram *=*=*=*=*=*=*=*=*=*=*=*=*=* 130 ! 140 DIM P(255),B(7) 150 U=PEEK(65364)/2-20 ! ***** F|r tab vid 40/80 tkn 155 Dummy=FNIni 160 ! ____________________ information _____________ 170 ; CHR$(12) CUR(0,U+6) '** RESCUE Ver 1.0 **' 180 ; CUR(1,U+6) STRING$(24,61) 190 ; : ; 'Detta program f|rs|ker r{dda filer p} en skiva som f|rlorat informationen i biblioteket. '; 195 ; 'De restaurerade filerna f}r filnamnet RESCUE..' : ; '' 200 ; 'Programmet kan dock inte r{dda allt.' 205 ; 'Om du t.ex. sparat n}got p} skivan efter det biblioteket f|rst|rts, s} har n}got'; 210 ; 'annat program p} skivan skrivits |ver.' : ; 220 ; 'Programmet kan ocks} missuppfatta gammal information p} skivan.' : ; 230 ; 'Skivan {r anv{ndbar direkt efter restaureringen, men alla sektorer {r markerade som upptagna.'; 240 ; ' Kopiera d{rf|r skivan med BACKUP/COPYLIB eller liknande program.' 245 ; 'Alternativt kan du }terts{lla bitmappen med programmet DISKCHEK. D} beh|ver' 247 ; 'du inte kopiera skivan, utan du kan forts{tta att anv{nda den.' 250 ! ____________________ s{tt drive ____________ 260 ON ERROR GOTO 260 ! ***** Vid fel inmatning 270 ; CUR(19,0) 'Vilken drive (' Typ$ ') '; : INPUT D 280 IF D<0 OR D>1 GOTO 270 ! ***** Felaktigt drivenummer 290 POKE -767,Dr(D) ! ***** S{tt drivenumret 300 ON ERROR GOTO 310 Z=CALL(24678)+CALL(24675) : IF PEEK(-747) 1000 ! **** Kolla drive 320 ! _______________ l{s in en sektor ____________ 330 FOR S=Minsekt TO Maxsekt ! ***** Sekt d{r det kan finnas program 340 ; CUR(22,0) 'Sektor:' S 350 T=FIX(S/8/Cluster) 360 ; CUR(22,20) 'Sp}r:' T 370 S4=(S-T*8*Cluster)/Cluster 380 Z=CALL(24678,FNSektoradr(S)) ! ***** L{s sektor 390 IF PEEK(-747) 1000 ! ***** Felkod fr}n diskkontrollen 400 IF PEEK(62721)=0 GOSUB 470 ! ***** Kolla om det {r en header 410 NEXT S ! ***** N{sta sektor 420 GOSUB 890 ! ***** Justera bitmap (lockout) 430 ; CUR(20,0) 'Skivan klar.' 440 END 450 ! *=*=*=*=*=*=*=*=*=* slut p} huvudprogrammet *=*=*=*=*=*=*=*=*=*=*=*=* 460 ! 470 ! ================================ jobbet ============================ 480 FOR I=0 TO 255 : P(I)=PEEK(62720+I) : NEXT I ! ***** Spar headerinf 490 GOSUB 540 ! ***** R{kna ut filnamnets plats i LIB-sekt 500 GOSUB 580 ! ***** Kalkylera filstorlek 510 GOSUB 660 ! ***** Kolla och ordna i LIB-sekt 520 RETURN 530 ! 540 ! ___________ r{kna ut filnamnets plats i LIB-sekt ___ 550 P1=INT(P(0)/16) ! ***** Relativ plats i sektorn (UFD-DOS 1-15 i f|rsta 552 ! ***** LIB sektorn 0-15 i |vriga, gammalt DOS 1-15 troligen) 560 S1=P(0)-P1*16 ! **** Relativ LIB-sekt (0-15) 570 RETURN 580 ! __________________________ kalkylera filstorlek ____ 590 FOR I=5 TO 237 STEP 2 ! ***** M|jliga platser f|r filfragment 600 IF (P(I)=255 AND P(I-1)=255) OR (P(I)=255 AND P(I+1)=255) GOTO 640 ! ***** Inga fler fragment 610 S9=(P(I) AND 31)*Cluster ! ***** Fragmentets storlek 620 S2=S2+S9 ! ***** Akumulera 630 NEXT I ! ***** N{sta fragment 640 S2=S2+1 ! ***** Plus headern 650 RETURN 660 ! ____________________ kolla och ordna i LIB-sekt ____ 670 Z=CALL(24678,FNSektoradr(16+S1)) ! ***** S1=LIB-sekt nr relativt sekt 16 680 S9=62720.+(P1*16) ! P1=LIB-platsnr relativt i sekt 690 IF (PEEK(S9))<>T GOTO 780 ! ***** R{tt pekare till headerns sp}r? 700 IF PEEK(S9+1)<>S4*32 GOTO 780 ! ***** R{tt sektor p} headerns sp}r? 710 FOR I=4 TO 14 ! ***** Antal m|jliga bokst{ver i ett filnamn 720 S8=PEEK(S9+I) ! ***** H{mta ett tecken 730 IF S8<32 OR S8>93 GOTO 780 ! ***** Kolla om godk{nt tecken 740 NEXT I ! **** N{sta tecken i ev. filnamn 750 IF PEEK(S9+15)<>255 GOTO 780 ! ***** Saknas slutbyte 760 POKE S9+2,S2,SWAP%(S2) : S2=0 ! ***** Skriv in filstorlek 770 GOTO 870 ! ***** Skriv sekt p} skiva 780 IF (S1=0 AND Ufddos) OR ( NOT Ufddos) FOR I=62720 TO 62735 : POKE I,0 : NEXT I ! ***** 16 st 0 f|rst i sekt 790 POKE S9,T,S4*32,S2,SWAP%(S2) : S2=0 ! ***** L{gg in headerpek+storlek 830 F4=F4+1 ! ***** R{knare f|r antal restaurerade filer 840 IF F4>25 F4=0 : F5=F5+1 ! ***** R{knare till filnamn 850 POKE S9+4,82,69,83,67,85,69,32,32 ! L{gg in filnamn 8 tkn 852 Fysfilnr$=OCT$(P(0)) : WHILE LEN(Fysfilnr$)<3 : Fysfilnr$='0'+Fysfilnr$ : WEND 855 Index=1 ! ***** Skriv Fysfilnr som extension 857 WHILE Index<=LEN(Fysfilnr$) 858 POKE S9+11+Index,VAL(MID$(Fysfilnr$,Index,1))+48 : Index=Index+1 860 WEND 870 Z=CALL(24675,FNSektoradr(16+S1)) ! ***** Skriv sektor 880 RETURN 890 ! _______________ justera bitmap (lockout) ____ 900 Z=CALL(24678,FNSektoradr(Bitmap)) ! ***** L{s bitmap 910 FOR I=0 TO T 920 POKE 62720+I,255 ! ***** Sp{rra alla sektorer 930 NEXT I 940 FOR I=0 TO 15 950 POKE 62959+I,16 ! ***** \ppnar f|r l{sning av filnamn 960 NEXT I 970 Z=CALL(24675,FNSektoradr(Bitmap)) ! ***** Skriv justerad bitmap 980 RETURN 990 ! ===================================================== felhantering 1000 ; : RESTORE : FOR A=1 TO 4 : READ N,F$ : IF (PEEK(-747) AND N) ; CHR$(7) F$ 1010 NEXT A 1020 END 1030 DATA 8, 'Checksummafel' 1040 DATA 16, 'D}lig disk' 1050 DATA 64, 'Skivan skrivskyddad' 1060 DATA 128,'Luckan |ppen' 2000 ! **** 2010 ! **** Programmet {r nu avsett f|r UFD-DOS och 832/834 drive. 2020 ! **** 2030 ! **** Dessa funktioner {r till f|r att underl{tta f|r dig som vill 2040 ! **** anpassa programmet till ett annat DOS och eller drive 2050 ! ***** 2060 DEF FNIni 2070 ! ***** 2080 ! ***** F|r 830 disk g{ller Bitmap=6 och Cluster=1 2090 ! ***** f|r |vriga diskar g{ller 14 och 4. 2100 ! ***** 2110 ! ***** Gammalt DOS: Dr(0)=0 Dr(1)=1 2120 ! ***** 2130 ! ***** UFD-DOS: 2140 ! ***** MF: Dr(0)=8 Dr(1)=9 2150 ! ***** MO: Dr(0)=12 Dr(1)=13 2160 ! ***** SF: Dr(0)=16 Dr(1)=17 2170 ! ***** RAM: 29 2180 ! ***** 2190 ! ***** Minsekt f|r 830 och gammalt DOS 24 alla |vriga har troligen 32 2200 ! ***** Maxsekt 830 = 639, 832/834 = 2559 och 838 = ? 2210 ! ***** 2220 Bitmap=14 : Dr(0)=8 : Dr(1)=9 : Cluster=4 : Ufddos=-1 2230 Minsekt=32 : Maxsekt=2559 : Typ$='MF' 2240 RETURN 0 2250 FNEND 2260 DEF FNSektoradr(Sektor) 2270 ! ***** Anv{nds om sektoradressen skall ber{knas p} annat s{tt, t ex 2280 ! ***** multipliceras med 32. 2290 RETURN Sektor 2300 FNEND