模拟器中Z80汇编+BASIC实现快速屏幕绘制遇黑屏问题求助
问题根因
- 汇编代码拷贝方向完全颠倒
ZX Spectrum的显存起始地址为16384($4000),整屏数据共6912字节。你当前的汇编逻辑是把未初始化的30000地址空间数据写入显存,30000地址初始值全为0,写入后自然呈现黑屏。
正确逻辑应该是:先做一次「显存到备份地址」的拷贝,存下彩色Hello的屏幕数据,清屏后再做一次「备份地址到显存」的拷贝,才能复现目标画面。 - 操作步骤时序错误
你编写的BASIC是死循环打印代码,运行过程中直接调用汇编无法获取有效屏幕数据,需要先终止BASIC运行,确认屏幕已经铺满彩色Hello内容后再执行备份操作。 - 备份地址有效性问题
需要确认30000地址空间未被BASIC程序、系统变量或其他加载的tap文件占用,否则备份的屏幕数据会被覆盖或者本身为无效数据。
解决方法
1. 修改汇编代码,分别编写备份、恢复两个程序
备份程序(先运行该程序存储屏幕数据):
ORG 50000 ; 备份程序入口地址 LD HL, 16384 ; 源地址为显存起始位置 LD BC, 6912 ; 全屏幕数据长度 LD DE, 30000 ; 目标地址为备份存储区域 LDIR RET
恢复程序(清屏后运行该程序还原画面):
ORG 50010 ; 恢复程序入口地址,和备份程序偏移10字节避免覆盖 LD HL, 30000 ; 源地址为备份存储区域 LD BC, 6912 ; 全屏幕数据长度 LD DE, 16384 ; 目标地址为显存 LDIR RET
2. 调整操作步骤
- 将修改后的两个汇编程序共同转换为tap文件,加载到模拟器
- 输入调整后的BASIC代码,避免手动终止死循环:
40 PRINT INK INT (RND*8); PAPER INT (RND*8); "Hello"; 50 IF PEEK 23672 < 100 THEN GO TO 50 : REM 铺满屏幕后自动停止 - 运行BASIC程序,等待屏幕完全铺满彩色Hello后自动停止
- 执行
RANDOMIZE USR 50000调用备份程序,将当前屏幕数据存入30000地址 - 执行
CLS清屏,此时屏幕为空 - 执行
RANDOMIZE USR 50010调用恢复程序,即可快速还原彩色Hello画面
内容的提问来源于stack exchange,提问作者Ghoul Fool
相关产品推荐
相关产品推荐

