从 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?

提问人:Sir Muffington 提问时间:6/7/2023 更新时间:11/2/2023 访问量:72

问:

这是 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 文件。

基本 8 位 Z80 逆向计算 ZXSorcture

评论

4赞 the busybee 6/8/2023
因此,涉及的步骤是:1)了解标记的语句在源BASIC中的作用。2)对于每个,在目标BASIC中找到一个等效的结构。3)相应地更改程序。-- 请您编辑您的问题并向我们展示您的尝试吗?-- 当你在使用它时,一些指向相应BASIC手册的链接也会有所帮助。

答:

2赞 karttu 11/2/2023 #1

这是我试图破解这个坚果的尝试。

问题 1

dump.bas:182: error: Syntax Error. Unexpected token 'INT' <INT>
6220 GO TO 6221 ; INT(RND*3)*4

分号在 BASIC 中通常不是运算符或标记,语句除外。此外,这是下一行,这毫无意义 - 不会有任何行可以跳过。此外,它只是挂在那里。所有这些都意味着这可能是一个跳转表实现。PRINTGO TOINT(RND*3)*4

Sinclair BASIC 返回值 [0,1) ,因此将产生值 0、4 或 8。您提到代码可能已损坏,这很可能是旧磁带。十六进制的分号值是 0x3B,加号的值是 0x2B - 这是一点的区别。RNDINT(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 上工作的示例。前两行是其下方程序的输出。彩色强调是我添加的。

ZX BASIC example program 1

问题 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$LIF L=0LIF K<L

ZXSpectrum 48k BASIC示例:

ZX BASIC example program 2

总结

BASIC方言变化很大,许多(大多数?)程序不容易从一个环境移植到另一个环境。如所提到的问题中所建议的,最好的做法是在模拟器中运行程序。

当您写问题时,请尽可能多地包含相关信息和背景。这三个问题很容易被发现,但如果我至少有围绕第一行的代码,它会节省一些时间。GO TO

最后,没有“Z80 BASIC”或“Z80编译器”。我认为您可能正在使用 boriel/zxbasic,但您肯定应该提到您在哪个环境中遇到了问题。

附言

祝你好运,恢复你父亲的代码。我认为这是一个好主意,我希望你能设法让它运行起来!

评论

1赞 Sir Muffington 11/5/2023
感谢您的见解。如何解决问题 2 和 3?我设法通过反复试验自己解决了问题1,所以你的解决方案与我的解决方案相同。
0赞 karttu 11/6/2023
@SirMuffington 不客气!同样,在没有看到更多代码的情况下,假设您使用的是不兼容的类似 Sinclair 的 BASIC,这有点像是黑暗中的镜头。对于问题 2,您可以使用值 创建一个字符串变量,该变量的值在 7040 之前设置,或者将 an 附加到该行。对于问题 3,您需要重命名 .ZX BASIC允许非字符串变量的长度超过一个字母,例如。.确保将所有出现的 替换为 。r(e)IF r(e)=1 PRINT "__"LLLLLL
0赞 karttu 11/6/2023
如果您需要更详细的帮助,请针对每个问题提出一个新问题(可能在逆向计算社区上):“如何更改此特定于 Sinclair BASIC 的代码以在非 Sinclair BASIC 上运行?