Joystick Fire vs Spacja

Szukasz drobnej pomocy przy kodowaniu, albo chcesz przedstawić światu swoją gotową lub w trakcie realizacji produkcję? To właściwy dział.
Wiadomość
Autor
DJ Gruby

Joystick Fire vs Spacja

#1 Post 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!

Awatar użytkownika
Sebaloz/Lepsi.De
Posty: 3962
Rejestracja: 14 wrz 2008, 00:02

#2 Post 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.
__________________________
Socjopatyczna Legia Commodore

Awatar użytkownika
skull
Posty: 760
Rejestracja: 15 wrz 2008, 08:18
Grupa: samar

#3 Post autor: skull »

sprawdzaj stan portu $dc01 po #$7f->dc00 i $ff->dc00

joy zawsze dziala
Bo pecet to zwykły banan...

DJ Gruby

#4 Post 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

Awatar użytkownika
skull
Posty: 760
Rejestracja: 15 wrz 2008, 08:18
Grupa: samar

#5 Post 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
Bo pecet to zwykły banan...

DJ Gruby

#6 Post 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?

DJ Gruby

#7 Post 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... :)

Awatar użytkownika
skull
Posty: 760
Rejestracja: 15 wrz 2008, 08:18
Grupa: samar

#8 Post 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).
Bo pecet to zwykły banan...

DJ Gruby

#9 Post autor: DJ Gruby »

Dzięki. A zatem wszystko wyjaśnione. Myślę, że temat do zamknięcia i do zarchiwizowania dla potomnych...?

ODPOWIEDZ