Odczyt znaku z klawiatury (GET)

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
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.

Personal tools