假如1990年的中国青少年有一台68K学习机

上篇写《终极三国》的时候,我顺手把1997年国产游戏的一轮衰退,归到了《血狮》头上。宣传失实,品质低劣,玩家失去信任,渠道跟着退缩,几家开发公司先后退出。这套故事讲起来很顺,也很容易让人记住。

顺着它再往前问一步:《血狮》为什么会做成那个样子?因为会做游戏的人不够。为什么人不够?因为中国少年没有欧美那批程序员的技术成长路径。再往前推:假如他们更早有一台能随便编程的电脑,会怎样?

先叠个甲:这条因果链是错的。或者说,它把复杂的产业史压成了几步过分省事的推导。《血狮》不是行业衰退的唯一主因;项目做砸了,也不等于全国找不出合格程序员;有了电脑,更不保证孩子会学编程、长大后就会做游戏。资金、管理、发行、盗版、购买力,哪一样都绕不过去。

但本文就是想借这条不成立的推导,往下做一场技术幻想。你可以把后面的“因为”“所以”,都理解成这个假设世界里的路标。我想象的不是一项足以改写游戏史的政策,而是一台我很希望自己小时候能摸到的机器。

假如1990年的中国青少年,有一台基于世嘉MD的68K学习机。

从《血狮》往前倒着想

《血狮》很适合当这场幻想的起点。它把几个问题挤在了一起:对开发难度估计不足、项目经验欠缺、宣传跑在产品前面,最后把一个本该完成的游戏,变成了一段所有人都记得的失败。

不过,叙事上的分量和实际的产业影响,毕竟是两回事。“一个烂游戏让全国玩家从此不买国产”这种说法,需要当年的销售、渠道和用户材料来支持,不能光靠后来反复讲这个故事。

那么,先把其他原因放在一边,姑且挑出“经验不足”这一条,继续往前倒。

做游戏的经验怎么来?总不能指望一个人在上班第一天,突然就知道游戏循环怎么写、内存怎么分、图像怎么画、声音怎么放。很多东西得在没人催进度、没人等着发工资的时候,自己折腾过一遍。

许怡然2009年那篇《网游创业失败全攻略》,讲的是另一阶段的创业问题,但其中关于技术经验、团队磨合和失败教训的讨论,仍然让人心有戚戚。尤其是这个提醒:一个团队不熟悉的那部分技术,足以拖垮整件事。

我幻想的技术路径,就是想把一部分“头一次犯的错”,提前到少年时代去犯。那时写坏了,损失的是一个周末,不是一家公司的工资。

欧美那批人,小时候拿什么练手

说到这个,最容易想到的自然是欧美家用电脑那条路。

开机进入BASIC,照着杂志上的程序清单敲,敲错了找错,跑起来以后改两行。开始只是想让屏幕上的东西动一动,后来嫌BASIC慢,就学机器码和汇编;想把程序留到明天,就学存盘;想让别人也玩到,就把磁带或软盘寄出去。

这条路最有意思的地方,是每一步都能给下一步一个理由。学编程不一定先有个宏大的目标,也可以只是因为自己写的小人跑得太慢。

Oliver双胞胎的自述就很具体:先用哥哥的ZX81折腾BASIC,再攒钱买Dragon 32,后来换BBC Micro,边上学边写游戏。Ian Bell也在自己的主页上保留着他和David Braben为BBC Micro编写《Elite》的资料。今天回头看是名作,当时往前走,也是一份程序、一份程序地写。

后来做《DOOM》的罗梅罗,也经历过这条路。他的个人简介写到,1979年开始接触大型机,1982年转向Apple II;他在访谈里回忆,1988年花了大约两个月,在Apple II上做出《Dangerous Dave》。从摸机器到成为职业开发者,中间有好几年可以自己折腾。

当然,这些是后来出了名的人,有幸存者偏差。买了家用电脑的孩子,也完全可以只拿它玩游戏。我羡慕的,是对其中想再往前走一步的人,机器没有拦着他。

不过,这不妨碍我羡慕那种条件:一台机器,既能玩别人的游戏,也能写自己的游戏;写完能保存,保存后能给别人。读者、玩家、作者,几种身份之间没有一道必须另买设备才能跨过去的墙。

现在把这条路径搬回中国。假如人才少,是因为这样的练手机会不够,那最直观的幻想,自然就是提前给孩子一台这样的机器。

