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