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