Welcome to Schneider / Amstrad CPC Forum. Please login or sign up.

28. March 2024, 16:19:09

Login with username, password and session length

Shoutbox

TFM

2024-01-15, 17:06:57
Momentan billige Farbbänder auf Ebay für PCW

Devilmarkus

2023-07-09, 10:37:40
Zweiter 👋😂🤣

TFM

2023-06-13, 14:21:49
Sommerloch!

TFM

2023-05-30, 17:00:20
Erster ;-)

Recent

Members
Stats
  • Total Posts: 11,654
  • Total Topics: 1,328
  • Online today: 93
  • Online ever: 1,724
  • (16. January 2020, 00:18:45)
Users Online
Users: 0
Guests: 86
Total: 86

86 Guests, 0 Users

Probleme mit Joystick-Abfrage

Started by oobdoo, 17. February 2015, 15:10:19

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

oobdoo

Ich frage meinen Joystick ab:

call &bb24
di
push af
call &bb00
pop af
ei

cp 8 ; für rechts
jr rechts

usw.


Die Abfrage funktioniert soweit. Das Problem dabei ist, das sie viel zu schnell kommen die weiteren Impulse. Einmal nur kurz den Joystick angetippt und die Figur rast schon über den halben Bildschirm.
Dabei macht JOY(0) in BASiC auch nix anderes als &bb24 abzufragen. Und da funktioniert es.

Ich steh vor einem Rätsel.  :(
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

oobdoo

Mit einer normalen Rechtsbewegung am Joystick bekomme ich immer 3x A ausgegeben.

org &4000

.start

di
call &bb24

push af
call &bd19

pop af
ei

cp 8
jr nz,start
         ld a,65
         call &bb5a
         call&bb00
jr start


Ich will aber nur einmal A bei normalen Handbewegungen am Bildschirm sehen.
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

Devilmarkus

Vielleicht fehlt ja ein CP 0 ?
So dass es sperrt, wenn der Joystick ruhig ist?

Oder ein Stop-Befehl?
https://cpcwiki.de
Dein Deutsches CPCWiki!

oobdoo

Ich versuche gerade eine Counter mit einzubauen, damit die Ereignisse nicht zu schnell kommen. Klappt aber noch nicht. :(
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

Devilmarkus

Bislang fragst du ja auch nur ab, was passieren soll, wenn Joystick gedrückt wird.
Aber wie setzt du die Bewegung zurück?
Das sollte erfolgen, wenn der Joystick <> 8 ist.

8 steht natürlich repräsentativ für die Bewegungsrichtung, die du abfragst...


Stell dir vor: Du drückst eine Taste, dann muss etwas erfolgen. Wenn Du diese Taste aber wiederum loslässt, muss auch etwas erfolgen.... Sonst bleibt intern die Taste gedrückt...
https://cpcwiki.de
Dein Deutsches CPCWiki!

oobdoo

Das war nur ein schneller Experimentiercode.

Mir geht es folgenden BASIC-Code (siehe Bild)

Da klappt das vorzüglich mit dem Joystick. Will ich das aber in Assembler nachbilden, dann rennt die Figur nicht um eine Position, sondern immer um mehrere.
Ich könnt noch verrückt werden.  :motz:
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

Devilmarkus

#6
Achso sorry, dann hatte ich dich falsch verstanden...
Vermutlich macht deine Figur nun zu schnelle Schritte?
Was, wenn Du zwischen den Schritten ganz einfach einen CALL &BD19 dort einfügst?

Edit: Könnte allerdings das gesamte Spiel verlangsamen... CALL &BD19 ist ja der Frameflyback Wait CALL...

Edit 2: Timer könnte aber klappen! Oder aber die Tastatursteuerung über Interrupt abfragen, wobei die Abfrage alle x Millisekunden erfolgt, und halt auch dann nur den Einzelschritt ausführt?
https://cpcwiki.de
Dein Deutsches CPCWiki!

oobdoo

Ich hab noch einen Gedanken im Kopf. Den mach ich aber erst nach dem TV schauen. Birne raucht.

Interrupt, ja gerne. Ist aber ein weiteres Problem was ich noch nicht gelöst habe.  ;)
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

Devilmarkus

#8
So in etwa?

InterruptInit:
ld a,(ix+0)
or a
jr z,InterruptDone
LD HL,BlocEvent
LD DE,InterruptHandle
LD BC,#8100
JP #BCD7

InterruptDone:
LD HL,BlocEvent
JP #BCDD
InterruptHandle:
DI
;; was soll ich hier machen?
ei
ret

BlocEvent:
DS 16



Edit: GGF. die Abfrage am Anfang entfernen! Dies hier basiert auf einem RSX-Befehl, welches den Interrupt ein - bzw. aus schaltet.
https://cpcwiki.de
Dein Deutsches CPCWiki!

oobdoo

So, wie es ausschaut habe ich das Problem gelöst.  :D
Assembler führt mich manchmal auf den falschen Weg und später seh ich den Baum vor lauter Bäumen nicht.

Einfach nur &BB18 aufrufen und entsprechend auswerten. Hab mich im WinCPC durch die umdefinierte Tastatur auf den falschen Weg begeben.
Jetzt klappt das mit der mit der Zehnertastatur und gleichzeitig auch übern Joystick.

Ich denk noch immer zu sehr in BASIC-Dimensionen und überseh dann die Lösungen.  :motz:

Naja, hauptsache läuft.  :00008351:

Danke nochmal an Devilmarkus der mich mit Sourcen versorgt hat, wodurch ich wieder auf den richtigen Weg gebracht wurde.  :knuddel:
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

TFM

Ja, Assembler ist einfach viel schneller als BASIC. Da muss schon mal eine Warteschleife rein ;-)
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

oobdoo

Plöde Geschwindigkeit. Wahnsinnig macht einen dieses Assembler.  :banghead:
Hat man ein Problem gelöst, stolpert man über zwei neue.  :gruebel:
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

TFM

Ja, aber wenn's läuft, dann läufts ... und zwar für immer. Nur nicht aufgeben, am Ende ist es das alles wert.
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

oobdoo

Ach Z80 is kagge. Ich meißt den Scheiß ausm Fensta.  :motz:

Jetzt schreib ich die Routine fürs Monster extra neu und der Bug taucht immer noch auf.  :gruebel:
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

TFM

Mach mal Pause und schlaf eine Nacht darüber.  :)
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)