提问人:Sir Muffington 提问时间:6/7/2023 更新时间:11/2/2023 访问量:72
从 Santaka ZX Spectrum 克隆代码移植到 Z80 以编译 Santaka 游戏 - 如何翻译成这种方言?
Porting from Santaka ZX Spectrum clone code to Z80 to compile a Santaka game - how to translate to this dialect?
问:
这是 https://retrocomputing.stackexchange.com/questions/27077 的延续
我正在尝试将我父亲的游戏移植到 Z80 编译器中。我已经设法阅读了教程和其他资源(如其他BASIC编程示例)来解决编译游戏的原始问题,但我仍然没有解决:
dump.bas:182: error: Syntax Error. Unexpected token 'INT' <INT>
6220 GO TO 6221 ; INT(RND*3)*4
dump.bas:206: error: Operator AND cannot be used with STRINGS
7040 PRINT AT y(e)-1,x(e)+1;"__" AND r(e)=1
dump.bas:291: error: Cannot convert value to string. Use STR() function
dump.bas:292: error: Cannot convert value to string. Use STR() function
9992 READ L$: LET L=LEN L$: LET S=0: LET K=2: LET N=N+1
9993 IF L=0 THEN RETURN
dump.bas:295: error: Cannot convert string to a value. Use VAL() function
9996 IF K<L THEN POKE A,C: LET S=S+C: LET K=K+2: LET A=A+1: GO TO 9994
因此,对于第一个错误,分号无法识别。是否可以在 Z80 的 BASIC 方言中更改此代码以使其运行?对于每一行,我都添加了相应的代码,除非一行有两行。
这似乎是一种特定的方言,我如何将其移植到 zxbasic 编译器(Z80)?
或者此代码是否因使用错误的 TAP 转换器而损坏?
我还录制了一盘磁带.WAV 文件。
答:
这是我试图破解这个坚果的尝试。
问题 1
dump.bas:182: error: Syntax Error. Unexpected token 'INT' <INT>
6220 GO TO 6221 ; INT(RND*3)*4
分号在 BASIC 中通常不是运算符或标记,语句除外。此外,这是下一行,这毫无意义 - 不会有任何行可以跳过。此外,它只是挂在那里。所有这些都意味着这可能是一个跳转表实现。PRINT
GO TO
INT(RND*3)*4
Sinclair BASIC 返回值 [0,1) ,因此将产生值 0、4 或 8。您提到代码可能已损坏,这很可能是旧磁带。十六进制的分号值是 0x3B,加号的值是 0x2B - 这是一点的区别。RND
INT(RND*3)*4
因此,我敢打赌这条线应该是:
6220 GO TO 6221 + INT(RND*3)*4
您父亲的代码会随机跳转到 6221、6225 或 6229,通过查看更多代码很容易验证。
问题 2
dump.bas:206: error: Operator AND cannot be used with STRINGS
7040 PRINT AT y(e)-1,x(e)+1;"__" AND r(e)=1
Sinclair BASIC允许与字符串一起使用。它是一个内联条件,声明仅当条件返回非零时才输出字符串。
这在 ZXSpectrum BASIC 编程手册的第 13 章中进行了描述。我想说的是,您正在使用的BASIC环境(您没有指定哪个环境)与ZXSpectrum BASIC不兼容。AND
关于如何在 ZXSpectrum 48k BASIC 上工作的示例。前两行是其下方程序的输出。彩色强调是我添加的。
问题 3
dump.bas:291: error: Cannot convert value to string. Use STR() function
dump.bas:292: error: Cannot convert value to string. Use STR() function
9992 READ L$: LET L=LEN L$: LET S=0: LET K=2: LET N=N+1
9993 IF L=0 THEN RETURN
dump.bas:295: error: Cannot convert string to a value. Use VAL() function
9996 IF K<L THEN POKE A,C: LET S=S+C: LET K=K+2: LET A=A+1: GO TO 9994
在这里,我相信您的 BASIC 环境与 ZXSpectrum BASIC 不兼容,它允许使用相同的标识符命名数字和字符串变量。
第 9992 行将 DATA 定义读入字符串,然后将字符串长度分配给数字变量。这也许令人困惑,但在ZX BASIC中有效。第 9993 行的错误是您使用的 BASIC 实现认为这是一个字符串的结果。与第 9996 行相同。L$
L
IF L=0
L
IF K<L
ZXSpectrum 48k BASIC示例:
总结
BASIC方言变化很大,许多(大多数?)程序不容易从一个环境移植到另一个环境。如所提到的问题中所建议的,最好的做法是在模拟器中运行程序。
当您写问题时,请尽可能多地包含相关信息和背景。这三个问题很容易被发现,但如果我至少有围绕第一行的代码,它会节省一些时间。GO TO
最后,没有“Z80 BASIC”或“Z80编译器”。我认为您可能正在使用 boriel/zxbasic,但您肯定应该提到您在哪个环境中遇到了问题。
附言
祝你好运,恢复你父亲的代码。我认为这是一个好主意,我希望你能设法让它运行起来!
评论
r(e)
IF r(e)=1 PRINT "__"
L
LL
L
LL
评论