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. :(
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.
Vielleicht fehlt ja ein CP 0 ?
So dass es sperrt, wenn der Joystick ruhig ist?
Oder ein Stop-Befehl?
Ich versuche gerade eine Counter mit einzubauen, damit die Ereignisse nicht zu schnell kommen. Klappt aber noch nicht. :(
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...
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:
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?
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. ;)
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.
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:
Ja, Assembler ist einfach viel schneller als BASIC. Da muss schon mal eine Warteschleife rein ;-)
Plöde Geschwindigkeit. Wahnsinnig macht einen dieses Assembler. :banghead:
Hat man ein Problem gelöst, stolpert man über zwei neue. :gruebel:
Ja, aber wenn's läuft, dann läufts ... und zwar für immer. Nur nicht aufgeben, am Ende ist es das alles wert.
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:
Mach mal Pause und schlaf eine Nacht darüber. :)