问题是:中国并非完全没有过。

中国自己的学习机,差在哪里

80年代进入国内学校的微机,并不只有一条路线。Laser 310和中华学习机,是其中比较容易让人想起来的两种。

Laser 310是伟易达的Z80家用电脑,有BASIC,也能接磁带存程序。它和许多CP/M电脑用了同一类CPU,不过内存布局、磁盘接口和系统环境另有自己的安排。收藏机构的实物目录保留了这台机器的记录。

中华学习机CEC-I则是Apple II兼容路线,6502A、64KB RAM,内置BASIC和LOGO。英国计算机历史博物馆保留了实物与配置记录。它能运行游戏,也有存储和扩展的办法,从硬件路线来说,已经有了家用微机的底子。

但“兼容Apple II”,又不等于把美国孩子面前的那套Apple II体验原样搬了过来。显示就是一个很具体的麻烦。原版Apple II的高分辨率彩色利用了NTSC复合视频的相位关系,像素排列本身会参与颜色的形成。换到PAL环境,得另外处理这种关系。苹果自己的参考手册就另列了欧洲制式的改动,以及PAL彩色编码器的办法。

中华学习机并不是没处理这个问题。它有PAL转换电路,手册也列有高分辨率彩色模式。但《无线电》1989年的设计师答问,专门解释过有些彩电接上以后不出彩条、或者彩条晃动的情况,需要调整电视,甚至调整学习机内部的彩色信号频率。能输出彩色,和接上家里的电视就稳定好看,是两件事。这条具体的使用门槛,比一句“能玩Apple II游戏”多了一层现实。同期设计师答问还给了价格:主机约1100元,软驱另买约600元。接口已经有了,配齐仍然要再掏一笔钱。

所以这条路线的问题,不能全算在6502头上。软件能不能拿到,电视显示得怎么样,软驱有没有配,孩子能不能经常使用,都影响它最终是一台什么样的机器。

到了90年代,小霸王那种FC兼容学习机,把另一部分门槛降了下来:接电视,插卡,带键盘,家长也比较容易接受“学电脑”这个理由。学习卡里的BASIC,确实启蒙过不少人。

可常见的低价配置没有方便的程序保存办法。敲了一下午,关机就得重来,这对编程的打击,比少几个颜色直接得多。FC架构本身倒没有把存储堵死,后来国内的软驱学习机,走的仍是这条路线。

裕兴、步步高继续往“电脑”的方向补。尤其是步步高软驱一号,已经有软盘、BBGDOS、BASIC和图形界面。收藏者的实机展示还能看到它通过接口和PC交换文件。它证明的至少是:8位学习机并不注定只能当一台插卡游戏机,厂商真愿意做,保存、编辑、交换文件都能补。

再往后是文曲星。它把编程环境塞进电子词典,用户在GVBASIC里写程序、保存、交换,又折腾出新的工具。参与者留下的编程启蒙回忆,甚至提到本机IDE、编译器和自制游戏。

这段历史尤其让我感兴趣。屏幕那么小,机器又是拿来查词的,仍然有人愿意在上面写完整的游戏、做新的语言和工具。文曲星说明,中国孩子并不缺折腾的兴趣,能保存作品、能互相传程序的环境,也确实会长出自己的东西。

只是它主要属于2000年前后的故事。我要意淫的,是把这种事情往前挪,挪到1990年,再换一套更合我胃口的硬件。

为什么偏偏是MD

先说一句:68000不是这场幻想成立的必要条件,是我的个人偏好。真要做普及教育,完善中华学习机、给FC学习机配好存储、提供更好的教材,都可能比另开一个平台省事。只是那样写下去,就不是这篇文章了。

MD的配置很容易让一个爱折腾老电脑的人动心:68000主CPU,Z80副CPU,有自己的图形和声音硬件,还有能接外部电路的卡带槽。世嘉官方硬件页列出的原始配置是68000约7.67MHz,主RAM 64KB,Z80约3.58MHz、另有8KB RAM。PAL机的频率略有不同,后面的设计也得考虑国内电视的制式。

68000的好处,是编程模型对人比较友善:32位寄存器、比较宽裕的地址空间,不必把所有东西都挤进8位CPU的那套局促里。MD又已经替你做好了tile、sprite、卷轴和声音这些最能让游戏“像个游戏”的部分。

