Assembly 6502汇编中位图的绘制
所以我一直在尝试在6502中绘制位图(用于Commodore 64)。 当我将图像加载到address2000时,它工作正常,但只要尝试另一个地址,如2400,它就不再工作了 另外,我使用CBM prg Studio作为我的IDE,而Vice作为我的C64仿真器。。。我不知道这是否重要 这是我得到的结果的图像 这是我的代码Assembly 6502汇编中位图的绘制,assembly,bitmap,6502,commodore,Assembly,Bitmap,6502,Commodore,所以我一直在尝试在6502中绘制位图(用于Commodore 64)。 当我将图像加载到address2000时,它工作正常,但只要尝试另一个地址,如2400,它就不再工作了 另外,我使用CBM prg Studio作为我的IDE,而Vice作为我的C64仿真器。。。我不知道这是否重要 这是我得到的结果的图像 这是我的代码 *=$0801 BYTE $0E, $08, $0A, $00, $9E, $20, $28 BYTE $32, $33,
*=$0801
BYTE $0E, $08, $0A, $00, $9E, $20, $28
BYTE $32, $33, $30, $34, $29, $00, $00, $00
*=$0900
; **************************************************************
; VARIABLES
; **************************************************************
TITLE_CHARMEM = $4340
TITLE_COLRMEM = $4728
TITLE_BACKMEM = $4B10
; **************************************************************
; 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 #$00
TITLE
; Load the image and store it in memory
; -- Image data
lda TITLE_CHARMEM,x
sta $0400,x
lda TITLE_CHARMEM + $0100,x
sta $0500,x
lda TITLE_CHARMEM + $0200,x
sta $0600,x
lda TITLE_CHARMEM + $0300,x
sta $0700,x
; -- Color data
lda TITLE_COLRMEM,x
sta $D800,x
lda TITLE_COLRMEM + $0100,x
sta $D900,x
lda TITLE_COLRMEM + $0200,x
sta $DA00,x
lda TITLE_COLRMEM + $0300,x
sta $DB00,x
inx
bne TITLE
lda #$19
sta $D018
FOREVER
jmp FOREVER
*=$23FE ; 2400 - 2 bytes for the header
INCBIN "bitmaps/title.prg"
*=$0801
字节$0E、$08、$0A、$00、$9E、$20、$28
字节$32、$33、$30、$34、$29、$00、$00、$00
*=$0900
; **************************************************************
; 变量
; **************************************************************
TITLE_CHARMEM=4340美元
头衔=4728美元
TITLE_BACKMEM=$4B10
; **************************************************************
; 宏
; **************************************************************
; **************************
; 键盘等待
defmkeywait;参数:[键]
@WAITLOOP
lda#$CB
cmp/1
bne@WAITLOOP
endm
; **************************
; 印刷品
defm打印;参数:[字符串]
lda#/1
jsr$AB1E
endm
; **************************************************************
; 游戏代码
; **************************************************************
初始化
lda#%00111011;启用位图模式
sta$D011
lda#%11011000;启用多色模式
sta$D016
lda标题_BACKMEM;从中加载背景数据
sta$D020;将其存储在后台地址中
sta$D021
ldx#00美元
标题
; 加载图像并将其存储在内存中
; -- 图像数据
lda TITLE_CHARMEM,x
sta$0400,x
lda标题\u CHARMEM+$0100,x
sta$0500,x
lda头衔+0.2万美元,x
sta$0600,x
lda头衔+字符+0300美元,x
sta$0700,x
; -- 颜色数据
lda标题_COLRMEM,x
sta$D800,x
lda头衔+现金+0100美元,x
sta$D900,x
lda头衔+现金+0200美元,x
sta$DA00,x
lda头衔+现金+0300美元,x
sta$DB00,x
因克斯
bne标题
lda#19美元
sta$D018
永远
永远的jmp
*=$23FE;2400-标头的2个字节
INCBIN“位图/标题.prg”
当我将图像加载到adress 2000时,它工作正常,但只要尝试其他地址(如2400),它就不再工作
这是你的答案。位图需要位于视频芯片读取位图的同一地址。通常那个地址是2000美元,但可以更改
同样,颜色必须始终位于地址$d800处。此地址在硬件中是固定的。您忘记调整目标地址了吗?不清楚title.prg中有什么,它是否有全屏转储?我不太确定什么是全屏转储(如果你问它是否有整个屏幕的数据,那么是的)。但是我已经导出了title.prg,以便其字符、颜色和背景位置与代码中的变量匹配。我也不知道你说的目标地址是什么意思。位图屏幕是2000美元。如果你有一个全屏图像,它必须位于那里。是的,这是正确的。该图像由屏幕内存$0400、颜色$d800和位图$2000组成。所有这些都是固定的(银行设置除外)。为了更准确:位图的地址必须是$2000的倍数,不能是$0000或$8000(因为下半部分将使用内置字符ROM)。显然,位图必须在VIC使用的4000美元银行中,所以2000美元是第0银行中唯一有效的地方。