1 REM Ins{nd av Kristoffer Eriksson <5357> 1988-04-25 20.24.11 (KERMIT) WINDOW.INF +----------------------------------------------------------+ ! WINDOW.BAC Ver 2.00 - Enkla f|nsterdrivrutiner. ! ! F|r ABC806, 802, 800M, ej 800C. ! ! Av Kristoffer Eriksson <5357>, April 1988. ! ! F}r kopieras fritt endast f|r ickekommersiella syften. ! +----------------------------------------------------------+ 1. Inledning 2. Maskinkrav 3. Anv{ndning 3.1 OPEN/PREPARE 3.2 PRINT 3.2.1 Enkla koder. 3.2.2 Rita ut ramen. 3.2.3 Spara f|nster och attribut. 3.2.4 ]terst{ll f|nster och attribut. 3.2.5 Spara f|nster utan attribut. 3.2.6 ]terst{ll f|nster utan attribut. 3.2.7 \vrigt. 3.3 PUT 3.4 INPUT 3.5 GET 3.6 CLOSE 3.7 KILL "WND:" 3.8 NAME 3.9 WIDTH 3.10 ATTRIBUTE 4. Effekt av utskrifter i maskinkod 4.1 CONWRITE - utskrift 4.2 CONREAD - radinmatning 4.3 CONSI - teckeninmatning 5. POKE och OUT 6. Start av WINDOW 7. Slut 1. Inledning ------------- Det h{r programmet skapar enheten "WND:" med vilken man kan |ppna filer som g}r till f|nster p} sk{rmen. Ett f|nster {r i det h{r sammanhanget ett fyrkantigt omr}de p} datorns bildsk{rm, som kan hanteras som en egen minia- tyrsk{rm oberoende av resten av sk{rmen. F|nstret kan vara f|rsett med en omgivande ram. F|nstret |ppnas som en vanlig fil, och man kan fr}n Basic utf|ra de vanliga filoperationerna p} denna f|nsterfil. F|rst och fr{mst kan man skriva p} den med PRINT och PUT. F|nstret har en egen mark|rposition, egen f{rg och andra utskriftsattribut oberoende av resten av sk{rmen och |vriga f|nster. Det scrollar ocks} n{r dess sista rad {r full. Det kan {ven scrolla bakl{nges. [ven INPUT och GET fungerar p} f|nster, och visar mark|ren och inmatad text p} r{tt plats. Kommandoinmatningen till Basic, och allt annat som normalt g}r till sk{rmen, kan tempor{rt flyttas om till ett f|nster. N}got som WINDOW inte klarar av {r att automatiskt hantera |verlappande f|nster, d{r en del av ett f|nster eller av den |vriga sk{rmytan skyms av ett annat f|nster. En utskrift som g|rs p} en skymd del, hamnar {nd} ovanp} den skymmande delen. Att hantera s}dant ligger p} ett h|gre plan av komplex- itet {n vad WINDOW {r avsett f|r. Hj{lp finns dock inbyggt till att spara och }terst{lla f|nsterinneh}ll vid behov. WINDOW {r till nytta f|r den som vill skriva ett program som utnyttjar f|nster, och f|r den som ska k|ra ett f{rdigt program som anv{nder WINDOW. WINDOW utr{ttar ingenting roligt av sig sj{lvt. St|rsta delen av den h{r beskrivningen riktar sig till den som vill programmera med WINDOW. 2. Maskinkrav -------------- WINDOW {r avsett att fungera p} alla ABC800-modeller med 80-teckenssk{rm, vilket {r ABC800M, ABC802 och ABC806. ABC800C med sin speciella bildminnes- organisation fungerar inte. WINDOW har dock inget skydd mot oavsiktlig anv{ndning p} ABC800C. Programmet g|r sig f|rst}s b{st p} en ABC806 som ju har flest finesser i bildgenereringen. WINDOW st|der f{rger, understrykning och blinkning och blockgrafik. F|nsterramen ritas med blockgrafik i aktuell f{rg p} 806:an. P} ABC802 och 800M ritas ramen med tecknen !, - och +. 802 har visserligen blockgrafik, men den kr{ver att en position till v{nster och h|ger om en kant p} ramen reserveras f|r grafik-p}- och grafik-av-styrtecken, vilket inte skulle bli s{rskilt vackert. 800M har ingen blockgrafik alls. Alla styrtecken f|r bl a grafik, blink, f{rg kan skrivas i ett f|nster {ven p} 802, men om de inte pareras med motsvarande avst{ngningstecken i slutet av respektive rad, p}verkas {ven f|nstrets ram av dem. S} f|rh}ller det sig inte p} 806. [ven p} 800M kan man f|rst}s skriva in styrtecken i f|nstren, men de har ingen effekt p g a h}rdvarans begr{nsningar. Sk{rmen kan anv{ndas i b}da 40- och 80-teckensl{ge p} 802 och 806. Vill man, s} g}r det i viss m}n p} 800M ocks}, om man i brist p} WIDTH-instruktion POKE:ar in |nskad sk{rmbredd p} adress 65364 innan WINDOW startas, och om den aktuella Basic-versionen bryr sig om det. P} 806 kan man rent av blanda f|nster skapade i 40- och 80-teckensl{ge, om man {ndrar med WIDTH-instruktionen mellan |ppnandet av de olika f|nstren. Det g}r i princip {ven p} 802, men eftersom den h}rdvarum{ssig sl}r om hela sk{rmen p} en g}ng, blir effekten inte s{rskilt god. Utskrift i EL- och DBLE-mode (dubbel teckenbredd resp dubbel h|jd) st|ds inte p} 806. P} |vriga modeller har de ingen effekt alls, eftersom h}rdvaran inte klarar dem. De g}r att anv{nda p} 806, men sker det vid den h|gra eller den undre kanten av f|nstret, kan de skriva |ver f|nstrets ram. Vid utskrift av DBLE i ett f|nster l{ngst ned p} sk{rmen, kan hela sk{rmen scrolla upp en rad. Utskrift i de inre delarna av ett f|nster g}r bra. N{r detta skrivs; n{r version 2.00 {r den senaste versionen, har WINDOW inte kunnat testas p} n}got annat {n ABC806. F|reg}ende version fungerade i alla fall p} allt. Rapportera eventuella fel till mig, konstrukt|ren. 3. Anv{ndning -------------- F|nster skapas, hanteras och avl{gsnas med hj{lp av vanliga Basic-instruk- tioner. Motsvarande funktioner kan givetvis uppn}s i maskinkod via PROM-- rutinen IO, men eftersom det interfacet {r funktionellt helt ekvivalent beskrivs det inte h{r. H{r f|ljer en genomg}ng av ber|rda Basic-instruktioner. Kunskap om deras vanliga anv{ndning f|ruts{tts. 3.1 OPEN/PREPARE Ett f|nster skapas med OPEN eller PREPARE. B}da instruktionerna har samma effekt. Efter enhetsnamnet "WND:" anges parametrar f|r f|nstret. De best{mmer framf|rallt f|nstrets placering och storlek p} sk{rmen. Formatet {r WND:RRKKHHBB.M d{r RR och KK med tv} siffror vardera anger rad respektive kolumn f|r f|nst- rets |vre v{nstra h|rn, samt HH och BB, likaledes med tv} siffror vardera, anger f|nstrets h|jd och bredd. M anger en extra parameter som beskrivs l{ngre ned. Koordinaterna anger platsen f|r den f|rsta skrivbara positionen inom f|nst- ret. Samma koordinater som i PRINT CUR anv{nds. H|jden anges i antal rader, och bredden i antal tecken. Koordinater och storlek m}ste vara s}dana att hela f|nstrets yta rymms p} sk{rmen, med den f|r tillf{llet r}dande sk{rmbredden (den som {r satt med instruktionen WIDTH). Annars f}r man Basic-fel 21. Sk{rmens alla 25 rader kan anv{ndas. WINDOW ser dock inte till att den 25:e raden syns p} ABC800M eller ABC802, utan det {r anv{ndarens ansvar. P} ABC806 syns alltid alla 25 rader. Eventuell ram runt f|nstret placeras utanf|r den angivna ytan. Om f|nstret {r placerat p} rad 5, kolumn 10, b|rjar ramen p} rad 4 kolumn 9. Hela den angivna bredden och h|jden {r tillg{nglig innanf|r ramen. Ramen beh|ver inte rymmas p} sk{rmen. De delar som som inte f}r plats, ritas helt enkelt aldrig ut. Med f|nstret WND:00002580, det st|rsta m|jliga f|nstret, kommer allts} aldrig n}gon ram att bli synlig. F|nster utan skrivbar yta, dvs med 0 rader, 0 kolumner, eller b}da delarna p} en g}ng, {r till}tna, men ger vid utskrift felaktigt resultat. Se avsnittet om PRINT. Sist i filnamnet, efter punkten, kallat "M" ovan, kan en bokstav anges som styr utritning av ramen och radering av f|nstret vid CLOSE. Om ingen bokstav anges, ritas automatiskt en ram runt f|nstret direkt n{r det |ppnas, och f|nsret raderas fr}n sk{rmen n{r det st{ngs. Alternativen {r: Bokstav Automatisk ram Radering vid CLOSE N Nej Nej M Nej Ja O Ja Nej Ingen Ja Ja [ven om man v{ljer att inte rita ut n}gon ram vid |ppnandet, kan man senare f} den utritad med ett PRINT-kommando. Raderingsinst{llningen kan d{remot inte {ndras i efterhand. Om ramen ritas ut vid |ppnandet, ritas den med den f{rg som senast anv{nts n}gonstanns p} sk{rmen. [ven ev ULN, FLSH, EL, DBLE-attribut anv{nds om de {r aktiva. En f|nsterfil erh}ller filflaggorna LUS.PERM och LUS.IACT. LUS.PERM g|r att ett f|nster inte st{ngs av CLOSE utan filnummer angivet, som ju i |vrigt st{nger alla |ppna filer. T{nk d{rf|r p} att alltid explicit st{nga alla f|nster ett program anv{nder. LUS.IACT markerar att f|nstret {r en "interaktiv" fil, vilket g|r att INPUT-instruktionen visar fr}getecken eller prompt (INPUT #filnr "Fr}ga" X$) n{r den anv{nds p} ett f|nster. Kort sagt, att f|nstret fungerar likadant som den vanliga sk{rmen. (Diskettfiler {r exempel p} icke interaktiva filer. Det {r inte s} bra om det skrivs ut saker p} dem n{r inmatning beordras.) Vissa f|r f|nstret privata v{rden kopieras vid |ppnandet fr}n de p} sk{rmen senast anv{nda. Aktuell f{rg, ULN, FLSH, EL och DBLE-attribut kopieras. Des- sa attribut (som bara {r aktuella p} ABC806) styrs sedan endast av de styr- tecken som eventuellt skrivs ut via just den f|nsterfilen, och p}verkas inte av n}gonting annat som h{nder p} sk{rmen. [ven sk{rmens aktuella bredd (40 eller 80 tecken) sparas, och }terst{lls tempor{rt varje g}ng f|nstret anv{nds, s} att dess storlek inte f|r{ndras av att sk{rmens bredd {ndras. Slutligen sparas ocks} aktuellt ATTRIBUTE-v{rde, det som st{lls av instruk- tionen ATTRIBUTE p} ABC806, s} att olika f|nster kan ha olika v{rde. Detta kan inte {ndras i efterhand. Tv} filer som |ppnas med samma f|nsterkoordinater, ger tv} olika f|nster placerade p} samma st{lle, inte tv} filnummer till samma f|nster. (Skillna- den {r att varje f|nster har egen mark|rplacering och privata data.) [ven om "WND:" {r mest naturligt som enhetsnamn, g}r "CON:" lika bra att anv{nda. B}da namnen g}r till WINDOW:s egen drivrutin. Man kan trots det |ppna filer som g}r direkt till den vanliga sk{rmen, s} som man brukar g|ra med OPEN "CON:". WINDOW k{nner igen s}dana filer p} att inga f|nsterparamet- rar anges efter enhetsnamnet. En s}dan fil fungerar precis som de brukar, utom efter omflyttning av "CON:" till ett f|nster. Mer om den saken l{ngre ned. 3.2 PRINT Med instruktionen "PRINT #filnummer" kan man g|ra utskrifter i ett tidigare |ppnat f|nster. Ut|ver vanlig text, fungerar alla vanliga kontrolltecken och mark|rplacering med funktionen CUR plus ett antal nya kontrolltecken och ESC-sekvenser. H{r f|ljer en lista. 3.2.1 Enkla koder. CHR$(8) BS Backspace. Flyttar mark|ren ett steg }t v{nster. Vid v{nster f|nsterkant forts{tter den till slutet av raden f|re. Nytt {r att vid |versta raden scrol- lar f|nstret bakl{nges. CHR$(9) TAB Nyhet. Flyttar mark|ren ett steg }t h|ger. Vid h|ger f|nsterkant forts{tter den till b|rjan av n{sta rad. Efter sista raden scrollar f|nstret framl{nges. CHR$(10) LF Line feed. Flyttar mark|ren en rad rakt ned}t. Vid sista raden scrollar f|nstret fram}t. CHR$(11) Nyhet. Reverse line feed. Flyttar mark|ren en rad rakt upp}t. Vid |versta raden scrollar f|nstret bakl{nges. CHR$(12) FF Form feed. Rensar f|nstret. Placerar mark|ren i f|nstrets |vre v{nstra h|rn. Ramen p}verkas inte. CHR$(13) CR Carriage return. Flyttar mark|ren till v{nster f|nsterkant p} aktuell rad. CHR$(27,61,Rad,Kol) Placerar mark|ren p} angiven rad och kolumn inom CUR(Rad,Kol) f|nstret. Om koordinaterna {r f|r stora f|r f|nstret anv{nds st|rsta m|jliga v{rden. 3.2.2 Rita ut ramen. CHR$(27,82) "R" Ritar ut f|nstrets ram p} nytt. Mark|ren flyttas inte. Aktuell f{rg och andra utskriftsattribut som ULN, FLSH, EL och DBLE anv{nds p} ramen. EL (dubbel teckenbredd) och DBLE (dubbel h|jd) ger inte n}gon snygg effekt och b|r undvikas. Utskriftsattributen kan {ven smitta av sig p} oanv{nda omr}den omedelbart till h|ger om ramen. H}rdvaran p} ABC806 {r s} konstruerad att tecken med attributkod 0 visas med samma attribut som tecknet n{rmast till v{nster om det. Endast vid rensning av sk{rmen med CHR$(12) och vid scroll, uppst}r omr}den med attributkod 0. All vanlig utskrift anv{nder attributkoder andra {n 0. 3.2.3 Spara f|nster och attribut. CHR$(27,83)+CVT%$(VAROOT(Spar$)) "S" Sparar f|nstrets inneh}ll i den angivna str{ngen. P} ABC806 sparas {ven alla tecknens attribut (f{rger o dyl). Str{ngen m}ste i f|rv{g ha dimensionerats s} att hela f|nstret f}r plats i den, annars h{nder inget. F|nstret tar en byte per position inne i f|nstret (rader * kolumner), plus en per tecken i ramen med de delar som hamnar utanf|r sk{rmen bortr{knade. Med sk{rmen i 40-teckensl{ge, g}r dubbla antalet bytes }t; tv} per tecken- position. P} ABC806 dubblas antalet ytterligare en g}ng f|r att rymma teck- nens attribut. Ramen, eller snarare den plats d{r ramen skulle finnas, sparas oavsett om ramen f|r tillf{llet {r utritad eller ej. Str{ngens aktuella l{ngd justeras efter}t s} den anger hur mycket som gick }t. En mycket enkel rimlighetskontroll av VAROOT-v{rdet utf|rs. Ut|ver den finns inget skydd mot ogiltiga v{rden. Ett ogiltigt v{rde ger stor risk f|r sys- temkrasch. 3.2.4 ]terst{ll f|nster och attribut. CHR$(27,84)+CVT%$(VAROOT(Spar$)) "T" Omv{ndningen till f|reg}ende kod. ]terst{ller f|nstrets utseende s}dant det var n{r det sparades i den angivna str{ngen. Allting inklusive ram och teck- nens attribut }terst{lls. Allt som redan finns p} f|nstrets plats skrivs |ver. 3.2.5 Spara f|nster utan attribut. CHR$(27,115)+CVT%$(VAROOT(Spar$)) "s" Sparar f|nstrets inneh}ll i den angivna str{ngen. Enda skillnaden mot ovan- st}ende kod {r att tecknens attribut inte sparas p} ABC806. P} s} s{tt tar det p} ABC806 bara h{lften s} stor plats som annars, vilket {ven {r lika lite plats som p} |vriga ABC-modeller. 3.2.6 ]terst{ll f|nster utan attribut. CHR$(27,116)+CVT%$(VAROOT(Spar$)) "t" Omv{ndningen till f|reg}ende kod. ]terst{ller f|nstrets utseende s}dant det var n{r det sparades i den angivna str{ngen. Eftersom tecknens attribut inte ing}r i str{ngen, anv{nds det i f|nstret f|r tillf{llet g{llande attributet till hela }terst{llningen. F|nstret blir enf{rgat. P} andra modeller {n ABC806 g|r det f|rst}s ingen skillnad. F|nster |ppnade p} 40-teckenssk{rm, kan inte }terst{llas korrekt p} ABC806 utan att anv{nda attribut, eftersom det {r attributen som }stadkommer r{tt storlek p} tecknen. 3.2.7 \vrigt. Till de h{r uppr{knade kommer de i maskinen redan befintliga tecknen som styr f{rger, blink, understrykning, blockgrafik och liknande i samma omfatt- ning som n{r WINDOW inte anv{nds. T{nk p} att dessa tecken p} ABC802 kan p}verka {ven delar av ett f|nsters ram som r}kar ligga inom tecknets verk- ningsomr}de. EL och DBLE p} ABC806 fungerar, men kan skriva |ver f|nstrets ram, i enlighet med avsnitt 2. Utskrift med annat {n styrkoder i endimensionella f|nster ger inget anv{nd- bart resultat. I f|nster med 0 kolumner sker utskriften som om f|nstret hade 1 kolumn, ovanp} h|ger ramkant. I f|nster med 0 rader forts{tter utskriften allt l{ngre nedanf|r f|nstret. I slut{ndan hamnar den utanf|r bildminnet i arbetsminnet, med systemkrasch som f|ljd. Det finns ingen anledning att g|ra utskrifter i endimensionella f|nster. 3.3 PUT Med instruktionen "PUT #filnummer" kan man ocks} g|ra utskrifter i ett f|ns- ter, men med n}got annan effekt {n PRINT. PUT bryr sig inte om n}gra styr- tecken alls. Alla utskrivna tecken l{ggs som de {r direkt i bildminnet. Vil- ken effekt teckenkoder 0-31 och 128-255 har beror p} vilken h}rdvara man har. Den h{r varianten av PUT liknar mest den som annars finns i ABC806. P} de andra modellerna {r PUT mest en pseudonym f|r PRINT. Vid 40 teckens sk{rmvidd, skrivs tecknen med vanlig enkel teckenbredd, men i varannan teckenposition, medan |verhoppade positioner l{mnas op}verkade. P} ABC802 d{r hela sk{rmens bredd {ndras p} en g}ng, har det till effekt att utskriften syns eller inte syns beroende p} om den hamnar i j{mna eller udda teckenpositioner. 3.4 INPUT Med "INPUT #filnummer" och INPUT LINE #filnummer" beg{r man inmatning fr}n ett f|nster. Basic skriver d} ut ett fr}getecken i det aktuella f|nstret, visar mark|ren d{r och v{ntar p} inmatning. Inmatningen kan editeras som vanligt med piltangenterna. En nyhet {r att CTRL-K rensar p}g}ende inmatning och g}r upp}t en rad, ungef{r motsvarande CTRL-L som rensar inmatningen och hela f|nstret. (CTRL-K motsvarar CHR$(11).) Utskriften av fr}getecken kan bytas ut mot valfri fr}getext p} det vanliga s{ttet: INPUT #filnummer "Fr}getext",Variabel Om man g|r inmatning med INPUT i ett litet f|nster, d{r inmatningen blir s} l}ng att dess b|rjan scrollas bort fr}n f|nstret, och man sen backar till- baks till b|rjan kommer f|nstret att scrolla bakl{nges, men den/de nya rader som kommer fram blir blanka i st{llet f|r att visa det som tidigare scrolla- de ut fr}n f|nstret. Men {ven om det som stod d{r inte syns, s} {r det inte bortgl|mt av inmatningsrutinen. 3.5 GET "GET #filnummer" och "GET #filnummer .... COUNT ..." l{ser in ett eller flera tecken via ett f|nster till en variabel. Mark|ren visas i det aktuella f|nstret, och datorn v{ntar tills det angivna antalet tecken matats in p} tangentbordet. Inmatade tecken visas ej. 3.6 CLOSE CLOSE utan filnummer st{nger inte f|nsterfiler. CLOSE med filnummer avslutar }tkomsten till det f|nstret. Om s} angavs n{r f|nstret |ppnades, raderas f|nstret fr}n sk{rmen, annars f|rblir det kvar. Vid raderingen raderas {ven det omr}de ramen skulle vara p}, oavsett om n}gon ram visats eller ej. Bak- grunden blir svart. Ramen blankas med de i f|nstret f|r tillf{llet aktuella attributen (t ex bakgrundsf{rg). 3.7 KILL "WND:" Med denna instruktion raderas WINDOW ur datorns minne. Observera att enhets- namnet inte ska f|ljas av n}gra f|nsterparametrar. I s} fall blir det Basic- fel 52. WINDOW laddas in p} l{gsta lediga adress i datorns arbetsminne och l{nkar in sig i vissa systemlistor (n{rmare best{mt CONSI-pekaren, enhetslistan och LU-listan). KILL f|rs|ker }ter frist{lla det anv{nda minnet, och }terst{lla listorna till samma tillst}nd som f|re inladdningen. Om n}got ytterligare resident program har laddats in, som anv{nder mera min- ne ovanf|r WINDOW, eller sj{lvt lagt beslag p} CONSI-pekaren eller {ndrat enhetslistan, klarar KILL inte av att g|ra n}gon vettig }terst{llning utan att samtidigt f|rst|ra det som laddats in senare. I st{llet blir det Basic- fel 40. Alla |ppna f|nster konverteras till att g} till den vanliga sk{rmen. Upprensningen efter KILL kan inte anses fullf|ljd f|rr{n ett programbyte har gjorts (CHAIN, NEW eller liknande). KILL frist{ller visserligen det anv{nda minnet, men det Basic-program plus data som ligger i arbetsminnet n{r detta g|rs, flyttas inte med, utan kommer att f} en "onaturlig" placering i minnet i f|rh}llande till l{gsta lediga minnesadress. Vid programbyte justeras f|r- h}llandena i och med att det gamla programmet avl{gsnas. Eventuella COMMON-variabler avl{gsnas, eftersom de adresseras relativt l{gs- ta lediga minnesadress, vilken {ndras av KILL. Det h{r g|r att ett program som f|re KILL hade COMMON-variabler, efter}t kan CHAIN:a andra program med andra COMMON-variabler, precis som ett program utan COMMON-variabler kan. (I vanliga f}r man annars Basicfel 205.) Eventuella data i COMMON-variablerna {r f|rlorade. Finns inget annat att CHAIN:a kan man anv{nda CHAIN "NUL:". 3.8 NAME NAME-instruktionen anv{nds till att flytta |ver alla utskrifter som normalt sker p} den vanliga sk{rmen till ett f|nster. Det betyder att man matar in alla sina Basic-kommandon i det f|nstret, listar program d{r, f}r felmedde- landen och programutmatningar d{r. [ven filer som f|re eller efter NAME |pp- nas som "CON:" g}r till f|nstret. Det enda som fortfarande g}r till hela sk{rmen {r utskrifter via maskinkods- anrop till utskriftsrutinerna i PROM, vilka WINDOW inte kan f}nga upp. Det {r vanligen .ABS-program som anv{nder s}dana. Se avsnitt 4. Instruktionen anv{nds s} h{r: NAME "CON:" AS "WND:f|nsterparametrar" F|nsterparametrarna anges p} samma s{tt som vid OPEN. Anv{ndningen av enhetsnamnen "CON:" och "WND:" {r f|rst}s valfri, eftersom b}da i sj{lva verket har samma effekt, och det {r f|nsterparametrarnas n{rvaro eller fr}n- varo som r{knas. Felaktiga f|nsterparametrar ger felkod 64. F|r att }terg} till normal hantering av sk{rmutskrifter anv{nds NAME "CON:" as "CON:" I inget av fallen anges f|nsterparametrar p} det f|rsta filnamnet. G|r man det blir det Basicfel 52. N{r den normala hanteringen }terupptas och det anv{nda f|nstret i praktiken st{ngs, raderas det inte fr}n sk{rmen, oavsett vilka f|nsterparametrar som anv{nts. I |vrigt fungerar alla s{rskilda f|nsterfinesser {ven p} detta f|nster, men utan att man beh|ver ange filnummer. N{r sk{rmutskriften {r omdirigerad till ett f|nster, g{ller det {ven filer |ppnade med namnet "CON:", b}de om de |ppnats f|re eller efter omdirigering- en. Filer som |ppnats f|re, kommer dock att vara m{rkta med den vanliga radl{ngden i st{llet f|r f|nstrets radl{ngd, vilket har betydelse vid anv{ndning av TAB och "," i PRINT. Fel }t andra h}llet blir det med filer som |ppnas som "CON:" medan omdirigeringen {r ig}ng, n{r den }terst{lls eller {ndras till ett nytt f|nster. Utskrift med TAB p} en och samma sk{rmrad via flera olika filer till "CON:" ger felaktig tabulering, eftersom aktuell kolumn bara lagras i den fil som en delutskrift g|rs via, medan de |vriga filerna tror sig st} kvar p} en tidigare kolumn. S} {r det {ven n{r WINDOW inte anv{nds, s} {ven om det kan l}ta lite dumt, {r det kompatibelt med Basicens egna rutiner. N{r sk{rmen {r omdirigerad, har WIDTH ingen effekt p} sk{rmens vidd, och ATTRIBUTE p}verkar inte utskriften i f|nstret. Liksom vid OPEN, sparas dessa v{rden en g}ng f|r alla i en privat area f|r f|nstret. Det finns dessutom inget s{tt att f} utskrift p} den vanliga sk{rmen, annat {n via maskinkods- anrop. Vid anv{ndning av .ABS-program och andra program som g|r utskrifter p} sk{r- men via maskinkodsanrop till rutinerna i Basic-prom, och d{rmed g}r f|rbi WINDOW, kan WINDOW inte se till att utskriften hamnar p} r{tt plats i f|nst- ret, eller |ver huvud taget inom f|nstret. Inmatning p} samma s{tt kan inte smita f|rbi WINDOW, utan placeras p} aktuell position i f|nstret, men kommer d} f|rst}s inte att st{mma med placeringen av tidigare utskrifter via prom-- rutinerna. 3.9 WIDTH WIDTH, som bara finns p} ABC802 och ABC806, kan anv{ndas med eller utan fil- nummer angivet: WIDTH radl{ngd WIDTH #filnummer,radl{ngd Den f|rsta formen {ndrar radl{ngden p} sk{rmen, och v{xlar {ven mellan enkel och dubbel teckenbredd beroende p} om radl{ngden blir st|rre eller mindre {n 40 tecken, allm{nt kallat 40- resp 80-teckensl{ge eller dito -sk{rm. Den andra formen {ndrar radl{ngden p} angiven fil, som m}ste vara |ppen. Att ange filnummer 0 har samma effekt som f|rsta formen. Radl{ngden anv{nds dels av Basics PRINT-rutin vid tabulering med TAB eller "," och utskrift av tal (som inte delas i tv} delar vid radslut), och dels av den aktuella enhetens drivrutin till att bryta f|r l}nga rader. Om WIDTH anv{nds p} en f|nsterfil, {ndrar det f|nstrets bredd, men ger inte n}gon automatisk justering av f|nstrets eventuella ram. Den kan ritas om med ett s{rskilt PRINT-kommando (avsnitt 3.2.2), och ritas d} med den nya bred- den. Det finns ingen kontroll av att f|nstret f}r plats p} sk{rmen med den nya bredden, s} ov{ntade effekter kan uppst} om f|nstret g}r utanf|r sk{rmens kant. Om det intr{ffar l{ngst ned p} sk{rmen, kan rent av inneh}llet i arbetsminnet skadas. N{r sk{rmustkrift har omdirigerats till ett f|nster med NAME, p}verkar WIDTH utan filnummer inte l{ngre sk{rmens bredd, utan fastmer det aktuella f|nst- rets bredd. Sk{rmens bredd {r d} inte l{ngre }tkomlig annat {n genom POKE, men till och med d} }terst{lls bredden vid varje utskrift till f|nstret. F|rutom sin egen bredd, h}ller varje f|nster reda p} vilken bredd sk{rmen var inst{lld p} n{r f|nstret |ppnades. Denna bredd }terst{lls tempor{rt vid varje utskrift i f|nstret. Eftersom f|nstrets bredd r{knas i antal tecken- kolumner, {r dess verkliga bredd (r{knat i bytes i bildminnet och centimeter p} sk{rmen) beroende av om enkel eller dubbel teckenbredd anv{nds, och det i sin tur beror p} om 40- eller 80-teckenssk{rm anv{nds. Genom att f|nstret b{r med sig r{tt sk{rmvidd, f|rblir dess verkliga storlek alltid konstant oavsett hur sk{rmens vidd {ndras. I annat fall skulle WINDOW kunna tro en sak om f|nstrets verkliga bredd, medan det p} sk{rmen {r dubbelt s} brett eller smalt. Ett f|nster |ppnat p} 80-teckenssk{rm p} ABC802 visar dock bara vart annat tecken om sk{rmen st{lls i 40-teckensl{ge, och ett f|nster f|r 40-teckensl{- ge visar i 80-teckensl{ge bara enkelbreddstecken p} var annan teckenposi- tion. P} ABC806 d{remot beh}ller f|nstren sitt utseende {ven om sk{rmens bredd {ndras. WINDOW konstruerades inte till att klara av att {ndra bredd p} |ppna f|ns- ter, men eftersom det inte g}r att hindra WIDTH fr}n att p}verka bredden {nd}, har dess effekt beskrivits h{r. Att hantera olika bredd p} sk{rmen ing}r d{remot i WINDOW. 3.10 ATTRIBUTE Med ATTRIBUTE-instruktionen, som endast finns p} ABC806, anger man ett v{rde som styr ett antal olika detaljer vid utskrift p} sk{rmen: 1 = Styrkoder f|r f{rg och liknande ska inte ta upp tecken- positioner vid utskrift, 2 = Softscroll (endast f|r hela sk{rmen, ej f|nster, endast om s{rskild softscrollrutin laddas), 4 = F{rger och andra utskriftsattribut ska inte automatiskt vid varje radbyte }terst{llas till vit f|rgrund, svart bakgrund och |vriga attribut av, 8 = (Ingen simulering med gr}skalor av f{rger p} DTC2) \nskas flera funktioner adderar man dem. V{rdena 1 och 4 p}verkar {ven utskriften i f|nster. F|r att g|ra de m|jligt att ha olika ATTRIBUTE-v{rden i olika f|nster, sparas aktuellt v{rde vid |ppnandet i en privat area hos f|nstret. Sen kan den inte {ndras i efter- hand, annat {n m|jligen med POKE p} r{tt st{lle. N{r sk{rmutskriften omdirigeras till ett f|nster med NAME, sparas ATTRIBUTE-v{rdet {ven i det f|nstret, och instruktionen ATTRIBUTE kan inte l{ngre {ndra det v{rde som anv{nds. F|rst n{r omdirigeringen upph|r f}r ett eventuellt nytt v{rde effekt. N{r v{rdet 4 inte anv{nds }terst{lls utskriftsattributen vid varje radbyte med CHR$(10), CHR$(11) (radbyte upp}t) och CHR$(12), samt n{r h|ger f|nster- kant passeras. F|rflyttning med CUR ger inte }terst{llning. Detta {r lika- dant som utan WINDOW, f|rutom att CHR$(11) inte finns d}. P} andra modeller {n ABC806 tar styrtecknen f|r f{rg och andra utskriftsatt- ribut alltid upp en teckenposition p} sk{rmen, eftersom de lagras som ett s{rskilt tecken i bildminnet. ABC806 har ett s{rskilt attributminne paral- lellt med det vanliga bildminnet, s} d{r kan man v{lja mellan att simulera de andra modellernas beteende, eller att utnyttja alla teckenpositioner till synliga tecken. Det {r detta v{rdet 1 styr. 4. Effekt av utskrifter i maskinkod ------------------------------------ Basicen arbetar vid kommandoinmatning, programeditering och utskrifter utan filnummer angivna till st|rsta delen via fil 0. Fil 0 brukar g} till sk{r- men. N{r WINDOW anv{nds delas fil 0 och blir tv} filer. En intern fil som g}r direkt till sk{rmen, och en ny fil 0 som tar emot alla utskrifterna och h}ller reda p} om det ska skrivas ut p} normalt s{tt p} sk{rmen eller efter NAME skickas till ett f|nster. Alla utskrifter till f|nster och vanliga sk{rmfiler slussas vidare till den interna filen d{r den verkliga utskriften sker. Varje fil h}ller reda p} sin egen mark|rposition, aktuella utskriftsattribut och liknande, som kopieras till den interna filen vid varje utskrift. Innan kopieringen g|rs kontrolleras positionen s} att den alltid h}ller sig inom f|nstret, med t ex scrollning av f|nstret som effekt. En del program, s{rskilt .ABS-filer, sk|ter utskrift och inmatning via anrop till s{rskilda rutiner i Basicprommen i st{llet f|r via filer. Dessa rutiner {r kopplade till den interna filen, och utnyttjar dess senaste mark|rposi- tion, attribut osv, och tar under inga f|rh}llanden h{nsyn till f|nster. Omdirigering med NAME har s}ledes ingen effekt p} s}dana utskrifter. M}nga systemprogram anv{nder .ABS-filer. Dessa kan d{rf|r st|ka till det p} sk{rmen vid anv{ndning. De promrutiner det g{ller h{r kallas CONWRITE (adress 11), CONREAD (5) och CONSI (2). H{r f|ljer nu en n{rmare beskrivning av var och ens effekt i samband med WINDOW. 4.1 CONWRITE - utskrift Skriver direkt p} sk{rmen, p} senast anv{nda position hos den interna filen och oavsett ev NAME. Lika lite som den bryr sig om fil 0:s mark|rposition, f}r fil 0 reda p} var p} sk{rmen utskriften slutade, s} vid blandad anv{nd- ning av fil 0 och CONWRITE, blir det blandade placeringar av utskrifterna p} sk{rmen ocks}. I synnerhet n{r senaste sk{rmutskrift gjordes p} fil 0 (normalfallet), och f|ljs av utskrift via CONWRITE, hamnar denna p} r{tt plats, men om det sen forts{tter med utskrift p} fil 0 igen, kommer den att b|rja om p} samma plats som CONWRITE-utskriften gjorde och skriva |ver denna. 4.2 CONREAD - radinmatning CONREAD f}ngas upp av WINDOW (genom att WINDOW kontrollerar de anrop som g|rs till CONSI f|r att h{mta enskilda inmatade tecken), och byts ut mot anrop till WINDOW:s egen inmatningsrutin. Om fil 0 {r omdirigerad med NAME till ett f|nster, genomf|rs inmatningen i det f|nstret. I annat fall uppdateras mark|rpositionen f|r fil 0 till den som senast anv{nts p} den interna filen, varefter inmatningen genomf|rs vid den positionen. P} s} s{tt blir positionen r{tt efter utskrifter med CONWRITE. Inmatningar med CONREAD f|reg}s ofta av utskrift av en ledtext eller fr}ga via CONWRITE. Om senaste utskrift skedde via fil 0 i st{llet, uppdateras positonen bara till sig sj{lv, s} det fungerar ocks}. Gick den via n}got annat f|nster i st{llet, kommer inmatningen att g|ras via fil 0 vid den i f|nstret anv{nda positionen, och skriva |ver en del av f|nstret och utan att ta h{nsyn till dess kanter. Uppf}ngning av CONREAD intr{ffar bl a vid editering av kommandon som Basic givit felmeddelande f|r. Basic anropar n{mligen i det fallet CONREAD direkt, i st{llet f|r att som i |vriga fall g} via fil 0. 4.3 CONSI - teckeninmatning CONSI visar helt enkelt mark|ren p} senast anv{nda position hos den interna filen, och v{ntar p} inmatning av ett tecken fr}n tangentbordet, precis som den alltid har gjort. D{rut|ver hj{lper den WINDOW att f}nga upp CONREAD. CONREAD anv{nder CONSI. Den senast anv{nda positionen {r inte alltid den som g{ller f|r fil 0, utan kommer fr}n senast anv{nda sk{rm- eller f|nsterfil. 5. POKE och OUT ---------------- En del Basicprogram n|jer sig inte med utskrifter via PRINT. De g}r direkt p} k{llan och POKE:ar in mark|rpositioner och OUT:ar ut utskriftsattribut. Eftersom normala fil 0 delas upp i WINDOW (se avsnitt 4), fungerar inte de vanliga POKE-adresserna. De g}r i WINDOW bara till den interna filen, vars variabler initieras p} nytt vid varje utskrift p} de andra filerna. D{rf|r har de bara kortvarig effekt n{r de f|ljs av utskrift med CONWRITE, och ingen alls annars. Man kan i princip POKE:a i fil 0:s (eller n}gon annan fils) variabler, om man letar upp filens LU-block genom att genoms|ka LU-- blockskedjan, vars startpekare finns p} adress 65344. PEEK p} de gamla adresserna ger f|r vissa variabler senast anv{nda v{rde, och f|r andra en kopia av aktuellt v{rde f|r fil 0. H{r f|ljer en lista p} variablerna i LU-blocket f|r sk{rm- och f|nsterfiler: Offset Namn Sk{rmfil Storlek Beskrivning Internfil F|nsterfil +0 W N{sta LU-blocks adress x x x +3 B LU.STAT Div flaggor x x x +4 W LU.DCB Pekare till enhetslistan x x x +6 B LU.POS Aktuell kolumn x x x +7 B -"- Aktuell rad x x x +8 W LU.WID Radl{ngd 0 x x +10 B LU.FC Senaste IO-operation x x x +11 B Sk{rmvidd d} f|nster |ppnades x +13 B Aktuellt OUT 53-v{rde (ABC806) s x x +14 B Utskriftsflaggor (ABC806) s x x +15 B Senaste genomf|rda radl{ngd(806,802) x +16 B F|nstrets h|jd x +17 B F|nstrets placering kolumn x +18 B F|nstrets placering rad x +19 B F|nstrets ATTRIBUTE-v{rde x +20 B Raderingsflagga CLOSE x "x" = Anv{nds. "s" = Senast anv{nda v{rde. "0" = Kopia aktuellt v{rde f|r fil 0, om den inte g}r till ett f|nster. OUT 53 f|r att st{lla attributporten p} ABC806, p}verkar inte utskriften annat {n med CONWRITE. INP(53) ger senast anv{nda v{rde. ATTRIBUTE-v{rdet som ligger p} adress 65266 i ABC806, {r senast satta med ATTRIBUTE-instruktionen, och g{ller f|r utskrift p} sk{rmfiler (inkl fil 0) n{r denna inte {r omdirigerad med NAME till ett f|nster. Uppgifterna h{r om var olika v{rden kommer ifr}n, g{ller n{r ingen utskrift {r under exekvering. D} kopieras v{rden fr}n filen utskriften g|rs p}, till den interna filen, OUT 53 och till ATTRIBUTE-v{rdet. 6. Start av WINDOW ------------------- Programmet startas med RUN eller CHAIN. N{r det k|rt klart finns de nya f|nsterrutinerna inlagda i datorns minne. WINDOW kan automatiskt starta n}got annat program n{r det har gjort sitt. Ange det andra programmets namn efter komma och semikolon. Om det andra programmet f|rst}r s}nt, kan man ange parametrar och ytterligare programnamn efter dess namn. Syntax: RUN WINDOW(,;programnamn) CHAIN "WINDOW(,;programnamn)" Parentesen markerar den icke obligatoriska delen. I m}nga program kan man ange s{rskilda optioner mellan "," och ";", men WINDOW har inga optioner. N{r WINDOW k|rs talar det om version, hur mycket minne som g}r }t och hur mycket som blir kvar. Eller om det uppt{cker att enheten "WND:" redan finns, meddelar det att WINDOW troligen redan finns laddat. I b}da fallen genomf|rs starten av det efterf|ljande programmet. Om felaktig syntax anv{nds, meddelas detta och k|rningen stoppas. Efterf|l- jande program startas inte. Med inst{llningsprogrammet ST[LLPAR, kan man st{lla in ett program som ska startas efter k|rning av WINDOW, n{r inget annat anges i RUN-kommandot. WINDOW l{gger sig p} l{gsta lediga adress i arbetsminnet. Version 2.00 tar 1547 bytes. Dessutom kopplar det in sig i enhetslistan och en del andra sys- temdata. Om ytterligare program som l{gger sig kvar i minnet k|rs tillsam- mans med WINDOW kan de h{nda att de st|r varandras arbete. Det kan ocks} g} olika bra beroende p} vilket som laddas in f|rst. WINDOW fungerar inte i REMOTE-k|rning. F|r urladdning av WINDOW, se avsnittet om KILL (3.7). 7. Slut -------- Programmet kan inte listas. Det beror inte p} att det {r hemligt, utan bara p} att det i sj{lva verket inte {r n}got Basic-program. Det inneh}ller maskinkod tillsammans med lite "kamouflage" som g|r att det g}r att starta med RUN som om det vore ett Basic-program. Men eftersom det inte {r Basic-instruktioner i det kan det inte listas. Programmet f}r spridas fritt, men inte mot h|gre betalning {n mediekost- naden, och det f}r inte anv{ndas i kommersiella produkter utan tillst}nd. Jag konstruerade WINDOW 1985. Det jag nu sl{pper {r en uppiffad, mer robust version, med ordentlig bruksanvisning. K{llkoden i assembler finns/kommer att finnas i ABC-klubbens programbank. Ett program som anv{nder WINDOW kom- mer ocks} att finnas. Rapportera eventuella fel till mig, Kristoffer Eriksson Vassv{gen 3 702 31 \rebro Tack.