100 ! ---------------------------------------- 110 ! ST[LLPAR.BAC - Inst{llning av parametrar i (vissa) program. 120 ! F|r ABC800-serien. Programexempel: KEY.BAC, TED.BAC. 130 ! Av Kristoffer Eriksson, ABC-klubben <5357> 140 ! F}r kopieras fritt endast i ickekommersiella syften. 150 ! ---------------------------------------- 160 ! 170 ! Ver--/-Datum----/-Sign-/-Kommentar------- 180 ! 1.00 / 85-03-12 / SKE / "SKE"=Kristoffer Eriksson 190 ! 1.01 / 85-10-10 / SKE / R{ttad hantering heltal 200 ! 2.00 / 86-11-08 / SKE / Fullsk{rmshantering, Typer 5-9,254,255, ABS-filer 201 ! 2.01 / 86-11-14 / SKE / 790: SPACE$(35), "Spara?" v{ntar p} CR 210 ! 220 ! Letar r{tt p} texten CHR$(255)+"PARM:" i program, avl{ser lite styrinfo 230 ! och aktuell inst{llning, och ber anv{ndaren mata in ett nytt v{rde. Detta 240 ! v{rde skrivs tillbaka in i programmet. 250 ! 260 ! Styrinfo (1 byte f|r varje taluppgift): 270 ! <255>PARM:<0> 280 ! 290 ! Typ: 0=Str{ng. Versaler. L{ngd fr}n till . 300 ! . 1=Str{ng. Alla tecken. L{ngd fr}n till . 310 ! . 2=Bin{rt 1 byte. V{rde mellan och . 320 ! . 3=Heltal 2 byte. -32768 - +32767. 330 ! . 4=Ett tecken. Antingen eller . 340 ! . 5=Ett alternativ. H|gst tecken. Giltiga alternativ anges f|re 350 ! . , tecken/styck, totalt tecken. Fyll ut oanv{nda 360 ! . tecken med blanka. =+L{ngd. 370 ! . 6=Ett alternativ. Som typ 5, men alternativnr i st{llet f|r v{rdet 380 ! . lagras, i en byte. =+1. 390 ! . 7=Ledtext utan inmatning. 400 ! . 8=Flyttal 4 byte. 410 ! . 9=Heltal 2 byte 0 - 65535. 420 ! . 254=Ger omr{kning av blockkontrollsummorna i en ABS-fil efter 430 ! . lagring av {ndrade parametrar. m}ste vara "ABS". 440 ! . 255=Filslut. Stoppar s|kningen efter fler parametrar. 450 ! 460 ! Typ 4,5 och 6 har automatisk konvertering till versaler, om det g|r att 470 ! ett annars ogiltigt svar blit giltigt. 480 ! 490 ! Formatet f|r typ 7, 254 och 255 skiljer sig fr}n |vriga p} s} s{tt att 500 ! delen ... inte existerar. 510 ! 520 ! Fr}getexten b|r inte inneh}lla n}gon radmatning, }tminstone inte om 530 ! fr}gorna tar mer {n en sida, f|r d} kan det bli problem med att avg|ra 540 ! var sidan slutar. 550 ! 560 ! Det totala utrymmet f|r en parametar fr}n <255> till f}r inte 570 ! passera mer {n en sektorgr{ns i filen, vilket betyder att den inte f}r 580 ! ta mer {n 254 byte f|r att fungera oavsett placering i filen. 590 ! 600 INTEGER : EXTEND : SINGLE : OPTION BASE 0 : ! NO RESUME 610 Maxpar=65 620 IF SYS(4)-Maxpar*160<2800 THEN Maxpar=(SYS(4)-2800)/160 630 DIM Text$(Maxpar)=70,Typ(Maxpar),Min(Maxpar),Max(Maxpar),Lgd(Maxpar) 640 DIM V{rde$(Maxpar)=60,Pos.(Maxpar),Rad(-1:Maxpar),Kol(-1:Maxpar),I$=1 650 Giltigtyp=9 660 Maxrad=21 670 ! 680 Wid=PEEK(65364) 690 Z=FNInitkey 700 ! 710 ; CHR$(12) "Inst{llning och {ndring av parametrar." 720 ; CUR(16,0) "PF1 = Avbryt" 730 ; "PF5 = Upp CTRL-A = Till b|rjan av rad" 740 ; "PF7 = Ned CTRL-E = Till slutet av rad" 750 ; CUR(3,0) "Vilken fil ska behandlas? "; 760 F$="" 770 ; CUR(3,26); : IF Wid<43 THEN ; 780 F$=FNInline$(F$,FNRad,FNKol,17) 790 ; CUR(20,0) SPACE$(35); 800 IF F$="" OR Keyf=Kstop THEN ; CUR(19,0); : GOTO 1170 810 F$=FNCaps$(F$) 820 IF INSTR(1,F$,".")=0 AND LEN(F$)<13 THEN F$=F$+".BAC" 830 ; CUR(3,26); : IF Wid<43 THEN ; 840 ; F$; 850 ON ERROR GOTO 870 : OPEN F$ AS FILE 1 860 WHILE 0 870 ; CUR(20,0); 880 IF ERRCODE=21 THEN ; "Hittar inte"; ELSE ; "Felkod" ERRCODE "p};" 890 ; ' "' F$ '".' SPACE$(20) CHR$(7) 900 GOTO 770 910 WEND 920 ! 930 ON ERROR GOTO 940 Z=FNAvl{s 950 IF Z>0 THEN ; CHR$(7) "Felkod" Z : GOTO 1170 960 IF Z=-1 THEN ; CHR$(7) 'F|r m}nga parametrar i "' F$ '". Tryck p} ngn tangent: '; : GET I$ 970 IF Antpar=0 THEN ; CUR(20,0) 'Inga parametrar i "' F$ '".' SPACE$(20) : GOTO 1170 980 Beh|versparas=0 990 Z=FNVisapars(0) 1000 Z=FN[ndrapars 1010 ; CUR(23,0) SPACE$(Wid) CUR(23,0); 1020 WHILE Beh|versparas 1030 ; "Spara? J(a), N(ej), [(ndra mer) "; 1040 ON FNSvar("JN[")+1 GOTO 990,1050,1170,990 1050 ; 1060 WHILE FNLagra=0 1070 ; "Parametrarna sparade." 1080 WHILE Absfil 1090 Z=FNAbsjustera 1100 IF Z=0 THEN ; "Justerade kontrollsummorna i filen." 1110 IF Z<0 THEN ; "Felaktig ABS-fil!" 1120 IF Z>0 THEN ; 'Felkod' ERRCODE 'i "' F$ '".' 1130 IF 0 WEND 1140 IF 0 WEND 1150 IF 0 WEND 1160 IF NOT Beh|versparas THEN ; "Inga parametrar {ndrade." 1170 CLOSE 1180 END 1190 ! 1200 ! 1210 ! 1220 DEF FNRad=PEEK(65363) 1230 DEF FNKol=PEEK(65362) 1240 DEF FNMin(A,B)=(A AND A<=B)+(B AND A>B) 1250 ! 1260 DEF FNInitkey 1270 Kvleft=1 : Kvright=2 1280 Kleft=3 : Kright=4 1290 Kdel=5 : Kce=6 1300 Kup=7 : Kdown=8 1310 Kstop=9 1320 Kcr=10 1330 Kdump=11 1340 Iutfyllnad=ASCII("_") 1350 RETURN 0 1360 FNEND 1370 ! 1380 DEF FNKeyfunc(K$) LOCAL P 1390 P=INSTR(1,CHR$(1,5,8,9,199,24,196,198,192,13,247),K$) ! ABC77 1400 IF P THEN RETURN P 1410 RETURN INSTR(1,CHR$(188,180,172,164,199,24,161,163,129,10,130),K$) ! 99 1420 ! 1=Very Left (CTRL-A), 2=Very Right (CTRL-E), 3=Left (<-), 4=Right (->), 1430 ! 5=Delete character (PF8), 6=Delete line (CE), 7=Up (PF5), 8=Down (PF7) 1440 ! 9=Stop/Ready (PF1), 10=CR, 11=Screen dump (CS-PF8) 1450 FNEND 1460 ! 1470 DEF FNInline$(Rad0$,Crad,Cpos0,Max) LOCAL G$=1,Rad$=80,Cpos,Flyttad 1480 [ndrat=0 1490 Rad$=Rad0$ 1500 ; CUR(Crad,Cpos0) Rad$ STRING$(Max-LEN(Rad$) AND Max>LEN(Rad$),Iutfyllnad); 1510 WHILE 1 1520 ; CUR(Crad,Cpos+Cpos0); : GET G$ 1530 Keyf=FNKeyfunc(G$) 1540 IF Keyf>6 THEN RETURN Rad$ 1550 IF Keyf=Kdump THEN 1680 ! Ingen dump 1560 IF Keyf THEN ON Keyf GOSUB 1690,1700,1720,1730,1750,1840 : Flyttad=-1 : GOTO 1670 1570 WHILE G$>=" " AND ASCII(G$)<127 1580 IF Flyttad=0 THEN GOSUB 1840 : ; CUR(Crad,Cpos+Cpos0); 1590 [ndrat=-1 1600 IF LEN(Rad$)<=Cpos THEN ; CUR(Crad,Cpos0+LEN(Rad$)) SPACE$(Cpos-LEN(Rad$)) G$; : Rad$=Rad$+SPACE$(Cpos-LEN(Rad$))+G$ : GOTO 1630 1610 IF LEN(Rad$)>=Max THEN Rad$=LEFT$(Rad$,Cpos)+G$+MID$(Rad$,Cpos+1,Max-Cpos-1) ELSE Rad$=LEFT$(Rad$,Cpos)+G$+RIGHT$(Rad$,Cpos+1) 1620 ; RIGHT$(Rad$,Cpos+1); 1630 Cpos=Cpos+1 1640 Keyf=Kright 1650 Flyttad=-1 1660 IF 0 WEND 1670 IF Cpos<0 OR Cpos>=Max THEN RETURN Rad$ 1680 WEND 1690 Cpos=0 : RETURN ! Very Left 1700 Cpos=LEN(Rad$) : IF Cpos>=Max THEN Cpos=Max-1 ! Very Right 1710 RETURN 1720 Cpos=Cpos-1 : RETURN ! Left 1730 Cpos=Cpos+1 : RETURN ! Right 1740 ! --- DEL, PF8 1750 IF Cpos>LEN(Rad$) OR (Cpos=0 AND LEN(Rad$)=0) THEN Cpos=Cpos-1 : RETURN 1760 [ndrat=-1 1770 WHILE Cpos=LEN(Rad$) 1780 Rad$=LEFT$(Rad$,LEN(Rad$)-1) : ; CHR$(8,Iutfyllnad); 1790 Cpos=Cpos-1 : RETURN 1800 WEND 1810 Rad$=LEFT$(Rad$,Cpos)+RIGHT$(Rad$,Cpos+2) 1820 ; RIGHT$(Rad$,Cpos+1) CHR$(Iutfyllnad); : RETURN 1830 ! --- CE 1840 ; CUR(Crad,Cpos0) STRING$(LEN(Rad$),Iutfyllnad); : Rad$="" : [ndrat=-1 1850 Cpos=0 1860 RETURN 1870 FNEND 1880 ! 1890 DEF FNAvl{s LOCAL P,P2,I$=506,J$=253,S$=4,Nr,Eof,L 1900 Absfil=0 1910 ON ERROR GOTO 1930 : GET #1 I$ COUNT 253 1920 WHILE 0 1930 IF ERRCODE<>38 THEN RETURN ERRCODE ELSE Eof=-1 1940 WEND 1950 WHILE NOT Eof 1960 ON ERROR GOTO 1980 : GET #1 J$ COUNT 253 1970 WHILE 0 1980 J$="" : Eof=-1 1990 IF ERRCODE<>38 THEN RETURN ERRCODE 2000 WEND 2010 I$=RIGHT$(I$,LEN(I$)-252)+J$ 2020 P=1 : WHILE P>0 AND P<=LEN(I$)-LEN(J$) 2030 P=INSTR(P,I$,CHR$(255)+"PARM:") 2040 IF P=0 OR P>LEN(I$)-LEN(J$) THEN 2220 2050 P2=INSTR(P,I$,CHR$(0)) 2060 IF P2=0 OR P2+5>LEN(I$) THEN P=P+1 : GOTO 2220 2070 IF Nr>Maxpar THEN Antpar=Nr : RETURN -1 2080 Text$(Nr)=MID$(I$,P+6,P2-P-6) 2090 Pos.(Nr)=POSIT(1)-(LEN(I$)-P2+1)+4 ! Pos f|r l{ng+v{rde 2100 S$=MID$(I$,P2+1,4) 2110 Typ(Nr)=ASCII(S$) 2120 WHILE Typ(Nr)<=Giltigtyp AND Typ(Nr)<>7 2130 Min(Nr)=ASCII(RIGHT$(S$,2)) 2140 Max(Nr)=ASCII(RIGHT$(S$,3)) 2150 Lgd(Nr)=ASCII(RIGHT$(S$,4)) 2160 IF P2+5+Lgd(Nr)>LEN(I$) THEN P=P+1 : GOTO 2220 2170 V{rde$(Nr)=MID$(I$,P2+5,Lgd(Nr)) 2180 P=P2+5+Lgd(Nr) 2190 IF 0 WEND : P=P2+1 2200 IF Typ(Nr)=254 IF Text$(Nr)="ABS" THEN Absfil=-1 : GOTO 2220 2210 IF Typ(Nr)=255 THEN P=32767 : Eof=-1 ELSE Nr=Nr+1 2220 WEND 2230 WEND 2240 Antpar=Nr 2250 RETURN 0 2260 FNEND 2270 ! 2280 DEF FNLagra LOCAL Nr 2290 ON ERROR GOTO 2380 2300 WHILE Nr7 2320 POSIT #1,Pos.(Nr) 2330 PUT #1 CHR$(Lgd(Nr)) 2340 PUT #1 V{rde$(Nr) 2350 IF 0 WEND 2360 Nr=Nr+1 : WEND 2370 RETURN 0 2380 ; "Felkod" ERRCODE "vid skrivning" 2390 RETURN -1 2400 FNEND 2410 ! 2420 DEF FNAbsjustera LOCAL S$=253,P,L{ngd,S,Updat,Filpos. 2430 ON ERROR GOTO 2610 : POSIT #1,0. 2440 WHILE 1 2450 Filpos.=POSIT(1) : GET #1 S$ COUNT 253 2460 P=1 : Updat=0 2470 WHILE ASCII(RIGHT$(S$,P))<>255 2480 IF ASCII(RIGHT$(S$,P))<>0 THEN RETURN -1 2490 L{ngd=ASCII(RIGHT$(S$,P+1)) 2500 IF ASCII(RIGHT$(S$,P+3))<>(255 XOR ASCII(RIGHT$(S$,P+4))) RETURN -4 2510 IF ASCII(RIGHT$(S$,P+5))<>(255 XOR ASCII(RIGHT$(S$,P+6))) RETURN -6 2520 P=P+7 2530 IF L{ngd=0 THEN RETURN 0 2540 IF P+L{ngd+1>253 THEN RETURN -2 2550 S=FNKontrollsumma(MID$(S$,P,L{ngd)) 2560 IF S<>ASCII(RIGHT$(S$,P+L{ngd)) MID$(S$,P+L{ngd,1)=CHR$(S) : Updat=-1 2570 P=P+L{ngd+1 2580 WEND 2590 IF Updat THEN POSIT #1,Filpos. : PUT #1 S$ 2600 WEND 2610 IF ERRCODE=38 THEN RETURN 0 ELSE RETURN ERRCODE 2620 FNEND 2630 ! 2640 DEF FNKontrollsumma(S$) LOCAL P,S 2650 P=LEN(S$) : WHILE P : S=S+ASCII(RIGHT$(S$,P)) : P=P-1 : WEND 2660 RETURN 255 AND S 2670 FNEND 2680 ! 2690 DEF FNVisapars(Nr0) LOCAL Nr,I$=1 2700 ; CHR$(12) 'Parametrar i "' F$ '".' 2710 Nr=Nr0 AND Nr0>0 2720 Rad(Nr-1)=2 : Kol(Nr-1)=-1 2730 WHILE Nr=0 THEN Nr=Nr+1 : WEND 2760 RETURN 0 2770 FNEND 2780 ! 2790 DEF FNVisapar(Nr) LOCAL V{rde$=160,Maxlen,Actlen,Rader 2800 Rad(Nr)=FNRad : Kol(Nr)=-1 2810 IF FNScrollp(LEN(Text$(Nr))) THEN RETURN -1 2820 Rader=1+FNRader(LEN(Text$(Nr))) 2830 ; Text$(Nr); 2840 ! 2850 V{rde$=FNGr{nser$(Nr) 2860 WHILE LEN(V{rde$) 2870 IF FNKol>0 THEN Rader=Rader+FNRader(1) : ; " "; 2880 IF FNKol+LEN(V{rde$)>Wid THEN Rader=Rader+1 : ; 2890 IF FNScrollp(LEN(V{rde$)) THEN RETURN -1 2900 Rader=Rader+FNRader(LEN(V{rde$)) 2910 ; V{rde$; 2920 IF 0 WEND 2930 IF Typ(Nr)>Giltigtyp OR Typ(Nr)=7 THEN Kol(Nr)=-2 : RETURN Rader 2940 ! 2950 V{rde$=FNV{rde$(Nr,-1) 2960 Maxlen=FNL{ngd(Nr) 2970 IF LEN(V{rde$)>Maxlen THEN Actlen=LEN(V{rde$) ELSE Actlen=Maxlen 2980 IF FNKol>0 THEN Rader=Rader+FNRader(1) : ; " "; 2990 IF FNKol+Actlen>Wid THEN Rader=Rader+1 : ; 3000 IF ActlenLEN(V{rde$) THEN ; STRING$(Maxlen-LEN(V{rde$),Iutfyllnad); 3060 RETURN Rader 3070 FNEND 3080 ! 3090 DEF FNScrollp(L{ngd)=FNRad+FNRader(L{ngd)>Maxrad 3100 DEF FNRader(L{ngd)=(FNKol+L{ngd-1)/Wid 3110 ! 3120 DEF FNGr{nser$(Nr) 3130 IF Typ(Nr)>Giltigtyp THEN RETURN "(Ok{nd typ)" 3140 ON Typ(Nr)+1 GOTO 3150,3150,3180,3190,3200,3210,3210,3220,3230,3190 3150 IF Min(Nr)=Max(Nr) THEN RETURN "("+NUM$(Min(Nr))+")" ! 0,1 Str{ng 3160 IF Min(Nr)=0 THEN RETURN "" 3170 RETURN '('+NUM$(Min(Nr))+'-'+NUM$(Max(Nr))+')' 3180 RETURN "("+NUM$(Min(Nr))+"-"+NUM$(Max(Nr))+")" ! 2 Byte 3190 RETURN "(Heltal)" ! 3,9 3200 RETURN "("+FNFilter$(CHR$(Min(Nr)),-1)+"/"+FNFilter$(CHR$(Max(Nr)),-1)+")" ! 4 Ett tecken 3210 RETURN "(V{lj "+FNAltlista$(Nr)+")" ! 5,6 Fleralt 3220 RETURN "" ! 7 Kommentar 3230 RETURN "(Flyttal)" ! 8 3240 FNEND 3250 ! 3260 DEF FNTyp$(Nr) 3270 ON Typ(Nr)+1 GOTO 3280,3280,3290,3300,3310,3310,3310,3320,3330,3300 3280 RETURN "Text" 3290 RETURN "Kort heltal" 3300 RETURN "Heltal" 3310 RETURN "Alternativ" 3320 RETURN "" 3330 RETURN "Flyttal" 3340 FNEND 3350 ! 3360 DEF FNV{rde$(Nr,Expand) LOCAL P 3370 ON Typ(Nr)+1 GOTO 3380,3380,3390,3400,3410,3420,3440,3470,3480,3490 3380 RETURN FNFilter$(V{rde$(Nr),Expand) ! 0,1 Str{ng 3390 RETURN NUM$(ASCII(V{rde$(Nr))) ! 2 Bin{r byte 3400 RETURN NUM$(CVT$%(V{rde$(Nr))) ! 3 Heltal 3410 RETURN FNFilter$(V{rde$(Nr),Expand) ! 4 Ett tecken 3420 RETURN FNFilter$(RIGHT$(V{rde$(Nr),FNMin(Min(Nr)+1,LEN(V{rde$(Nr))+1)),Expand) ! 5 Fleralt 3430 ! 6 Fleralt nr 3440 P=ASCII(RIGHT$(V{rde$(Nr),FNMin(Min(Nr),LEN(V{rde$(Nr)))+1))*Max(Nr)+1 3450 IF P+Max(Nr)-1>LEN(V{rde$(Nr)) THEN RETURN "" 3460 RETURN FNFilter$(FNTrailsp$(MID$(V{rde$(Nr),P,Max(Nr))),Expand) 3470 RETURN "" 3480 RETURN NUM$(CVT$F(V{rde$(Nr))) ! 8 Flyttal 3490 P=CVT$%(V{rde$(Nr)) ! 9 Heltal 3500 IF P<0 THEN RETURN NUM$(65536.+P) ELSE RETURN NUM$(P) 3510 FNEND 3520 ! 3530 DEF FNL{ngd(Nr) 3540 ON Typ(Nr)+1 GOTO 3550,3550,3560,3570,3580,3550,3550,3590,3600,3610 3550 RETURN Max(Nr) ! 0,1 Str{ng, 5 Fleralt 3560 RETURN LEN(NUM$(Max(Nr))) ! 2 Bin{r byte 3570 RETURN 6 ! 3 Heltal 3580 RETURN 1 ! 4 Ett tecken 3590 RETURN 0 ! 7 3600 RETURN 12 ! 8 Flyttal 3610 RETURN 5 ! 8 Heltal 3620 FNEND 3630 ! 3640 DEF FNAltlista$(Nr) LOCAL S$=160,P 3650 WHILE P+Max(Nr)<=Min(Nr) AND P+Max(Nr)<=LEN(V{rde$(Nr)) 3660 S$=S$+LEFT$(",",1 AND P>0)+FNFilter$(FNTrailsp$(MID$(V{rde$(Nr),P+1,Max(Nr))),-1) 3670 P=P+Max(Nr) 3680 WEND 3690 RETURN S$ 3700 FNEND 3710 ! 3720 DEF FNFilter$(S$,Expand) LOCAL T$=160,P,K 3730 T$=S$ 3740 WHILE P127 THEN IF LEN(T$)<156 AND Expand THEN T$=LEFT$(T$,P-1)+"<"+NUM$(K)+">"+RIGHT$(T$,P+1) : P=P+3 ELSE MID$(T$,P,1)="." 3770 WEND 3780 RETURN T$ 3790 FNEND 3800 ! 3810 DEF FNScrollfram(Nr) LOCAL Spar,Rader,Rad,Scroll 3820 Rad=Rad(Nr) 3830 ; CUR(23,0) SPACE$(Wid) CUR(Rad(Nr),0); 3840 Spar=Maxrad : Maxrad=23767 : Rader=FNVisapar(Nr) : Maxrad=Spar 3850 IF Nr+1Maxrad : ; : Rad=Rad-1 : Scroll=Scroll+1 : WEND 3890 IF Scroll>0 THEN ; CUR(1,0) SPACE$(Wid); 3900 IF Scroll>1 THEN ; CUR(0,0) 'Parametrar i "' F$ '".' SPACE$(Wid-16-LEN(F$)); 3910 Rad=Nr+(1 AND Nr+1=-1 3930 Rad(Rad)=Rad(Rad)-Scroll 3940 IF Rad(Rad)<2 THEN Kol(Rad)=-1 ELSE Rad=Rad-1 : WEND 3950 RETURN 0 3960 FNEND 3970 ! 3980 DEF FN[ndrapars LOCAL Nr,Steg 3990 ; CUR(23,0) "PF1 = Klart."; 4000 IF Wid>70 THEN Felrad=23 : Felkol=40 ELSE Felrad=22 : Felkol=0 4010 Steg=1 4020 Nr=-1 4030 WHILE 1 4040 Nr=Nr+Steg 4050 IF (Nr<0 AND Rad(-1)>=2) OR Nr>=Antpar THEN Steg=-Steg : GOTO 4200 4060 WHILE Kol(Nr)=-1 4070 IF Msg AND Felrad=22 AND Steg>0 THEN ; CUR(22,0) SPACE$(Wid); 4080 IF Steg>0 THEN Z=FNScrollfram(Nr) ELSE Z=FNVisapars(Nr) 4090 ; CUR(23,0) "PF1 = Klart."; 4100 IF Nr<0 THEN Steg=-Steg : GOTO 4200 4110 WEND 4120 IF Kol(Nr)<0 THEN 4200 4130 ; CUR(23,13) FNTyp$(Nr); 4140 IF FN[ndrapar(Nr) THEN Beh|versparas=-1 4150 IF Msg THEN ; CUR(Felrad,Felkol) SPACE$(Wid-Felkol); : Msg=0 4160 ; CUR(23,13) SPACE$(LEN(FNTyp$(Nr))); 4170 IF Keyf=Kstop THEN RETURN 0 4180 IF Keyf=Kup OR Keyf=Kvleft OR Keyf=Kleft OR Keyf=Kdel THEN Steg=-1 4190 IF Keyf=Kdown OR Keyf=Kvright OR Keyf=Kright OR Keyf=Kcr THEN Steg=1 4200 WEND 4210 RETURN 0 4220 FNEND 4230 ! 4240 DEF FN[ndrapar(Nr) LOCAL I$=160,V.,Typ,Maxlen,[ndr 4250 Typ=Typ(Nr) 4260 Maxlen=FNL{ngd(Nr) 4270 I$=FNV{rde$(Nr,0) 4280 WHILE 1 4290 I$=FNInline$(I$,Rad(Nr),Kol(Nr),Maxlen) 4300 WHILE Keyf=Kstop OR Keyf=Kup OR Keyf=Kdown 4310 ; CUR(Rad(Nr),Kol(Nr)) STRING$(LEN(I$),Iutfyllnad); 4320 ; CUR(Rad(Nr),Kol(Nr)) FNV{rde$(Nr,-1); 4330 RETURN 0 4340 WEND 4350 [ndr=[ndr OR [ndrat 4360 IF NOT [ndr THEN RETURN 0 4370 ; CUR(Rad(Nr),Kol(Nr)) SPACE$(LEN(I$)) CUR(Rad(Nr),Kol(Nr)); 4380 IF FNKollapar(Nr,Typ,Maxlen,I$)=0 THEN RETURN 1 4390 WEND 4400 FNEND 4410 ! 4420 DEF FNKollapar(Nr,Typ,Maxlen,S$) LOCAL P,I$=160 4430 ON Typ+1 GOTO 4590,4600,4470,4470,4670,4770,4770,4440,4470,4470 4440 RETURN 0 ! 7 Komm 4450 ! 4460 ! 2,3,8,9 Tal 4470 IF Typ=8 THEN P=FN[pval.(S$) ELSE P=FN[pval(S$) 4480 IF P THEN RETURN -1 4490 IF Typ<>8 IF V{rde.<>INT(V{rde.) THEN RETURN FN[pfel("Endast heltal") 4500 IF Typ=2 IF V{rde.Max(Nr) THEN RETURN FN[pfel("Ska vara mellan "+NUM$(Min(Nr))+" och "+NUM$(Max(Nr))) 4510 IF Typ=9 AND V{rde.<0 THEN V{rde.=65536.+V{rde. 4520 I$=NUM$(V{rde.) 4530 ; I$ STRING$(Maxlen-LEN(I$) AND Maxlen>LEN(I$),Iutfyllnad) 4540 IF Typ=2 THEN Lgd(Nr)=1 : V{rde$(Nr)=CHR$(V{rde.) 4550 IF Typ=3 OR Typ=9 THEN Lgd(Nr)=2 : V{rde$(Nr)=CVT%$(V{rde.) 4560 IF Typ=8 THEN Lgd(Nr)=4 : V{rde$(Nr)=CVTF$(V{rde.) 4570 RETURN 0 4580 ! 4590 I$=FNCaps$(S$) : GOTO 4610 ! 0 Str{ng 4600 I$=S$ ! 1 Str{ng 4610 ; I$ 4620 IF LEN(I$)Max(Nr) THEN RETURN FN[pfel("Ska vara mellan "+NUM$(Min(Nr))+" och "+NUM$(Max(Nr))+" tecken") 4630 V{rde$(Nr)=I$ 4640 Lgd(Nr)=LEN(I$) 4650 RETURN 0 4660 ! 4670 I$=LEFT$(S$,1 AND LEN(S$)>0) ! 4 Ett tkn 4680 IF I$=CHR$(Min(Nr)) OR I$=CHR$(Max(Nr)) THEN 4710 4690 IF FNCaps$(I$)=CHR$(Min(Nr)) OR FNCaps$(I$)=CHR$(Max(Nr)) THEN I$=FNCaps$(I$) : GOTO 4710 4700 RETURN FN[pfel("V{lj "+FNFilter$(CHR$(Min(Nr)),-1)+" eller "+FNFilter$(CHR$(Max(Nr)),-1)) 4710 ; I$ 4720 V{rde$(Nr)=I$ 4730 Lgd(Nr)=1 4740 RETURN 0 4750 ! 4760 ! 5,6 Alternativ 4770 I$=FNTrailsp$(S$) 4780 P=FNInitem(LEFT$(V{rde$(Nr),FNMin(Min(Nr),LEN(V{rde$(Nr)))),LEFT$(I$+SPACE$(Max(Nr)),Max(Nr)),Max(Nr)) 4790 IF P THEN 4830 4800 P=FNInitem(LEFT$(V{rde$(Nr),FNMin(Min(Nr),LEN(V{rde$(Nr)))),LEFT$(FNCaps$(I$)+SPACE$(Max(Nr)),Max(Nr)),Max(Nr)) 4810 IF P=0 THEN RETURN FN[pfel("Ogiltigt alternativ") 4820 I$=FNCaps$(I$) 4830 ; I$ STRING$(Maxlen-LEN(I$) AND Maxlen>LEN(I$),Iutfyllnad) 4840 IF Typ=6 THEN I$=CHR$((P-1)/Max(Nr)) 4850 V{rde$(Nr)=LEFT$(V{rde$(Nr),FNMin(Min(Nr),LEN(V{rde$(Nr))))+I$ 4860 Lgd(Nr)=LEN(V{rde$(Nr)) 4870 RETURN 0 4880 FNEND 4890 ! 4900 DEF FNInitem(S$,Item$,Lgd) LOCAL P 4910 P=1 : WHILE P 4920 P=INSTR(P,S$,Item$) : IF MOD(P-1,Lgd)=0 THEN RETURN P 4930 IF P THEN P=P+1 4940 WEND 4950 RETURN 0 4960 FNEND 4970 ! 4980 DEF FN[pfel(Text$) 4990 IF Msg THEN ; CUR(Felrad,Felkol) SPACE$(Wid-Felkol); 5000 ; CUR(Felrad,Felkol) Text$ "." CHR$(7); 5010 Msg=-1 5020 RETURN -1 5030 FNEND 5040 ! 5050 DEF FN[pval.(S$) 5060 ON ERROR GOTO 5070 : V{rde.=VAL(S$) : RETURN 0 5070 RETURN FN[pfel("Ogiltigt tal") 5080 FNEND 5090 DEF FN[pval(S$) LOCAL V{rde 5100 ON ERROR GOTO 5110 : V{rde=VAL(S$) : V{rde.=V{rde : RETURN 0 5110 RETURN FN[pfel("Ogiltigt heltal") 5120 FNEND 5130 ! 5140 DEF FNSvar(Alt$) LOCAL I$=1,P,Rad,Kol 5150 Rad=FNRad : Kol=FNKol 5160 WHILE 1 5165 WHILE 1 5170 I$=FNInline$(I$,Rad,Kol,1) 5180 IF Keyf=Kstop THEN RETURN 0 5185 IF Keyf<>Kcr THEN WEND 5190 IF I$="" THEN I$=CHR$(13) ELSE I$=FNCaps$(I$) 5200 P=INSTR(1,Alt$,I$) 5210 IF P THEN ; CUR(Rad,Kol) MID$(Alt$,P,1); : RETURN P 5220 ; CHR$(7); 5230 WEND 5240 FNEND 5250 ! 5260 DEF FNCaps$(S$) LOCAL T$=160,P 5270 T$=S$ 5280 WHILE P="`" THEN MID$(T$,P,1)=CHR$(ASCII(MID$(T$,P,1))-32) 5300 WEND 5310 RETURN T$ 5320 FNEND 5330 ! 5340 DEF FNTrailsp$(S$) LOCAL P 5350 P=LEN(S$) : WHILE P 5360 IF ASCII(RIGHT$(S$,P))=32 THEN P=P-1 : WEND 5370 RETURN LEFT$(S$,P) 5380 FNEND