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