6502程序集绘制位图
Drawing bitmap in 6502 assembly
所以我一直在尝试在 6502 中绘制位图(对于 Commodore 64)。
当我将图像加载到地址 2000 时,它工作正常,但一旦尝试不同的地址,如 2400,它就不再工作了。
我还使用 CBM prg Studio 作为我的 IDE,使用 Vice 作为我的 C64 模拟器...不知道这是否重要。
这是我得到的结果的图片
这是我的代码
*=01
BYTE [=10=]E, , [=10=]A, [=10=], E, ,
BYTE , , , , , [=10=], [=10=], [=10=]
*=00
; **************************************************************
; VARIABLES
; **************************************************************
TITLE_CHARMEM = 40
TITLE_COLRMEM = 28
TITLE_BACKMEM = B10
; **************************************************************
; MACROS
; **************************************************************
; **************************
; KEYWAIT
defm KEYWAIT ; Paramters: [Key]
@WAITLOOP
lda #$CB
cmp /1
bne @WAITLOOP
endm
; **************************
; PRINT
defm PRINT ; Paramters: [String]
lda #</1
ldy #>/1
jsr $AB1E
endm
; **************************************************************
; GAME CODE
; **************************************************************
INIT
lda #%00111011 ; Enable bitmap mode
sta $D011
lda #%11011000 ; Enable multicolor mode
sta $D016
lda TITLE_BACKMEM ; Load background data from
sta $D020 ; Store it in the background addresses
sta $D021
ldx #[=10=]
TITLE
; Load the image and store it in memory
; -- Image data
lda TITLE_CHARMEM,x
sta 00,x
lda TITLE_CHARMEM + 00,x
sta 00,x
lda TITLE_CHARMEM + 00,x
sta 00,x
lda TITLE_CHARMEM + 00,x
sta 00,x
; -- Color data
lda TITLE_COLRMEM,x
sta $D800,x
lda TITLE_COLRMEM + 00,x
sta $D900,x
lda TITLE_COLRMEM + 00,x
sta $DA00,x
lda TITLE_COLRMEM + 00,x
sta $DB00,x
inx
bne TITLE
lda #
sta $D018
FOREVER
jmp FOREVER
*=FE ; 2400 - 2 bytes for the header
INCBIN "bitmaps/title.prg"
When I load the image into adress 2000 it's works fine, but as soon as try a different address like 2400 it doesn't work anymore.
这就是你的答案。位图需要位于视频芯片将要读取它的同一地址。通常该地址是 2000 美元,但可以更改。
同样,颜色必须始终位于地址 $d800。这个地址是硬件固定的。
所以我一直在尝试在 6502 中绘制位图(对于 Commodore 64)。 当我将图像加载到地址 2000 时,它工作正常,但一旦尝试不同的地址,如 2400,它就不再工作了。
我还使用 CBM prg Studio 作为我的 IDE,使用 Vice 作为我的 C64 模拟器...不知道这是否重要。
这是我得到的结果的图片
这是我的代码
*=01
BYTE [=10=]E, , [=10=]A, [=10=], E, ,
BYTE , , , , , [=10=], [=10=], [=10=]
*=00
; **************************************************************
; VARIABLES
; **************************************************************
TITLE_CHARMEM = 40
TITLE_COLRMEM = 28
TITLE_BACKMEM = B10
; **************************************************************
; MACROS
; **************************************************************
; **************************
; KEYWAIT
defm KEYWAIT ; Paramters: [Key]
@WAITLOOP
lda #$CB
cmp /1
bne @WAITLOOP
endm
; **************************
; PRINT
defm PRINT ; Paramters: [String]
lda #</1
ldy #>/1
jsr $AB1E
endm
; **************************************************************
; GAME CODE
; **************************************************************
INIT
lda #%00111011 ; Enable bitmap mode
sta $D011
lda #%11011000 ; Enable multicolor mode
sta $D016
lda TITLE_BACKMEM ; Load background data from
sta $D020 ; Store it in the background addresses
sta $D021
ldx #[=10=]
TITLE
; Load the image and store it in memory
; -- Image data
lda TITLE_CHARMEM,x
sta 00,x
lda TITLE_CHARMEM + 00,x
sta 00,x
lda TITLE_CHARMEM + 00,x
sta 00,x
lda TITLE_CHARMEM + 00,x
sta 00,x
; -- Color data
lda TITLE_COLRMEM,x
sta $D800,x
lda TITLE_COLRMEM + 00,x
sta $D900,x
lda TITLE_COLRMEM + 00,x
sta $DA00,x
lda TITLE_COLRMEM + 00,x
sta $DB00,x
inx
bne TITLE
lda #
sta $D018
FOREVER
jmp FOREVER
*=FE ; 2400 - 2 bytes for the header
INCBIN "bitmaps/title.prg"
When I load the image into adress 2000 it's works fine, but as soon as try a different address like 2400 it doesn't work anymore.
这就是你的答案。位图需要位于视频芯片将要读取它的同一地址。通常该地址是 2000 美元,但可以更改。
同样,颜色必须始终位于地址 $d800。这个地址是硬件固定的。