1

Temat: Jak czytac klawiature w ASM?

Ja przepraszam, jesli kogos draznie, ale przeczytalem w tempie ekspresowym kurs TeBe, i jedna ksiazke o asmeblerze 6502 i zaczalem w koncu powoli kodowac ALE...

<PROWOKACJA>
TeBe skupia sie w swym kursie na jakis demach, efach, muzyczkach... Kogo to obchodzi, pytam sie? Nigdy nie rozumialem po jaka cholere ludzie pisza dema? Obejrze raz, oczy mi wyjda z orbit i jeszcze tak zostana i co? Koniec zabawy. Zamist pisac dema mozna napisac cos pozytecznego.
</PROWOKACJA>

I tu pierwsze pytanie, na ktore odpowiedzi nie znalazlem w kursie TeBe (jesli jest obiecuje odszczekac i obejrzec 10 dem pod rzad).

Jak najprosciej i najbardziej poprawnie czytac klawiature? Dajcie wskazowke bo nie chce sie na slepo zapedzic w jakis zalulek bez wyjscia i stracic 3 dni pracy.

I drugie pytanie:
Zawsze jak pracowalem z nowym mikrokontrolerem, staralem sie znalesc takie zbiorcze zestawienie wszystkich rozkazow, z czasami wykonywania, kodami, i jednozdaniowym opisem co robia i na jakie flagi wplywaja - tak zeby miescilo sie to mala czcionka na jednej stronie. Druknac sobie to mozna i miec na stale pod reka zamiast szukac po ksiazkach... Dla 6502 nie znalazem. Ma ktos cos takiego?
A jakby ktos mial jeszcze w takiej super skompresowanej formie mape waznych rejestrow Atari to bylo by zajefajnie :)
Dzieki

2

Odp: Jak czytac klawiature w ASM?

Jak najprosciej i najbardziej poprawnie czytac klawiature? Dajcie wskazowke bo nie chce sie na slepo zapedzic w jakis zalulek bez wyjscia i stracic 3 dni pracy.

Najprościej:

getchar lda $E425
        pha
        lda $E424
        pha
        rts

Wywołujesz prockę poprze JSR GETKEY i dostajesz kod ATASCII w akumulatorze. Kod otrzymujesz w ten, a nie inny sposób, ponieważ adresy w tablicy wektorów procedur obsługi urządzeń zmniejszone są o jeden, czyli świetnie nadają się do umieszczenia na stosie i wywołania przez RTS.

Gdybyś chciał odczytać łańcuch znaków, to robisz to tak:

gets ldx #$00     ; kanał #0
     lda #$05     ; rozkaz get line dla CIO
     sta $0342,x
     lda #<str    ; adres bufora na linię
     sta $0344,x
     lda #>str
     sta $0345,x
     lda #<strlen ; długość linii
     sta $0348,x
     lda #>strlen
     sta $0349,x
     jmp $E456    ; GO ;)

Kanał #0 jest zawsze otwarty dla programów i obsługuje standardową konsolę :lol: (urządzenie E: otwarte dla wejścia/wyjścia, czyli klawiatury/ekranu). Długość linii, wbrew obiekowym opiniom, lepiej podać dokładnie (niektórzy wpisują tylko starszy bajt, tak, by wartość 16-bitowa pod $0348 była różna od zera). Pozwoli to ustrzec przed modnym ostatnio błędem przepełnienia bufora. ;) W zasadzie nie ma możliwości wpisania jdnorazowo tekstu dłuższego niż 120 znaków (jedna linia logiczna - 3 linie ekranu).

Ad.2 Mógłbyś sprecyzować dokładniej. Nie bardzo łapię o co chodzi. :idea:

Zawsze mam rację, tylko nikt mnie nie słucha.

3

Odp: Jak czytac klawiature w ASM?

Ad1, Dzieki! Zaraz bede probowal. (tylko rozumiem, ze piszac "Wywołujesz prockę poprze JSR GETKEY" miales na mysli GETCHAR? ;) Sprytny wybeg z ta podmiana adresu powrotu...

Ad2. No... chodzi mi o takie przydatne jednostronicowe sciagawki: jedna z mnemonikami i jedna z mapa pamieci Atari, zebym nie musial na poczatku nauki w kolko wertowac Zientary, kursu TeBe i Tajemnic Atari :) Moze ktos sciagnal cos takiego albo sobie zrobil i sie podzieli?

