Odczyt znaku z klawiatury (GET): Różnice pomiędzy wersjami

Z Atariki
Przejdź do nawigacji Przejdź do wyszukiwania
Nie podano opisu zmian
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 29 sie 2009, 18:43

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  ...

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.