Patric Ljung
<5455>
· Text 853 · w6 · kommentar
1985-07-06 11:39
Ärende: Vad är klockan ???
En del info:
Systemvariablerna LU.POS KBFLAG,KBCHAR är samma på ABC806,802,800
Det bästa sättet är att använda CRTC-kretsen (som normalt görs).
Jag har redan tidigare skrivit en artikel om hur denna fungerar (till
en del) men det tycktes visst vara svårförståelig.
Som kanske de flesta vet består ju en teckencell av ett visst antal linjer.
Närmare bestämt 10 stycken. Man kan då bestämma mellan vilka rader markören
skall befinna sig. Om vi säger att markören skall vara en linje tjock
och befinna sig på rad nummer 9 (1-10), det blir 8 (0-9). Då gör man
följande:
OUT 56,10,57,Startrad,56,11,57,Slutrad där Startrad=Slutrad=8
Detta ger en fast markör. Men nu vill vi även bestämma om markören över-
huvudtaget skall synas på skärmen samt vilken hastighet den skall ha.
Man kan nämligen välja mellan två hastigheter. Dett gör vi genom att
addera Markördata till Startrad.
Nu fungerar det så här att:
Markördata = 0 Fast cursor
= 32 Cursor non-display
= 64 Blink-cursor, 1/16 field Rate
= 64+32 Blink, 1/32 Field Rate
Var någonstans skall vi placera cursorn?
Om markören skall befinna sig på position Rad,Kolumn blir dess adress
Curadr = 30720 + Rad * 80 + Kolumn, Såvida vi inte har 'ABC80'-bildminne
Tyvärr vet jag inte hur bildminnet ser ut i ABC800C. Men om det fungerar
som ABC80ians överlåter jag detta till någon annan.
Det som sedan måste göra är att CRTC-kretsen måste få reda på vilken
adress cursorn har. Och det får den reda på genom:
OUT 56,14,57,SWAP%(Curadr),56,15,57,Curadr
Om man då vill tända cursorn på den position den är ämnad till, dvs på
den position som CUR(R,K) har bestämt finns informationen Rad,Kolumn
i adresserna: Rad=PEEK(65363) och Kolumn=PEEK(65362)
För att då i FNGet¤ placera ut cursorn skall man tända och placera ut
cursorn med den adress som finns i LU.POS dvs 65362,65363 INNAN man skriver
något annat på skärmen.
DEF FNGet¤
Curadr=30720+PEEK(65363)*80+PEEK(65362)
OUT 56,14,57,SWAP%(Curadr),56,15,57,Curadr
OUT 56,10,57,Startrad+Markördata,56,11,57,Slutrad
! Sedan är det inmatnings frågan.
Det mest tilltalande är en WHILE-loop
SYS(5) eller PEEK(65506) är tangentbordsflaggan som laddas med 128 när
en tangent trycks ner (eller efter en stund vid repetering). Detta inne-
bär att loopen skall fortgå så länge som SYS(5) eller PEEK(65506) är
noll. Det bästa är att använda SYS(5) då någon får för sig att kanske
flytta KEYFLG till en annan adress.
Det finns överlag tre sätt att läsa det sist inmatade tecknet.
Char=INP(34), Char=PEEK(65507) samt GET Char¤.
Men efter som vi nu skall simulera GET som släcker cursorn efter att
man matat in ett tecken så bör vi även i FNGet¤ släcka cursorn. Dessutom
måste vi nollställa tangentbords flaggan, eftersom vi redan har läst
tecknet. För att slippa göra detta själv kan det passa bra att läsa tecknet
med GET, som då nollställer flaggan och släcker cursorn. Eftersom vi
redan vet att en tangent redan är nertryckt kan vi lungt göra GET utan
att behöva oroa oss för att 'fastna'.
Rutinen för att samtidigt skriva ut tiden och vänta på tecken samt att
läsa det blir således:
WHILE SYS(5)=0
; CUR(Trad,Tkol) TIME¤;
WEND
GET Char¤
Här är Trad och Tkol klockans position på skärmen. Det är att föredra
att dessa variabler inte är lokala (LOCAl Trad,Tkol) för att slippa skicka
med dessa som argument varje gång. Eftersom klockan troligtvis skall
hålla sig på sin tilldelade plats går det utmärkt att tilldela dessa
i början av program, typ #define TRAD 0 i C.
Då kan man väl nästan plita ihop den slutgiltliga rutinen.
DEF FNGet¤ LOCAL Char¤=1,Curadr
Curadr=30720+PEEK(65363)*80+PEEK(65362)
OUT 56,14,57,SWAP%(Curadr),5,15,57,Curadr
OUT 56,10,57,104,56,11,57,8
WHILE SYS(5)=0
; CUR(Trad,Tkol) TIME¤;
WEND
GET Char¤