Lendo o controlador nes (dendy) no assembler

No artigo anterior eu falei sobre o básico do montador 6502 sobre algumas áreas de memória e como trabalhar com elas, até hoje tive a seguinte série de tarefas: leitura do controlador, animação, cronômetro. Abaixo, sob o corte, contarei como aprendi a ler o controlador.






Tudo, como antes, começou com um objetivo, fui ao wiki nesdev (o link estará no final do artigo) para ler sobre como trabalhar com o controlador. Afinal, se você olhar para ele, existem apenas alguns gatilhos externos para o jogo, após os quais o jogo executa algumas ações específicas. Em primeiro lugar, trata-se de um cronômetro interno, as ações dos personagens são realizadas no início de um determinado momento, um exemplo marcante disso podem ser simples chefes nos jogos, seu comportamento é descrito por um modelo que está vinculado a qualquer período de tempo. Em segundo lugar, um gatilho importante para o jogo é pressionar os botões de controle, aos quais o personagem principal do jogo responde principalmente, pressionando para cima, para baixo, para a esquerda e para a direita, iniciar e selecionar. O herói pode se mover, pular, rastejar e assim por diante. Ou seja, pressionar o botão diretamente instrui o jogo a fazer isso.Rodando a programação para o NES, procuro focar não no objeto que estará na tela, como muitos programadores modernos são possíveis, mas no que será desenhado neste ou naquele quadro.





Mas mais perto do assunto, há muitos controladores no NES, que vão desde motocicletas clássicas até infláveis ​​e microfones, mas o dândi tinha apenas dois gamepads clássicos (joystick) e uma pistola leve. Provavelmente falaremos sobre o último mais tarde. E assim o dândi tem duas portas de processador para ler controladores $ 4.016 para o primeiro gamepad, $ 4.017 para o segundo gamepad.





O primeiro passo é "reiniciar o controlador" ou "inicializá-lo" simplesmente escrevendo os valores $ 01 e $ 00 na porta sequencialmente





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



Em seguida, o dândi lê a prensa na seguinte sequência A, B, Selecionar, Iniciar, Cima, Baixo, Esquerda, Direita e escreve na porta $ 4016, portanto, para receber um pressionamento de botão, precisamos apenas ler a partir desta porta , o valor sequencialmente 8 vezes





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
      
      



E o ciclo se repete: lendo, determinando, desenhando o estado do herói.

Foi assim que aconteceu, nem tudo é tão complicado quanto parecia à primeira vista. A própria montadora causa mais dificuldades, às vezes alguns pontos não são tão transparentes, mas eu gostaria de dizer uma coisa simples, se há um sonho vale a pena ir, e em nenhum caso você deve desistir de tais empreendimentos. Nos próximos artigos gostaria de falar sobre animação e criação gráfica.





Artigo anterior da

literatura : http://wiki.nesdev.com/

Exemplo inteiramente no github








All Articles