它不像Apple II那样让CPU承担大部分画图工作,也不必一开始就在PC上自己写整套软件绘图。先让VDP把背景卷起来,让精灵动起来,孩子很快就能看到成果。这个即时反馈,对启蒙比一句“这是16位机”有用。

不过,游戏机还不是开发用微机。MD的64KB主RAM能做出好游戏,是因为大量程序和素材直接放在卡带ROM里。等你想在机器上同时放编辑器、源程序、编译器和文件缓冲,账就不一样了。拿来运行游戏的配置,不能不加修改就当成拿来开发游戏的配置。

所以我的方案从这里开始分成两件事:1990年假想中的量产学习机,和今天拿真MD做的扩展原型。前者可以把键盘和扩展电路做进外壳;后者尽量从卡带口接进去。两者的软件思路相通,工程条件并不完全一样。

游戏机变电脑,也不是没人试过

最该补进这段历史的,反而是世嘉自己的SC-3000。

1983年7月15日,世嘉就推出过这台键盘一体的“游戏电脑”,接家用电视,插BASIC卡编程,也能插游戏卡;磁带机、打印机等外设可以另配。世嘉官方介绍甚至直接把自制游戏、图形和作曲当成卖点。比起后来的TeraDrive,这才更接近我想要的产品形态。

也就是说,“学习机外壳里放一套游戏硬件,再把编程能力交给用户”,这条路在当年是存在的。问题从来不是有没有人想到过。

中国市场上的学习机,还多了一层家长的购买理由。机器摆在柜台上,键盘、BASIC、汉字输入和教学软件,都比“这是一台游戏机”更好解释。至于买回家以后最常插什么卡,那是另一回事。

但这个壳只能帮助它进门,不能凭空把价格变便宜。MD是1988年才上市的硬件,1990年就要把它做成国内普及型产品,还要加键盘、RAM和存储,不是把后来廉价兼容机的价格往前搬两年就能办到的。芯片供应、定制芯片、授权或兼容实现、模具和售后,每一样都得有人付钱。

所以幻想还要再加一个前提:有厂商愿意把它当成一条要养几年的产品线,先进入一部分学校和家庭,再慢慢扩大。不是宣布“能量产”,它就会自动摆到全国孩子桌上。

这台幻想中的机器

系统分三层,借CP/M的办法

操作系统不必从现代桌面系统往下砍。借老微机那套划分就很好:

用户环境:BASIC、编辑器、命令解释器
系统服务:文件、程序加载、内存管理
硬件接口:屏幕、键盘、磁盘等驱动

对应CP/M里的名字,就是CCP、BDOS和BIOS。Digital Research的CP/M-68K系统手册把这几层交代得很清楚。我要借的是这种隔离硬件差异的办法,让BASIC不必知道软驱控制器具体焊在哪个地址上。

CP/M-80和CP/M-68K沿用了相似的分层思路,程序却并不二进制兼容。前者熟悉的0100h装入地址、CALL 0005h约定,到了68000上,都要换成适合新CPU的办法。64KB也只是经典CP/M-80机器常见的完整地址空间量级,放到68K上做开发环境,得重新算。

真正要跑CP/M-68K,还得补RAM、安排异常向量和装入地址,做平台适配。CompuPro的CP/M-68K安装手册写的是最低128KB配置。对这台学习机,我更愿意先把可用RAM扩展到512KB作为开发版目标,给编辑器和后续工具留点余量。

初版也可以根本不追求CP/M兼容,先写一个小系统,只提供屏幕、键盘、文件和装入程序的稳定接口。兼容性是另外一笔工程账,不要为了三个熟悉的缩写,把自己绑上去。

卡带口接什么,得老老实实画电路

MD的卡带口能接ROM,也能通过附加电路接RAM和外设。但它不是“68000封装上的所有引脚,都原封不动伸出来了”。要做扩展,得按卡带接口实际提供的信号安排地址译码、读写和时序,不能把一张通用68000扩展板照搬过去。

我会先做这么几样东西:

如果坚持用当年的芯片,WD1772这类软盘控制器可以列入候选。Western Digital的1986年数据手册给它定义的是8位主机接口,需要和MD总线做适配。软盘先以双密度格式为目标;1.44MB高密度格式对数据率另有要求,得配相应的控制器方案。

