20 ! --------------------------------------------- 30 ! ISAMCHEK Ver 1.23 - Kontroll av isamregister 40 ! F|r ABC800-serien, Endast testat i LUX-NET 50 ! F}r kopieras fritt endast i icke-komersiella syften. 60 ! 70 ! Ver 1.00 86-01-16 Av <5357> Kristoffer Eriksson 80 ! Ver 1.20 86-02-06 <5357> Fler kontroller, kan f|rl{nga fil 85 ! Ver 1.21 86-04-23 <5357> Integer-index r{ttat 86 ! Ver 1.22c86-08-06 <5357> Filer>32767 sektorer 87 ! Ver 1.23 86-10-05 <5357> >32767 {ven i FNF|rl{ng 90 ! --------------------------------------------- 100 ! 110 ! OBS: [ven om ett register passerar alla kontroller utan anm{rkning 120 ! finns det inga garantier f|r att det {r helt felfritt. 130 ! Jag vet inte om l{ngdm{tningen av filerna fungerar p} alla DOS. 140 ! Pekare i ISAM: Byte (B) Sektor (W) 150 ! 160 INTEGER : EXTEND 170 ! 180 DIM I$=253,Rub$=50,X$=256,Prfil$=16,Ism$=16,Isd$=16,Cmp$=23 190 DIM Ind$(15)=8,Indtop(15),Indlen(15),Indtyp(15) 200 Rub$="-*-------- Isam-fil-kontroll --------*-" 210 Prradl=130 ! Skrivarens radl{ngd 220 Prfil$="PR:\\\7" 230 Prinit$=CHR$(15) ! EPSON, smal skrift 240 Prvmarg=10 ! V{nstermarginal f|r skrivaren 245 REM ISAMCHIC.ASM 860729 246 Cmp$=CHR$(33,255,255,123,178,200,33,0,0,24,3,33,0,0,167,237,82,33,0,0,208,43,201) 247 Cmp1=VARPTR(Cmp$) : Cmp2=Cmp1+11 ! Cmp1:DE=0/>Ismlast, Cmp2:DE>Isdlast 250 ! 260 ! ___Fr}ga om filnamn__________ 270 ; Rub$ 280 INPUT "Filnamn: "Ism$ 290 IF Ism$="" THEN 2310 300 IF INSTR(1,Ism$,".")=0 THEN Ism$=Ism$+".ISM" 310 OPEN Ism$ AS FILE 1 320 ! 330 ! ___Fr}ga om optioner________ 340 ; 350 ; "I - Kontroll av indextr{den." 360 ; "T - Kontroll av kedjan med tomma poster i datafilen." 370 ; "B - Kontroll av att postpekare endast pekar p} b|rjan av poster." 380 ; "R - Kontroll av att alla dataposter refereras exakt 1 g}ng per index." 390 ; "D - Detaljerad utskrift av alla indexsektorer." 400 ; "V - Val av vilka indextr{d som ska testas." 410 ; "S - Starta fr}n viss sektor." 420 ; "P - Printerutskrift." 430 ; "E - Skriv ej ut hela inneh}llet i sektorer med fel i." 440 ; "F - F|rl{ng fil." 450 ! 460 ON ERROR GOTO 460 : INPUT "Vilka kontroller ska g|ras: "I$; 470 ! 480 Optdpek=0 : Optind=0 : Optdetalj=0 : Optpr=0 : Optv{lj=0 : Optejd=0 490 Optdfre=0 : Optifre=0 : Opf|rl{ng=0 : Optim=-1 : Optdm=0 : Optbt=0 : Flg=0 500 FOR I=1 TO LEN(I$) 510 X=INSTR(1,"BDEFIOPRSTV",CHR$(ASCII(MID$(I$,I,1)) AND 223))+1 520 ON X GOSUB 560,570,580,590,600,610,620,640,690,700,710,720 530 IF Flg THEN 450 540 NEXT I 550 WHILE 0 560 ; CHR$(7) ' "' MID$(I$,I,1) '"' : Flg=-1 : RETURN 570 Optdpek=-1 : RETURN ! B 580 Optdetalj=-1 : RETURN ! D 590 Optejd=-1 : RETURN ! E 600 Optf|rl{ng=-1 : RETURN ! F 610 Optind=-1 : RETURN ! I 620 Optim=0 : RETURN ! O (Ej test oref indsekt, spara minne) 630 ! 640 ON ERROR GOTO 670 : PREPARE Prfil$ AS FILE 10 : ; #10 Prinit$; ! P 650 Wrradpos=0 : Wrlastcr=-1 660 Optpr=-1 : RETURN 670 ; CHR$(7) "Felkod" ERRCODE "p} skrivaren (" Prfil$ ")." : Flg=-1 : RETURN 680 ! 690 Optdm=-1 : Optdfre=-1 : Optim=0 : RETURN ! R 700 Optbt=-1 : RETURN ! S 710 Optdfre=-1 : RETURN ! T 720 Optv{lj=-1 : Optind=-1 : Optim=0 : RETURN ! V 730 WEND 740 IF I$="" THEN ; "Inga." ELSE ; 750 IF (Optdetalj OR Optejd OR Optdm) AND NOT Optbt THEN Optind=-1 760 IF Optdpek AND NOT Optdfre THEN Optind=-1 770 Optifre=Optind AND NOT Optbt 780 IF Optpr ; #10 SPACE$(Prvmarg) Rub$ : ; #10 SPACE$(Prvmarg) "Tester: " I$ 790 ON ERROR GOTO 800 ; 810 ! 820 ! 830 ! ___L{s in allm{na data______ 840 GET #1 I$ COUNT 27 850 X=ASCII(MID$(I$,1,1)) 860 IF X<>1 THEN Z=FNWr("Ok{nd isamfilversion (pos 0): "+NUM$(X)+", borde vara 1. Programmet kanske inte passar till filen.",1) 870 ! 880 Isd$="" 890 X=ASCII(MID$(I$,2,1)) 900 IF X<>255 THEN Isd$=FNDevnam$(X AND 31) : IF Isd$="" THEN Z=FNWr("Ok{nd diskdrive (pos 1): "+NUM$(X)+".",1) 910 Isd$=Isd$+FNTrailsp$(MID$(I$,3,8))+"."+FNTrailsp$(MID$(I$,11,3)) 920 ! 930 X=ASCII(MID$(I$,14,1)) 940 IF X<>3 THEN Z=FNWr("Pos 13 borde vara 3, {r nu "+NUM$(X)+".",1) 950 Ismantsec=CVT$%(MID$(I$,15,2)) 960 Isdendb=ASCII(MID$(I$,17,1)) ! Position efter sista posten, byte 970 Isdends=CVT$%(MID$(I$,18,2)) ! -"-, sektor 980 Ismfreb=ASCII(MID$(I$,20,1)) ! F|rsta lediga indexsektor 990 Ismfres=CVT$%(MID$(I$,21,2)) 1000 Isdfreb=ASCII(MID$(I$,23,1)) ! F|rsta raderade post 1010 Isdfres=CVT$%(MID$(I$,24,2)) 1020 Postlen=CVT$%(MID$(I$,26,2)) ! Postl{ngd 1030 Ismlen=PEEK2(64778) ! Antal sektorer i filen 1040 ! 1050 ! ___Skriv ut info___________ 1060 Z=FNWr("",1) 1070 Z=FNWr("Indexfil: "+Ism$,1) 1080 Z=FNWr("Antal sektorer enligt filen: "+FNUs$(Ismantsec)+", i verkligheten: "+FNUs$(Ismlen)+".",1) 1090 Z=FNWr("Position efter sista posten i datafilen: Sektor "+FNUs$(Isdends)+" Byte "+NUM$(Isdendb)+".",1) 1100 Z=FNWr("Position d{r kedjan av tomma poster b|rjar: Sektor "+FNUs$(Isdfres)+" Byte "+NUM$(Isdfreb)+".",1) 1110 Z=FNWr("Position f|r f|rsta tomma indexsektorn: Sektor "+FNUs$(Ismfres)+" Byte "+NUM$(Ismfreb)+".",1) 1120 Z=FNWr("Postl{ngd: "+NUM$(Postlen)+" bytes.",1) 1130 ! 1140 ! ___Datafilen________________ 1150 Z=FNWr("",1) 1160 Z=FNWr("Datafil: "+Isd$,1) 1170 ON ERROR GOTO 1220 : OPEN Isd$ AS FILE 2 1180 Isdlen=PEEK2(64778) 1190 Z=FNWr("Verklig l{ngd: "+FNUs$(Isdlen)+" sektorer.",1) 1200 IF (Isdlen<=Isdfres XOR Isdlen<0 XOR Isdfres<0) OR (Isdlen3 THEN Z=FNWr("Byte "+NUM$(POSIT(1)-11)+" (Index "+FNTrailsp$(Ind$(Antind))+") borde vara 3, {r nu"+NUM$(X)+".",1) 1380 Indtop(Antind)=CVT$%(MID$(I$,10,2)) ! Startsektor f|r indextr{det 1390 Indlen(Antind)=ASCII(MID$(I$,15,1)) ! Indexets l{ngd 1400 Indtyp(Antind)=ASCII(MID$(I$,16,1)) ! Datatyp 1410 ! 1420 Z=FNWr(FNHjust$(5,NUM$(Antind))+" "+Ind$(Antind)+FNHjust$(9,FNUs$(Indtop(Antind))),0) 1430 IF ASCII(MID$(I$,12,1)) THEN Z=FNWr(" Ja",0) ELSE Z=FNWr(" Nej",0) 1440 Z=FNWr(FNHjust$(9,NUM$(CVT$%(MID$(I$,13,2))))+FNHjust$(6,NUM$(Indlen(Antind))),0) 1450 X=Indtyp(Antind) 1460 IF X>5 THEN Z=FNWr(NUM$(X),0) : GOTO 1480 1470 Z=FNWr(" "+MID$("BinAscIntFlSFlDBCD",X*3+1,3),0) 1480 IF RIGHT$(I$,17)<>STRING$(4,0) THEN Z=FNWr(" Resten <> 0. Ok{nd anv{ndning.",0) 1490 IF X=3 THEN Indlen(Antind)=4 1500 IF X=4 THEN Indlen(Antind)=8 1510 Z=FNWr("",1) 1520 WEND 1530 ! 1540 IF Antind=0 THEN Z=FNWr("Inga index definierade.",1) 1550 ! 1560 ! ___V{lj index___ 1570 WHILE Optv{lj 1580 ; 1590 ON ERROR GOTO 1590 1600 INPUT "Ange siffrorna f|r de index som ska testas: "I$ 1610 FOR I=1 TO LEN(I$) 1620 IF MID$(I$,I,1)<"1" OR ASCII(MID$(I$,I,1))-48>Antind THEN ; CHR$(7) '"' MID$(I$,I,1) '"' : GOTO 1590 1630 NEXT I 1640 IF 0 WEND 1650 ! 1660 ! ___F|rberedelser___ 1670 IF Optind OR Optdfre OR Optifre THEN ; : ; "PF1=Avbryt, Mellanslag=Paus" 1680 IF Optdm THEN Optdm=FNMapdim(INT(FNUs.(FNMax(Isdlen,Isdends+1))*253./Postlen)) 1690 IF Optim THEN Optim=FNMapdim(FNMax(Ismlen,Ismantsec)-1) 1700 IF Optim THEN Z=FNBitmap(0) 1710 Isdlast=-FNMax(-(Isdlen+1),-Isdends) 1720 Ismlast=-FNMax(-Ismlen,-Ismantsec)-1 1730 Flgdp=NOT (Optdm OR Optdpek) 1732 MID$(Cmp$,8,2)=CVT%$(Ismlast) : MID$(Cmp$,13,2)=CVT%$(Isdlast) 1740 ! 1750 ! 1760 ! ___Kolla ledig-listor___ 1770 IF Optdfre THEN Z=FNListskal(2) 1780 IF Optifre THEN Z=FNListskal(1) 1790 ! 1800 WHILE Optbt 1810 ; 1820 ON ERROR GOTO 1820 : INPUT "Ange sektor (0=Sluta): ";I 1830 IF I=0 THEN 2190 1840 Flgavbryt=0 1850 Ind=FNBacktrace(I) 1860 IF Optim AND Ind THEN Z=0 : WHILE Z<=Maxmap : Bitmap(Z)=0 : Z=Z+1 : WEND 1870 Z=FNAvbryt 1880 WEND 1890 ! 1900 ! ___Kolla index___ 1910 WHILE Optind 1920 Flg=0 1930 FOR Ind=1 TO Antind 1940 IF Optv{lj IF INSTR(1,I$,CHR$(Ind+48))=0 THEN WHILE 0 1950 WHILE Optdm AND Flg 1960 Z=FNWr(STRING$(80,45),1) 1970 I=0 : WHILE I<=Maxmap : Bitmap(I)=0 : I=I+1 : WEND 1980 Z=FNListskal(2) 1990 IF Flgavbryt THEN 2090 2000 IF 0 WEND 2010 Flgavbryt=0 2020 Z=FNWr("",1) 2030 Z=FNWr("Kollar index "+FNTrailsp$(Ind$(Ind))+".",1) 2040 Nycklar=0 2050 Z=FNChkind(Indtop(Ind),Indlen(Ind),Indtyp(Ind),0,0) 2060 Z=FNWr("",1)+FNWr(FNUs$(Nycklar)+" nycklar funna.",1) 2070 IF Flgavbryt THEN Z=FNAvbryt : Optim=0 2080 IF Optdm AND NOT Flgavbryt THEN Z=FNMapskal(2) ! Oref poster 2090 Flg=-1 2100 WEND 2110 NEXT Ind 2120 IF Optim THEN Z=FNMapskal(1) ! Orefererade sektorer 2130 IF 0 WEND 2140 ! 2150 Z=FNWr("",1) 2160 Z=FNWr("Klart.",1) 2170 IF Optpr THEN ; #10 CHR$(12); 2180 ! 2190 ! ___F|rl{ngning___ 2200 WHILE Optf|rl{ng 2210 ON ERROR GOTO 2210 2220 ; 2230 INPUT "Vilken fil ska f|rl{ngas (0=Ingen, 1=Index, 2=Data) ? "X 2240 WHILE X=1 OR X=2 2250 INPUT "Hur m}nga nya sektorer ? "Z 2260 IF Z<1 THEN 2250 2270 IF X=1 THEN Ismlen=FNF|rl{ng.(1,FNUs.(Ismlen),Z) ELSE Isdlen=FNF|rl{ng.(2,FNUs.(Isdlen),Z) 2280 IF 0 WEND 2290 IF X WEND 2300 ! 2310 CLOSE 2320 END 2330 ! 2340 DEF FNListskal(Fil) 2350 Flgavbryt=0 2360 X$="sektorer i index" : IF Fil=2 THEN X$="poster i data" 2370 Z=FNWr("",1) 2380 Z=FNWr("Kollar kedjan av tomma "+X$+"filen (Sektor,byte).",1) 2390 IF Fil=1 THEN Z=FNChklist(Ismfres,Ismfreb,1) ELSE Z=FNChklist(Isdfres,Isdfreb,2) 2400 Z=FNAvbryt 2410 RETURN 0 2420 FNEND 2430 ! 2440 DEF FNMapskal(Fil) 2450 Z=FNWr("",1) 2460 IF Fil=1 THEN X$="sektorer i index" ELSE X$="poster i data" 2470 Z=FNWr("Kollar orefererade "+X$+"filen.",0) 2480 IF Fil=2 THEN Z=FNWr(" (Postnr Sektor,Byte)",1) ELSE Z=FNWr("",1) 2490 Flgavbryt=0 2500 IF Fil=1 THEN Z=FNChkmap(1,FNUs.(Ismantsec-1)) ELSE Z=FNChkmap(2,INT((FNUs.(Isdends)*253.+Isdendb)/Postlen-1)) 2510 Z=FNAvbryt 2520 RETURN 0 2530 FNEND 2540 ! 2550 ! 2560 ! ___Rekursiv testning av indexsektor_____ 2570 DEF FNChkind(Sektor,Indlen,Indtyp,Froms,Fromb) LOCAL I$=253,P,Typ,Parentes,Key$=50,Fel 2580 IF FNChkip(Sektor,Froms,Fromb) THEN RETURN -1 2590 IF NOT Optdetalj THEN Z=FNWr(NUM$(FNUs.(Sektor)),0) 2600 Radslut=-1 2610 IF Indtyp=2 THEN LET Key$=CVT%$(-32768) 2620 ! 2630 ON ERROR GOTO 3150 2640 POSIT #1,FNUs.(Sektor)*253. 2650 GET #1 I$ COUNT 253 2660 ON ERROR GOTO 2670 ! 2680 IF Optdetalj THEN Z=FNInddetalj(Sektor,I$,Indlen,Indtyp) 2690 ! 2700 X=ASCII(LEFT$(I$,1)) 2710 IF X<>Fromb THEN Fel=FNCifel(Sektor,0,"Tillbakapekarens byteangivelse {r "+NUM$(X)+", ska vara "+NUM$(Fromb)) 2720 X=CVT$%(MID$(I$,2,2)) 2730 IF X<>Froms THEN Fel=FNCifel(Sektor,1,"Tillbakapekarens sektorangivelse {r "+FNUs$(X)+", ska vara "+FNUs$(Froms)) 2740 ! 2750 ON ERROR GOTO 3110 2760 P=4 : WHILE P<254 2770 Typ=ASCII(MID$(I$,P,1)) 2780 IF Typ>3 THEN Fel=FNCifel(Sektor,P-1,"[r "+NUM$(Typ)+", ska vara 0, 1, 2 eller 3. Skippar sektorn") : GOTO 3070 2790 ON Typ+1 GOTO 3070,2830,2920,2830 2800 ! 2810 ! __1 = Pekare h|gre nyckar, slut___ 2820 ! __3 = Pekare l{gre nycklar + Nyckel___ 2830 X=ASCII(MID$(I$,P+1,1)) 2840 IF X<>3 THEN Fel=FNCifel(Sektor,P,"Byteangivelse i pekare {r "+NUM$(X)+", ska vara 3") 2850 X=CVT$%(MID$(I$,P+2,2)) 2860 IF NOT Optdetalj IF Parentes THEN Z=FNWr(" ",0) ELSE Z=FNWr(" (",0) : Parentes=-1 2870 Fel=Fel OR FNChkind(X,Indlen,Indtyp,Sektor,P-1) 2880 IF Typ=1 OR Flgavbryt THEN 3070 2890 P=P+3 2900 ! 2910 ! __2 = Nyckel______ 2920 Nycklar=Nycklar+1 2930 Fel=Fel OR FNChkdp(CVT$%(MID$(I$,P+2,2)),ASCII(MID$(I$,P+1,1)),Sektor,P) 2940 P=P+4 2950 ! 2960 WHILE Indlen<=50 2970 X=0 2980 X$=MID$(I$,P,Indlen) 2990 IF Indtyp<5 THEN X=X$0 THEN Z=FNCifel(Froms,Fromb,"Bytepekaren {r "+NUM$(Byte)+", borde vara 0") : Byte=0 3300 IF Fil=1 THEN Z=FNChkip(Sektor,Froms,Fromb) ELSE Z=FNChkdp(Sektor,Byte,Froms,Fromb) 3310 IF Z=-2 THEN Z=FNWr("Avbryter.",1) : GOTO 3450 3320 POSIT #Fil,FNUs.(Sektor)*253.+Byte 3330 GET #Fil I$ COUNT 3 3340 Froms=Sektor 3350 Fromb=Byte 3360 Sektor=CVT$%(RIGHT$(I$,2)) 3370 Byte=ASCII(LEFT$(I$,1)) 3380 WEND 3390 IF Froms OR Fromb THEN Z=FNWr("",1) 3400 Z=FNAvbryt 3410 RETURN 0 3420 ! 3430 Z=FNWr("",1) 3440 IF ERRCODE=38 THEN Z=FNWr("Sektorn finns inte.",1) ELSE Z=FNWr("Felkod"+NUM$(ERRCODE)+".",1) 3450 Z=FNWr("Pekaren finns i ",0) 3460 IF Fil=1 THEN Z=FNWr("index",0) ELSE Z=FNWr("data",0) 3470 IF (Froms OR Fromb)=0 THEN IF Fil=1 THEN Fromb=19 ELSE Fromb=22 3480 Z=FNWr("filens sektor "+FNUs$(Froms)+", byte "+NUM$(Fromb)+".",1) 3490 RETURN 0 3500 FNEND 3510 ! 3520 DEF FNCifel(Sektor,Byte,Text$) 3530 IF Radslut THEN Z=FNWr("",1) 3540 Z=FNWr("Sektor "+FNUs$(Sektor)+" byte "+NUM$(Byte)+": "+Text$+".",1) 3550 Radslut=0 3560 RETURN -1 3570 FNEND 3580 ! 3590 ! ___Kolla att bitmap fyllts______ 3600 DEF FNChkmap(Fil,Max.) LOCAL Top,I,Bit,Ant,Pos.,S. 3610 Top=INT(Max./16) : IF Maxmap-1 3640 Bit=0 : WHILE Bit<=15 3650 WHILE (Bitmap(I) AND 2^Bit)=0 3660 S.=FNUs.(I*16+Bit) 3670 IF I=Top IF S.>Max. THEN 3780 3680 Z=FNWr(NUM$(S.)+" ",0) : Ant=Ant+1 3690 WHILE Fil=2 3700 Pos.=S.*Postlen : S.=INT(Pos./253.) 3710 Z=FNWr("("+NUM$(S.)+","+NUM$(Pos.-S.*253)+"); ",0) 3720 IF 0 WEND 3730 IF 0 WEND 3740 Bit=Bit+1 : WEND 3750 IF Flgavbryt THEN RETURN 0 3760 IF 0 WEND 3770 I=I+1 : WEND 3780 IF Ant THEN Z=FNWr("",1) 3790 IF Ant>1 Z=FNWr(FNUs$(Ant)+" pekare saknas.",1) 3800 RETURN 0 3810 FNEND 3820 ! 3830 DEF FNBacktrace(Sektor0) LOCAL Sektor,Froms,J$=3,R$=3,I,Ind 3840 Z=FNWr("Kedja av tillbakapekare:",1) 3850 Sektor=Sektor0 3860 ON ERROR GOTO 4080 3870 WHILE Sektor 3880 Froms=Sektor 3890 POSIT #1,FNUs.(Froms)*253 : GET #1 J$ COUNT 3 3900 IF Froms=Sektor0 THEN R$=J$ 3910 Z=FNWr(FNL}ngadr$(J$),1) 3920 Sektor=CVT$%(RIGHT$(J$,2)) 3930 WEND 3940 I=1 : WHILE I<=Antind 3950 IF Indtop(I)=Froms THEN Z=FNWr("Start = Index "+Ind$(I),1) : Ind=I 3960 I=I+1 : WEND 3970 IF Ind=0 THEN Z=FNWr("Antingen tom-listan eller borttappad sektor",1) 3980 Z=FNWr("",1) 3990 WHILE Optdetalj AND NOT Optind 4000 POSIT #1,FNUs.(Sektor0)*253. : GET #1 I$ COUNT 253 4010 Z=FNInddetalj(Sektor0,I$,Indlen(Ind),Indtyp(Ind)) 4020 IF 0 WEND 4030 I=ASCII(LEFT$(R$,1)) 4040 Froms=CVT$%(RIGHT$(R$,2)) 4050 IF Optind THEN Z=FNChkind(Sektor0,Indlen(Ind),Indtyp(Ind),Froms,I) 4060 RETURN Ind 4070 ! 4080 Z=FNWr("Kan inte l{sa sektor "+FNUs$(Sektor)+", felkod "+NUM$(ERRCODE)+".",1) 4090 RETURN 0 4100 FNEND 4110 ! 4120 ! ___Utskrift sk{rm & skrivare____ 4130 DEF FNWr(S$,Cr) LOCAL I$=1 4140 WHILE SYS(5) 4150 GET I$ 4160 WHILE I$=" " 4170 ; " -Pause- "; : GET I$ 4180 ; STRING$(9,8) SPACE$(9) STRING$(9,8); 4190 IF 0 WEND 4200 IF ASCII(I$)=192 THEN Flgavbryt=-1 4210 WEND 4220 IF PEEK(65362)+LEN(S$)>PEEK(65364) IF PEEK(65362) THEN ; 4230 ; S$; 4240 IF Cr THEN ; 4250 IF NOT Optpr THEN RETURN 0 4260 ! 4270 IF Wrradpos+LEN(S$)>Prradl IF Wrradpos THEN ; #10 : Wrlastcr=-1 4280 IF Wrlastcr THEN ; #10 SPACE$(Prvmarg); : Wrradpos=Prvmarg 4290 ; #10 S$; : Wrradpos=Wrradpos+LEN(S$) 4300 IF Cr THEN ; #10 : Wrradpos=0 4310 Wrlastcr=Cr 4320 RETURN 0 4330 FNEND 4340 ! 4350 DEF FNF|rl{ng.(Fil,Sektor.,Ant) LOCAL I$=1,I 4360 ON ERROR GOTO 4400 : POSIT #Fil,Sektor.*253. : GET #Fil I$ 4370 ; CHR$(7) "Dostrubbel: Filen {r l{ngre {n vad som anges av PEEK2(64778)!" 4380 RETURN Sektor. 4390 ! 4400 ON ERROR GOTO 4470 : POSIT #Fil,Sektor.*253. 4410 WHILE I20 THEN L=20 4580 P=4 : WHILE P<254 AND NOT Flgavbryt 4590 Typ=ASCII(MID$(I$,P,1)) 4600 Z=FNWr("Byt "+FNHjust$(3,NUM$(P-1))+": "+NUM$(Typ),0) 4610 IF Typ>3 THEN Z=FNWr(STRING$(6-LEN(NUM$(Typ)),63)+": ",0) 4620 Z=FNWr(" "+MID$("End NextKey Prev",Typ*4+1,4)+": ",0) 4630 ON Typ+1 GOTO 4730,4650,4680,4660 4640 ! 4650 Z=FNWr(FNL}ngadr$(MID$(I$,P+1,3)),0) : GOTO 4730 ! 1 4660 Z=FNWr(FNL}ngadr$(MID$(I$,P+1,3)),0) ! 3 4670 P=P+3 4680 ! 4690 Z=FNWr("Data: "+FNL}ngadr$(MID$(I$,P+1,3)),0) 4700 Z=FNWr(' "'+FNKeykonv$(MID$(I$,P+4,L),Indtyp)+'"',1) 4710 P=P+4+Indlen 4720 WEND 4730 RETURN FNWr("",1)+FNWr("",1) 4740 ! 4750 IF ERRCODE=134 THEN Z=FNWr("Sektorslut.",1) : GOTO 4730 4760 Z=FNWr("Internt fel, felkod "+NUM$(ERRCODE)+".",1) : GOTO 4730 4770 FNEND 4780 ! 4790 DEF FNKeykonv$(S$,Typ) 4800 IF Typ<6 THEN ON Typ+1 GOTO 4810,4810,4820,4810,4810,4810 4810 RETURN FNFilter$(S$) ! 1 Bin, 2 Asc, 3,4 Float, 5 BCD, \vr 4820 RETURN FNHjust$(6,NUM$(SWAP%(CVT$%(S$) XOR 128))) ! 2 Int 4840 FNEND 4850 ! 4860 DEF FNL}ngadr$(I$)="(Byt"+FNHjust$(4,NUM$(ASCII(LEFT$(I$,1))))+" Sek"+FNHjust$(5,FNUs$(CVT$%(RIGHT$(I$,2))))+") " 4870 ! 4880 DEF FNHjust$(L{ngd,S$)=SPACE$(L{ngd-LEN(S$))+S$ 4890 ! 4900 DEF FNFilter$(S$) LOCAL T$=256,P,K 4910 T$=S$ 4920 WHILE P126 THEN MID$(T$,P,1)="." 4950 WEND 4960 RETURN T$ 4970 FNEND 4980 ! 4990 DEF FNMax(A,B) 5000 IF A>B THEN RETURN A ELSE RETURN B 5010 FNEND 5020 ! 5030 DEF FNAvbryt 5040 IF Flgavbryt THEN Z=FNWr("-Avbrutet-",1) 5050 RETURN 0 5060 FNEND 5070 ! 5080 DEF FNChkdp(Sektor,Byte,Froms,Fromb) LOCAL X.,Y.,Fel 5090 IF CALL(Cmp2,Sektor) THEN Z=FNCifel(Froms,Fromb,"Pekare till sektor "+FNUs$(Sektor)+", som inte finns i datafilen") : Fel=-2 5110 IF Sektor=Isdlast IF Byte+Postlen>253 THEN Fel=FNCifel(Froms,Fromb,"Post som inte ryms helt i datafilens sista sektor") 5120 IF Flgdp THEN RETURN Fel 5130 X.=FNUs.(Sektor)*253.+Byte 5140 WHILE Optdpek 5150 Y.=X./Postlen 5160 IF FIX(Y.)<>Y. THEN Fel=FNCifel(Froms,Fromb,"Pekare till datafilen ej till b|rjan av en post, "+NUM$(X.-FIX(Y.)*Postlen)+" byte fel") 5170 IF 0 WEND 5180 IF NOT Optdm THEN RETURN Fel 5190 IF FNBitmap(X./Postlen) THEN RETURN Fel 5200 RETURN FNCifel(Froms,Fromb,"Ytterligare pekare till sektor "+FNUs$(Sektor)+" byte "+NUM$(Byte)+" i datafilen") 5210 FNEND 5220 ! 5230 DEF FNChkip(Sektor,Froms,Fromb) LOCAL Fel 5240 IF CALL(Cmp1,Sektor) THEN GOSUB 5280 : Fel=-2 5250 IF NOT Optim THEN RETURN Fel 5260 IF FNBitmap(Sektor) THEN RETURN Fel 5270 RETURN FNCifel(Froms,Fromb,"Ytterligare pekare till sektor "+FNUs$(Sektor)+" i indexfilen") 5280 Z=FNCifel(Froms,Fromb,"Pekare till sektor "+FNUs$(Sektor)+", som inte finns i indexfilen") : RETURN 5290 FNEND 5300 ! 5310 DEF FNBitmap(Bit) LOCAL I,B 5320 I=Bit/16 : IF I<0 THEN I=4096+I 5330 IF I>Maxmap THEN RETURN -1 5340 B=2^(Bit AND 15) 5350 IF Bitmap(I) AND B THEN RETURN 0 5360 Bitmap(I)=Bitmap(I) OR B : RETURN -1 5370 FNEND 5380 ! 5390 DEF FNMapdim(Max) LOCAL G 5400 G=1000 : IF Optim THEN G=1700 5410 Maxmap=INT(FNUs.(Max)/16) 5420 IF SYS(4)-Maxmap*2=0 THEN DIM Bitmap(0:Maxmap) 5440 RETURN Maxmap>=0 5450 FNEND 5460 ! 5470 ! ___Ta bort avslutande tomrum___ 5480 DEF FNTrailsp$(S$) LOCAL P 5490 P=LEN(S$) 5500 WHILE P 5510 IF MID$(S$,P,1)=" " THEN P=P-1 : WEND 5520 RETURN LEFT$(S$,P) 5530 FNEND 5540 ! 5550 ! ___Unsign, G|r positivt____ 5560 DEF FNUs.(A) 5570 IF A<0 THEN RETURN 65536.+A ELSE RETURN A 5580 FNEND 5590 DEF FNUs$(A)=NUM$(FNUs.(A)) 5600 ! 5610 ! ___Dos-enhetsnr ==> Namn___ 5620 DEF FNDevnam$(Devnr) LOCAL A,I 5630 IF PEEK(24678)<>195 THEN 5700 5640 A=PEEK2(65403) 5650 WHILE A 5660 IF I>100 THEN 5700 ELSE I=I+1 5670 IF A>24575 AND PEEK(A+7)=Devnr THEN RETURN CHR$(PEEK(A+2),PEEK(A+3),PEEK(A+4))+":" 5680 A=PEEK2(A) : WEND 5690 RETURN "" 5700 RETURN "DR"+NUM$(Devnr AND 7) 5710 FNEND