Commodore 64 Kick Assembler消隐边框问题排查与解决
Commodore 64屏幕消隐:Kick Assembler代码适配与问题解决
问题背景
我将一段ACME汇编脚本转换为Kick Assembler语法后,运行出现显示异常,有两个核心疑问:
- 如何修复显示异常问题?
- 自定义代码入口应插入何处,才能有效利用消隐后的屏幕区域?
调试过程与问题现象
- 移除Wait宏后,边框能成功消隐,但屏幕顶部出现光栅线。
- 调整代码并加入摇杆控制精灵的测试逻辑后,精灵可跨越上下边框,但画面出现黑色竖线伪影。
最终解决方案
通过添加以下两行代码,彻底解决了所有显示问题:
lda #$00 sta $3fff
初始转换代码
.macro Wait (v) { ldy #v dey bne *-1 } * = $0801 .byte $0c, $08, $00, $00, $9e, $32, $30, $36, $31, $00, $00, $00 * = $080d lda #$01 sta $3fff sei start: lda #$30 cmp $d012 bne *-3 lda #$00 sta $d011 Wait(24) lda #$0b sta $d011 lda #$31 cmp $d012 bne *-3 lda #$1b sta $d011 Wait(8) bit $ea ldx #$00 loop1: txa sta $d020 sta $d021 Wait(9) inx cpx #254 bne loop1 asl $3fff bne start inc $3fff jmp start
调整后测试代码
* = $0801 BasicUpstart($080d); .label JOYSTICK_2 = $dc00 .label UP = %00000001 .label DOWN = %00000010 .label LEFT = %00000100 .label RIGHT = %00001000 .label FIRE = %00010000 .label JOYSTICK_2_IDLE = %01111111 .label SCREEN_RAM = $0400 .label SCREEN_CLEAR = $e544 .label SCREEN_BORDER_COLOR = $d020 .macro WAIT(duration) { ldy #duration dey bne *-1 } * = $080d lda #150 sta $d000 // Sprite 0的X坐标 lda #230 sta $d001 // Sprite 0的Y坐标 lda #LIGHT_RED sta $d027 // Sprite 0颜色 lda #BLACK sta $d025 // 精灵额外颜色1 lda #WHITE sta $d026 // 精灵额外颜色2 lda #$80 sta $07f8 // Sprite 0指针索引 lda #%00000001 // 启用Sprite 0多色模式 sta $d01c lda #%00000001 // 启用Sprite 0 sta $d015 lda #$01 sta $3fff sei start: lda #$fa cmp $d012 bne *-3 lda #$00 sta $d011 WAIT(22) lda #$1b sta $d011 jsr gameLoop /* loop1: txa sta $d020 sta $d021 WAIT(9) inx cpx #254 bne loop1 asl $3fff bne start inc $3fff jmp start*/ gameLoop: ldx #0 slowDownLoop: nop nop nop nop nop nop nop nop inx cpx #255 bne slowDownLoop jsr readJoystick_2 jsr start readJoystick_2: lda JOYSTICK_2 // $dc00 cmp #JOYSTICK_2_IDLE // %01111111 beq joy2_IDLE jmp checkJoy2_UP joy2_IDLE: checkJoy2_UP: lda JOYSTICK_2 and #UP beq joy2_UP jmp checkJoy2_DOWN joy2_UP: dec $d001 checkJoy2_DOWN: lda JOYSTICK_2 and #DOWN beq joy2_DOWN jmp checkJoy2_LEFT joy2_DOWN: inc $d001 checkJoy2_LEFT: lda JOYSTICK_2 and #LEFT beq joy2_LEFT jmp checkJoy2_RIGHT joy2_LEFT: dec $d000 checkJoy2_RIGHT: lda JOYSTICK_2 and #RIGHT beq joy2_RIGHT jmp checkJoy2_FIRE joy2_RIGHT: inc $d000 checkJoy2_FIRE: lda JOYSTICK_2 and #FIRE beq joy2_FIRE jmp doneReadJoystick_2 joy2_FIRE: inc SCREEN_BORDER_COLOR doneReadJoystick_2: rts *=$2000 .import binary "testGuy.bin"
内容的提问来源于stack exchange,提问作者Black.Jack
相关产品推荐
相关产品推荐

