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%