Odczyt znaku z klawiatury (GET)
From Atariki
| Wersja z dnia 16:39, 29 sie 2009 KMK (Dyskusja | wkład) (Programowanie: Odczyt znaku z klawiatury moved to Odczyt znaku z klawiatury (GET)) ← Previous diff |
Wersja z dnia 16:43, 29 sie 2009 KMK (Dyskusja | wkład) Next diff → |
||
| Linia 3: | Linia 3: | ||
| == Wersja elegancka, ale długa == | == Wersja elegancka, ale długa == | ||
| - | <pre> | + | <code> |
| - | kname .byte "K:",$9B | + | kname .byte "K:",$9B |
| - | + | ; | |
| - | cioexe sta iccmd,x | + | cioexe sta iccmd,x |
| - | jmp jciomain | + | jmp [[Tablica skoków#JCIOMAIN|jciomain]] |
| - | + | ; | |
| - | getkey jsr lookup | + | getkey jsr lookup |
| - | bmi error | + | bmi error |
| - | + | ; | |
| - | lda #<kname | + | lda #<kname |
| - | sta icbufa,x | + | sta icbufa,x |
| - | lda #>kname | + | lda #>kname |
| - | sta icbufa+1,x | + | sta icbufa+1,x |
| - | lda #$04 | + | lda #$04 |
| - | sta icax1,x | + | sta icax1,x |
| - | lda #$00 | + | lda #$00 |
| - | sta icax2,x | + | sta icax2,x |
| - | lda #$03 | + | lda #$03 |
| - | jsr cioexe | + | jsr cioexe |
| - | bmi error ;w dobrze zdebugowanym programie raczej nie wystąpi tu błąd | + | bmi error ;w dobrze zdebugowanym programie raczej nie wystąpi tu błąd |
| - | + | ; | |
| - | lda #$00 | + | lda #$00 |
| - | sta icbufl,x | + | sta icbufl,x |
| - | sta icbufl+1,x | + | sta icbufl+1,x |
| - | lda #$07 | + | lda #$07 |
| - | jsr cioexe | + | jsr cioexe |
| - | bmi error ;np. naciśnięto Break | + | bmi error ;np. naciśnięto Break |
| - | + | ; | |
| - | pha | + | pha |
| - | lda #$0c | + | lda #$0c |
| - | jsr cioexe | + | jsr cioexe |
| - | pla | + | pla |
| - | rts | + | rts |
| - | + | ; | |
| - | error ... | + | error ... |
| </pre> | </pre> | ||
| Linia 46: | Linia 46: | ||
| == 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ć ich 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. | ||
Wersja z dnia 16:43, 29 sie 2009
Procedura czeka, aż użytkownik naciśnie jakiś klawisz na klawiaturze, po czym zwraca odpowiedni kod ATASCII w akumulatorze.
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 ...
</pre>
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
<code>
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.
