10 ! ========================================
12 ! VISAUTIL 2.22 - Visa textfil med backningsm|jlighet.
14 ! F|r hela ABC800-serien.
16 ! ========================================
18 ! 
20 ! Lista en fil p} sk{rmen.
22 ! Ger m|jlighet att scrolla lite bak}t i filen.
24 ! 
30 ! Ver--/-Datum----/-F|rfattare----------------/-Kommentar---
32 ! 1.00 / 86-08-08 / David Andersson <5201>    / F|r ABC80
34 ! 2.00 / 86-11-10 / Kristoffer Eriksson <5357>/ Konverterad till ABC800
36 ! 2.10 / 86-11-12 / Bo Kullmar <1789>         / RUN VISAUTIL,
38 ! 2.20 / 86-11-14 / Kristoffer Eriksson <5357>/ Tgbstatus->Tgbget, GOTO
40 ! .  fr}n 2.10 avl{gsnade, RUN VISAUTIL,;
42 ! 2.21 / 86-11-15 / Kristoffer Eriksson <5357>/ 1810: NOT
44 ! 2.22 / 86-11-19 / Bo Kullmar <1789>/ 350: DIM L$=160
80 ! 
82 ! Denna version {r avsedd att fungera p} alla maskiner i ABC800-serien,
84 ! med alla olika inst{llningar, dvs 40 eller 80 tecken p} ABC802 eller
86 ! ABC806, 40 tecken p} ABC800C och 80 tecken p} ABC800M.
90 ! 
92 ! (Notera att det inte finns n}gra GOTO utom ON ERROR GOTO, och att
94 ! alla GOSUB g}r till j{mna hundratal.)
96 ! 
100 ! ----Init----
110 INTEGER : EXTEND : ! NO RESUME
120 Wid%=PEEK(65364%) ! Radl{ngd
130 X%=PEEK(39%)
140 Abc%=(800% AND (X%=10% OR X%=2% OR X%=3%))+(802% AND X%=3%)+(806% AND X%=4%)
150 Tgbget%=(Abc%<>802% AND Abc%<>806%)
160 Done%=0%
170 DEF FNV%(V%)=V%+Buflen%*((V%>=Buflen%)-(V%<0%)) 
180 ! 
190 ! ----Maskinkod bak}tscroll----
200 Bkscroll$=STRING$(138%,0%)
210 ! BKSCROLL.ASM. 1986-11-09
220 A%=VARPTR(Bkscroll$)
230 REM BKSCROLL.ASM. 1986-11-10
240 POKE 0%+A%,58%,39%,0%,254%,2%,40%,41%,254%,10%,32%,7%,58%,84%,255%,254%,41%,56%,30%,219%
250 POKE 19%+A%,53%,8%,33%,47%,127%,17%,127%,127%,1%,48%,7%,237%,184%,17%,0%,120%,1%,79%,0%,175%
260 POKE 39%+A%,211%,53%,205%,A%+82%,SWAP%(A%+82%),8%,211%,53%,201%,221%,33%,A%+138%,SWAP%(A%+138%)
270 POKE 52%+A%,62%,24%,1%,40%,0%,221%,94%,254%,221%,86%,255%,61%,202%,A%+81%,SWAP%(A%+81%)
280 POKE 67%+A%,221%,110%,252%,221%,102%,253%,237%,176%,221%,43%,221%,43%,24%,229%,11%,98%
290 POKE 83%+A%,107%,54%,32%,19%,237%,176%,201%,0%,124%,128%,124%,0%,125%,128%,125%,0%,126%
300 POKE 100%+A%,128%,126%,0%,127%,128%,127%,40%,124%,168%,124%,40%,125%,168%,125%,40%,126%
310 POKE 116%+A%,168%,126%,40%,127%,168%,127%,80%,124%,208%,124%,80%,125%,208%,125%,80%,126%
320 POKE 132%+A%,208%,126%,80%,127%,208%,127%
330 ! 
340 ! Textrad fr}n fil
350 DIM L$=160%
360 ! Filnamn F1$ & Chainfil$
370 DIM F1$=20%
380 F1$=FNRunpar$
390 ! Tangentbordstecken
400 DIM G$=1%
410 ! Stoptangenter
420 DIM Stt$=4% : Stt$=CHR$(0%,28%,192%,193%)
430 ! Dimensionera buffert
440 Buflen%=(SYS(4%)-700%)/(Wid%+6%)
450 IF Buflen%<48% ; 'F|r lite minne f|r textbufferten' : STOP 
460 DIM V$(Buflen%-1%)=Wid%
470 ! 
1000 ! ----Huvudloop----
1010 IF F1$='' THEN ; 
1020 ; '***** VISAUTIL *****'
1030 ; 'Listar en fil,' Buflen% '- raders buffert'
1040 ; ' PF5 och <---   =lista bak}t i filen'
1050 ; ' PF7 och --->   =lista fram}t i filen'
1060 ; ' MELLANSLAG     =   -"-'
1070 ; ' PF2 och CTRL-\ =lista fr}n b|rjan igen'
1080 ; ' PF1 och CTRL-@ =sluta'
1090 ; 
1100 ! 
1110 WHILE NOT Done%
1120   WHILE F1$=''
1130     ON ERROR GOTO 1130 : INPUT 'Filnamn? ';F1$
1140   IF 0% WEND 
1150   ! 
1160   Done%=-1% ! Anta det g}r v{gen
1170   WHILE F1$<>''
1180     F1%=1%
1190     F1$=FNCaps$(F1$)
1200     ON ERROR GOTO 1300 : OPEN F1$ AS FILE F1%
1210     ; CHR$(12%);
1220     L$=''
1230     GOSUB 1800 ! Sl{pp tangent
1240     GOSUB 2000 ! Visningsloop
1250     CLOSE F1%
1260   IF I%=28% OR I%=193% WEND 
1270   WHILE SYS(5%) : GET G$ : WEND ! T|m buffert
1280   ! 
1290   WHILE 0% ! Openfel
1300     ; CHR$(7%)
1310     IF ERRCODE=21% THEN ; 'Hittar inte filen ' F1$ '!' ELSE ; 'Fel nr:' ERRCODE
1320     Done%=0% ! Det h{r gick ju inte
1330     F1$=''
1340   WEND 
1350 WEND 
1360 ; CUR(23%,0%);
1370 IF LEN(Chainfil$) THEN ON ERROR GOTO 1380 : CHAIN Chainfil$
1380 END 
1390 ! 
1800 ! ----V{nta p} tangentsl{pp----
1810 IF NOT Tgbget% THEN WHILE SYS(8%) : WEND 
1830 RETURN 
1840 ! 
2000 ! ----Huvudrutin----
2001 ! Initiera buffert
2010 W1%=0% : W2%=0% : V1%=0%
2020 V$(0%)='****** H[R B\RJAR FILEN '+F1$ : ; CUR(0%,0%) V$(0%);
2030 FOR V%=1% TO 23%
2040   V$(V%)=':' : ; CUR(V%,0%) V$(V%);
2050 NEXT V% 
2100 ! Huvudloop
2110 WHILE 1%
2120   GOSUB 3390 ! Tangentkod
2130   IF INSTR(1%,Stt$,CHR$(I%)) RETURN ! CTRL-@, CTRL-\, PF1 or PF2
2140   IF I%=8% OR I%=196% GOSUB 2300 ! <- or PF5
2150   IF I%=9% OR I%=32% OR I%=198% GOSUB 2400 ! -> or SPACE or PF7
2160   IF I%=255% GOSUB 2200 ! Ingen tangent
2170 WEND 
2180 ! 
2200 ! ----Framf|rh}llning----
2210 ! L{s fr}n filen om n{ra slutet p} bufferten
2220 V%=FNV%(W2%-V1%)
2230 IF V%<36% GOSUB 3000
2240 RETURN 
2250 ! 
2300 ! ----Scrolla bak}t----
2310 IF V1%=W1% RETURN 
2320 V1%=FNV%(V1%-1%)
2330 V2%=FNV%(V1%+23%)
2340 Z%=CALL(VARPTR(Bkscroll$))
2350 ; CUR(0%,0%) V$(V1%);
2360 RETURN 
2370 ! 
2400 ! ----Scrolla fram}t----
2410 X%=FNV%(W2%-V1%)
2420 IF X%<12% GOSUB 3000 : RETURN 
2430 V1%=FNV%(V1%+1%) : ; CUR(23%,0%)
2440 V2%=FNV%(V1%+23%)
2450 IF V2%=W1% W1%=FNV%(W1%+1%)
2460 IF X%<24% V$(V2%)=':'
2470 ; CUR(23%,0%) V$(V2%);
2480 RETURN 
2490 ! 
3000 ! ----L{s fr}n filen----
3010 IF F1%=0% RETURN 
3020 W2%=FNV%(W2%+1%)
3030 IF W2%=W1% W1%=FNV%(W1%+1%)
3040 ! Kolla om rest fr}n f|rra raden
3050 L%=LEN(L$)-2% : IF L%<=0% GOSUB 3200 : L%=LEN(L$)-2%
3060 IF L%>Wid% L%=Wid%
3070 V$(W2%)=LEFT$(L$,L%)
3080 L$=RIGHT$(L$,L%+1%)
3090 ! Visa raden p} sk{rmen om det g}r
3100 S1%=FNV%(W2%-V1%)
3110 IF S1%<24% ; CUR(S1%,0%) CHR$(32%,8%) V$(W2%);
3120 RETURN 
3130 ! 
3200 ! ----L{s en rad----
3210 ON ERROR GOTO 3250
3220 INPUT LINE #F1%,L$
3230 ON ERROR GOTO 
3240 RETURN 
3250 ! Error
3260 L$='****** L[SFEL ERROR'+NUM$(ERRCODE)+'**'
3270 IF ERRCODE=34% L$='****** SLUT P] FILEN '+F1$+'**'
3280 CLOSE F1% : F1%=0%
3290 RETURN 
3300 ! 
3390 ! ----L{s tangentkod----
3400 IF Tgbget% THEN IF SYS(5%) THEN ; CUR(23%,Wid%); : GET G$ : I%=ASCII(G$) : RETURN ELSE I%=255% : RETURN 
3410 IF SYS(8%) THEN IF I%=255% THEN FOR R%=1% TO 70% : NEXT R% : I%=INP(34%) ELSE I%=INP(34%) ELSE I%=255%
3420 RETURN 
3430 ! 
3500 DEF FNCaps$(S$) LOCAL T$=160,P%
3510   T$=S$
3520   WHILE P%="`" THEN MID$(T$,P%,1%)=CHR$(ASCII(MID$(T$,P%,1%))-32%)
3540   WEND 
3550   RETURN T$
3560 FNEND 
3570 ! 
3600 DEF FNRunpar$ LOCAL Adr%,Par$=0,Komma%,Cr%,Semi%
3610   Adr%=CALL(81%)
3620   POKE VAROOT(Par$),161%,0%,Adr%,SWAP%(Adr%),161%,0%
3630   Komma%=INSTR(1%,Par$,',')
3640   Cr%=INSTR(1%,Par$,CHR$(13%))
3650   IF Komma%=0% OR Cr%Komma% AND Semi%