Knipperende cursor in ATOMVDU
door Roland Leurs
Op de vorige landdag vroeg Johan mij of het mogelijk is om op de Atom-in-PC
een knipperende cursor te krijgen in de 32*16 ATOMVDU mode. Uiteraard is
dat mogelijk.
Een knipperende cursor kan op twee manieren gerealiseerd worden:
· met interrupts
· tijdens het wachten op een toetsaanslag
Uit een vorig verhaal weten we dat interrupts mogelijk zijn, maar niet
volgens de regels geschreven software kan het systeem snel vast laten lopen.
Vandaar dat ik gekozen heb om de cursor alleen te laten knipperen op het
moment dat de Atom-in-PC op een toetsaanslag wacht.
De opzet is even eenvoudig als doeltreffend:
1. Test of een toets is ingedrukt, zo ja, handel deze af
2. Er is geen toets ingedrukt, verlaag de knipper timer
3. Is deze timer op 0 aangekomen, dan moet de cursor geïnverteerd
worden en de timer wordt opnieuw ingesteld.
Om een en ander snel uit te voeren heb ik de rdch en wrch routines uit
de console driver van EPOS/3 gebruikt en omgezet naar een aparte routine.
Het adres wordt ingesteld op regel 110. Assembleren is een kwestie van
RUN intikken en even wachten. Na het assembleren schakelt u de Atom-in-PC
naar ATOMVDU mode en roept u de routine aan met LINK #7F00 (of naar het
adres dat u ingesteld heeft in regel 110). Indien de Atom-in-PC niet in
ATOMVDU mode staat zal de routine een beep geven en verder niets initialiseren.
figuur 1: Knipperende cursor
De knipperfrequentie kunt u enigszins beïnvloeden met adres #8E.
De waarde die hier in staat wordt steeds gebruikt om de timer opnieuw in
te stellen. Hoe hoger de waarde, des te lager de knipperfrequentie.
Veel plezier ermee,
Met vriendelijke groeten uit een zonnig Born.
Roland
10 REM ATOMVDU KNIPPERENDE CURSOR
20 REM (c) Roland Leurs 1995 - 1999
30 REM Atom Terminal v3.08 of hoger vereist !
40
50 NONMI
60 PASS 2;GOSUB a
70 PASS 1;GOSUB a
80 END
90
100aASM-B
110 .CODE #7F00
120 .OPTION #80
130
140 :ZENDBYTE = #FFC8
150 :LEESBYTE = #FFC5
160 :OSBYTE = #FFC2
170
180 :SPEED = #8E
190 :TIMER = #8F
200
210 :FLASH LDA #209
\ CONTROLEER OF ATOMVDU ACTIEF IS
220
CMP @#FE \ TEST DE HOGE BYTE
230
BEQ INITFLASH \ SPRING INDIEN ATOMVDU ACTIEF
240
JSR #FD1A \ GEEF ERROR-PIEPJE
250
JMP ENDFLASH \ SPRING NAAR EINDE ROUTINE
260
270 :INITFLASH LDA @<RDCH
\ ZET NIEUWE VECTOR
280
STA #20A
290
LDA @>RDCH
300
STA #20B
310 :ENDFLASH RTS
\ EINDE ROUTINE
320
330 :RDCH CPY
@#00 \ BUFFER LEEG ?
340
BNE WAIT4KEY \ NEE, SPRING
350
STY #53 \ BEWAAR Y
360 :WAIT4KEY JSR SCAN
\ VOER KEYBOARD SCAN UIT
370
CMP @#00 \ TOETS GEDRUKT ?
380
BNE KEYPRESS \ SPRING ALS TOETS GEDRUKT IS
390
DEC TIMER \ VERLAAG TIMER
400
BNE NOFLASH \ SPRING INDIEN NOG NIET 0
410
TYA \ Y REGISTER
NAAR ACCU
420
PHA \ SAVE
ACCU (= Y REGISTER)
430
LDY #E0 \ LAADCURSORPOSITIE OP REGEL
440
LDA (#DE),Y \ LAADT CURSOR
450
EOR @#80 \ INVERTEER CURSOR
460
STA (#DE),Y \ SCHRIJF GEINVERTEERDE CURSOR TERUG
470
JSR #FE66 \ EFFE WACHTEN
480
JSR #FE66 \ EFFE WACHTEN
490
PLA \ LEES
Y REGISTER VAN STACK
500
TAY \ HERSTEL
Y REGISTER
510
LDA SPEED \ LAADT KNIPPERSNELHEID
520
STA TIMER \ ZET TIMER
530 :NOFLASH JMP WAIT4KEY
\ OPNIEUW SCANNEN
540 :KEYPRESS PHA
\ SAVE TOETSCODE
550
TYA \ Y REGISTER
NAAR ACCU
560
PHA \ SAVE
ACCU (= Y REGISTER)
570
LDY #E0 \ LAADCURSORPOSITIE OP REGEL
580
LDA (#DE),Y \ LAADT SCHERMINHOUD
590
ORA @#80 \ MASKEER HOGE BIT
600
STA (#DE),Y \ SCHRIJF CORRECTE CURSOR TERUG
610
PLA \ LEES
Y REGISTER VAN STACK
620
TAY \ HERSTEL
Y REGISTER
630
PLA \ HERSTEL
TOETSCODE
640
CMP @#7F \ TEST OP BACKSPACE
650
BEQ RDCH_BS \ SPRING INDIEN BACKSPACE
660
CMP @#20 \ TEST OP SPATIE OF KARAKTER
670
BCS RDCH_AS \ SPRING INDIEN KARAKTER
680
CMP @#1B \ TEST OP ESCAPE
690
BEQ RDCH_ESC \ SPRING INDIEN ESCAPE
700
CMP @#0D \ TEST OP ENTER
710
BEQ RDCH_END \ SPRING INDIEN ENTER
720
JSR #FFF4 \ HET IS EEN CONTROL CODE, VOER DEZE
UIT
730
JMP WAIT4KEY \ GA SCANNEN VOOR VOLGENDE TOETS
740
750 :RDCH_AS CPY @#80
\ KONTROLEER BUFFER LENGTE
760
BCS RDCH_END \ SPRING INDIEN BUFFER VOL
770
INC #52 \ VERHOOG BUFFER TELLER
780
RTS \ EINDE
RDCH - karakter ingevoerd
790
800 :RDCH_BS CPY @#00
\ TEST OP LEGE BUFFER
810
BEQ RDCH_END \ SPRING BIJ LEGE BUFFER
820
CPY @#81 \ TEST OP VOLLE BUFFER
830
BCS RDCH_END \ SPRING INDIEN MEER DAN VOL (?)
840
DEC #52 \ VERLAAG BUFFER TELLER
850
RTS \ EINDE
RDCH - backspace ingevoerd
860
870 :RDCH_ESC LDY #53
\ HAAL Y-WAARDE TERUG
880
BEQ RDCH_ESC1 \ SPRING INDIEN 0
890
LDY @#40 \ LAADT Y MET #40 (?)
900 :RDCH_ESC1 STY #52
\ ZET ALS BUFFER POINTER
910 :RDCH_END RTS
\ EINDE RDCH
920
930 \ *****************************************************************
940 \ Keyboard scan routine
950 \ Uitvoer: Accu = ascii waarde (00 -> geen toets gedrukt)
960 \ *****************************************************************
970
980 :SCAN PHP
\ BEWAAR PROCESSOR STATUS
990
STX #E4 \ BEWAAR GEBRUIKTE REGISTERS
1000
STY #E5
1010 :SCAN1 LDA @#0B
\ ZET SEMAFOOR
1020
JSR OSBYTE
1030
BCC SCAN1 \ SPRING INDIEN TOEGANG GEWIJGERD
1040
LDX @#00 \ DEFAULT ASCII WAARDE
1050
LDA @#00 \ GEEF SCAN COMMANDO #5D AAN PC
1060
JSR ZENDBYTE
1070
LDA @#5D
1080
JSR ZENDBYTE
1090
JSR LEESBYTE \ LEES KEYBOARD STATUS BYTE VAN PC
1100
LSR A \ TEST OF TOETS INGEDRUKT
IS
1110
BCC ENDSCAN \ GEEN TOETS GEDRUKT, BEEINDIG ROUTINE
1120
JSR LEESBYTE \ LEES ASCII WAARDE VAN INGEDRUKTE TOETS
1130
TAX \ ZET IN
X-REGISTER
1140
JSR LEESBYTE \ LEES SCAN CODE VAN INGEDRUKTE TOETS
1150
TAY \ ZET IN
Y-REGISTER
1160
CPY @#0F \ SPECIALE TOETSEN AFHANDELEN
1170
BNE TEST_BS \ SPRING ALS GEEN COPY TOETS (tab)
1180
LDA @#00 \ PC-COM #02: LEES TEKEN OP CURSOR
POS
1190
JSR ZENDBYTE
1200
LDA @#02
1210
JSR ZENDBYTE
1220
JSR LEESBYTE \ LEES ASCII WAARDE OP CURSOR POSITIE
1230
TAX \ ZET DEZE
WAARDE IN X-REGISTER
1240
JMP ENDSCAN \ GA NAAR EINDE SCAN ROUTINE
1250 :TEST_BS CPY @#0E
\ TEST OP BACKSPACE TOETS
1260
BNE TST_CUR_U \ SPRING INDIEN GEEN BACKSPACE
1270
LDX @#7F \ LAADT CODE VOOR DELETE
1280
BNE ENDSCAN \ NAAR EINDE SCAN ROUTINE
1290 :TST_CUR_U CPX @#00
\ TEST OP EXTENDED CODE
1300
BNE ENDSCAN \ SPRING ALS NORMALE TOETS GEDRUKT IS
1310
CPY @#48
1320
BNE TST_CUR_L \ SPRING INDIEN GEEN CURSOR UP
1330
LDX @#0B \ LAADT ASCII WAARDE VOOR OMHOOG
1340
BNE ENDSCAN \ NAAR EINDE SCAN ROUTINE
1350 :TST_CUR_L CPY @#4B
1360
BNE TST_CUR_R \ SPRING INDIEN GEEN CURSOR LEFT
1370
LDX @#08 \ LAADT ASCII WAARDE VOOR LINKS
1380
BNE ENDSCAN \ NAAR EINDE SCAN ROUTINE
1390 :TST_CUR_R CPY @#4D
1400
BNE TST_CUR_D \ SPRING INDIEN GEEN CURSOR RIGHT
1410
LDX @#09 \ LAADT ASCII WAARDE VOOR RECHTS
1420
BNE ENDSCAN \ NAAR EINDE SCAN ROUTINE
1430 :TST_CUR_D CPY @#50
1440
BNE ENDSCAN \ SPRING INDIEN GEEN CURSOR DOWN
1450
LDX @#0A \ LAADT ASCII WAARDE VOOR OMLAAG
1460 :ENDSCAN LDA @#0A
\ WIS SEMAFOOR
1470
JSR OSBYTE
1480
TXA \ ZET ASCII
WAARDE IN ACCU
1490
LDX #E4 \ HERSTEL X EN Y REGISTER
1500
LDY #E5
1510
PLP \ HERSTEL
PROCESSOR STATUS
1520
RTS \ EINDE
ROUTINE
1530
1540 .END
1550 RETURN
|