软驱电机启动时的供电、数据请求的响应时间、总线宽度转换,也都要处理。控制器负责磁记录和寻道等底层工作,主机这边仍然得把每个字节按时接住。这些就是画电路、写驱动时要一点点啃的活。

Z80先管声音,别给它派太多活

看到两颗CPU,很容易手痒:68000跑用户程序,Z80管全部I/O,岂不美哉。

方向不是不能试,但MD并不是两颗CPU对着一块共享内存随便读写。68000访问Z80区域,要遵守总线请求与释放的规则;Z80通过窗口访问主机地址空间,也有自己的限制。世嘉的软件手册还专门提醒过嵌套访问造成的问题。

因此第一版里,Z80先按它在MD游戏里的常见分工管声音。键盘有控制器就让控制器收,磁盘由68000配合控制器读写。真要把I/O交给Z80,再定义邮箱、握手和超时,测清楚访问延迟,别把“多一颗CPU”当成“免费多一条总线”。

至于顺手跑CP/M-80的兼容模式,更不能只看见Z80就宣布完成。它原配只有8KB RAM,离普通CP/M程序期望的内存环境还差一大截,得另做内存映射甚至增加硬件。这个梗可以留到以后,先让BASIC能可靠存盘。

屏幕先求看得清,再求80列

MD没有原生字符模式,可以拿8×8的tile显示字模。以320×224为例,正好40列28行。放一个BASIC提示符和行编辑环境,够用了。

想做80列,可以把字模压成4×8,每个tile并排画两个字符。但这样就不能只把字符编号塞进背景表,而得在RAM里合成成对的字形,再更新对应图块。字符缓冲、图块缓存和显存传输,都会多一笔开销。

更大的问题还是电视。四个像素宽的字,再经过复合视频和电视的显示电路,能不能看舒服,是个实机问题。这台机器的默认使用条件,就是1990年家里那台电视,界面得按这个条件做。

所以40列是默认,80列是给显示条件较好的用户准备的可选模式。中文则另走16×16字模,320×224只能排20列14行,输入法和编辑界面都得按这个尺度设计。ROM里装得下字库,不等于屏幕就适合长篇文书处理。

开机即BASIC,但得把游戏能力交出来

我还是喜欢开机就进BASIC。

敲一条语句,马上看到结果;行首带数字,就把它存进程序。一个孩子不用先理解文件目录、工程配置和链接步骤,就能从几行程序开始。这种门槛很低的入口,今天看也不算过时。

但如果这台机器只是跑一个Tiny BASIC,只能算数、打印文字,那我换68000干什么?真正该随机器提供的,是把VDP、手柄和声音封装好的接口。

装入图块,设置调色板,摆精灵,滚动背景,读手柄,播放音符,等待下一帧。先让孩子用BASIC把这些事情串起来,嫌慢了再去看汇编例程。PEEK、POKE和机器码调用可以留着,但不能把所有画图工作都扔给用户自己查寄存器。

存储也得从第一版就算进去。SAVE、LOAD、列目录、复制文件,连同错误提示,都得好好做。源码在磁盘上存成便于交换的文本,内存里要不要token化、怎样节省编辑空间,则可以另选办法。64KB并没有宽裕到可以不算这些账。

再配几个真正能拆开看的例程:一个打砖块,一个卷轴射击,一个小地图上的角色移动。附上图块编辑器和声音工具。这样“学编程”和“做游戏”之间,才有一截孩子自己走得过去的楼梯。

工具链、自举,以及先别急着上GCC

往上走,自然会想到汇编器和C编译器。

今天可以在PC上用交叉工具编译MD程序,但我更想要的是直接在这台学习机上编辑和编译。这样不必先买另一台更贵的电脑,孩子从写BASIC到写机器码,始终可以在自己的机器上往前走。为此,工具本身的体积和内存需求也得控制。

这台机器的本机开发路线,我会按BASIC、监控与调试工具、小汇编器、小型C工具的顺序走。每一步都先能编出一个完整作品,再往上加。编辑器和图形工具的可用性,未必比编译器支持多少语法次要。

原版68000的乘除法也有边界:它有16×16得到32位结果的乘法,以及32位被除数除以16位除数的指令;完整的32位操作数乘除,需要额外实现或运行库帮助。不是笼统一句“没有32位乘除”,更不是它连32位整数运算都不会。Motorola用户手册同时说明了用户态、监督态和各种异常。没有MMU,不等于没有权限概念,也不等于错误访问不会出事。

