Odczyt znaku z klawiatury (GET)
From Atariki
Wersja z dnia 12:09, 10 mar 2006 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]] == |
- | <pre> | + | <code> |
- | kname .byte "K:",$9B | + | kbcodes = $02fc |
+ | ; | ||
+ | getkbc lda kbcodes | ||
+ | cmp #$ff | ||
+ | beq getkbc | ||
+ | ldx #$ff | ||
+ | stx kbcodes | ||
+ | rts | ||
+ | </code> | ||
- | cioexe sta iccmd,x | + | 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. |
- | jmp jciomain | + | |
- | getkey jsr lookup | + | == GET zwracające kod [[ATASCII]] == |
- | bmi error | + | |
- | lda #<kname | + | 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. |
- | 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 | + | === Wersja elegancka, ale długa === |
- | sta icbufl,x | + | |
- | sta icbufl+1,x | + | |
- | lda #$07 | + | |
- | jsr cioexe | + | |
- | bmi error ;np. naciśnięto Break | + | |
- | php | + | <code> |
- | pha | + | kname .byte "K:",$9B |
- | lda #$0c | + | ; |
- | jsr cioexe | + | cioexe sta iccmd,x |
- | pla | + | jmp [[Tablica skoków#JCIOMAIN|jciomain]] |
- | plp | + | ; |
- | rts | + | getkey jsr lookup |
- | + | bmi error | |
- | error ... | + | ; |
- | </pre> | + | 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 ... | ||
+ | </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 46: | 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 === |
- | <pre> | + | <code> |
- | getkey lda $e425 | + | getkey lda $e425 |
- | pha | + | pha |
- | lda $e424 | + | lda $e424 |
- | pha | + | pha |
- | rts | + | rts |
- | </pre> | + | </code> |
- | 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ć je gdzie indziej. | + | 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. | 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. | ||
[[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).