A brief history of 6502, WQX and my simulation for Super Mario Bros. on WQX...
还是先声明一下吧,其实我一直都很想在日志里写点模仿校内体、梨花体、凡客体之类的文章,至于本文,乃是我对上世纪初期之白话文风的蛋疼模仿作。题材其实是Isword帮我选的,但也确是我认为较有可写的一段回忆。然则这个题材实在不适合用搞笑的文体来写作,故而才有现在这样的不古不今之文风。总之所以估计会写很久的,Isword莫拍>_<
唉,我是真的不知道该如何为这篇日志分类好。观众一看便知它不是音乐帖,但若要依循惯例,不顾一切地将他与“杂”这个分类下的日志归在一处,在我是有极大地为难的。不为别的,只为这日志的主题,在我心中是如此地鹤立鸡群,乃至我已然无法抹平心中的激动,几番要为他另加开辟出一处版块单独放置,以作为“为了纪念的纪念”了!
要追究这事件的动因,则可推至公元二零零六年国庆假日期间,即十月四日午时(12:54)。那日正值秋高气爽之际,饭毕蛋疼之时,于是便有易码技术论坛的一位元老李索夫特,在那“星迷天地”一栏中发帖唤作“看看你的电子词典是否支持硬件4灰度”,期以点拨广大星迷群众。帖中李君自曰曾参与经典机型Nc2K的开发,对Nc2K的四灰度屏有所接触,奈何效果不佳,终于放弃。帖中更是提到了某神秘器件SPLD803的存在。按那李君所说,只要持有此器件之DataSheet一物,按图索骥对那器件之IO进行一番设置,便能够驱使那器件工作在硬件四灰度的状态,再不必费时费力,通过软件模拟。
此帖一经发出,便惹得众人围观,回帖中赞扬者有之,质疑无用者有之,欲寻找DataSheet者有之,照例慨叹星界衰落者亦有之。我在星界虽一小卒,然对李君发帖的一向半真半水亦有耳闻,那天偶上论坛得见此贴,便也高兴地在人群中作了个看客。谁知这一看之下,竟与硬件四灰度这一新生事物断断续续打交道半年有余,最终成为我混迹星界数年间最给力之回忆,且待我细细讲来。
那时我年方二八,正是爱玩的年纪,又恰逢了大二那无忧无虑的好时光,故而整个国庆期间都在外面游玩。待我回来看到李君那帖时,回帖已然超过一页了。按着李君在帖子里给出的超链接寻去,发觉此器件为对岸一间名为Sunplus的晶片公司生产。兴奋之际在网站上浏览搜索,却发觉须要经了一个大为周折的注册过程,才可以成功下载SPLD803器件的DataSheet。败兴之余回到论坛一看,大家的经历果与我大同小异,都认为功亏一篑。李君更是一度迁怒于Sunplus公司(注一)。那时的我年幼无知,也认为Sunplus公司在下载DataSheet这种事情上横生枝节,实在无理,便想尽办法,总之终于将DataSheet搞到手,方才开始正式研究。
如今若要问我那DataSheet是从何处得来,我也只好说是颇花了些心思,费了不少口舌功夫才到手的。只不过那人当时满口答应,却在多日之后才将DataSheet的PDF文件发送至我邮箱。或许是间隔略久,我竟鬼使神差地将此事忘掉,全心投入到Tc808系统内核备份的研究中,直到某日无聊登录邮箱查看新邮件,才发觉DataSheet早已躺在我邮箱收件夹里了。这样算下来,竟使得星界对4灰度的研究推迟开展了一月有余,多年来每每忆及此种插曲,仍略觉惭愧。
话说当日我在数学系机房上网,临走时登录邮箱,竟发觉有封名为“SPLD803B_DS”的邮件,登时大喜,连忙开始下载。那时已是夜里,机房快要锁门,我几度向欲断网走人的管理员大娘求情,方得成功下载完毕,打印一份带回宿舍认真研读。不料此文档貌似体积不大,打印出来之后竟有数十页之多,并且全英文的版本初看之下难免头大。无奈只好抓主要矛盾,直接找寻四灰度相关之记载。不多时便觅得一组相关的图画与文字记录恰如李君所说,只需用代码和SPLD803建立通讯,再将一组数据写入晶片的IO,即时便会生效。看到此处,才觉得四灰度果然有望。不过终于从DataSheet中获知此种奥妙之时,已是接近午夜。于是决定先睡觉,转天再下手实践。
至于我第二天下手的对象,自然是那个早已被怀疑是初始化SPLD803晶片的中断:INT$C004。通读这个中断的汇编代码之后一切已再明显不过:只要动手将其反汇编,然后修改发送给SPLD803晶片的数据即可!接下来的一切,便不过是兴奋地做着枯燥的体力活。话说当日我便将数据改写完毕,运行生成的bin文件后屏幕一闪,即变出了两个八十点宽八十点高的屏幕。虽然那时四灰度程序还远未完工,但这次在四灰度研究方面竟然暂时走在了星界的前面,兴奋之情确然是空前的。于是晚上我便再度到数学系机房上网发帖,将DataSheet和我修改后可令Tc808初步进入四灰度模式的bin文件(当时叫做OUT.BIN)一并上传发布,期待回音(注二)。
然而正如上文所说,这第一天所放上去的东西除了那DataSheet为一份较有意义之资料外,那自造的小bin程序根本离半成品还差得远。且不说那程序根本不能显示任何实质性的内容,连如何设置那显存的开始地址亦是毫无头绪。那程序只能将单色模式的显存数据以一畸形的四灰度模式显示,除关机外并无任何复原之法,对一些星迷反而造成了短暂的困惑。加之第三天我细细研究了那PDF后,又发觉各种或显或潜的问题,凡此种种,使得当时的研究遇上了一点小瓶颈。前前后后在论坛上讨论了两天,都未收到满意的结果。转眼已经是第五天,我终于决定起用笨办法,不断修改程序传递给IO的参数穷举测试,总算成功地修改了显存的起始地址及行宽,使之与四灰度模式相适应。这样,Tc808的四灰度模式算是达成了。虽然那时他并无上佳的显示效果,闪烁和串扰的问题还深为严重,但我相信作为燎原的星火,引玉的砖头,这点微光亦算是足够了。
果不出我所料,在我发布这新版本驱动之后的第二天,便有立天这一位高手用了我的驱动,在Nc3000的机子上搞了一个能显示出小孩子头部的实例并拍下照片,由艾斯沃德传到论坛,证明了这驱动的可行性。我想或许是因了我这新版的驱动能够直接和Nc3000通用,才做得这么快罢。总之那之后,这驱动也就陆陆续续地被移植到各个老机型上了。艾斯沃德君后来还制作了Nc3000的四灰度图片浏览器,成为星界历史上之首个硬件四灰度软件。
和四灰度图片实例同一天诞生的还有另一个新闻,也就是李索夫特君在EM的第一大水帖:“4灰度Lvc(LavaX)官方正版制作计划”。对于那个帖子,我实在是不忍心再说什么的。只记得那帖子如同天涯高楼一般热得极快,冷得也极快,大家对于四灰度的兴趣也就随之消退了。我也转而去做了一些其他的事情,大抵是扒了扒vnt的播放过程,改了改英雄坛说之类。至于后来的四灰度超级马里奥,那时虽然也有想到,但是是绝无心情去完成的。
大约到了第二年的三月末,那时候我终于从如何使得文曲星播放音乐这种枯燥的事情中挣脱出来,或许是物极必反的缘故,好生堕落了一阵子。闲暇之际心血来潮,又把半年前那段切换四灰度模式之代码拿出来细细把玩。这次换了角度来看待问题,脑中很快生出灵感,将那四灰度的显示效果提升到了一个新的层次。取得此种进步之际又回想当初论坛中的某些讨论,若有所悟。一番实验后发觉,虽然四灰度模式用于显示大块相同颜色时难于胜任,幸而显示小块杂碎颜色是其特长,于是认为制作一四灰度版本之游戏当可行。思索间忆及星界往昔种种给力之游戏,发觉制作超级马里奥之四灰度版实为上乘之选。此游戏之经典空前绝后,且在老机型上几乎全机型制霸,可玩性及普及性自然是一等一的。而那原版超级马里奥实为一彩版游戏,对其图素稍加处理自然可以实现四灰度效果。加之李君早已将文曲星端版本之代码悉数公开,此种天时地利人和一起,可谓万事俱备,只欠开工。于是我便跃跃欲试,准备将这一想法变成可见的现实。
那时我在星界各大论坛游荡已有年余,手头积攒了不少资料,在给Tc808移植软件的过程中也对其系统的方方面面有了较清晰的认识,这些无形之中为我增添了信心,亦成为我设计超级马里奥四灰度版本程序架构之基础。加上我踏入星界之初即听闻文曲星与东洋之FC游艺机所用CPU晶片实乃同源,甚为惊奇,故当时也曾阅读过FC之资料,这使得虽李君之代码向来晦涩,但我在阅读其超级马里奥电子词典版源码时从头至尾并未遇上太多问题,客观上加快了游戏的制作速度。
然而万事说易行难,要论那游戏制作中最为困难之一环,实乃对FC游艺机PPU之软件模拟。话说将单色屏幕之游戏扩展为四色后,所需内存也必扩张一倍。文曲星所用之6502型晶片仅一区区8位CPU,又将大片固化内存用于bios等功能,是故扩张后的内存需求早已超出CPU之8位寻址范围,李君的PPU模拟架构须加以修改方可适用。这条路实属前无古人,颇为棘手。幸而我略懂Tc808之硬件机理,知道切换BANK后,在那0BANK的$4000~$7fff处尚存16K内存可用,故而并未气馁,而是由此入手探索新的内存调度之法。最后终于设计出将那PPU模拟的核心代码置于$2400处不随BANK切换而改变的区域内,而两个背景图层及命名表都放在0BANK内存中的架构。程序运行中每当要刷新屏幕时即跳到$2400处的代码,切换为0BANK并利用0BANK中的两个背景图层及命名表生成屏幕缓冲图像,刷新至屏幕后再切换回1BANK,继续运行游戏主程序。为进一步节省空间,图像数据的格式也要经过处理,使得同样的空间大小原本只能容纳黑白数据,现在可以容纳四级灰度数据。当年此种架构据我所知从未有人尝试,那BANK切换的速度能否赶得上代码跳转的速度也是问题。然而那时总是有一种大无畏的心理作怪,促使着我认为这条路不但是唯一的办法,也是最好的办法,总之去试试看罢,不行又如何!
架构确定之后便又是编写代码的体力活。奈何当年我没有电脑,于是所有的代码竟然都是在文曲星上完成的,其中辛苦自不必说。多亏有易路客的EasyEditor为编辑文本文档提供莫大方便,又有赵飞的6502星端编译器可以成功编译任意体积之代码,不然四灰度版超级马里奥的发布,恐怕还要再推迟一段时日。当时我写代码时当真是小心翼翼如履薄冰,每写完一段代码都要反复检查,生怕因为不起眼的bug导致运行失败。这次写的程序自始至终都工作在根本无法看清单色屏幕数据的四灰度模式下,程序架构也是前所未有,如果出了错,那断是没有任何调试的可能。记得五月底六月初我正式动手开始制作,几乎把所有的课余时间都花在了这个上面。经过近两个星期的努力,总算是将代码部分全部编写完毕,开始编译时才发觉6502星端编译器上编译一次竟然需要一刻钟之久。当时还没有转换图像数据,于是我直接复制了一部分软件的二进制码,作为测试用的字模。这样组织好的bin文件竟然第一次便执行成功。虽然贴图皆乱码,然而分明能够看出游戏确实是在运行。于是第二天的复变函数课后我便写了个LavaX版本的转换程序,将原版超级马里奥的图像数据转为与四灰度相适应的格式。编译这转换程序,自然用的是雁的LavaX星端编译器。这图像数据与原bin程序整合后,效果可谓完善。初看去有GB之感,且无串扰及闪烁之问题。程序运行也为正常,直到我将其通关,也未有出现任何bug。后来虽然多次在细节方面修改完善,然而核心代码从写完之时便再没有过任何改动,这总让我自豪,也令我意识到先设计再动手的重要。
程序基本完善后我便在六月十二日中午将其放出,仍作抛砖引玉之期。软件发布后果然反响不错,一如当年四灰度驱动发布之初。完美的显示效果(注三)以及四级灰度的画面宣告了四灰度技术终于成熟。后来几天我一鼓作气,先后将其成功移植到Nc3000、Tc1000、Tc1000S等机型上,不料Nc2K系列机型总是无法运行。后有论坛内隐居已久,一向德高望重的孙前辈短消息于我,方知Nc2K系列在0BANK只有8K内存。可惜我这四灰度版之软件所需内存总共达64K,几乎榨干文曲星所有机能,Nc2K系列凭空少了8K内存,自然会运行失败。此后几年内我一再努力要将Nc2K系列的移植进行下去,皆以内存不足而失败,成为一大遗憾。
抛出砖头,引来白玉。很快便有马可李和孤村微雨两位编写了一些四灰度下的图形代码,后七七零零零零六君和孤村微雨君还分别制作了Tc808(实验版,未改动系统内核)和Nc3000(版本3.9)的四灰度系统。李君那四灰度版LavaX虽以大坑告终,然有雁君成功将LavaX与四灰度相融合,制作了一些软件。这些在当时人气下滑的易码论坛还是惹来了不少关注。奈何当时星界颓势尽显,四灰度技术最终也仅有少数人使用,未能取得蓬勃的发展。我后来已届大三,纠结于校内外各种竞赛及活动,除一同时播放vnt及flm之程序(未发布)外再未制作任何软件。自此淡出星界,那四灰度版之超级马里奥便成了我最后也是最好的作品。
回顾四灰度之历史,那李君想必在Nc2000研发之初期就早已对四灰度技术之存在一清二楚,然而直到二零零六年底才将其公诸于世,无疑错过了星界最辉煌的时期。若李君零二年时便公开此技术之存在,以当时星界之繁荣,完善四灰度之显示效果自不必说,要重新制作出纯四灰度版本之系统内核想来亦并非难事。奈何凡事没有如果,抚今追昔,唯有遗憾二字可表。呜呼,雕栏玉砌应犹在,只是朱颜改。星界多少事,都付笑谈中。
注一:大陆市场上出售的“文曲星”品牌之老机型,基本是对岸远见公司提供全部硬件,而后北京金远见在硬件基础上作软件开发而成的产品。而当年远见公司使用的所有晶片基本来自凌阳,因而SPLD803这一器件的来源从一开始我们就能够猜出一二,奈何DataSheet实在难以寻找,最终能够搞到一份也属万幸了。
注二:彼时我虽因怀旧故,课余常研究文曲星,但仍向学。故日日于自习室流连,不常上网发帖,发帖又总喜斟酌半天文字,搞得发帖之时机房已要关门,只得转过天来,甚至数天后才来看回复。于是惹得那时的星界同好每每找不到人,在此向大家赔罪。
注三:关于硬件四灰度模式的显示效果,当时的星界多有争论。我身为四灰度技术的开创者,在此提出一些自己的看法。
易码众公认的经典机型中,我自始至终只有一台Tc808。记得由于GGV盗版李君LavaX的缘故,论坛里一开始对Tc808多有骂声,作为当时的新机型,或者说是最后的老机型,也没有人专门给它编写任何软件。我开始自学6502汇编,给Tc808移植软件,就是为了改变这种状况。我移植的第一个实用软件便是立天君的SeeBmp。所谓敝帚自珍,我在这个软件的细节上下了非常大的功夫,其软件模拟16灰度的效果经我微调之后几乎可以和硬件16灰度媲美,闪烁被减少到了极限。后来的事实也证明了模拟灰度在其他机型上绝对没有Tc808的效果好,两台机子都有的同学可以试验一下。奈何塞翁失马焉知非福,在后来的硬件灰度与模拟灰度效果之争中,Tc808优秀的模拟灰度效果竟成为了一个太高的标杆。回顾当时的争论,我提出三个事实:
一、大家所说的灰度看起来“闪”,其实分硬件的“闪”和软件的“闪”。硬件灰度闪,是指屏幕的亮度不断地从亮到暗反复变化,然而总体来说,每个像素和它周围像素的灰度值之比是稳定的。而软件灰度闪在这一点上恰恰相反,不但每个像素的灰度值都在不断变化,而且和它周围像素的灰度值之比是不固定的,一会儿是此像素比彼像素亮,一会儿又是此像素比彼像素暗。
二、硬件的闪在不同光照条件下,程度是不同的。在日光灯下看,闪烁会更强烈,而在日光下看,闪烁会减弱很多。而软件的闪基本不受此影响。
三、即使是Tc808,也并不总能够达到那完美的硬件16灰度效果,原因是CPU频率有时会改变,导致刷新率改变,此时软件模拟灰度的效果也很闪。
综上,大多数非Tc808的用户事实上是拿着很烂的软件模拟灰度效果与硬件灰度作对比,而包括我在内的Tc808用户则可以用媲美Tc800的16灰度效果与当时并不成熟的硬件灰度效果作对比,这样的对比会产生什么样的结论,想必是很分明了。抛开这一点不提,硬件四灰度模式一旦用于显示大块的颜色,那严重的串扰现象至今都是无法解决的,单单这一点,就严重限制了硬件四灰度的适用范围。事实上星界后来涌现的各种四灰度软件在显示效果上没有超越超级马里奥四灰度版的,由此可见一斑。现在看来,为了推广硬件四灰度而做超级马里奥,确实是一个无比正确的选择。如果让我去做四灰度系统或者做其他游戏,那么不是要显示很大的图标,就是要显示满屏幕的大号瓷砖拼图,都难免串扰现象之虞。没有完美的画面效果,也就未必能调动起大家对四灰度的积极性了。