4

Odp: Jak czytac klawiature w ASM?

jak masz OS wlaczony to w komorce 764 masz kod ostatnio nacisnietego znaku

a ta procka czeka na nacisniecie klawisza

read_key
 lda #$ff    ; ustawiamy na $FF
 sta 764

key
 lda 764
 cmp #$FF
 beq key
 
 cmp #kod1
 beq obsluga1
 cmp #kod2
 beq obsluga2
 cmp #kod3
 beq obsluga3
 ...
 ...
 ...


 i z procedur obslugi wracamy, np. przez

 jmp read_key

jesli OS masz wylaczony to kod znaku bedzie w $D209, ale musisz sprawdzic czy jakikolwiek klawisz zostanie nacisniety $D20F, jak przeczytasz opis tych rejestrow to zrozumiesz

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

5

Odp: Jak czytac klawiature w ASM?

Powiedz mu jeszcze przynajmniej, że ten "kod" to jest kod skaningowy klawiatury, a nie ASCII, jak u Lizarda.

KMK
? HEX$(6670358)

6

Odp: Jak czytac klawiature w ASM?

draco - oki, dzieki, misa dosc dac sygnal, misa sobie sama doszukac co i jak, bo kiedys troche programwowac Atari Basic :)
Dzieki

7

Odp: Jak czytac klawiature w ASM?

I jeszcze jedno do KBCODES (764 - $02FC). Jak już zrobisz:

lda $02FC ; 764

i zapragniesz mieć z tego ATASCII, to zrób jeszcze to:

tay       ; kod klawisza nadal w akumulatorze
lda ($79),y

Pod adresem $79 (KEYDEFP) jest adres tablicy konwersji kodów klawiatury na ASCII.

Metoda podana przez TeBe jest ok, ale nie jest tak elegancka jak moja, no i nie będziesz miał tego ładnego kliku wciśniętego klawisza. :mrgreen:

Zawsze mam rację, tylko nikt mnie nie słucha.

8

Odp: Jak czytac klawiature w ASM?

Lizard. - w Twojej procedurze pobierania linii, jak juz wywolam:

jmp $E456    ; GO ;)

to jak ja stamtad wroce? ;)

9

Odp: Jak czytac klawiature w ASM?

Nosty: Ja bym skoczył tak:

JSR $E456 - wróci samo po RTSie w tej procce

I Ty zostaniesz big endianem...

10

Odp: Jak czytac klawiature w ASM?

Masz jmp a nie jsr, więc powrót nastąpi za miejsce, w którym napiszesz jsr gets. ;)

     jsr gets
     bmi error     ; tutaj wróci jmp $E456 z GETS
     ...
gets ldx #$00     ; kanał #0
     ...
; tutaj procedurka podana wcześniej
     jmp $E456    ; GO ;) 

BMI ERROR nie wzięło się przypadkowo, bo gdy nastąpi błąd lub user wciśnie Break, to znacznik N będzie ustawiony, a rejestr Y będzie zawierał numer błędu (w przypadku uzycia klawisza Break - 128, $80). Dodatm tylko, że wszystkie systemowe numery błędów są większe od 127 (mają ustawiony najstarszy bit) i są zwracane w rejestrze Y.

Zawsze mam rację, tylko nikt mnie nie słucha.

11

Odp: Jak czytac klawiature w ASM?

Zawsze jak pracowalem z nowym mikrokontrolerem, staralem sie znalesc takie zbiorcze zestawienie wszystkich rozkazow, z czasami wykonywania, kodami, i jednozdaniowym opisem co robia i na jakie flagi wplywaja - tak zeby miescilo sie to mala czcionka na jednej stronie. Druknac sobie to mozna i miec na stale pod reka zamiast szukac po ksiazkach... Dla 6502 nie znalazem. Ma ktos cos takiego?

Znajdziesz takie zestawienia (bez czasu wykonywania rozkazow) w podreczniku uzytkownika pakietu QA. Zajrzyj tu.

12

Odp: Jak czytac klawiature w ASM?

6502 matrix

http://members.chello.nl/taf.offenga/matrix30.txt

widzialem tez kiedys taki 2-stronicowy dokument z Harwardu chyba z wszystkimi danymi o 6502, ale jakos nie moge go wygooglac.

http://www.5oft.pl/

13

Odp: Jak czytac klawiature w ASM?

ja proponuję tak: - zakładając że programujemy na Atarce i niechcemy używać procedur z OS-ROM:

