Atom Nieuws jaargang 1999 nummer 2
../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif
pagina 6

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

../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif