欢迎光临散文网 会员登陆 & 注册

【NES/SMB1(2J)】近期各类大小改hack/工具展示

2023-08-10 17:36 作者:SKY2008_233  | 我要投稿

0:01 最早在w7n网盘看到用MMC5的PCM直接播放波形音频,然后就拿ROM来改了改放进去了各种别的音乐()至于音量炸裂,因为NES本身的APU PCM原始数据是7bit(00~7F),但MMC5的PCM是8bit(00~FF),那么80~FF的数据就会被强制转化为00~7F,从而出现问题。


1:39 SMBViewer,即SMBViewer,是一个可以查看SMB1各空间地图的工具,初代作者为贴吧溢出关卡吧吧友miku_con于2016年元旦发布,届时只能将地形呈现在。后来2022年下半年我想把他做一个“移植”在Java上,于是就有了所看到的。现在这位大佬已经做出了SMBViewer v1.1,比我做的功能多一些,准确度也高一些,但是我自己加了额外的反汇编查看器、十六进制查看器和图形查看器(后两个没有演示)。SMBViewer v1.1可以前往溢出关卡吧的链接下载,我做的版本在我网盘有。


3:52 IRQ涉及到卷轴拆分的问题:原版SMB1显示分数栏的同时也要滚动屏幕,由于NES的扫描线执行方式,游戏可以先在一帧开始时(还没到有画面的扫描线)设置卷轴在左上角显示,显示完分数栏后再移动到正常滚动位置显示,这个位置大约在第31条扫描线。SMB1使用的方式是“0号精灵命中”,游戏中的0号精灵(金币下面的小影子)只有与背景中的任意一个已经渲染的非透明像素重合才会“命中”,也就是说如果已经命中0号精灵,那么扫描线已经到达第31条,就可以拆分卷轴了。而后来的游戏又提供了专门的扫描线IRQ,可以设置专门在某一条扫描线时触发一个中断(即IRQ),在中断中执行拆分卷轴的程序,ROM就是这么改的。IRQ卷轴拆分已经在SMB2J中被用到,但我使用的IRQ架构相比起来还有一个特点:

判断“每一帧开始”的时候每一帧都会有一个NMI中断信号发出,虽然可以控制是否接受这个中断。SMB1在每一帧收到NMI后是这样的程序:

NMI信号→禁止NMI跳转→主程序1→播放当前音乐→主程序2→等待0号精灵命中→拆分卷轴→主程序3→允许NMI跳转→结束

这里的关键在于,如果主程序1帧没有执行完,当下一帧的。这也就是我们见到的“分数栏晃动”的卡帧。

SMB2J的架构则仍然类似:

NMI信号→禁止NMI跳转→IRQ中断设置→主程序1→播放当前音乐→主程序2→等待IRQ完毕→主程序3→允许NMI跳转→结束

注意到这两者都是在一帧

而我改后可以保证只要游戏不是特殊的卡死,每一帧都可以拆分卷轴、播放音乐(音乐程序入口包含于):

“标识1”:默认为0

NMI信号→IRQ中断设置

→如果标识1为0:标识1为1→主程序1→标识1为0

→播放当前音乐

→如果标识1为0:标识1为1→主程序2→等待IRQ完毕→主程序3

→结束


4:42 把蘑菇顶出来的东西改成崩溃()是盗版ROM 瞎搞


4:51 114514屏幕 应某人所求


4:59 洛克人2的BGM "Dr.Willy Stage 1 Theme" 拿了NSF自己改过的显示一些东西 我不玩洛克人()只是觉得音乐不错


5:40 奥拓普雷先生进军SMB1(不是) 实际是用HL的4:54.032Any%TAS的fm2粘贴到游戏里,每一帧读取按键代替手柄输入。这个是需要用到上面IRQ涉及到的那种不管是不是lag frame都要执行一些程序的架构的,因为fm2文件在延迟帧也有输入。可惜因为执行了更多的程序,Warpless18:37的TAS放进来因为有了原本没有的延迟帧,导致了一帧偏差,无法继续播放。


