Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- jsr gerasprites
- jsr gerap
- lda #4
- sta $90
- lda #8
- sta $91
- lda #0
- sta $f0 ;modo de jogo
- lda #$20
- sta $f2
- lda #0
- sta $64
- sta $65; score
- lda #3
- sta $6E ;vidas
- lda #1
- sta $af ;velocidade
- gameloop:
- lda $f0
- cmp #1
- beq explosao
- cmp #2
- beq score
- ;modo normal
- jsr jogador
- jsr inimigo
- jmp gameloop
- explosao:
- ;modo explodindo
- lda #23
- sta $41
- lda #11
- sta $42
- lda #8
- sta $44
- lda $80
- sta $40
- lda $90
- sta $45
- lda #13
- sta $43
- jsr dsprite
- dec $f2
- bne explodindo
- jsr cls
- lda #0
- sta $f0
- dec $6e
- bne explodindo
- lda #2
- sta $f0 ; Game over
- explodindo:
- jmp gameloop
- score:
- ;modo game over
- lda #0
- ldx #0
- limpatudo:
- sta $200,x
- sta $300,x
- sta $400,x
- sta $500,x
- inx
- bne limpatudo
- lda #0;limpa o contador
- sta $f5
- ;Faz operação decimal porca pra escrever o score
- lda #0
- sta $6B
- lda #4
- sta $f1
- sta $43
- sta $6A
- lda #10
- sta $41
- lda #8
- sta $44
- lda #6
- sta $40
- scoreloop:
- lda #0
- sta $f5
- conta:
- ldx $6b
- lda tabelabcd,x
- sta $f9
- inx
- lda tabelabcd,x
- sta $f8
- sec
- lda $65
- sbc $f8
- sta $67
- lda $64
- sbc $f9
- sta $66
- bmi smallcon
- inc $f5
- sta $64
- lda $67
- sta $65
- jmp conta
- smallcon:
- asl $f5
- asl $f5
- lda #34
- adc $f5
- sta $42
- jsr dsprite
- clc
- lda #5
- adc $40
- sta $40
- inc $6b
- inc $6b
- dec $6a
- bne scoreloop
- jmp fim
- tabelabcd:
- dcb $3,$E8,0,$64,0,10,0,1
- jogador:
- ;Desenha e calcula o jogador
- lda #23
- sta $41
- lda #0
- sta $42
- sta $44
- lda $80
- sta $40
- lda $90
- sta $45
- lda #11
- sta $43
- jsr dsprite
- lda $85
- sta $40
- jsr csprite
- lda $80
- sta $85
- lda $80 ;calcula o controle pra esquerda e direita
- cmp #0
- beq noleft
- lda $ff
- cmp #97
- bne noleft
- dec $80
- dec $80
- noleft:
- lda $80
- cmp #20
- beq noright
- lda $ff
- cmp #100
- bne noright
- inc $80
- inc $80
- noright:
- lda $80 ;breca o personagem no meio
- cmp #10
- bne midstop
- lda $0
- sta $ff
- midstop:
- inc $90
- rts
- inimigo:
- ;desenha o inimigo
- lda $af
- clc
- adc $A1
- sta $a1
- lda $A1
- cmp #16
- bmi noreset
- ;evento de quando o inimigo atinge o fundo
- lda #0
- sta $A1;manda o inimigo pro alto
- lda #16
- sta $A0
- lda $fe
- and #3
- asl
- asl
- asl
- asl ;calcula o proximo caminho
- sta $AE
- clc
- lda #1
- adc $65
- sta $65
- lda #0
- adc $64
- sta $64
- lda $65;determina a velocidade do jogo
- cmp #10
- bmi noreset
- lda #2
- sta $af
- lda $65;velocidade maxima
- cmp #20
- bmi noreset
- lda #3
- sta $af
- noreset:
- clc
- lda $A1
- clc
- adc $ae
- tax
- lda carpts,x
- clc
- adc #16
- sta $a0 ;calcula a posição do inimigo pela altura
- lda $A1
- cmp #5
- bpl farcar ;BPL/BMI são a comparação de maior que/menor que
- clc ;desenha e ajusta o inimigo quando esta longe
- adc #4
- sta $41
- sta $A4
- lda #31
- sta $42
- lda $A0
- clc
- sbc #1
- sta $40
- sta $A3
- lda #3
- sta $43
- sta $AA
- jmp renderenemy
- farcar:
- lda $A1
- cmp #10
- bpl closercar
- clc
- adc #5
- sta $41
- sta $A4
- lda #25
- sta $42
- lda $A0
- clc
- sbc #3
- sta $40
- sta $A3
- lda #6
- sta $43
- sta $AA
- jmp renderenemy
- closercar:
- lda $A1
- clc
- adc #8
- sta $41
- sta $A4
- lda #0
- sta $42
- lda $A0
- clc
- sbc #5
- sta $40
- sta $A3
- lda #11
- sta $43
- sta $AA
- renderenemy:
- lda #4 ;desenha e limpa o inimigo
- sta $44
- lda $91
- sta $45
- jsr dsprite
- lda $A5
- sta $40
- lda $A6
- sta $41
- lda $ab
- sta $43
- jsr csprite
- lda $A3
- sta $A5
- lda $A4
- sta $A6
- lda $AA
- sta $AB
- inc $91
- lda $a1
- cmp #14
- bmi semkaboom
- sec
- lda $40
- sbc $80
- bpl nupos
- eor #$ff
- nupos:
- cmp #5
- bpl semkaboom
- lda #1
- sta $f0
- lda #20
- sta $f2 ;calcula se houve colisão de inimigo e se houve, seta o f1 pro modo explosão
- semkaboom:
- rts
- carpts: ;trilhas que o inimigo pode seguir
- dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dcb 0,0,1,1,2,2,3,3,4,5,6,7,8,9,10,11
- dcb 0,0,$ff,$ff,$fe,$fe,$fd,$fd,$fc,$fc,$fb,$fa,$f9,$f8,$f7,$f6
- dcb 0,0,1,1,2,2,3,3,2,1,0,$ff,$fd,$fb,$f9,$f6
- add16:
- clc ;Rotina de adição de numero 8bit em numero 16bit reusada 1 trilhão de vezes
- adc $10
- sta $10
- lda #0
- adc $11
- sta $11
- rts
- add162:
- clc ;usada pelo menos umas 2 vezes
- adc $12
- sta $12
- lda #0
- adc $13
- sta $13
- rts
- dsprite:
- ;desenha sprite na tela
- ;$40 x $41 y $42 spini $43 splen $44 palette $45 spid
- lda $41
- lsr
- lsr
- lsr
- clc
- adc #2
- sta $11
- lda #$f
- sta $13
- lda $42
- sta $12
- lda #0
- sta $30
- tax
- tay
- lda $41
- and #7
- asl
- asl
- asl
- asl
- asl
- adc $40
- sta $10
- sta $15
- lda $11
- adc #$15
- sta $16
- dspritel:
- lda ($12),y
- cmp #0
- beq tra
- clc
- adc $44
- tax
- lda pal,x
- sta ($10),y
- lda $45
- sta ($15),y
- tra:
- iny
- cpy $43
- bne dspritel
- ldy #0
- lda #32
- jsr add16
- lda #74
- jsr add162
- lda $10
- sta $15
- lda $11
- adc #$15
- sta $16
- inc $30
- lda #8
- cmp $30
- bne dspritel
- rts
- pal:
- dcb 0,0,2,$a,0,0,5,$d,0,1,7,$8
- csprite:
- ;Apaga o sprite anterior usando a tabela em 1fxx
- lda $41
- lsr
- lsr
- lsr
- clc
- adc #2
- sta $11
- adc #$26
- sta $13
- lda #0
- sta $30
- tax
- tay
- lda $41
- and #7
- asl
- asl
- asl
- asl
- asl
- adc $40
- sta $10
- sta $12
- sta $15
- lda $11
- adc #$15
- sta $16
- cspritel:
- lda ($15),y
- cmp $45
- beq masked
- lda ($12),y
- sta ($10),y
- masked:
- iny
- cpy $43
- bne cspritel
- ldy #0
- lda #32
- jsr add16
- lda #32
- jsr add162
- lda $10
- sta $15
- lda $11
- adc #$15
- sta $16
- inc $30
- lda #8
- cmp $30
- bne cspritel
- rts
- gerap:
- ;Gera o background
- lda #$28
- sta $11
- lda #0
- sta $10
- tay
- tax
- loop:
- lda ecor,x
- sta ($10),y
- iny
- cpy #32 ;Compare com o y que dá zero se y=32
- bne loop
- lda #32 ;bota 32
- jsr add16
- ldy #0
- inx
- cpx #32
- bne loop
- lda #12
- sta $20 ;começo inicial
- lda #7
- sta $21 ;tamanho inicial
- lda #$c
- sta $22 ;cor inicial
- lda #$40
- sta $10
- lda #$29
- sta $11
- lda #0;endereço do começo
- ldy $20
- lda #1;canto branco
- ldx $21
- edraw:
- sta ($10),y
- lda $22
- iny
- dex
- bne edraw
- lda #1
- sta ($10),y ;canto branco da direita
- lda #32 ;bota 32
- jsr add16
- lda $10
- cmp #0
- bne antesdametade
- lda #$b
- sta $22
- antesdametade:
- lda #1
- inc $21
- inc $21
- ldx $21
- dec $20
- ldy $20
- cpy #$ff
- bne edraw
- ;depois de plotar o background num buffer
- ;Copia pra tela
- cls:
- lda #2
- sta $11
- lda #$28
- sta $13
- lda #0
- sta $10
- sta $12
- ldx #4
- ldy #0
- plotatela:
- lda ($12),y
- sta ($10),y
- iny
- bne plotatela
- inc $11
- inc $13
- dex
- bne plotatela
- rts
- ;tabela de cores do background
- ecor:
- dcb 1,1,1,3,1,3,3,3,3,3,8,8,8,8,8,8,9,9,9,9,9,9,9
- dcb $b,$b,$b,$b,$b,$b,$b,$b,$b
- gerasprites:
- ;essa rotina é bem complicada e maluca porque decoda as imagens com 2bits de precisão naquele bloco (se fosse mandar as cores puras, seria um bloco 4 vezes maior)
- lda #$0
- sta $10
- sta $13
- sta $20
- tax
- tay
- lda #$F
- sta $11
- decodeb:
- ldy $13
- lda spri,y
- sta $14
- ldy #0
- ldx #4
- decodesb:
- lda $14
- and #3 ;"filtra" os dois primeiros bits com and
- sta ($10),y
- lsr $14 ;Divide o valor de $14 por 4. Isso, junto com o and
- lsr $14 ;acima "fatia" os 8 bits de cada byte em 4 fatias de 2 bits que contem os valores de cor que eu quero
- lda #74 ; são 74 pixels de sprite, então isso desce em Y no bitmap sendo gerado
- jsr add16
- dex ;4 vezes pra fatiar o byte
- bne decodesb
- clc
- lda $13
- and #1
- cmp #1
- bne par ;A cada 2 bytes, tem que empurrar o bitmap sendo desenhado pra direita, por isso só nos impares
- lda $20
- sta $10
- lda #$f
- sta $11
- inc $20
- par:
- inc $13
- lda $13
- cmp #150 ;74*2 bytes
- beq finishde
- jmp decodeb ;esses branches condicionais só podem pular 126 bytes pra cima ou 127 pra baixo ou algo assim, então precisa usar um JMP se salto for muito grande
- finishde:
- rts
- spri: ;tabela de sprites de 2 bits
- dcb 0,0,0,$54,0,$54,$14,$54,$14,$3E,$A0,$16,$E0,$16,$A0,$16
- dcb $14,$3E,$14,$54,0,$54,0,$54,0,$C,0,$C0
- dcb 0,$CF,0,$88,$8C,$6D,$C0,$58,$80,$57,$30,$58
- dcb $C0,$62,$80,$8F,$C,$E0,$C0,$C,0,$C0,0,$30
- dcb 0,$50,0,$51,0,$3A,0,$3A,0,$51,0,$50
- dcb 0,$44,0,$38,0,$44,$55,$55,1,$40,1,$40
- dcb $55,$55,$10,$40,4,$40,$55,$55,0,$40,$45,$55
- dcb $41,$40,$41,$40,$55,$50,5,$50,$41,$40,$41,$40
- dcb $55,$55,$55,1,0,1,0,1,$55,$55,$55,$50
- dcb $41,$40,$41,$40,$45,$55,$55,$55,$41,$40,$41,$40
- dcb $45,$55,1,$40,1,$14,$41,1,$15,0,$15,$55
- dcb $41,$40,$41,$40,$15,$55,$55,$50,$41,$40,$41,$40,$55,$55
- fim:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement