关于「文曲星」的一些记忆 (一)

事情的起因是这样的: 前几天看到了《什么值得买》上的一篇怀旧晒单: 《【怀旧族】你还记得文曲星吗? 》, 高中时我也是文曲星使用者的一员, 我想起以前文曲星的那些论坛, 就去搜索了一下, 基本上全部都倒掉了 (官方也未能幸免啊), 看起来文曲星果然是没落了. 然后搜索到了这一篇博文: 《纪念我逝去的文曲星》, 博主也是在文曲星的全盛时期的用家, 这篇文章看完我亦感同身受, 于是噼里啪啦在微博刷了一通屏, 再把刷屏的内容整合一下, 就成了这篇博文.

我的文曲星应该是在初二或者初三的时候入手的, 那个时候还不了解电子词典的功能什么的, 完全是初中时的小伙伴推荐的, 似乎理由是可以写 BASIC (好像还强调了红外线功能), 于是以学习的名义向父母申报了购买文曲星 NC2600C, 这个东西看起来是这个样子的:

文曲星 NC2600C

还有这个样子的:

文曲星 NC2600C

怎么样, 是不是一种笔记本式的的高大上感觉啊?

尽管这台小小的设备的配置在现在看来简直低到不行 (6502 系 CPU、数十 MB ROM、数 KB 内存、160*80 像素点阵屏), 但却支持 GVBASIC、汇编、LAVA 三大程序平台, 特别是 GVBASIC, 是可以直接在文曲星上写完 BASIC 程序然后运行的, 甚至还出现了病毒 :-o , 可玩性不知道比现在那些弱智的学习机点读机高到哪里去了.

一、GVBASIC 篇

GVBASIC, 是金远见公司为文曲星开发的一种 BASIC 变种语言, 文曲星上自带编辑工具以及运行环境, 所以可以随时写 BASIC 程序, 再加上 BASIC 是一种解释型语言, 写完就能立刻执行, 简直秒杀现在的苹果安卓.

以前最喜欢做的一件事, 是用 GVBASIC 做一个伪造的英汉查词界面, 只要有人问我借文曲星, 我就先打开这个程序, 一旦按下一个键就开始死循环 BEEP (扬声器鸣叫), 基本上上课的时候都会被吓到. 后来同学再问我借文曲星的话, 都要先按一下「英汉」键从假冒程序中跳出, 因为读键值的函数只能检测普通按键, 而不能检测与阻止功能切换键, 所以后来做出了加强版: 直接通过循环 PEEK 读取系统内存的按键值区域, 由于循环时程序是无法通过功能切换键跳出的, 这样即使按下切换键都会一直叫了; 这样做的话还有一个缺点, 可以按「跳出」键强制退出程序, 所以在透过 POKE 指令修改内存某区域, 禁止了「跳出」键功能, 效果简直完美.

用 GVBASIC 做的最大的一个程序, 是已经达到了单文件限制 (貌似是 64KB) 而无法继续编写的一个很无聊的锁屏程序. 这个程序只有一个功能, 就是锁定文曲星…要求用密码才能解锁, 密码错误数次后会强制禁止尝试一段时间 (所以说 iOS 什么的这样的功能都是抄袭我的嘛), 还特别用心的使用了当时流行的 XP 风格, 这可是要一点一点自己画出来的, 看起来效果很好. 密码是可以自定义的, 为了加快速度没有使用系统内建的文件读取函数, 而是直接读写内存; 程序还具有非法退出的记录功能, 如果上次文曲星是通过捅重启键非法退出的, 就会在下次运行时收到警告. 此外, 还有花里胡哨的屏保功能, 写了好几种刷屏方式, 样式多的让人捉不着头脑 :-? .

在这里解释一下 PEEK 和 POKE 指令, 它们用于通过指定地址来直接操作内存. 这是两条黑指令来的, 金远见公司没有公布, 更加不会说明内存各地址的作用, 所以使用者都是乱放数据的, 不小心就导致系统挂掉需要重启, 更加严重的似乎会导致主板坏掉只能送修 (为此官方还出了谨防恶意软件的通知), 真是杀人放火居家必备之良药啊.

此外, 自制的最实用的一款程序是计算器, 除了实现了普通计算器的功能, 还可以对分数约分、加减, 以及小数化分数、小数化根号什么的. 还做过一个小小的探险游戏, 因为想写出一点儿移动画面, 太麻烦半途而废了; 做的最成功的游戏是让一个自由落体的小点在不接触边界、障碍物和自己运动产生的曲线的情况下到达目的地, 颇具难度和趣味.

说一说网上的人一般都做什么样的 GVBASIC 程序吧, 由于 GVBASIC 本身效率很低 (特别是操作屏幕的某些自带函数) 、语言特性不完全 (例如无法自定义函数、缺失一些控制语句等等) 、程序大小有限制, 所以质量上超过汇编与 LAVA 的很少, 发布的程序多为数学辅助工具, 即使有游戏也是用字符画出的界面.

不过在坛子上有人为了证明 GVBASIC 也能做出很炫的效果, 释出了一个打地鼠游戏, 这个游戏不仅有精美的游戏画面, 还有 GVBAISC 苦手们看到碉堡的毫无闪烁的画面平移特效. 但是打开程序的源代码, 只能看见满屏的 PEEK、POKE 黑魔法.

我猜测一下这个程序的原理: 亮瞎狗眼的特效是直接操作显示区缓冲来实现的, 主程序全是内存操作语句, 可能是直接将要运行的机器指令写入了程序运行的区域, 这让 BASIC 程序几乎成为了汇编代码, 所以执行速度 UP, 可读性降为 0.

自此之后, 就有人开始用这个方法丧心病狂的对 GVBASIC 代码加密, 再后来就有了一种折衷的方式: 代码是可读的, 但是中间插入了一些用于验证代码是否被修改的代码, 检测到代码被修改就立刻停止运行. 我只记得 GVBASIC 能够读写文件, 但应该不能直接读取自身, 不过似乎是有办法通过黑指令读写任意文件, 甚至修改当前目录, 所以校验程序自身应该也是不难的.

似乎在这种能够自我校验的 BASIC 程序出现后不久, 文曲星界就没落了, 于是再也没看到过更牛的 GVBASIC 程序了.

关于「文曲星」的一些记忆 (二)