Odczyt znaku z klawiatury (GET)

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 16:43, 29 sie 2009
KMK (Dyskusja | wkład)

← Previous diff
Aktualna wersja
Jhusak (Dyskusja | wkład)
(Wersja najkrótsza, zależna od SO, do ograniczonego zastosowania)
Linia 1: Linia 1:
-Procedura czeka, aż użytkownik naciśnie jakiś klawisz na klawiaturze, po czym zwraca odpowiedni kod [[ATASCII]] w akumulatorze.+Procedura czeka, aż użytkownik naciśnie jakiś klawisz na klawiaturze, po czym zwraca odpowiedni kod w akumulatorze.
-== Wersja elegancka, ale długa ==+== GET zwracające [[Kody klawiszy|kod klawiatury]] ==
 + 
 +<code>
 + kbcodes = $02fc
 + ;
 + getkbc lda kbcodes
 + cmp #$ff
 + beq getkbc
 + ldx #$ff
 + stx kbcodes
 + rts
 +</code>
 + 
 +Zaletą użycia <code>KBCODES</code> jest łatwość monitorowania stanu tej zmiennej bez konieczności czekania na naciśnięcie klawisza przez użytkownika (patrz niżej). Kod ATASCII można tu uzyskać przez kombinację obu sposobów, tzn. wywołanie <code>getkey</code> wtedy, kiedy <code>KBCODES</code> zasygnalizuje naciśnięcie klawisza. Oszczędza to kłopotu z użyciem wektora tablicy definicji klawiatury, który w nowszych wersjach OS istnieje, a w starszych nie.
 + 
 +== GET zwracające kod [[ATASCII]] ==
 + 
 +Obie poniższe procedury wywołują tę samą funkcję OS. Jej - czasem niepożądaną - cechą jest to, że wstrzymuje wykonywanie programu aż do naciśnięcia klawisza przez użytkownika.
 + 
 +=== Wersja elegancka, ale długa ===
<code> <code>
Linia 38: Linia 57:
; ;
error ... error ...
-</pre>+</code>
Procedura '''lookup''' jest do znalezienia [[Programowanie: Jak wyszukać pierwszy wolny IOCB|tutaj]]. Reszta to etykiety systemowe. Procedura '''lookup''' jest do znalezienia [[Programowanie: Jak wyszukać pierwszy wolny IOCB|tutaj]]. Reszta to etykiety systemowe.
Linia 44: Linia 63:
Zaletą takiego sposobu odczytywania danych z klawiatury jest zgodność z każdym rodzajem klawiatury, byleby tylko był zainstalowany w systemie właściwy dlań sterownik "K:". Zaletą takiego sposobu odczytywania danych z klawiatury jest zgodność z każdym rodzajem klawiatury, byleby tylko był zainstalowany w systemie właściwy dlań sterownik "K:".
-== Wersja krótka, ale nieelegancka ==+=== Wersja krótka, ale nieelegancka ===
<code> <code>
Linia 59: Linia 78:
[[Kategoria:Niezbędnik kodera]] [[Kategoria:Niezbędnik kodera]]
 +
 +=== Wersja najkrótsza, zależna od SO, do ograniczonego zastosowania ===
 +
 +<code>
 + jsr $f2fd
 +</code>
 +
 +Funkcja ta zwraca kod ATASCII w akumulatorze. Zastosowanie tej funkcji ogranicza się do szybkich programików, wprawek, tam, gdzie liczy się ilość kodu.
 +Funkcja ta czeka na znak. Jeśli nie chcemy, aby funkcja nie czekała na znak, tylko zwracała go wyłącznie jeśli został naciśnięty, to musimy skorzystać z rejestru CH (764, $2fc)
 +
 +<code>
 +
 + lda CH
 + cmp #255
 + beq skip
 + jsr $f2fd
 + skip
 +
 +</code>
 +
 +Może być stosowana w parze z
 +
 +<code>
 + jsr $f2b0
 +</code>
 +
 +która służy do wypisania znaku z akumulatora na ekran.
 +
 +A oto najkrótszy edytor ekranowy (MEMO PAD)
 +
 +<code>
 + org $2800
 + start
 + jsr $f2fd
 + jsr $f2b0
 + jmp start
 +</code>
 +
 +Metoda ta jest hackerska, używanie jej w dzisiejszych progamach to proszenie się o kłopoty (głównie u innych użytkowników).

