Fun fact: The full 6502 machine code of the NES game F1 Race was reverse engineered in China in 1994 by an independent developer 于春, who later wrote a 400-page NES programming textbook about it, making him a little-known NES ROM hacking and homebrewing pioneer worldwide, possibly one of the few NES experts in the world who didn't sign an NDA. Why? To make 8 millions of <del>Nintendo game console clones pretending to be</del> educational home computers in the country actually be educational as advertised. This was also the only surreal opportunity in the world for someone to become a national hero politically, for the service of REing Nintendo games.

图 3-5 《大赛车》游戏的主画面

比赛画面绘制完成后,赛车的发动机已经启动,处于怠速状态,这时若按下加速键 A 加油,发动机的转速将提高,发动机的“突突”声节奏加快、音调升高。当按一下 A 键又松开时,发动机的声响将发出轰油门的声音,效果极为逼真。

当发令声未响完发动机已经处于高速运转状态时,发令声过后,赛车将发出“吱吱”的刹车声,同时赛车的两个后轮将显示出赛车轮胎挫起的路面尘土,相应地发动机转速降低,赛车速度则逐渐提高,只有赛车到达一定的速度“吱吱”声才会消失,赛车进入正常行驶状态。这模拟了赛车发动机高速运转时起步的过程。

当赛车在行驶中走到路边时,也将发出“吱吱”的刹车声,同时车速减慢,只有驶离路边或赛车已经停止,“吱吱”声才会消失。

在比赛中若赛车超过干扰车或被干扰车超过时,将发出超车声,超车声随两车距离由远到近而由弱渐强。这一超车声是干扰车的发动机声音,当两车并行时声音最强,随后以 [...]

(71 页)图 3-1 《大赛车》游戏功能模块图

A 大赛车(F-1 RACE)

B0:复位处理 C000,绘制标题画面,选择比赛难度,E60A~E823,演奏标题音乐,等待开始 -> 延时结束时让未按 START 键则进行游戏演示

B1:C066 中断处理,读操纵器各按键值

B2:C91B 读中断周期,读操纵器的 START、SELECT 键 -> C

B3:发声处理 F46E~FC2D

B2 -> C:C0D5~C207 按 START 键后,比赛开始。(游戏主控处理模块)

D1:E9BA 绘制比赛路线提示,演奏开始音乐;清屏,绘制比赛画面,显示发令标志,发令声响。-> E1:CFD2~D0D3:绘制比赛路线,开始演奏音乐。

D2:C19B 读中断,读 START 键 -> E2 C964~CA37 若按 START,进行游戏暂停处理,再按 START 恢复比赛

D3 CA38~CB92 显示时间、积分,马路中心线,赛车速度、高低速档位,发动机转速。

D4 C906~C91A 开显示。比赛画面上段的提示栏定位。

D5 D11B~D8D1 计时、计分、调速、刹车,定义卡通
   -> E3 发动机高速运转时起步,发刹车声,令车速逐渐提高。
   -> E4 赛车走到路边时,发刹车声令车速降低

D6 CC75-CE38 判断比赛进程,查询撞车,查询比赛成功画面的卷动与扭曲
   -> E5 C208~C41C 控制远山卷动,调整车速,调整路面变量
   -> E6 E1DE~E448 撞车的查询处理
   -> E7 FDC8~FE4D 调整比赛路线提示上的白点的座标,控制白点闪烁

D7 FF14~FFF9 发撞车爆炸声,扭曲路面

D8 F254~F295 显示爆炸

D9 CE39~CF5C 比赛失败处理

D10 CF6C~CFD1, F3B5~F46D 比赛成功处理

在“SKILL LEVEL”“1~3”之间选择游戏难度。若选择“SKILL LEVEL 1”时将从第一关开始比较;若选择“SKILL LEVEL 2”时将从第三关开始比较;若选择“SKILL LEVEL 3”时将……

(68 页)图 5-17 比赛画面结构示意图

背景 0 页上半部分
背景 0 页下半部分
背景 1 页下半部分

……至此,比赛画面的定位操作完毕。

5.4.6 比赛开始的发令处理

比赛开始的发令处理由程序段 $EA23~$EB57 完成。

1、执行 $EA23~$EA59,置 PPU 首址 $210E、$212E、$214E、$216E,分别置入 H9C、H9D、H9D、H9E 四个数据,显示四个发令长条。执行 $EA5A~$EA74,令 ($214C) = H2D 以消去第三个发令长条左端的白云。令 ($23D3) = HFF、($23D4) = HFF 以置发令长条的背景 0 页配色代码为 11。

2、执行 $EA75~$EA99 定义发令长条状的红色卡通。红色发令长条由四个卡通块组成,定义数据如下:

($3A0) = HFD
($3A1) = HFD
($32A) = H20
($3A3) = H70
($3A4) = HFD
($3A5) = HFD
($3A6) = H20
($3A7) = H78
($3A8) = HFD
($3A9) = HFD
($3AA) = H20
($3AB) = H80
($3AC) = HFD
($3AD) = HFD
($3AE) = H20
($3AF) = H88

显然,此时卡通长条显示于画面之外(因其 Y 坐标为 HFD)。

3、调 $F46E 做好发声准备;A = 0 调 $F48E 关发声。令 ($4F) = 1,A = H1E 调 $EB5C 子程序,置延时计时器 ($A4) = H1E,由 $A4 控制在 $EB5E~$EB9D 程序段中循环等待。

(217 页)
0

If you have a fediverse account, you can quote this note from your own instance. Search https://mk.absturztau.be/notes/ais1ax26yiul0005 on your instance and quote it. (Note that quoting is not supported in Mastodon.)