1 REM Ins{nd av Kristoffer Eriksson SYSOP <5357> 1986-12-16 03.40.27 (DUMP) DOTOPT.INF +-------------------------------------------------------------+ ! DOTOPT.BAC Ver 2.00 - SET DOT och CLR DOT till ABC806. ! ! Framf|rallt f|r ABC806, men {ven ABC800 och ABC802. ! ! Av Kristoffer Eriksson <5357>, December 1986. ! ! F}r kopieras fritt, dock endast f|r icke-kommersiellt bruk. ! +-------------------------------------------------------------+ 1. Inledning 2. De nya instruktionerna 2.1 Uppl|sning 2.2 Skillnader mellan olika ABC-datorer 2.3 Att skriva program som g}r p} alla ABC800-datorer 3. Internkoder i BASIC 3.1 Problem med skilda internkoder 3.2 Program i text- och bin{r-form 3.3 Konsekvenser 3.4 ]tg{rder och konverteringar 4. Start och parametrar 4.1 Start-syntax 4.2 Optioner 4.3 ST[LLPAR:s parametrar 5. Tekniska data 5.1 Minnes}tg}ng 5.2 Url{nkning 5.3 Listbarhet 6. Nyheter i version 2 7. Slut 1. Inledning ------------- DOTOPT ut|kar BASIC-II med blockgrafik-instruktionerna SET DOT, CLR DOT och funktionen DOT. Dessa anv{nds i m}nga spel och andra konverterade ABC80-program, men finns dessv{rre inte som standard i ABC806 och ABC800M. Den bristen }tg{rdas tillf{lligt, fram till n{sta reset, genom en k|rning av programmet DOTOPT. ABC800C och ABC802 har redan fr}n b|rjan dessa instruktioner, s} d{r beh|vs inte DOTOPT. Dock g}r det att ladda DOTOPT {ven p} dem, vilket beror p} att de interna BASIC-instruktionskoderna som anv{nds av DOTOPT, inte {r samma som normalt, varf|r program som anv{nder DOTOPT:s instruktioner, inte g}r att k|ra utan DOTOPT. Eftersom ABC800M inte har n}gon blockgrafik i sin teckengenerator, kommer endast ett virrvarr av bokst{ver, siffror och andra tecken att bli resultatet av ett f|rs|k att anv{nda DOT-instruktionerna, vilket dock inte hindrar att sj{lva programmen fungerar. 2. De nya instruktionerna -------------------------- DOTOPT skapar f|ljande tv} BASIC-instruktioner och en dito funktion: SET DOT R,K t{nder en punkt p} DOT-rad R och DOT-kolumn K. CLR DOT R,K sl{cker samma punkt. A=DOT(R,K) tilldelar A v{rdet -1 om p} DOT-rad R och DOT-kolumn K {r t{nd, och v{rdet 0 om den {r sl{ckt. 2.1 Uppl|sning --------------- Vilka koordinater R och K som {r till}tna med DOT-instruktionerna varierar fr}n maskin till maskin, i samma m}n som sk{rmen kan visa olika mycket text. Varje teckenposition rymmer tv} kolumner och tre rader punkter av det slag DOT-instruktionerna hanterar. Nedan en |versikt. Maskin R K (40 tecken) K (80 tecken) ------- ---- ------------- ------------- ABC80 0-71 0-79 - ABC800C 0-71 0-79 - ABC800M 0-74 - 0-159 ABC802 0-74 0-79 0-159 ABC806 0-74 0-79 0-159 Koordinaten R anger DOT-raden, och {r 0 l{ngst upp p} sk{rmen. Koordinaten K anger kolumnen, och {r 0 l{ngst till v{nster p} sk{rmen. Antalet kolumner varierar beroende p} om sk{rmen visar 40 eller 80 tecken per rad. De maskiner som kan visa 25 rader har 74 som h|gsta DOT-rad. F|r att DOT-rad 72-74 ska synas p} ABC800M och ABC802 m}ste den nedersta textraden t{ndas med OUT 56,6,57,25. 2.2 Skillnader mellan olika ABC-datorer ---------------------------------------- P} ABC800C och ABC802 (och ABC80) g}r det inte att f} blockgrafik i kolumn 0 och 1, eftersom det inte finns plats f|r n}got start-grafik-tecken f|re. ABC806 anv{nder dessa styrtecken p} ett annat s{tt. P} ABC800C och ABC802 m}ste styrtecken f|r grafik skrivas in p} de rader d{r blockgrafik ska anv{ndas. Man kan placera tecknen allra f|rst p} raden, eller l{ngre in om inte hela raden ska vara i grafikl{ge. De tecken det r|r sig om heter GRED, GYEL, GBLU, GGRN, GCYA, GMAG, GWHT, som ger r|d, gul, bl}, gr|n, cyan (ljusbl}), magenta (rosa/lila) respektive vit grafik. L{ngre in p} raden kan grafiken sl}s av igen med n}got av tecknen RED, YEL, BLU, GRN, CYA, MAG eller WHT. I ABC80-program anv{nds CHR$(151) och CHR$(135), vilka {r samma som GWHT och WHT. Ofta anv{nt {r att st{lla om hela sk{rmen i grafikl{ge i b|rjan av programmet, med en liten loop som: 10 FOR R=0 TO 24 20 PRINT CUR(R,0) GWHT; 30 NEXT R P} de rader som befinner sig i grafikl{ge syns alla tecken utom versaler som block-grafik (kombinationer av punkter, tv} kolumner om tre punkter f|r varje teckenposition). DOT-instruktionerna arbetar med dessa tecken. Skrivs ett grafikstyrtecken |ver, syns det att resten av raden best}r av valiga skrivtecken. Bildminnet i ABC806 {r annorlunda organiserat. Styrtecknen lagras inte som tecken i bildminnet och styr inte en bildsk{rmsrad i taget, utan simuleras av programvaran i datorn och ett attributminne som beskriver f{rg, blink och understrykning separat f|r varje tecken p} sk{rmen. Dessutom lagras inte blockgrafiken som omvandlade tecken i ASCII-alfabetet, utan har egna koder, och man riskerar d{rf|r aldrig att tappa grafiken. Vid normalt arbete mot sk{rmen uppf|r den sig synbarligen som en ABC802 eller ABC800C, men egentligen avkodas styrtecknen av programvaran, och de beg{rda attributen l{ggs p} de tecken som skrivs ut efter}t, fram till radbyte. L{gg m{rke till skillnaden mellan r{ckvidden f|r styrtecknen. P} ABC802 ber|rs alla tecken som st}r l{ngre fram p} raden, med p} ABC806 ber|rs de tecken som skrivs tidsm{ssigt senare, och bara till dess man byter rad med CHR$(10) eller en PRINT-sats som inte avslutas med ";". Detta b{ddar f|r problem n{r block-grafikprogram ska skrivas s} att de fungerar lika p} alla datormodeller. Begripligt nog har den ovan beskrivna loopen f|r grafikst{llning av sk{rmen, inte n}gon st|rre effekt p} ABC806. 2.3 Att skriva program som g}r p} alla ABC800-datorer ------------------------------------------------------ Vad som g{ller p} ABC806 {r senast anv{nda f{rg och teckentyp (grafik eller text). Denna {ndras inte s} l{nge man flyttar sig mellan raderna med CUR(R,K) och avslutar PRINT med semikolon (;). Instruktionen ATTRIBUTE 4 har effekten att attributen inte {ndras vid radbyte, men utnyttjar man den vinner man inte s} v{rst mycket, men f|rlorar m|jligheten att k|ra programmet p} ABC800, eftersom ABC800 inte accepterar program med ATTRIBUTE-instruktionen. Vidare kan man inte skriva ut n}got p} ett st{lle p} sk{rmen med ett attribut (t ex bl}+text), och sedan som p} ABC802 g} till en annan plats d{r andra styrtecken g{ller (t ex gul+grafik), och tro att utskriften ska p}verkas av dessa. P} ABC806 m}ste man st{lla in det andra attributet p} nytt, l{mpligen med mark|ren p} det st{lle d{r styrtecknet redan st}r, och sedan flytta mark|ren dit d{r utskriften ska g|ras, och utf|ra den. Det som p} ABC80, ABC800C och ABC802 ser ut s} h{r: 100 PRINT CUR(1,0) GWHT CUR(1,25) "PO[NG" WHT " 0 " CUR(1,35) GWHT ... 500 PRINT CUR(1,10) "54" : REM Grafisk figur 510 PRINT CUR(1,31) P : REM Po{ngsumma som anv{nder rad 1 i grafikl{ge, med en liten textruta fr}n position 25-35, b|r konverteras till: 100 PRINT CUR(1,0) GWHT CUR(1,25) "PO[NG" WHT " 0 " CUR(1,35) GWHT ; ... 500 PRINT CUR(1,0) GWHT CUR(1,10) "54" ; : REM Grafisk figur 510 PRINT CUR(1,30) WHT CUR(1,31) P ; : REM Po{ngsumma Rad 100 b|r bevaras, s} att det fortfarande fungerar p} andra maskiner {n ABC806. Grafikst{llningen i b|rjan av rad 500 kan oftast uteslutas om man vet att utskrift redan g|rs i grafik-l{ge, och det kan {ven vara l{mpligt att st{lla tillbaks grafikl{ge efter utskrift av P. Styrtecknen b|r place- ras i variabler s} det blir l{tt att {ndra f{rg. Konstruktionen p} rad 510 med tv} CUR till positioner direkt efter varand- ra kan synas on|dig, men om datorn st}r i l{ge ATTRIBUTE 1, kommer inte WHT-tecknet att flytta fram mark|ren till n{sta position, och program som fungerar i alla l{gen {r att f|redra. F|r DOT-instruktionerna spelar det p} ABC806 ingen roll om det {r text- eller grafik-l{ge som g{ller f|r tillf{llet, eftersom text och grafik anv{nder skilda teckenkoder, men d{remot f}r punkten den senast anv{nda f{rgen. (Egentligen f}r hela teckenpositionen den f{rgen, s} omgivningen kan bli "smittad" av f{rgen.) 3. Internkoder i BASIC ----------------------- Varje BASIC-instruktion representeras internt i datorn av en s{rskild kod best}ende av en till tre tal mellan 0 och 255. I tabellen nedan visas vilka koder som anv{nds av DOTOPT. Den tredje kolumnen anger hur instruktionerna och funktionen ser ut om ett program listas utan att ha DOTOPT inladdat. Instruktion Internkod Listas som ------------ ---------- ----------- SET DOT 134,128 XSTM128 CLR DOT 134,129 XSTM129 DOT() 126,160 XFN160 Hoppas koderna inte krockar med n}got annat. 3.1 Problem med skilda internkoder ----------------------------------- I alla ABC-modellerna finns DOT-instruktionerna, }tminstone deras namn och normala internkoder. P} ABC806 och ABC800M inneb{r detta att instruktio- nerna g}r att skriva in i ett program, men om programmet k|rs, f}r man felkod 200 som betyder "Enheten ej ansluten". Den "enhet" som avses {r exekveringsrutiner (till skillnad fr}n inmatningsrutiner) f|r DOT-instruktionerna. Internkoderna f|r dessa instruktioner {r allts} redan upptagna, och det {r inte m|jligt att koppla dem till nya rutiner, vilket {r orsaken till att DOTOPT m}ste anv{nda andra internkoder. En oundviklig nackdel blir f|rst}s att det d} finns tv} varianter, med problem att vid varje enskilt tillf{lle komma }t r{tt variant. 3.2 Program i text- och bin{r-form ----------------------------------- Ett BASIC-program kan lagras i tv} olika former, BAC-form och BAS-form, uppkallade efter de filtyper som brukar anv{ndas. BAC-form, {ven kallad bin{rform, {r en halvkompilerad form d{r alla instruktioner {r |versatta till internkoder. BAS-form inneb{r att programmet ligger som l{sbar text, precis som det ser ut vid listning. Laddar man in ett program fr}n BAS-form |vers{tts automatiskt det till internkod (BAC-form), innan det kan k|ras. Vid den |vers{ttningen utnyttjas de f|r tillf{llet aktuella instruktionstabellerna i maskinen f|r att fr}n instruktionernas textform g} till motsvarande internkod. 3.3 Konsekvenser ----------------- Program i BAC-form anv{nder de instruktioner deras internkoder symboliserar. Ett BAC-program med internkoder f|r de vanliga inbyggda DOT-instruktionerna som ger felkod 200 vid k|rning p} ABC806 eller ABC800M, kommer alltid att ge fel oavsett om DOTOPT {r inladdat eller inte. DOTOPT:s instruktioner har ju andra internkoder. Programmet g}r dock alltid att lista. Ett BAC-program med internkoder f|r DOTOPT:s instruktioner kommer enbart att fungera n{r DOTOPT {r inladdat, oavsett vilken dator man k|r p}. DOTOPT:s internkoder kan ju bara tolkas med hj{lp av DOTOPT. Dessutom kommer programmet vid listning utan DOTOPT att skriva ut de XSTM- och XFN-koder som st}r i h|gerkolumnen i tabellen ovan. Det hela l|ser sig s} fort DOTOPT laddats. Ett BAS-program fungerar alltid p} ABC800C och ABC802, men p} ABC806 och ABC800M endast n{r DOTOPT {r laddat. BAS-program g}r l}ngsammare att ladda {n BAC-program. Vid |vers{ttningen till internkod anv{nds DOTOPT:s koder om DOTOPT {r laddat, och annars de vanliga koderna. 3.4 ]tg{rder och konverteringar -------------------------------- Om ett program som anv{nder DOT-instruktionerna ska fungera p} alla dator- modellerna b|r det lagras i BAC-form med DOTOPT:s internkoder, och DOTOPT b|r laddas f|re k|rning oavsett vilken dator programmet k|rs p}. DOTOPT:s internkoder f}r man genom att ha DOTOPT inladdat n{r programmet konstrueras eller laddas in fr}n BAS-form. Om det bara g{ller att f} ett BAS-program med DOT-instruktioner att fungera p} just din maskin, beh|ver inga speciella }tg{rder vidtas p} ABC800C och ABC802, medan DOTOPT m}ste laddas f|re de aktuella programmet p} ABC806. ABC800M har inte block-grafik, men vill DOTOPT m}ste laddas f|rst om man vill kunna provk|ra programmet {nd}. Har man ett program i BAC-form som man vill kunna k|ra p} ABC806 (eller ABC800M), men som f|r n{rvarande ger felkod 200, ska man ladda in programmet (LOAD), lista det p} en fil i BAS-form, se till att man har laddat DOTOPT nu eller tidigare, ladda in BAS-formen igen, och till sist l{mpligen spara det hela i BAC-form igen, exempel: LOAD SPEL ! H{mta SPEL.BAC LIST X.BAS ! Spara i textform som X.BAS RUN DOTOPT ! Ladda in DOTOPT om det inte gjorts tidigare LOAD X.BAS ! H{mta in textformen igen SAVE SPEL ! Spara i BAC-form. Anv{nd annat namn om den ! gamla varianten ska vara kvar UNSAVE X.BAS ! Radera textformen Hela f|rfarandet g}r ut p} att f} g|ra om |vers{ttningen till internkod med r{tt interkod. Programmerar man DOT-instruktioner i ett program som inneh}ller DOTOPT:s internkoder, men nu gl|mt att ladda DOTOPT f|rst, kommer olika internkoder att blandas i programmet. L|ses p} samma s{tt som ovan. Ett program med DOTOPT:s internkoder som ska omvandlas till att anv{nda de vanliga koderna (vad det nu skulle kunna vara bra f|r?) behandlas s} h{r: RUN DOTOPT LOAD PROG LIST X.BAS Reset eller url{nkning av DOTOPT enligt beskrivning i denna manual. LOAD X.BAS SAVE PROG UNSAVE X.BAS Vid all konvertering via listning och laddning av BAS-filer, g{ller det att se till att r{tt INTEGER- eller FLOAT-l{ge anv{nds. Om det i de behandlade programmet st}r INTEGER eller FLOAT m}ste man f|re listningen skriva samma sak som kommando, s} att programmet listas p} det s{tt som antagits av programmeraren. St}r det inte INTEGER eller FLOAT i programmet ska man se till att samma l{ge anv{nds vid listning och laddning, s{rskilt om man som i ovanst}ende exempel anv{nder reset. Har man ett BAS-program, t ex fr}n klubbens kassetter, disketter eller programbank, som man |nskar k|ra p} ABC806 eller ABC800M, {r det enkla f|rfarandet: RUN DOTOPT ! Ladda DOTOPT om det inte redan gjorts LOAD PROG2.BAS ! Ladda programmet och |vers{tt till int.kod SAVE PROG2 ! Spara i BAC-form Sen ska man inte gl|mma att k|ra DOTOPT f|re varje g}ng PROG2 ska k|ras. Effekten av DOTOPT sitter kvar till n{sta reset (eller explicit url{nkning som beskrivs p} annat st{lle). 4. Start och parametrar ------------------------ DOTOPT {r ett program som vid k|rning skapar ett antal extra BASIC- instruktioner som ligger kvar i datorns minne efter att DOTOPT avslutats. Instruktionerna ligger kvar tills man }terst{ller datorn med reset eller l{nkar ur dem enligt avsnitt 5.2. 4.1 Start-syntax. ------------------ Programmet startas med RUN eller CHAIN, och n{r det k|rt klart finns de nya grafik-instruktionerna inlagda i datorns minne, redo att anv{ndas. Vid denna k|rning kan en del parametrar anges. Syntaxen {r: RUN DOTOPT(,(-)(optioner)(;programnamn)) eller CHAIN "DOTOPT(,(-)(optioner)(;programnamn))" Parenteserna omsluter h{r s}dana delar av kommandona som inte {r obligato- riska. Uttryckt i ord, kan man direkt efter programnamnet DOTOPT ange ett kommatecken, eventuellt ett bindestreck (en vanlig inledning till optio- ner) och noll, ett eller flera tecken som speciella |nskem}l (optioner). Till sist f}r ett semikolon t{tt f|ljt av {nnu ett programnamn ange att ett visst program ska startas automatiskt n{r det h{r {r klart. Eventuella parametrar till det programmet {r ocks} till}tna, om de f|reg}s av komma. 4.2 Optioner. -------------- F|ljande optionsbokst{ver finns: D - Sl} om sk{rmen till dubbel teckenbredd (40 tecken/rad). E - Sl} inte om till dubbel teckenbredd. T - "Tyst" inladdning, inget startmeddelande skrivs ut. H - Visa en kort hj{lptext. ? - Samma som H. ! - Ladda in programmet {ven om det tycker att det redan finns laddat. Anv{nds H eller "?", laddas DOTOPT inte in, s}vida inte n}gon ytterligare option anv{nds. E beh|ver inte anv{nds om man inte med ST[LLPAR {ndrat programmet s} att det annars sj{lvmant v{xlar till dubbel teckenbredd. T g{ller inte i kombination med H. Om en felaktig option anges stannar programmet med en hj{lputskrift och fel 221 (otill}tet tecken efter satsen). Om inga optioner anges, inte ens ett streck (-), {r det ST[LLPAR:s para- metrar som g{ller, annars {r det de angivna optionerna. 4.3 ST[LLPAR:s parametrar -------------------------- Inst{llningsprogrammet ST[LLPAR (b|r vara minst version 2) visar n{r det appliceras p} DOTOPT, tre fr}gor. Den f|rsta handlar om huruvida DOTOPT ska v{xla till dubbel teckenbredd utan att option D beh|ver anv{ndas. Den andra avg|r om inladdningsmeddelandet ska skrivas ut eller inte, och p} den tredje kan man ange ett program som ska startas efter DOTOPT n{r inget program explicit anges vid start av DOTOPT. Med ST[LLPAR kan man l{tt f} DOTOPT att ing} mitt i kedjan av program som autostartas vid systemstart eller reset. Det g}r {ven l{tt att l}ta en kopia av DOTOPT med n}got annat namn, f} andra parametrar om det skulle underl{tta hanteringen. Man kommer dock {ve l}ngt med att ange ytterligare programnamn i RUN- eller CHAIN-kommandot. 5. Tekniska data ----------------- Programmets maskinkod l{gger sig s} l}ngt ned det g}r i det lediga arbets- minnet utan att krocka andra program som t ex KEY. Alldeles i b|rjan av denna minnesarea lagras de f|re detta v{rdena p} Y.BOTM och STMTBA, som eventuellt kan anv{ndas f|r att senare l{nka ur programmet. 5.1 Minnes}tg}ng. Vid laddning talar DOTOPT om exakt hur mycket minne som g}r }t och hur mycket som blir kvar. P} ABC800C g}r det }t 79 bytes, och p} |vriga maski- ner 262 bytes. 5.2 Url{nkning. Om DOTOPT {r det |versta hj{lpprogram som ligger i botten av minnet och det enda eller sist laddade som inneh}ller extra BASIC-instruktioner, kan url{nkningen g|ras med f|ljande programsnutt: 1000 INTEGER : EXTEND 1010 Stmtba=65405 : Fnktba=65407 : Botm=65292 1020 L{nk=PEEK2(Stmtba) 1020 POKE Botm,PEEK(L{nk-2),PEEK(L{nk-1) ! ]terta reserverat minne 1030 POKE Stmtba,PEEK(L{nk),PEEK(L{nk+1) ! L{nka ur instruktioner 1040 L{nk=PEEK2(Fnktba) 1050 POKE Fnktba,PEEK(L{nk),PEEK(L{nk+1) ! L{nka ur funktionen DOT 5.3 Listbarhet Att programmet inte {r listbart beror inte p} illvillja, utan p} att {ven om datorn (och en del m{nniskor) luras tro att det {r ett BASIC-program, s} inneh}ller det faktiskt ingen BASIC. 6. Nyheter i version 2 ----------------------- Version 1.01 kommer fr}n 1986-10-16. Version 2.00 kommer fr}n 1986-12-16. 1. M|jligheten att ange parametrar och chainfil p} kommandoraden. 2. M|jligheten att {ndra parametrar med ST[LLPAR. 3. Klarar av ABC800C. 4. Rutinval mellan ABC802 och ABC806 g|rs direkt vid inladdningen i st{llet f|r vid exekvering av DOT-instruktioner, vilket g|r dem lite snabbare och sn}lare med minne. 5. Ny manual (den som du l{ser nu). 7. Slut -------- Rapportera eventuella fel till mig, Kristoffer Eriksson Vassv{gen 3 702 31 \rebro /Kristoffer Eriksson, ABC-klubben <5357>