6:55 B-1和K-1的BRK导致堆栈变化的太多的版本。这两关崩溃问题详见百度贴吧帖子5322657196


7:31 SMB1,SMB2J FDS版的NES移植版。这种移植版使用了MMC5的增量SRAM,可以映射到6000-DFFF的任何一个8K处,刚好就用进来了。FDS系统本身也是6000-DFFF都是RAM,可以很好的模拟实际效果,总体对原ROM的改动量也比其他移植版要小很多。以及SMB2J用了FDS扩展音效,MMC5没法模拟。


9:19 GARUNA的幻游 打了之前IRQ的补丁 因为是保持ROM大小不变所以用了一些程序优化空间,包括金币闪烁。原版金币闪烁会一次写入4个字节,但实际只需要1个,总共可优化出51个字节,但相应的程序入口也要改变。原版只有一个地方金币闪烁程序入口,但是幻游不止一个,所以就出现了各种问题。


10:29 本质上这个ROM是个有2J元素的1代hack。这一类hack最早出现在Insectduel之手,后来我还制作了各种各样的这类ROM,这个是其中之一。Insectduel使用了MMC1扩容并在SRAM里放入代码,而这一个ROM将加的代码全部用在了切bank的ROM内。


12:00 纯水下版本SMB1()以前没事的时候随便搞的,而且音乐保留了原本场景的音乐


12:56 YEAAAA:8080-07 ATAEEY:8F08-60 8080=07表示屏幕图块写入缓冲区的起始点(原本是00)变成了07,那么其他程序仍然在使用的0300作为缓冲区指针就不会被清零,写入就会有问题。8F08处的程序是更新屏幕上分数时间等数据的程序,也需要写入0300缓冲区,为了避免体验过差就关闭HUD显示数字了。然后使用的lua是自己写的


14:44 把IRQ补丁打到魔法小分队版后又多开了个金手指()就是执行完主程序3后更改2000使得显示的图标与正常不一致,可以体现出程序是在哪一条扫描线执行完的。至于金手指,原本JMP $8212执行完主程序3之后就可以直接结束了,如果是JSR $8212那么在后面的还会被执行,后面的程序是IRQ预先留好的(?


15:45 “砖块炸裂耳机”砖块被顶碎的音频使用了噪声通道,而$FFEA-$FFF9的几个字节数据就是每个特定时间的音量值。如果这些数据被更改,那么音效的音量就会有一些改变。注:所有“盗版SMB1”的ROM顶砖块都会有类似的音量值问题,与原版不一致,可以作为盗版判断依据之一。(还有之一就是会有0-1问题)


16:44起都是我的自制改版Warpworld展示,版本为最新的build0054-4。0054-3即加了新的标题音乐,可以按↑+B+A重置存档

音乐系统也有一些大改,比如fb输入#$7F和#$82以上的情况,可试试对比原版


18:40 拉旗条件演示 地图块25就是旗杆的中间部分(一竖条),24则是旗杆顶,现在不需要城堡都可以算分(后面也有演示)。那个小旗子其实就是城堡一般要附带的敌人31负责算分,但是现在可以它的功能可以直接被代替,它自己的程序只负责显示。


19:14 暂停界面可保存存档。SAVE的是关卡信息,也就是当前进行到第几关


19:20 启用金手指SKYSKYOK后可以直接在标题界面按A,B键选关,→键可以改变是否为加大难度后模式,食人花会变为红色类型


22:29 吃了无敌星之后最大速度变为0x33,即3.1875像素/frame,而且过关后如果切换音乐放的话有可能可以提前结束关卡


23:20 水下可顶砖,踩敌人


23:53 水下炮台生效(原版因为炮台和水下气流用同一片内存空间,所以炮台在水下不生效,现在删除气流)


24:44 水下可使用藤蔓(原版爬藤途中会被卡住并且扰乱敌人指针)

【NES/SMB1(2J)】近期各类大小改hack/工具展示的评论 (共 条)

分享到微博请遵守国家法律