今天复刻,可以参考Smaller C这种小编译器的组织方式。它支持自编译,也有x86、MIPS代码生成,但不是现成的68K本机编译器。补后端以后,还得补汇编、链接、运行库、系统接口,再看内存是否够。几千行代码、几个周末的估算,都得等真的动手再说。

我想要的终点仍然是那幅画面:在机器上编辑源程序,编译,运行自己的游戏,退出后接着改。只不过要走到那里,中间还有很多很具体的活。

从“自己写出来”,到“别人也能玩”

这是整套幻想最容易漏掉的一环。

孩子写出来的游戏,不应该还得找一家工厂烧卡才能给同学玩。学习机里的装入程序,要能从软盘把自制程序读进RAM再运行;随机器给出的例程,也要按同一套规则发布。大型商业MD游戏不一定装得下,但一个自制小游戏可以专门按这个目标设计。

学校能互相拷盘,杂志能刊登源码、出售程序盘,厂商能定期收录用户作品。教材把显示和声音讲清楚,接口和文件格式公开,升级以后尽量还认旧程序。做到这些,机器上才可能长出一个社区。

这也解释了为什么单看CPU型号会看错。中华学习机已经有不少硬件条件,文曲星后来也长出了开发社区。我要幻想的,不只是把6502换成68000,还得把这些零散的条件凑齐,并且比现实早几年。

步步高能证明多少

步步高软驱学习机,是很好的历史参照。它说明FC兼容架构也能配软驱、跑自己的系统、提供编程环境。这足以反驳“游戏机改不了电脑”,却证明不了“1990年做MD学习机一定便宜、一定好卖”。

时间差了几年,硬件成本不同,市场条件不同。更何况,带软驱的8位机可以用bank切换安排较大的RAM,原装MD却只有64KB主RAM;不能只因为68000比较强,就断言后者在所有方面都更宽裕。

所以我愿意把它当成一张已经有人走过一半的路线图。看完会觉得“这个东西值得做”,还不能拍胸脯说“工程上没有秘密,只有没人投钱”。

顺着那条错的逻辑,再往下想

现在把技术账放到一边,回到开头那个故意省事的推导。

假如《血狮》暴露的是人才不够,假如人才不够又和少年时代的练手机会有关,那么,这台机器在1990年进入一部分学校和家庭以后,我希望看到的是这么一条时间线:

能卖多少台,有多少人长期使用,又有多少人从玩游戏走到写游戏,都没有办法靠一张配置表算出来。但哪怕只多出一批这样的人,我也觉得很值得。

他们学到的VDP寄存器,当然不能直接拿去写Windows游戏。能带走的是看手册、读别人的代码、定位错误、控制范围和完成作品的经验。这种经验,比“比别人早摸过16位CPU”更有用。

于是,在这条幻想线里,《血狮》依然可以做砸,投资人依然可能不懂开发,盗版也不会自己消失。但多一些做过完整作品的人,至少让一个团队在选人、估工期、判断“这件事到底做不做得出来”时,多一点可凭借的东西。

我不是要给《血狮》换一个一定成功的结局。我是想给当时那些可能会做游戏的孩子,多安排几年的练手机会。从那条错的逻辑链出发,最后意淫到这里,我觉得就够了。

至于它能不能改变产业,得把叠甲时暂时放下的东西全捡回来:家长买不买得起,学校愿不愿意教,厂商能不能连续支持,作品有没有渠道,作者能不能收到钱。任何一环断掉,都可能让这台漂亮机器只剩一批爱好者。

而中国后来真正普及起来的是PC兼容机。便宜的兼容硬件、学校和单位的采购、软件积累,以及后来网吧和家庭的使用需求,一起把这条路走大了。并不是全国先开了一场技术选型会,再一致决定放弃68K。

今天反而可以认真试试这个幻想。先在模拟器里做BASIC和图形接口,验证保存、装入、编辑和运行,再画扩展板、调总线、做实机。现代工具会省掉很多麻烦,但不会替你自动完成一台好用的电脑。

等它真的启动起来,屏幕上出现那个等你输入程序的光标,我想我还是会高兴的。

唯一的问题是:它再也不能改变1997年了。