;asm6 palette.asm palette.nes
pallette_idx equ $00
button_a equ $01
; iNES header
db "NES", $1a
db $01 ; PRG-ROM
db $01 ; CHR-ROM
db $00 ; mapper / mirroring
dsb 9, $00
base $c000
Reset:
lda #0
sta pallette_idx
sta button_a
lda #$00
sta $2000 ; PPU制御レジスタ1
sta $2001 ; PPU制御レジスタ2
; ネームテーブル $2000-$23bf
lda #$20
sta $2006 ; VRAMアドレスレジスタ
lda #$00
sta $2006
ldy #240
--
ldx #0
-
stx $2007 ; VRAMアクセスレジスタ
inx
cpx #4
bne -
dey
bne --
; 属性テーブル $23c0-$23ff
lda #$23
sta $2006 ; VRAMアドレスレジスタ
lda #$c0
sta $2006
ldy #16
--
ldx #0
-
lda attr_table, x
sta $2007 ; VRAMアクセスレジスタ
inx
cpx #4
bne -
dey
bne --
jsr set_palette
-
jmp -
set_palette:
; パレットテーブル $3f00-3f1f
lda #$3f
sta $2006 ; VRAMアドレスレジスタ
lda #$00
sta $2006
ldx pallette_idx
ldy #$10
-
lda pal_table, x
sta $2007 ; VRAMアクセスレジスタ
inx
dey
bne -
cpx #$50
bne +
ldx #$00
+
stx pallette_idx
lda #$00
sta $2005 ; スクロールレジスタ
sta $2005
; 表示開始
lda #$88
sta $2000 ; PPU制御レジスタ1
lda #$0e
sta $2001 ; PPU制御レジスタ2
rts
VBlank:
lda #$01
sta $4016 ; ジョイパッド1レジスタ
lda #$00
sta $4016
lda $4016
and #$01
bne +
sta button_a ; Aボタンが押されてなければ0をセット
rti
+
lda button_a
bne + ; Aボタンが押され続けていればスルー
jsr set_palette
lda #1
sta button_a
+
rti
pal_table:
db $00, $01, $02, $03
db $00, $04, $05, $06
db $00, $07, $08, $09
db $00, $0a, $0b, $0c
db $10, $11, $12, $13
db $00, $14, $15, $16
db $00, $17, $18, $19
db $00, $1a, $1b, $1c
db $20, $21, $22, $23
db $00, $24, $25, $26
db $00, $27, $28, $29
db $00, $2a, $2b, $2c
db $30, $31, $32, $33
db $00, $34, $35, $36
db $00, $37, $38, $39
db $00, $3a, $3b, $3c
db $00, $0d, $0e, $0f
db $00, $1d, $1e, $1f
db $00, $2d, $2e, $2f
db $00, $3d, $3e, $3f
attr_table:
db $00, $55, $aa, $ff
org $fffa
dw VBlank ; NMI VBlank
dw Reset
dw 0 ; IRQ/BRK
incbin "sample.chr"