You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Z80汇编双字符精灵右移仅上半部分移动问题咨询

问题根源分析

你的猜测方向是对的,问题本质是两个核心逻辑没有同步处理精灵上下两部分的属性:
你定义的PLAYER段是两行ZX Spectrum的PRINT AT控制序列,每行固定4字节:控制码22, Y坐标, X坐标, 字符码,结构如下:

PLAYER      DEFB 22, 12, 15, 144 ; 上半部分:偏移2存X坐标,偏移3存字符码
            DEFB 22, 13, 15, 145 ; 下半部分:偏移6存X坐标,偏移7存字符码

1. 右移逻辑只更新了上半部分X坐标

你当前的GORIGHT逻辑只修改了PLAYER+2(上半部分的X坐标存储地址),下半部分的X坐标存储在PLAYER+6的位置,完全没有被修改,所以下半部分永远停留在初始的X=15位置。

2. 擦除逻辑只处理了上半部分字符

你当前的UNDRAW逻辑只把PLAYER+3(上半部分的字符码)改为空格,下半部分的字符码存储在PLAYER+7的位置,擦除时还是保留原UDG字符145,所以旧位置的下半部分不会被清空。

你之前的LD BC, EOPLAYR-PLAYER长度设置是完全正确的,确实覆盖了两行共8字节的打印内容,问题出在待打印的内容本身的坐标、字符值没有同步修改,和打印长度无关。


修复方案

修复右移逻辑

GORIGHT     LD A, (PLAYER+2)  ; 用上半部分X坐标做边界判断
            CP 31
            JR Z, MAINLP      
            CALL UNDRAW
            LD A, (PLAYER+2)  ; 上半部分X坐标+1
            INC A             
            LD (PLAYER+2), A
            LD (PLAYER+6), A  ; 新增:同步把下半部分X坐标也+1
            JR MAINLP

修复擦除逻辑

UNDRAW      LD A, " "            
            LD (PLAYER+3), A   ; 上半部分字符改为空格
            LD (PLAYER+7), A   ; 新增:下半部分字符也改为空格
            CALL PRTPLAY       ; 擦除所有旧位置残留
            LD A, 144          
            LD (PLAYER+3), A   ; 恢复上半部分UDG字符
            LD A, 145
            LD (PLAYER+7), A   ; 新增:恢复下半部分UDG字符
            RET

内容的提问来源于stack exchange,提问作者Ghoul Fool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:15:02