返回

文章详情

10 REM"_(C2SLFF4

Hacker News2026年7月22日 11:58

2026年7月21日 让我们深入探讨《巫师的城堡》(源代码)!10 REM"_(C2SLFF4 这是80年代微型计算机BASIC游戏《巫师的城堡》的第一行,最初是为Exidy Sorcerer平台编写的。这是一个REM语句,即该特定语言中的注释。如果你对有这种东西的语言不熟悉,10是行号。但有趣的部分是这个"_(C2SLFF4混乱。这是一个拼写错误还是垃圾?不。这在1980年7月的《休闲计算》期刊中公开的源代码中逐字出现。那到底是什么呢?注意:我将跳回跳去使用十进制(对BASIC友好)和十六进制(对程序员友好)。十六进制前缀为0x,后缀为h,或者明显包含数字A-F。注意:感谢我的黑客同伴Josh和Chris,他们在模拟器和研究工作上做了大量工作。虽然耗时数小时,但那是值得的。不然没有他们的帮助,我的工作量将是十倍。怀疑这是源代码的更多上下文,但无关的部分已被删除,并添加了一些空格的内容:10 REM"_(C2SLFF4 40 POKE 260,218: POKE 261,1: T = USR(0): T = PEEK(-2049) 在BASIC中,:是命令分隔符。POKE向指定内存位置写入一个字节值。PEEK从一个指定的位置读取。Sorcerer BASIC显然使用的是有符号16位数字,因此地址-2049为65536-2049或0xF7FF的十六进制形式。我们稍后将再提到该地址。使用负数调用伪随机数生成器(PRNG)RND()可以给它种子。旧的PRNG喜欢使用奇数作为种子,因此2*T+1表达式强制它为奇数。USR()函数调用一个机器代码例程。而且行80是T从PEEK()初始化后的第一次使用。这些东西的接近性让它们看起来与种子PRNG有关。Sorcerer BASIC没有RANDOMIZE命令,因此当时的唯一选择是:让用户输入一个随机种子。运行一个递增循环,直到用户按下一个键(或一些用户驱动的操作),并将其用作种子。从现有软件和/或硬件获取某种随机东西的种子。《巫师的城堡》没有做前两种。因此这一定是最后一种。REM语句是否包含机器代码,恰好编码为ASCII文本?Sorcerer的确使用了ASCII编码。但从ASCII字符中得到有用的Z80机器代码似乎有些疯狂。对吗?然而,这似乎是一个足够合理的疯狂假设,以便运行并看看能找到什么。USR()函数USR()调用很有趣——它调用一个机器代码函数,但细节是系统依赖的。但幸运的是,互联网上有大量的技术手册,我们能够找出它。地址259具有JP指令(无条件跳转)到一个16位小端绝对地址。而POKE是用于地址260和261的。这是USR()函数的跳板。您将机器代码的起始地址POKE到地址260和261中,然后运行USR()以调用它。40 POKE 260,218: POKE 261,1: T = USR(0): T = PEEK(-2049) 将其逆转为小端,这意味着我们查看的地址为(1 << 8) | 218,即474。当我们运行USR(0)时,它跳转到应以RET指令结尾的地址474的机器代码。USR()的参数(0)存储为RAM中的4字节浮点数,以便机器代码在需要时可以查看它。结果表明在该用例中并不相关。此外,我们将USR()的返回值分配给T,但我仍不清楚这个返回值是什么。但这是无关紧要的,因为我们立即用下一个赋值覆盖了T。那么……地址474上有什么呢?BASIC RAM当您输入一行Sorcerer BASIC时,解释器对其进行词法分析,并将PRINT等命令替换为单字节值:PRINT被词法分析为0x97,REM被词法分析为0xC3等等。然后,它以链表的形式存储在内存中,其中每一行都是一个“节点”。节点格式为:2字节的“下一个”指针 2字节的行号 表示词法分析后的代码行的字节 1字节的null终止符(0x00字节) 而该链表在Sorcerer中从地址469开始。让我们再看看那个神秘的行:10 REM"_(C2SLFF4 这意味着该行的节点由以下地址和字节组成:469 下一个指针的低字节 470 下一个指针的高字节 471 行号的低字节 472 行号的高字节 473 `REM`标记(0xc3) 474 `REM`文本的首字节,`"`字符!!而474是我们进入的USR()函数的位置!它实际上是将REM语句的文本作为Z80机器代码调用!反汇编,尝试一次 这可能是真的吗?让我们试一下!以下是ASCII字符的十六进制值:" 22 _ 5F ( 28 C 43 2 32 S 53 L 4C F 46 F 46 4 34 最后有结束的0x00终止符,但那只是Z80中的NOP,因此我们将忽略它。反汇编后,我们得到:22 5

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