I'm trying to change the player color with the background color everytime fire button for player 1 is fired (INPT4) but its just occours once. I tried to understando how constant works in dasm because constants appear that they aren't constants. The part of code that does it is in Joystick( part 3 of code). I used Joy of Sticks as base to my code. After i change the color with background ill try to change the color with any object in the screen.
http://www.atariage.com/2600/programming/2600_101/05joy.html
Heres the full code:
PROCESSOR 6502
; vcs.h para usar a TIA e os registradores
include vcs.h
;===============================================================================
; Início da RAM e separamos espaço pra possíveis variáveis - Cabeçalho
;===============================================================================
;define um espaço para as variáveis
SEG.U VARS
;RAM scomeça no endereço $80
ORG $80
;===============================================================================
; Início do Catucho - Cabeçalho
;===============================================================================
; Cabeçalho
SEG CODE
; Recomenda-se que rom até 2k comece em $F800 e 4K $F000
ORG $F000
;Variáveis reservadas
;YBox = $82
COR_FUNDO = $99
COR_PLAYER = $83
YPos = $80; ; onde guardaremos a posição vertical do objeto
Quadrado = $81; variável do quadrado
;BOX_COLOR = $84 ; blue
;===============================================================================
; Inicio do Jogo
;===============================================================================
Inicio
;Limpa a RAM e os registradores da TIA e do processador
;recomendação para todos os jogos e limpar a RAM
sei ;desativa qualquer interrupção
cld ; limpa o bit de cáculo de BCD
ldx #0 ; carrega x com 0
txa ; passa o valor de x para A
tay ; || || de a para y
free
dex ; x = x -1
txs ; passa x para o Stack pointer
pha ; da um push em A
bne free ; enquanto não for zero(tiver algo) ontinua o loop
;escolhemos trabalhar com o míssel 0
lda #39 ; tamanho = 39 pg 40 manual stella
sta NUSIZ0 ; quadrado = tamanho
lda #99 ; posicão inicial 192/2 = 96 + 4 pixels = 100 -1 index (começa conta de 0) = 99
sta YPos ;Posição inicial no eixo y(vertical)
;mark
lda #COR_PLAYER
sta COLUP0
lda #COR_FUNDO
sta COLUBK ; background = cor#39 marrom claro
; cpx #2
; beq volta
;volta
; rts
;;set initial box position
;lda #120
;sta YBox
;lda #(200 - BOX_HEIGHT)/2
;lda #BOX_COLOR
;sta COLUP1
;;;calcular a posiçao inicial no eixo x(horizontal)
lda #79 ; posicão inicial 160/2 = 80 - 1 index = 79
sec ; limpa o carry
sta WSYNC ; espera o inicio da linha
;;asl shiftleft bit, ajuda a "empurrar o quadrado para direita
DivideLoop
sbc #15 ;2
bcs DivideLoop ;4/5 4/ 9.../54 pg 8 manual 15 colour clock interval
eor #7 ;+6/11... 01 10
asl ;8
asl ;10
asl ;12
asl ;14/19.../64
sta.wx HMM0,X ;19/24.../69
sta RESM0,X ;23 precisamos chegar no ciclo 23 ou + para podermos setar
sta WSYNC ;necessário antes do HMOVE
sta HMOVE ;movimentação horizontal tem q ter ciclo 24> aqui pg 9 manual stella
;Obs.: bug de 8 bits referente a este HMOVE ^^^^^^^^ que da o tracinho preto na tela superior esquerda
;===============================================================================
; Estrutura do Programa Principal
;===============================================================================
Main
;1 - VerticalSync
;2 - VerticalBlank
;3 - Joystick
;4 - Núcleo
;5 - OverScan
;5.1 - voltemos ao Main
;6 - Fim do cartucho
;===============================================================================
; 1 - Vertical Sync
; -------------
; Aqui geramos o sinal que orienta a TV a mover o canhão para o topo da tela para
; podermos ir mandando os frames. O sinal VSync precisa ser de 3 linha como
; explicamos no trabalho
;===============================================================================
;VerticalSync:
lda #2 ; Carrega o acumulador com 2 para podermos setar D1 = 1 no sta da linha 86
sta VSYNC ; acumulador D1 = 1 e liga o sinal do vertical Sync
sta WSYNC ; espera por SYNC para ir até o fim da 1ª linha
sta WSYNC ; espera por SYNC para ir até o fim da 2ª linha
sta WSYNC ; espera por SYNC para ir até o fim da 3ª linha
lda #0 ; carrega o acumulador com 0 então poderemos setar D1 = 0 no sta da linha 91 ]
;sta GRP0
;sta GRP1
sta VSYNC ; acumulador d1 = 0 e desliga o sinal vsync
;===============================================================================
; 2 - Vertical Blank
; --------------
; Pularemos 37 linhas do vblank
;===============================================================================
ldx #36 ; x = 36, já temos uma linha da nossa inicialição da Pos Horizontal
vbLoop
sta WSYNC ; espera ir até o fim da linha
dex ; x = x -1
bne vbLoop ; volta a VbLoop se x > 0
;===============================================================================
; 3 - Joystick
; --------------
; Aqui captaremos os comandos do Joystic para movimentar o quadrado
;===============================================================================
lda #16 ; a = 16
bit SWCHA ; faz um and lógico com o registrador A e SWCHA pega o bit de entrada
bne testaBaixo ; se for diferente de zero
inc YPos ;
inc YPos ; 2 inc para regular a velocidade
testaBaixo
lda #32 ;a = 32
bit SWCHA ; faz um and lógico com o registrador A e SWCHA pega o bit de entrada
bne testaEsquerda ; testa o próximo se >0
dec YPos ;
dec YPos ; 2 dec para regular a velocidade
testaEsquerda
;aqui usaremos reg X
ldx #0 ; x = 0
lda #64 ; a = 64
bit SWCHA ;faz um and lógico com o registrador A e SWCHA pega o bit de entrada
bne testaDireita ; testa o próximo se >0
ldx #%00011111 ;+1 nos 4 primeiros bits esquerda ; pg 41 manual do stella D7 D6 D5 D4
;4 primeiros bits do registrador
;pg 41 manual do stella
;D7 D6 D5 D4
;0 1 1 1 +7
;0 1 1 0 +6
;0 1 0 1 +5 Move left
;0 1 0 0 +4 indicated number +7 vmax -8 1 & -1 vmin
;0 0 1 1 +3 of clocks
;0 0 1 0 +2
;0 0 0 1 +1
;0 0 0 0 0 No Motion
;1 1 1 1 -1
;1 1 1 0 -2
;1 1 0 1 -3
;1 1 0 0 -4 move right
;1 0 1 1 -5 indicated number
;1 0 1 0 -6 of clocks
;1 0 0 1 -7
;1 0 0 0 -8
testaDireita
lda #128 ;a = 128
bit SWCHA ;faz um and lógico com o registrador A e SWCHA pega o bit de entrada
bne done ; vaa para done linha 198 se a flag de bit > 0
ldx #%11111111 ; -1 nos 4 primeiros bits direita
done
stx HMM0 ;Enfim, guarda o comando;
########################################################HERE THE INPT4 ###########################################
LDA INPT4 ;read button input
BMI ButtonNotPressed ;skip if button not pressed
ldx COLUP0
cpx #COR_PLAYER
bcs jumper
ldx #COR_FUNDO
ldy #COR_PLAYER
stx COLUBK
sty COLUP0
jumper
ldx #COR_FUNDO
ldy #COR_PLAYER
stx COLUP0
sty COLUBK
ButtonNotPressed
##################################################
;===============================================================================
; 4 - Núcleo
; ------
; Aqui é a parte onde desenhamos o nosso quadrado
;===============================================================================
ldy #190 ; y = 190
sta WSYNC ; espera fim da linha
;lda #%00000000
sta VBLANK ; desliga vblank
sta WSYNC ; necessário antes de chamar HMOVE mover
sta HMOVE ; executa comando se houver
; Desenhando a tela do jogo
TelaPrincipal
sta WSYNC
QuadradoON
cpy YPos ; verifica se quadrado ta ativo
bne no ; pula pra linha 214
lda #8 ; a = 8
sta Quadrado ;atualiza quadrado
no
;Ta fora da tela quadrado?
lda #0 ; a =0
sta ENAM0 ; atualiza enam0
;Voltou?Então pinta quadrado!
lda Quadrado ; atualiza quadrado
beq fim ; se flag =0 vai pra linha 227
ligado
lda #2 ; a =2
sta ENAM0 ; atualiza enam0
dec Quadrado ; diminui o valor da variável quadrado
fim
dey ; y = y-1
bne TelaPrincipal ; se y> 0 continua o looping
;===============================================================================
; 5 - Overscan
; --------------
;Aqui contamos as 30 linhas finais da tela
;===============================================================================
;lda #%01000010
lda #2 ; a = 2 pra fazer D1 = 1;
sta WSYNC ; espera vsync para ir até o fim da linha, e garantir o fim da scanline
sta VBLANK ; desliga a imagem e liga vblank
ldx #30 ; x = 30
osLoop
sta WSYNC ; espera vsync para ir até o fim da linha
dex ; x = x -1
bne osLoop ; looping regressivo retornando para osLoop enquanto x != 0
;===========================================================================
; 5.1 - Retorna ao Main
;===========================================================================
;lda #0
;sta VBLANK
jmp Main ; Volta para o label Main >> linha 93 <<
BoxGfx:
.byte %11111111
.byte %11111111
.byte %10000001
.byte %10000001
.byte %10000001
.byte %10000001
.byte %10000001
.byte %10000001
.byte %10000001
.byte %10000001
.byte %10000001
.byte %10000001
.byte %10000001
.byte %10000001
.byte %11111111
.byte %00000000
;===============================================================================
; 6 - Fim do Cartucho
;===============================================================================
ORG $FFFC ; espaço para o endereço dos vetores de interrupçoes ( Reset o mais importante).
.WORD Inicio ; NMI
.WORD Inicio ; RESET
.WORD Inicio ; IRQ
T2f.asm
T2f.bin