Strona 1 z 1

Joystick Fire vs Spacja

: 24 lis 2012, 22:00
autor: DJ Gruby
Jak odróżnić naciśnięcie FIRE w joysticku podpiętym do portu #1 od naciśnięcia spacji na klawiaturze?

Kod: Zaznacz cały

                lda #$7f
                sta $dc00
                lda $dc01
                and #$10
                bne *+5
                jmp spacebar_pressed
Przykładowy kod reaguje zarówno na jedno jak i na drugie, a ja potrzebuje, żeby reagował wyłącznie na naciśnięcie spacji (FIRE w joysticku ma służyć do innych funkcji). Jeśli ktoś może coś poradzić, z góry dziękuję za pomoc!

: 24 lis 2012, 23:02
autor: Sebaloz/Lepsi.De
Proponuje przez sekunde czytac dc01 i zapamietac wartosci. Jesli wystapilo tylko #$10 i nie wystapil ruch joystickiem w jakas strone to raczej nacisnal spacje a nie fire.

: 25 lis 2012, 20:04
autor: skull
sprawdzaj stan portu $dc01 po #$7f->dc00 i $ff->dc00

joy zawsze dziala

: 25 lis 2012, 22:04
autor: DJ Gruby
skull pisze:sprawdzaj stan portu $dc01 po #$7f->dc00 i $ff->dc00

joy zawsze dziala
Nie rozumiem zdania? Możesz wytłumaczyć? :D

: 26 lis 2012, 08:22
autor: skull
po zablokowaniu wszystkich linii matrycy klawiatury, czyli:

lda #$FF
sta $dc00

spacja nie będzie odczytywana (brak zmian na porcie $dc01) - za to wychylenia joyistcków nadal zmieniają stan portu $dc01.

a więc

lda #$ff
sta $dc00
lda #$10
and $dc01
beq JoyPort1Fire
ldx #$7f
stx $dc00
and $dc01
beq SPACE

: 26 lis 2012, 21:52
autor: DJ Gruby
Dokładnie tak wygląda mój kod. Mimo to, przycisk FIRE odczytywany jest jako wciśnięcie spacji. Czy jest możliwe, że to problem tylko na emulatorze?

: 26 lis 2012, 22:13
autor: DJ Gruby
Okej, problem rozwiązałem w następujący sposób... Utworzyłem dodatkową zmienną, która zlicza ilość cykli, przez które wciśnięta jest spacja. Przed rozpoczęciem pętli, która oczekuje na wciśnięcie tego klawisza bądź też przycisku FIRE, zeruje wspomniany licznik i zwiększam go każdorazowo po wejściu do procedury SPACE. Ta procedura z kolei weryfikuje stan licznika i skacze do faktycznej procedury obsługi spacji dopiero, gdy licznik zliczy do 2, a zatem mając już niemal całkowitą pewność, że zanim odczyt zostanie potwierdzony jako wciśnięcie spacji, zweryfikujemy najpierw raz jeszcze stan joysticka. Czyli w skrócie:

Kod: Zaznacz cały

                lda #$00
                sta space_counter

loop            lda #$ff 
                sta $dc00 
                lda #$10 
                and $dc01 
                beq JoyPort1Fire 
                ldx #$7f 
                stx $dc00 
                and $dc01 
                beq SPACE
                lda #$00
                sta space_counter
                jmp loop

SPACE           inc space_counter
                lda space_counter
                cmp #$02
                bne *+5
                jmp SPACE_FOR_REAL
                jmp wait_for_user_action
Co myślisz o takim rozwiązaniu? Dla mnie oczywiście najważniejsze jest, że działa... :)

: 27 lis 2012, 08:40
autor: skull
a więc sprawdziłem teraz procedurkę - rzeczywiście, masz rację "przycisk FIRE odczytywany jest jako wciśnięcie spacji. Czy jest możliwe, że to problem tylko na emulatorze?" tyle że trzeba dodać że CZASEM.

No nie ma co ukrywać że priorytety w portach mają Joye - nie ma jak ich maskować - to właśnie w tym tkwi problem,
poprzednia procedura jest ok (emulator też), ale wszystko zależy w którym momencie naciśniemy przycisk fire:



lda #$ff
sta $dc00
lda #$10
and $dc01
beq JoyPort1Fire
ldx #$7f
stx $dc00 ;<- jeśli trafimy od tego miejsca w dół - to na nic blokowanie linii dla spacji
and $dc01
beq SPACE


ponieważ jest to krótka pętla, więc zdarzenie takie jest całkiem częste.
I wtedy wykona RAZ kod dla spacji a dopiero potem Joy-a (przy spacji problem nie istnieje, przez blokadę portu)
Rozwiązaniem jest sprawdzenie jeszcze raz po sprawdzeniu SPACJI przycisku JOY-a (czyli zblokowanie klawiatury) . I to właśnie akurat realizujesz w swojej procedurce (chociaż nie potrzeba licznika).

: 27 lis 2012, 22:36
autor: DJ Gruby
Dzięki. A zatem wszystko wyjaśnione. Myślę, że temat do zamknięcia i do zarchiwizowania dla potomnych...?