Aktualna wersja

Procedura czeka, aż użytkownik naciśnie jakiś klawisz na klawiaturze, po czym zwraca odpowiedni kod w akumulatorze.

Spis treści

GET zwracające kod klawiatury

kbcodes = $02fc
;
getkbc lda kbcodes
       cmp #$ff
       beq getkbc
       ldx #$ff
       stx kbcodes
       rts

Zaletą użycia KBCODES jest łatwość monitorowania stanu tej zmiennej bez konieczności czekania na naciśnięcie klawisza przez użytkownika (patrz niżej). Kod ATASCII można tu uzyskać przez kombinację obu sposobów, tzn. wywołanie getkey wtedy, kiedy KBCODES zasygnalizuje naciśnięcie klawisza. Oszczędza to kłopotu z użyciem wektora tablicy definicji klawiatury, który w nowszych wersjach OS istnieje, a w starszych nie.

GET zwracające kod ATASCII

Obie poniższe procedury wywołują tę samą funkcję OS. Jej - czasem niepożądaną - cechą jest to, że wstrzymuje wykonywanie programu aż do naciśnięcia klawisza przez użytkownika.

Wersja elegancka, ale długa

kname .byte "K:",$9B
;
cioexe sta iccmd,x
       jmp jciomain
;
getkey jsr lookup
       bmi error
;
       lda #<kname
       sta icbufa,x
       lda #>kname
       sta icbufa+1,x
       lda #$04
       sta icax1,x
       lda #$00
       sta icax2,x
       lda #$03
       jsr cioexe
       bmi error            ;w dobrze zdebugowanym programie raczej nie wystąpi tu błąd
;
       lda #$00
       sta icbufl,x
       sta icbufl+1,x
       lda #$07
       jsr cioexe
       bmi error             ;np. naciśnięto Break
;
       pha
       lda #$0c
       jsr cioexe
       pla
       rts
;
error  ...

Procedura lookup jest do znalezienia tutaj. Reszta to etykiety systemowe.

Zaletą takiego sposobu odczytywania danych z klawiatury jest zgodność z każdym rodzajem klawiatury, byleby tylko był zainstalowany w systemie właściwy dlań sterownik "K:".

Wersja krótka, ale nieelegancka

getkey lda $e425
       pha
       lda $e424
       pha
       rts

Zaletą tego sposobu jest to, że procedura zajmuje tylko 9 bajtów; powinna też zawsze działać, gdyż korzysta z umieszczonego w ROM-ie wektora wskazującego procedurę odczytu bajtu z klawiatury, z którego to wektora korzysta też CIO. Niemniej jest to "półlegalna" metoda wywoływania systemu operacyjnego: te wektory nie są przeznaczone dla programów użytkownika, a to, że w każdej wersji OS-u są w tym samym miejscu wynika po prostu z faktu, że nie ma szczególnego powodu przenosić ich gdzie indziej.

Wadą tej metody jest to, że omija ona tablicę urządzeń HATABS - a więc ewentualny handler zainstalowany przez użytkownika nie zostanie wywołany.

Wersja najkrótsza, zależna od SO, do ograniczonego zastosowania

       jsr $f2fd

Funkcja ta zwraca kod ATASCII w akumulatorze. Zastosowanie tej funkcji ogranicza się do szybkich programików, wprawek, tam, gdzie liczy się ilość kodu. Funkcja ta czeka na znak. Jeśli nie chcemy, aby funkcja nie czekała na znak, tylko zwracała go wyłącznie jeśli został naciśnięty, to musimy skorzystać z rejestru CH (764, $2fc)

       lda CH
       cmp #255
       beq skip
       jsr $f2fd
skip

Może być stosowana w parze z

       jsr $f2b0

która służy do wypisania znaku z akumulatora na ekran.

A oto najkrótszy edytor ekranowy (MEMO PAD)

       org $2800
start
       jsr $f2fd
       jsr $f2b0
       jmp start

Metoda ta jest hackerska, używanie jej w dzisiejszych progamach to proszenie się o kłopoty (głównie u innych użytkowników).

Personal tools