アセンブラでnes(dendy)コントローラを読み取る

前回の記事では、6502アセンブラの基本について、いくつかのメモリ領域とその操作方法について説明しましたが、今日まで、コントローラ、アニメーション、タイマーの読み取りという一連のタスクがありました。以下のカットの下で、私がコントローラーを読むことをどのように学んだかを説明します。






以前と同じように、すべてが目標から始まりました。コントローラーの操作方法について読むために、nesdev wiki(リンクは記事の最後にあります)にアクセスしました。結局のところ、それを見ると、ゲームの外部トリガーはごくわずかであり、その後、ゲームはいくつかの特定のアクションを実行します。まず、これは内部タイマーであり、キャラクターのアクションは特定の時間の開始時に実行されます。これの顕著な例はゲームの単純なボスであり、その動作は任意の期間に関連付けられたテンプレートによって記述されます。第二に、ゲームの重要なトリガーは、ゲームの主人公が主に応答するコントローラーボタンを、上下左右に押して開始および選択することです。主人公は移動、ジャンプ、這うなどができます。つまり、ボタンを直接押すと、ゲームにこれを行うように指示されます。ファミコンのプログラミングを先取りして、多くの現代のプログラマーが可能であるように、画面に表示されるオブジェクトではなく、このフレームまたはそのフレームに描画されるものに焦点を当てようとしています。





しかし、主題に近づくと、クラシックからインフレータブルバイクやマイクに至るまで、NESには多くのコントローラーがありますが、ダンディには2つのクラシックゲームパッド(ジョイスティック)と軽いピストルしかありませんでした。後者については後で話します。したがって、ダンディには、コントローラーを読み取るための2つのプロセッサーポートがあります。1番目のゲームパッド用に4016ドル、2番目のゲームパッド用に4017ドルです。





最初のステップは、値$ 01と$ 00をポートに順番に書き込むだけで、「コントローラーを再起動」または「初期化」することです。





deadyJoy:
 lda #$01
 sta $4016
 lda #$00
 sta $4016
      
      



次に、ダンディは次の順序でプレスを読み取り、A、B、選択、開始、上、下、左、右、ポート$ 4016に書き込みます。したがって、ボタンの押下を受信するには、このポートから読み取るだけで済みます。 、値を順次8回





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
      
      



そして、このサイクルが繰り返されます。主人公の状態を読み、決定し、描きます。

これが結果であり、すべてが一見したほど複雑なわけではありません。アセンブラー自体がより困難になり、透明性が低い点もありますが、簡単に言えば、夢があれば行く価値があり、決してあきらめないでください。次の記事では、アニメーションとグラフィックの作成について説明したいと思います。





過去の記事

文献:http:

//wiki.nesdev.com/完全にgithubの例








All Articles