lda $d20f - bit 3 skasowany, znaczy ze wciśnięto jakiś klawisz.
and #$04
eor #$04
beq *+4 - jeśli nie naciśnięto to powrót z podprocedury
clc
rts

ldy $d209 - odczytyaj kod klawisza bezpośrednio z POKEY'a
lda ($79),y - zamień kod klawiatury na kod ATASCII
sec
rts

hmmm... - użyteczne przy własnych procedurach, jeśli mam kod w pamięci RAM pod ROM'em - a ja z tego nagminnie kożystam  :D
Poza konwersją na ATASCII - chyba, że stworzymy własną tablice do konwersji.

uwaga! rejestry pokey'a pisałem z głowy - więc mogłem się pomylić.

FAQ: Cegła waży kilogram i pół cegły. Ile ważą dwie cegły ? :D

JIL 4EVER!

14

Odp: Jak czytac klawiature w ASM?

lda $d20f - bit 3 skasowany, znaczy ze wciśnięto jakiś klawisz.
and #$04
eor #$04
beq *+4 - jeśli nie naciśnięto to powrót z podprocedury

I żeś babola strzelił, bo nie bit trzeci, tylko drugi. I po co to EOR #$04? Po wciśnięciu klawisza:$D20F = $FB; potem AND #$04 i akumulator = 0; EOR #$04 sprawi, że akumulator = 4 i BEQ nie skoczy, a procka wyjdzie jakby klawisz nie był wciśnięty. Nie żebym się czepiał, ale pamiętam, że błędy w przykładach bardzo utrudniały mi kiedyś naukę asma. ;)

hmmm... - użyteczne przy własnych procedurach, jeśli mam kod w pamięci RAM pod ROM'em - a ja z tego nagminnie kożystam Very Happy

Niom, i tylko wtedy, choć jest prosty sposób na przełączanie ROMu na RAM  i z powrotem bez ryzyka padu kompa. Opis w Syzygy #7.

Generalnie jestem zwolennikiem korzystania z tego co oferuje system: ˇ po co wyważać otwarte drzwi
ˇ system zrobi to samo co my, i to bez pisania dodatkowego kodu (vide 1)
ˇ system jest sprawdzony i raczej trudno natrafić na błąd (vide 1)
ˇ system, wbrew opini Krógera, nie jest po to by go olewać, bo vide 1

Zawsze mam rację, tylko nikt mnie nie słucha.

15

Odp: Jak czytac klawiature w ASM?

po co to EOR - trudno by gadać - popatrezyłbyś na moje programy to byś wiedział: - poprostu siem rozpędziłem i napisałem z głowy - normalnie w moich programach robię tak:

...
lda $d20f
and #$0c
eor #$0c
bne *+4
clc
rts
ldy $d209
lda ($79),y
sec
rts

bit 2 = 0 - niewcisnięty klawisz, bit 3 = 0 ani SHIFT - po wykonaniu EOR - jeśli oba bitu bedą 0, to Z=0, czyli żaden klawisz (ani SHIFT) nie jest wciśnięty
a moje programy, które kożystają już z RAM'u pod ROM'em, na stałe mają go odłaczonego i koźystają z niego tylko na procedury I/O z DOS'em. Chyba zdążyłeś zauważyć - np. w GHE, że NIE MA W NIM PRZERWAŃ IRQ - WSZYSTKO CHODZI NA VBL. To dlatego niedziała u Ciebie kombinacja Shift+Control+Delete (ala łyndows :twisted:  ) - programik podpina siem pod IRQ, a GHE na stałe (oprócz operacji I/O) ma je wyłączone - coż jeszcze nieopanowałem obsługi IRQ, aby zrobić je po swojemu -czasami są zwiech, a jeszcze niewiem czemu, więc poprostu jeśli nie musze, to z nich niekożystam, a potem taki Lizard siem wkurza mu mu Ctrl+Alt+Delete nie działa  :lol:  :lol:  :lol: Natomiast pod wektorem - $79 trzymam własną tablice dla konwersji Atascii - SZCZEGÓLNIE przydało mi się to w GHE - bardzo uprościło to kod - rozpoznawania czy klawisz to funkcja czy np. litera

FAQ: Cegła waży kilogram i pół cegły. Ile ważą dwie cegły ? :D

JIL 4EVER!

16

Odp: Jak czytac klawiature w ASM?

