Im vorherigen Artikel habe ich Ihnen die Grundlagen des 6502-Assemblers zu einigen Speicherbereichen und deren Arbeit erklärt. Bis heute hatte ich die folgenden Aufgaben: Lesen des Controllers, Animation, Timer. Unten unter dem Schnitt werde ich Ihnen erzählen, wie ich gelernt habe, den Controller zu lesen.
Alles begann nach wie vor mit einem Ziel. Ich ging zum nesdev-Wiki (der Link befindet sich am Ende des Artikels), um zu lesen, wie man mit dem Controller arbeitet. Wenn Sie es sich ansehen, gibt es schließlich nur wenige externe Auslöser für das Spiel, nach denen das Spiel einige spezifische Aktionen ausführt. Erstens ist dies ein interner Timer, die Aktionen der Charaktere werden zu Beginn einer bestimmten Zeit ausgeführt. Ein markantes Beispiel hierfür können einfache Bosse in Spielen sein. Ihr Verhalten wird durch eine Vorlage beschrieben, die an einen beliebigen Zeitraum gebunden ist. Zweitens ist ein wichtiger Auslöser für das Spiel das Drücken der Controller-Tasten, auf die der Hauptcharakter des Spiels hauptsächlich reagiert, indem er nach oben, unten, links und rechts drückt, startet und auswählt. Der Held kann sich bewegen, springen, kriechen und so weiter. Das heißt, durch direktes Drücken der Taste wird das Spiel dazu aufgefordert.Beim Vorprogrammieren für das NES versuche ich, mich nicht auf das Objekt zu konzentrieren, das auf dem Bildschirm angezeigt wird, da viele moderne Programmierer möglich sind, sondern darauf, was in diesem oder jenem Rahmen gezeichnet wird.
Aber näher am Thema gibt es viele Controller auf dem NES, von klassischen bis zu aufblasbaren Motorrädern und Mikrofonen, aber der Dandy hatte nur zwei klassische Gamepads (Joystick) und eine leichte Pistole. Wir werden wahrscheinlich später darüber sprechen. Und so verfügt der Dandy über zwei Prozessoranschlüsse zum Lesen von Controllern: 4016 US-Dollar für das erste Gamepad und 4017 US-Dollar für das zweite Gamepad.
Der erste Schritt besteht darin, den Controller neu zu starten oder zu initialisieren, indem einfach die Werte $ 01 und $ 00 nacheinander in den Port geschrieben werden
deadyJoy: lda #$01 sta $4016 lda #$00 sta $4016
Als nächstes liest der Dandy die Presse in der folgenden Reihenfolge A, B, Auswählen, Starten, Aufwärts, Abwärts, Links, Rechts und schreibt an Port $ 4016. Um also einen Tastendruck zu erhalten, müssen wir nur von diesem Port lesen , der Wert nacheinander 8 mal
lda #4016 ; A
lda #4016 ; B
lda #4016 ; Select
lda #4016 ; Start
lda #4016 ; Up
lda #4016 ; Down
lda #4016 ; Left
lda #4016 ; Right
A . , . . X Y . zeropage ( ) $00 - $FF , , , .
ReadA:
LDA $4016 ; A
AND #%00000001 ; N Z
bne walkHeroRight ; A
beq ReadB ; B
ReadB:
LDA $4016 ; B
AND #%00000001
bne walkHeroLeft ; B walkHeroLeft
beq ReadSelect ; Select
; 5
ReadRight:
LDA $4016 ;
AND #%00000001
bne walkHeroRight ;
beq heroStay ;
assembler , , . , . . X Y
walkHeroRight: inc herroXCoordinate jmp drawHero walkHeroLeft: dec herroXCoordinate jmp drawHero
drawHero:
lda herroYCoordinate
sta $2004
lda $00
sta $2004
lda #%00010111
sta $2004
lda herroXCoordinate
sta $2004
lda herroYCoordinate
sta $2004
lda #01
sta $2004
lda #%00010111
sta $2004
lda herroXCoordinate
adc #$07
sta $2004
lda herroYCoordinate
adc #$07
sta $2004
lda $02
sta $2004
lda #%00010111
sta $2004
lda herroXCoordinate
sta $2004
lda herroYCoordinate
adc #$07
sta $2004
lda #03
sta $2004
lda #%00010111
sta $2004
lda herroXCoordinate
adc #$07
sta $2004
nmi_delay 4
jmp mainLoop
Und der Zyklus wiederholt sich: Lesen, Bestimmen, Zeichnen des Heldenzustands.
So stellte sich heraus, dass nicht alles so kompliziert ist, wie es auf den ersten Blick schien. Der Assembler selbst verursacht mehr Schwierigkeiten, manchmal sind einige Punkte nicht so transparent, aber ich möchte eine einfache Sache sagen: Wenn es einen Traum gibt, lohnt es sich, dorthin zu gehen, und auf keinen Fall sollten Sie solche Unternehmungen aufgeben. In den nächsten Artikeln möchte ich über Animation und Grafikerstellung sprechen.
Vergangener Artikel
Literatur : http://wiki.nesdev.com/
Beispiel vollständig auf Github