Commodore 64 Sprite无法显示问题排查求助(附汇编代码)
Commodore 64汇编Sprite不显示问题排查与修复
以下是你的代码中导致Sprite无法正常显示的关键问题及修复方案:
核心错误点
- Sprite指针未完整配置:Sprite 0( paddle)的指针存储在
$07F8,Sprite 1(ball)的指针存储在$07F9。你仅给$07F8赋值#$20,但未设置$07F9的#$21,导致系统无法定位球的Sprite数据。 - Sprite颜色寄存器遗漏:仅设置了Sprite 0的颜色寄存器
$D028,Sprite 1的颜色寄存器$D029未赋值,球会使用默认颜色(可能与背景色一致,导致不可见)。 - Sprite数据末尾冗余字节:每个Sprite的图形数据固定为64字节,你在两组Sprite数据末尾添加的
$01会破坏图形结构,必须删除。 - 重复赋值冗余:连续两次给
$D027(Sprite 0颜色寄存器)赋值,第二次的#$01覆盖了第一次的#$21,虽不影响显示,但属于无效代码。 - 主循环X寄存器逻辑错误:颜色循环中的
resetx分支直接强制将X置0,导致Sprite 0的颜色永远无法变化,需调整为仅在X达到$0F时重置。
修正后的完整代码
* = $1000 jsr init jsr mainloop init: jsr $E544 ; KERNAL清屏例程 ; 设置Sprite指针:Sprite0在$2000,Sprite1在$2100 lda #$20 sta $07F8 lda #$21 sta $07F9 ; 设置Sprite颜色:Sprite0为白色,Sprite1为白色 lda #$01 sta $D027 lda #$01 sta $D029 lda #$30 ; paddle的X坐标 sta $D000 lda #$20 ; paddle的Y坐标 sta $D001 lda #$A0 ; 球的X坐标 sta $D002 lda #$64 ; 球的Y坐标 sta $D003 lda #%00000011 ; 启用Sprite0和Sprite1 sta $D015 rts mainloop: wait: iny cpy #$ff beq nowait jmp wait nowait: ; 循环改变Sprite0颜色 cpx #$0f beq resetx inx stx $D028 jmp color_done resetx: ldx #$00 stx $D028 color_done: ; 读取右键(右箭头) lda $DC01 and #%00001000 beq If_right ; 读取左键(左箭头) lda $DC01 and #%00000100 beq If_left jmp mainloop ; 无按键时直接回到主循环 If_left: lda $D000 sec sbc #$01 sta $D000 jmp mainloop If_right: lda $D000 clc adc #$01 sta $D000 jmp mainloop jmp mainloop * = $2000 !byte $00,$00,$00,$00,$38,$00,$00,$38 !byte $00,$00,$38,$00,$00,$38,$00,$00 !byte $38,$00,$00,$38,$00,$00,$38,$00 !byte $00,$38,$00,$00,$38,$00,$00,$38 !byte $00,$00,$38,$00,$00,$38,$00,$00 !byte $38,$00,$00,$38,$00,$00,$38,$00 !byte $00,$38,$00,$00,$38,$00,$00,$38 !byte $00,$00,$38,$00,$00,$00,$00,$00 * = $2100 !byte $00,$00,$00,$00,$00,$00,$00,$00 !byte $00,$00,$00,$00,$00,$00,$00,$00 !byte $00,$00,$00,$00,$00,$00,$fe,$00 !byte $00,$fe,$00,$00,$fe,$00,$00,$fe !byte $00,$00,$fe,$00,$00,$fe,$00,$00 !byte $fe,$00,$00,$00,$00,$00,$00,$00 !byte $00,$00,$00,$00,$00,$00,$00,$00 !byte $00,$00,$00,$00,$00,$00,$00,$00
内容的提问来源于stack exchange,提问作者Karolina Sadowska
相关产品推荐
相关产品推荐