Tia. I bardzo uprościło Tobie i wielu innym wychodzenie z programu przez JMP $E474.


Rozumiem, że Twój post, to przyzanie się, że nie potrafisz korzystać z funkcji systemu operacyjnego? :oops:

Zawsze mam rację, tylko nikt mnie nie słucha.

17

Odp: Jak czytac klawiature w ASM?

Yhh, to ja zaczynam czarno widzieć tego DOS-a...  :?

KMK
? HEX$(6670358)

18

Odp: Jak czytac klawiature w ASM?

<PROWOKACJA>
TeBe skupia sie w swym kursie na jakis demach, efach, muzyczkach... Kogo to obchodzi, pytam sie? Nigdy nie rozumialem po jaka cholere ludzie pisza dema? Obejrze raz, oczy mi wyjda z orbit i jeszcze tak zostana i co? Koniec zabawy. Zamist pisac dema mozna napisac cos pozytecznego.
</PROWOKACJA>

"JESTEM ZA A NAWET PRZECIW"

Pozdrawiam
Marcin

19

Odp: Jak czytac klawiature w ASM?

Yhh, to ja zaczynam czarno widzieć tego DOS-a...

A Ty myślisz, żę poco Casper pisze własne sterowniki do Twojego HDD? To nie będzie Dos, a dOS. :D

Zawsze mam rację, tylko nikt mnie nie słucha.

20

Odp: Jak czytac klawiature w ASM?

Denial of Service? No właśnie się tego zacząłem obawiać  :D

KMK
? HEX$(6670358)

21

Odp: Jak czytac klawiature w ASM?

Nie, by bym napisał DoS. To nie będzie podsystem obsługi dysków, ale system ładowany z dysku. Wyczuwasz, tę subtelną różnicę?

Zawsze mam rację, tylko nikt mnie nie słucha.

22

Odp: Jak czytac klawiature w ASM?

Khm, ale po co?

KMK
? HEX$(6670358)

23

Odp: Jak czytac klawiature w ASM?

Tak a propos glownego watku to sprawdzilem propozycje TeBe i Lizarda i oba mi ladnie dzialaja :D (choc choroba nie mam clicka po nacisnieciu.... badam sprawe).
Dzieki!!!

24

Odp: Jak czytac klawiature w ASM?

Wracając do tematu. Najlepsze motody opierają się na specyfikacji systemu i dlatego proponuję jeszcze jedną metodę odczytu klawiatury:

; Initialize reading
      ldx #$50    ; open IOCB for Keyboard
      lda #$03    ; IOCB open
      sta $0342,x ; ICCMD (char)
      lda #<kb.id
      sta $0344,x ; ICBUFA (ushort)
      lda #>kb.id
      sta $0345,x
      lda #$04    ; open for reading
      sta $034A,x
      jsr $E456   ; JCIOMAIN

;     ...
; some code here
;     ...

kb.id .by "K:" 0

; Keyboard reading
getc  ldx #$50
      lda #$07    ; IOCB get bytes
      sta $0342,x
      lda #$00
      sta $0348,x
      sta $0349,x
      jmp $E456

; Called by exit() function
kbcls ldx #$50
      lda #$0C    ; IOCB close
      sta #0342,x
      jmp $E456

Po wyjściu z GETC kod ATASCII znajduje się w akumulatorze.

Powyższą metodą będziemy mieli pewność, że klawiaturę poprawnie odczytamy zawsze, niezależnie od wersji systemu i jego położenia w pamięci (oczywiście pewne adresy muszą być zachowane, np. tablica skoków).

:!: Więcej :!:
:!: Jeśli ktoś przeniesie system operacyjny z Atari na Commodore, to powyższy kod ruszy bez żadnych zmian. :!:

[ Dodano: 15.11.2004 11:35:21 ]

(choc choroba nie mam clicka po nacisnieciu.... badam sprawe).

My Ci zawsze dobrze doradzimy. :) Przy mojej klik musi być!

Zawsze mam rację, tylko nikt mnie nie słucha.

25

Odp: Jak czytac klawiature w ASM?

Lizard napisał/a:

Tia. I bardzo uprościło Tobie i wielu innym wychodzenie z programu przez JMP $E474.

