Odczyt znaku z klawiatury (GET)

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 09:52, 17 wrz 2022
Jhusak (Dyskusja | wkład)
(dodany przykład)
← Previous diff
Aktualna wersja
Jhusak (Dyskusja | wkład)
(Wersja najkrótsza, zależna od SO, do ograniczonego zastosowania)
Linia 86: Linia 86:
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 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)+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> <code>
 +
lda CH lda CH
cmp #255 cmp #255
beq skip beq skip
jsr $f2fd jsr $f2fd
-skip+ skip
 + 
</code> </code>
Linia 108: Linia 110:
<code> <code>
org $2800 org $2800
-start+ start
jsr $f2fd jsr $f2fd
jsr $f2b0 jsr $f2b0
jmp start jmp start
</code> </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