10 REM"_(C2SLFF4

10 REM"_(C2SLFF4

Hacker News 摘要

原标题:10 REM"_(C2SLFF4

这篇文章探讨了 80 年代经典电脑游戏 The Wizard's Castle(巫师城堡)源代码开头第一行中一段神秘注释的来源。

这段代码出现在 1980 年 7 月号的 Recreational Computing 杂志上。游戏是为 Exidy Sorcerer 电脑编写的,其第一行内容为 10 REM"_(C2SLFF4。由于 REM 是 BASIC 语言中的注释标记,这段看起来像乱码或输入错误的文字引发了作者及其技术伙伴的好奇。

作者通过深入研究和模拟器实验,揭示了这一串字符背后的技术真相:

这段注释其实是一段 Z80 机器语言程序。在 Exidy Sorcerer 电脑中,BASIC 解释器会将每一行代码存放在内存中。当程序运行到特定指令时,会通过 USR() 函数跳转到地址 474。而地址 474 正好是这一行 REM 注释文字在内存中开始存放的位置。这意味着电脑直接把这段看起来像文字的内容当作指令来执行。

这段机器码的核心功能是模拟随机数生成器的种子。当时的 Sorcerer BASIC 没有内置的随机化命令。为了让每次游戏生成的地下城地图都不一样,开发者编写了这段微型程序:

1. 它读取 Z80 处理器内部的 R 寄存器。该寄存器的值随着指令周期快速变化,对人类而言是随机的。

2. 它检查该值是否为 0,如果是则重新读取。

3. 它将获取到的非零随机值存入内存地址 0xF7FF。

4. 随后,BASIC 程序的下一行代码会使用 PEEK(-2049)(即 0xF7FF)读取这个随机值,并将其作为随机数种子的基础。

关于为什么代码显示为乱码,作者发现这与字符编码有关。在 80 年代,许多非 ASCII 字符或高位字节在屏幕上会显示为特定的图形。作者通过手动在内存中写入机器码字节,然后列出代码清单,成功复现了与杂志上一模一样的神秘字符:

• 字节 237 和 95 对应了 "_

• 字节 247 比较特殊,它在显示时会被拆解成 LF 两个字符。

• 字节 201(对应机器码的返回指令 RET)在显示时则变成了 F4

这一发现解释了为什么简单的机器码会变成一长串奇怪的字符。同时也揭示了一个有趣的局限性:由于 R 寄存器只增加低 7 位,这意味着这款游戏在 Exidy Sorcerer 上其实只能生成 127 种不同的地下城。

作者总结认为,当年读者如果仅仅按照杂志打印出的字面意思去输入代码,程序可能无法正常工作。开发者很可能是先在内存中直接写入了机器码,然后再将其作为程序导出发布。这种将机器码隐藏在注释中的做法,是早期计算机资源匮乏时代程序员为了节省空间和实现特殊功能而使用的黑科技。


原文:https://beej.us/blog/data/mystery-comment/

评论:https://news.ycombinator.com/item?id=49005329

Report Page