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