《巫师城堡》是80年代一款知名的微型计算机BASIC游戏,最初为Exidy Sorcerer平台编写,其源代码曾刊载于1980年7月的《Recreational Computing》杂志。如果你翻开这份泛黄的代码清单,第一行就会看到一串难以理解的字符:

10 REM"_(C2SLFF4

打开网易新闻 查看精彩图片

在BASIC语言里,REM代表注释,本应是程序员写给人类阅读的说明,后面却跟了一串看似是乱码的字符。这并非打字错误或印刷瑕疵,它原封不动地出现在杂志发布的原始代码中,诱发了技术考古者们一连串大胆的猜测和跨平台的逆向工程。

打开网易新闻 查看精彩图片

代码后续的几行提供了更关键的线索。第40行先用POKE指令向内存地址260和261分别写入了数值218和1,然后调用USR(0)函数。在Sorcerer BASIC中,USR函数专门用来执行机器码,而内存地址259处存放的是一条无条件跳转指令。POKE操作的本质,就是设定了一个跳板:先把机器码程序的入口地址写入指定位置,再通过调用USR让系统跳转到那里执行。两个值按小端序反转后,指向了地址474。

这套组合动作与随后一行用PEEK函数从-2049地址读取数值、并用于初始化随机数生成器的行为挨得太近,很难不被看作是同一个目的的不同环节。旧时代的伪随机数算法偏爱奇数种子值,于是程序特意用2*T+1的表达式将数值强制转换为奇数再传给RND。这让人怀疑,那段形同乱码的REM注释里,其实嵌入了某种能够生成种子的机器码。

打开网易新闻 查看精彩图片

当时Sorcerer计算机确实使用ASCII编码,但用纯ASCII字符凑出一段能正常工作的Z80机器码,听起来像是一个疯狂的假设。也只有抱着这种足够疯狂的假设去调查,才能发现这行“注释”恰恰是一个穿越了40年时光的软工技巧,把极具功能性的底层指令伪装成了人畜无害的注释文本。