Hmmm... Niebyło gdzie zapamiętać stron 0 i 2. Chyba że kosztem zmniejszenia bufora na teks... Zamieżam to poprawić panowie. A skok "JMP $E474" bardzo ułatwił mi sprawe z kodem, gdyż OS-ROM załatwił za mnie wszystko :lol:  - nawet zadurzo - "CD "  :oops: - drobny efekt uboczny.

Lizard napisał/a:

Rozumiem, że Twój post, to przyzanie się, że nie potrafisz korzystać z funkcji systemu operacyjnego? "

No nie no panowie... Nikt jeszcze niewymyślił sposobu na jednoczesne uruchamianie kodu z pamięci RAM pod ROM'em i jednoczesne odwoływanie się do tablicy skoków w OS-ROM. A system wydaje mi się, że znam dość dobrze, gdyż dla własnych potyrzeb używam dużą liczbę skoków "nieudokumentowanych" lub jak woli Lizard - "nielegalnych". Coż na AtariOS/TightOS/QMEG wsio chodzi więc czemu się pierdzielić z denerwującymi procedurami systemu operacyjnego - żeby odczytać kod klawisza muszę użyć podsystemu CIO i urządzenia "K:" - dopóki jakiś klawisz niezostanie naciśnięty, to sterownik "K:" stoi w miejscu i czeka (na zmiłowanie) aż jakiś klawisz zostanie naciśnięty, a ja w tym czasie mógłbym zrobić cośinnego. więc wolę kożystać z rejestrów pokey'a lub choćby ich cieni niż z "K:". Przy wyświetlaniu tekstu używam jednak "E:".

drac030 napisał/a:

Yhh, to ja zaczynam czarno widzieć tego DOS-a...

niebędzie tak źle. System HiDOS w ogóle niebędzie kożystał z pamięci RAM pod ROM'em, więc postaram się używać wyłącznie tabeli skoków, a odczyt klawiatury poprzez rejestry POKEY'a. A jak przyjdzie mi do głowy użycie czegoś "nielegalnego", to zapytam się grzecznie na forum. Ok?

Lizard napisał/a:

A Ty myślisz, żę poco Casper pisze własne sterowniki do Twojego HDD? To nie będzie Dos, a dOS.

A choćby dla tego, że IDE BIOS (v1.0 - v1.4) nie obsługuje partycji i dysków >8GB. Jeśli więc chcemy używać większych dysków i/lub dysku slave na BIOS'ie v1.2 lub starszym, to bez sterownikia siem nieobejdzie. Choćby takiego, który wczyta zrelokowanego BIOS'a v1.4. Przecież sam system ma znieźć ograniczenia <8GB  :twisted:

nosty napisał/a:

Tak a propos glownego watku to sprawdzilem propozycje TeBe i Lizarda i oba mi ladnie dzialaja  (choc choroba nie mam clicka po nacisnieciu.... badam sprawe).
Dzieki!!!

proszę bardzo - wstaw sobie to do procki TeBe lub Lizarda - albo mojej  :lol:

...
ldx #$50
stx $d40a
stx $d01f
dex
dex
bpl *-8
...

Ps.

Lizard napisał/a:

Najprościej:

 
getchar lda $E425 
        pha 
        lda $E424 
        pha 
        rts 

:idea:  8O I TO NAPISAŁA OSOBA, KTÓRA UŻYWA TYLKO LEGALNYCH I ELEGANCKICH SKOKÓW Z TABLICY SYSTEMU OPERACYJNEGO.  :twisted:  :rolleyes:  ... no comments.....  :rolleyes:

:idea: UPROSZCZE WAM KOD WE WSZYSTKICH PODANYCH TU PRZYKŁADACH - DZIAŁA NA WSZYSTKICH QMEGACH I KLONACH ATARI OS-ROM: :twisted:  :twisted:  :twisted:



...
JSR $F302
...

JEST TO BEZPOŚREDNI SKOK DO PROCEDURY GETCHR Z SYSTEMU OPERACYJNEGO I ZAJMUJE TYLKO 3 BAJTY KODU !!!
PO POWROCIE MAMY W AKUMULATOPRZE KOD ATASCII NACIŚNIĘTEGO KLAWISZA. KLIK JEST, CHYBA ZE ZOSTANIE WYŁĄCZONY PRZEZ ODPOWIEDNIĄ WARTOŚĆ NA STRONIE 2 !!!  :P  :P  :P  8O  8O  :lol:  :lol:

FAQ: Cegła waży kilogram i pół cegły. Ile ważą dwie cegły ? :D

JIL 4EVER!