kategoria: AMOS
[#1] Drugi fire joystik amos
Hej czy moze ktos wie jak obsłużyć drugi fire w joystiku w amosie? Czy to jest mozliwe? Przegladam ksiazki i net i nie moge nic znalezc.
[#2] Re: Drugi fire joystik amos

@marggines, post #1

moze jest jakies rozszerzenie do Amosa ale w podstawowej wersji AmosPro nie mozna.
[#3] Re: Drugi fire joystik amos

@selur, post #2

Na pewno jest.
Na aminecie znalazłem rozszerzenia na 3 i 4 joy (na lpt) oraz obsługę padów z CD32
[#4] Re: Drugi fire joystik amos

@marggines, post #1

mozesz sobie zerknac jak sie zmieniaja komorki pamieci i według tego ustawic reakcje w programie czy grze. Peek/poke/leek/doke/deek i inne ciekawostki.
1
[#5] Re: Drugi fire joystik amos

@Stoopi, post #4

zeby zerkac musisz znac funkcje i adres tej komorki :)
1
[#6] Re: Drugi fire joystik amos

@selur, post #5

Owszem.
[#7] Re: Drugi fire joystik amos

@marggines, post #1

A dasz radę przewalić z asm na Amos ?

Bo to kwestia dwóch rejestrów. POTGO ($dff034) i POTGOR (POTINP) ($dff016).
[#8] Re: Drugi fire joystik amos

@asman, post #7

A nie wystarczy POKE ?
https://www.ultimateamiga.co.uk/HostedProjects/AMOSFactory/AMOSProManual/14/1403.html


Ostatnia aktualizacja: 15.11.2024 11:31:47 przez Norbert
[#9] Re: Drugi fire joystik amos

@Norbert, post #8

Tak jak była już mowa w wątku, jest też dostępne gotowe rozszerzenie do AMOSa, które obsługuje drugi przycisk joysticka i wiele więcej (joystick analogowy, game-pad, joysticki na port równoległy).

http://aminet.net/package/dev/amos/Ercole_ext

Ostatnia aktualizacja: 15.11.2024 12:07:23 przez Hexmage960
1
[#10] Re: Drugi fire joystik amos

@Norbert, post #8

Dzięki Norbert,

Najpierw założenia, niestety to jest ważne. Przyjmujemy że odczyt drugiego przycisku będzie wykonywany raz na ramkę, oczywiście można szybciej, niemniej trzeba zachować pewien określony czas pomiędzy odczytami. Nie pamiętam dokładnie ile to czasu. Trzeba by we własnym zakresie doczytać.
1. Gdzieś przd pętlą sprawdzająca drugi przycisk robimy coś takiego.

move.w #$ff00,$dff034

Co ma odbicie w Amosie na takie cudo.
DOKE $dff0034,$ff00
secondButton = 0


2. Potem w pętli gdzie ma być sprawdzanie przycisku.
btst #6,$dff016
bne .1
st secondButton
.1 
move.w #$c000,$dff034

Co na Amos
' czekanie na ramke

 val = Peek($dff0016) and 64
 if (val = 0) then secondButton = 1
 Doke($dff034, $c000)


Nie wiem czy ten kod Amosa jest poprawny bo nie pamiętam dokładnie, trzeba by sprawdzić i ewentualnie poprawić. Bo ja przyjąłem że rezultatem val mogą być wtedy dwie wartości. 0 albo 64.
[#11] Re: Drugi fire joystik amos

@asman, post #10

Jak dobrze pamiętam w Amosie istnieje funkcja VAL, króra zamienia zmienną tekstową na liczbową, więc potrzeba wprowadzić inną nazwę dla tej zmiennej. Reszta będzie prawidłowa moim zdaniem.
1
[#12] Re: Drugi fire joystik amos

@tukinem, post #11

Dzięki.
[#13] Re: Drugi fire joystik amos

@asman, post #10

tak bedzie poprawnie

war=Peek($dff0016) and 64
if war=0 then secondbuton=1
Doke $dff034,$c000
2
[#14] Re: Drugi fire joystik amos

@asman, post #10

Przyjrzałem się temu dokładniej i to nie działa.

Porównałem z wątkiem z EAB i tu bardzo pomogłeś mi tym: MOVE.w #$ff00,$dff034.

Napisałem dla obu portów joysticka i to działa w Amosie oraz odpowiedniu w BB. Dla portu 1 sprawdzam bit 10, a dla portu 2 bit 14.

Tak to wygląda w Amosie:
While Not Key State($45)

Wait Vbl 

Doke $DFF034,$FF00

Rem PIERWSZY PORT
If Deek($DFF016) and $400 : Rem 10 BIT 
   Rem 2 FIRE NIE WCISNIETY 
Else 
   Rem 2 FIRE WCISNIETY 
   Doke $DFF180,$F00
End If 



Rem DRUGI PORT 
If Deek($DFF016) and $4000 : Rem 14 BIT 
   Rem 2 FIRE NIE WCISNIETY 
Else 
   Rem 2 FIRE WCISNIETY 
   Doke $DFF180,$F00
End If 

Wend 

End


Przetestowałem zarówno z numpadem ustawionym na port 2 i wciskaniem DEL_NUM, jak również prawym przyciskiem myszy ustawionej w porcie 1, ale też przełączyłem w tym porcie na inne ustawienie, aby mieć pewność i tam również to działa prawidłowo.

Nie wiem, dlaczego na EAB tak kombinowali z odczekaniem chwili czasu, bo tam Toni Wilen pisał, że trzeba odczekać minimum jedną linię ekranu, aż nastąpi rozładowanie się kondensatora. Może na real Amidze jest inaczej, niż w emulatorze.

Ostatnia aktualizacja: 16.11.2024 08:39:00 przez tukinem
[#15] Re: Drugi fire joystik amos

@tukinem, post #14

Fajnie że poprawiłeś moje wypociny z głowy.
Z tym odczekaniem chodzi o to że nie możesz odczytywać stanu z JEDNEGO portu na przykład w jakiejś głupiej pętli, przez głupią mam na myśli pętle w której nie odczekasz odpowiedniego czasu. Bo może to generować niepoprawne wyniki, chodzi tu też o różne typy joysticków podpiętych i chodzi też o to by u wszystkich działało :). A tu u Ciebie jest czekanie na ramkę odczyt z jednego portu i z drugiego portu więc to zadziała i to jest super, bo myślę że problem został rozwiązany.

Na maginesie. Swego czasu jak siedziałem nad prodecurą odczytu przycisków z joypada, które jak mnie pamięć nie myli to były podobnie odczytywane, to pamiętam że tam czasy są ważne. Na moim padzie od cd32 (niestety mam tylko pada) działało, ale jak Wepl testował to zgłaszał że są fałszywe "naciśnięcia" przycisków. Ku przestrodze moral z tego taki, że niestety trzeba testować na różnych sprzętach.
[#16] Re: Drugi fire joystik amos

@asman, post #15

Rozumiem.

A jeszcze takie pytanie, po co na końcu jest MOVE.w #$c000,$DFF034? Po odczytaniu danego bitu należy go wyzerować?

Ostatnia aktualizacja: 16.11.2024 09:36:13 przez tukinem
[#17] Re: Drugi fire joystik amos

@tukinem, post #16

Ja to tak rozumiem.
Na dzień dobry nie wiesz jaki jest stan POTGO, więc na dzień dobry prosisz go o przesłanie impulsu +5 wolt. To jest ten rozkaz move.w #$ff00,$dff034 (to tak na marginesie udostępnia wyjście dla pinu 5, pinu 9 w obu portach), jotd na EAB mówi że jest to konieczne, bo dla niektórych joysticków będzie odczyt działał tylko raz.

I teraz potrzeba 300 miliseknud na ładowanie i rozładowanie kondesatorów podłączonych do pinów 5 i 9 (z tych pinów właśnie odczytujesz poprzez rejestr potgor). Odczekałeś i odczytujesz. I teraz znowu musisz zrobić prośbę o wysłanie impulsu +5 wolt w tym przypadku (port 1) to są bity 15 i 14 w POTGO. Stąd to move.w #$c000,$dff034.
Jeśli posiadasz książkę Mapa Pamięci tom II, to tam przy rejestrach POTGO I POTGOR jest to dokładnie wyjaśnione. A jak nie posiadasz to znajdzie na chomiku
[#18] Re: Drugi fire joystik amos

@asman, post #17

Kurcze wlasnie o to mi chodzilo, jak tylko bede przy amidze to sobie to sprawdzę . Dzieki za odzew i zainteresowanie sie tematem.

Ostatnia aktualizacja: 16.11.2024 10:46:50 przez marggines
[#19] Re: Drugi fire joystik amos

@asman, post #17

Czyli to bardziej "elektroniczne" wytłumaczenie. Ja się sugerowałem tym, więc bardziej to rozumiałem w ten sposób, że na początku wysyłamy $FF00, aby wyczyścić bity 0-7, a ustawić bity 8-15, następnie odczytać konkretne bity (14 lub 10), a jeśli się wyzerowały, tzn. że w danym porcie wciśnięto drugi FIRE. Stąd moje pytanie było o ten ostatni krok, bo myślałem, że na koniec znowu należy poprzez $C000 ustawić bit 15 i 14 (który był sprawdzany w tym akurat przypadku). A może tu należy dla każdego fire odpowiednio dodatkowo sterować poprzez OUTLx/DATLx jak w podają te rejestry hardware?

Dodatkowo zastanawia mnie działanie bitu 0.

Table 8-4: POTGO ($DFF034) and POTGOR ($DFF016) Registers

       Bit
       Number  Name    Function
       ------  ----    --------
       15      OUTRY   Output enable for bit 14 (1=output)
       14      DATRY   data for port 2, pin 9
       13      OUTRX   Output enable for bit 12
       12      DATRX   data for port 2, pin 5
       11      OUTLY   Output enable for bit 10
       10      DATLY   data for port 1, pin 9 (right  mouse button )
       09      OUTLX   Output enable for bit 8
       08      DATLX   data for port 1, pin 5 (middle  mouse button )
       07-01   X       chip revision identification number
       00      START   Start pots (dump capacitors, start counters)
[#20] Re: Drugi fire joystik amos

@tukinem, post #19

aby wyczyścić bity 0-7, a ustawić bity 8-15

Bity 0-7 tu nie mają znaczenia.

A może tu należy dla każdego fire odpowiednio dodatkowo sterować poprzez OUTLx/DATLx jak w podają te rejestry hardware?


No właśnie to jest to sterowanie, poprzez zapis $c000 do potgo. Weź rozważ taką sytuację.
Zrobiłeś $ff00 do potgo i odczytujesz stan przycisku w pętli z czekaniem na ramkę, załóżmy że był wciśnięty przez użytkownika, wtedy mamy zero na bicie i ok, nic więcej nie robimy, nie ustawiamy $c000 w potgo. I teraz użytkownik puścił przycisk. A ty sprawdzasz potgor i masz wciąż na bicie zero. I to wygląda jakby użytkownik trzymał przycisk. Bo przecież ten rejestr nie jest czyszczony po odczycie (przynajmniej ja tak myślę), i masz fałszywy wynik że przycisk jest naciśnięty. Dlatego tak ważne jest ustawienie $c000 (mowa tylko o porcie 1) w dobrym miejscu.

I po prawdzie ja bym Twój przykład zmodyfikował, bo ustawiasz #$ff00 do potgo i od razu czytasz bity od przycisku, może nie minąć odpowiednia ilość czasu i dostaniesz fałszywy stan przycicku. Lepiej dać ten Doke za sprawdzaniem + Dać jeszcze jeden przed czekaniem na ramkę.

Weź pod uwagę jeszcze jedną ważną rzecz. Zależy to od tego czy wyłączyłeś OS. Bo OS cyklicznie ustawia POTGO, żeby zebrać informacje o stanie przycisków (prawy myszy). I tu na przykład przez przypadek możesz też mieć nieprawdziwe sytuacje. Jeśli chcesz być 100% pewny, to ubijasz OS i wtedy przechodzisz na czarną stronę mocy. Nie wiem czy jeśli OS jest włączony i zaalokujesz sobie potgo.resource to masz całkowitą kontrolę nad potgo i potgor. Musiałby się wypowiedzieć ktoś, kto to ogarniał.

Ostatnia aktualizacja: 16.11.2024 12:57:03 przez asman

Ostatnia aktualizacja: 16.11.2024 12:57:25 przez asman
[#21] Re: Drugi fire joystik amos

@tukinem, post #14

sory, ze sie wcinam ale w Amosie, to nie dziala prawidlowo wg mnie.
If Deek($DFF016) and $400

nie kumam tego zapisu, przeciez wartosc true nigdy nie moze byc spelniona
[#22] Re: Drugi fire joystik amos

@selur, post #21

Działa bo sprawdziłem. To jest sprawdzenie bitu 14 pod adresem $DFF016. W Blitzu to byś miał: If Peek.w($dff016) BitTst 14.

Ustaw sobie joystick z drugim fire w emulatorze i sprawdź. Tylko bit 14 sprawdza port 2 a bit 10 port 1.

@Asman: sprawdziłem bez Doke $dff034,$ff00 i wtedy wystarczy raz wcisnąć fire a reaguje tak jakby był cały czas wciśnięty. Doke po WaitVBL powoduje ustawienie bitów 8-15 a one znowu się zerują po wciśnięciu. $cc00 ustawia jedynie bit 14 i 15, a $ff00 ustawia wszystkie 8, co jest prawidłowe. Sprawdziłem również pod Blitz Basic. Zarówno pod systemem jak i bez systemu jest identycznie, czyli kolejno: VWait, Move.w $ff00,$dff034 i sprawdzanie bitów spod $dff016. Pod systemem również bez wysłania $ff00 trzyma wyzerowany bit 14 po wciśnięciu drugiego fire i puszczeniu. Oczywiście BB ma własną funkcję od sprawdzania fire zarówno jednego jak i drugiego w obu portach, ale chciałem sprawdzić czy po odczycie z Pauli będzie też działać pod systemem. Piszę z Pauli, bo rejestry $dff016 oraz $dff034 to rejestry Pauli dla tych, co by nie wiedzieli, a to też ciekawostka, bo zazwyczaj ten układ kojarzy się mylnie tylko i wyłącznie z dźwiękiem
[#23] Re: Drugi fire joystik amos

@tukinem, post #22

sprawdziłem bez Doke $dff034,$ff00 i wtedy wystarczy raz wcisnąć fire a reaguje tak jakby był cały czas wciśnięty


bo twoj warunek wykona tylko instrukcje po ELSE poniewaz pierwsza czesc nigdy nie zostanie osiagnieta (nie bedzie rowna true czyli -1 )

i nie rozumiem jak odczytujesz te wartosci jako fire, skoro bit bedzie zawsze rowny 0 w tym warunku.

ps.
w Amosie tez jest instrukcja odczytujaca stan bitow ze zmiennej, tylko nie pamietam skladni a nie mam pod reka ksiazki akurat.

Ostatnia aktualizacja: 16.11.2024 14:45:06 przez selur
[#24] Re: Drugi fire joystik amos

@selur, post #23

Możesz sobie napisać to inaczej żeby nie używać ELSE'a, np tak:
While Not Key State($45)
Wait Vbl 
Doke $DFF034,$FF00
Rem PIERWSZY PORT
If(Deek($DFF016) and $400)=0 : Rem 10 BIT 
   Rem 2 FIRE WCISNIETY 
   Doke $DFF180,$F00
End If 

Rem DRUGI PORT 
If(Deek($DFF016) and $4000)=0 : Rem 14 BIT 
   Rem 2 FIRE WCISNIETY 
   Doke $DFF180,$F00
End If 
Wend 
End


zadowolony? szeroki uśmiech

a w BB to byłoby tak:
WBStartup
BLITZ

While NOT RawStatus($45)
   VWait
   
   If Joyb(0)=2    ; PORT 1
      MOVE.w #$f00,$dff180
   Endif

   If Joyb(1)=2    ; PORT 2
      MOVE.w #$f0,$dff180
   Endif

Wend

AMIGA
End


Ostatnia aktualizacja: 16.11.2024 15:25:36 przez tukinem
[#25] Re: Drugi fire joystik amos

@tukinem, post #24

U mnie ten twój program działa ale wyłacza rozkaz fire(1).
Oczywiście w Amosie. Więc na to samo wychodzi. Autorowi posta chodziło o to żeby działały dwa przyciski jednocześnie.

Ostatnia aktualizacja: 16.11.2024 16:24:34 przez djpiotrs

Ostatnia aktualizacja: 16.11.2024 16:26:40 przez djpiotrs
[#26] Re: Drugi fire joystik amos

@djpiotrs, post #25

Jak nie działa jak działa? Trzeba sobie wyniki stablicować tylko.
Dim P0(1) : Dim P1(1)

While Not Key State($45)
Wait Vbl 
   P0(0)=0 : P0(1)=0 : P1(0)=0 : P1(1)=0

   Doke $DFF034,$FF00

Rem PIERWSZY PORT
   If Fire(0) Then P0(0)=1
   If(Deek($DFF016) and $400)=0 Then P0(1)=1

Rem DRUGI PORT 
   If Fire(1) Then P1(0)=1
   If(Deek($DFF016) and $4000)=0 Then P1(1)=1

   Locate 0,0
   Print "     PORT"
   Print " 0       1"
   Print P0(0),P0(1),P1(0),P1(1)

Wend 
End


Oto wynik wciśnięcia u mnie jednocześnie dwóch klawiszy myszy oraz NUM0 + NUM_DEL:

[#27] Re: Drugi fire joystik amos

@tukinem, post #24

nie kumam tych stanow bitow, jak 0 moze byc wcisnietym fajerem w joysticku ale moze w wolnym czasie poczytam o co tam chodzi.
[#28] Re: Drugi fire joystik amos

@selur, post #27

Poczytaj o wychyleniu joysticków to osiwiejesz bo tam dopiero jest dziwnie zrobione zresztą ci pisałem kiedyś. Tam robisz już EOR na dwóch różnych bitach. Odczyt klawiatury też jest ciekawy. Wszystko jest zaprojektowane jakby na złość koderom, ale idzie przywyknąć
[#29] Re: Drugi fire joystik amos

@selur, post #27

To żaden sekret, bity są odwrócone w tym przypadku i tyle. zamiast oczekiwać 1 oczekujemy 0. Aż chyba zainstaluje znowu Amosa.
[#30] Re: Drugi fire joystik amos

@asman, post #29

Dobrym przykładem jest również bit 7 od $BFD100, czyli uruchomienie silniczka stacji dyskietek. Uruchamiamy go zerując bit, a wyłączamy ustawiając na 1. Odwrotnie jest w przypadku wybierania stacji. Wtedy ustawia się odpowiedni bit 3, 4, 5 lub 6 dla kolejno DF0/1/2/3.
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem