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

0:01 最早在w7n網(wǎng)盤看到用MMC5的PCM直接播放波形音頻,然后就拿ROM來(lái)改了改放進(jìn)去了各種別的音樂()至于音量炸裂,因?yàn)镹ES本身的APU PCM原始數(shù)據(jù)是7bit(00~7F),但MMC5的PCM是8bit(00~FF),那么80~FF的數(shù)據(jù)就會(huì)被強(qiáng)制轉(zhuǎn)化為00~7F,從而出現(xiàn)問題。
1:39 SMBViewer,即SMBViewer,是一個(gè)可以查看SMB1各空間地圖的工具,初代作者為貼吧溢出關(guān)卡吧吧友miku_con于2016年元旦發(fā)布,屆時(shí)只能將地形呈現(xiàn)在。后來(lái)2022年下半年我想把他做一個(gè)“移植”在Java上,于是就有了所看到的。現(xiàn)在這位大佬已經(jīng)做出了SMBViewer v1.1,比我做的功能多一些,準(zhǔn)確度也高一些,但是我自己加了額外的反匯編查看器、十六進(jìn)制查看器和圖形查看器(后兩個(gè)沒有演示)。SMBViewer v1.1可以前往溢出關(guān)卡吧的鏈接下載,我做的版本在我網(wǎng)盤有。
3:52 IRQ涉及到卷軸拆分的問題:原版SMB1顯示分?jǐn)?shù)欄的同時(shí)也要滾動(dòng)屏幕,由于NES的掃描線執(zhí)行方式,游戲可以先在一幀開始時(shí)(還沒到有畫面的掃描線)設(shè)置卷軸在左上角顯示,顯示完分?jǐn)?shù)欄后再移動(dòng)到正常滾動(dòng)位置顯示,這個(gè)位置大約在第31條掃描線。SMB1使用的方式是“0號(hào)精靈命中”,游戲中的0號(hào)精靈(金幣下面的小影子)只有與背景中的任意一個(gè)已經(jīng)渲染的非透明像素重合才會(huì)“命中”,也就是說如果已經(jīng)命中0號(hào)精靈,那么掃描線已經(jīng)到達(dá)第31條,就可以拆分卷軸了。而后來(lái)的游戲又提供了專門的掃描線IRQ,可以設(shè)置專門在某一條掃描線時(shí)觸發(fā)一個(gè)中斷(即IRQ),在中斷中執(zhí)行拆分卷軸的程序,ROM就是這么改的。IRQ卷軸拆分已經(jīng)在SMB2J中被用到,但我使用的IRQ架構(gòu)相比起來(lái)還有一個(gè)特點(diǎn):
判斷“每一幀開始”的時(shí)候每一幀都會(huì)有一個(gè)NMI中斷信號(hào)發(fā)出,雖然可以控制是否接受這個(gè)中斷。SMB1在每一幀收到NMI后是這樣的程序:
NMI信號(hào)→禁止NMI跳轉(zhuǎn)→主程序1→播放當(dāng)前音樂→主程序2→等待0號(hào)精靈命中→拆分卷軸→主程序3→允許NMI跳轉(zhuǎn)→結(jié)束
這里的關(guān)鍵在于,如果主程序1幀沒有執(zhí)行完,當(dāng)下一幀的。這也就是我們見到的“分?jǐn)?shù)欄晃動(dòng)”的卡幀。
SMB2J的架構(gòu)則仍然類似:
NMI信號(hào)→禁止NMI跳轉(zhuǎn)→IRQ中斷設(shè)置→主程序1→播放當(dāng)前音樂→主程序2→等待IRQ完畢→主程序3→允許NMI跳轉(zhuǎn)→結(jié)束
注意到這兩者都是在一幀
而我改后可以保證只要游戲不是特殊的卡死,每一幀都可以拆分卷軸、播放音樂(音樂程序入口包含于):
“標(biāo)識(shí)1”:默認(rèn)為0
NMI信號(hào)→IRQ中斷設(shè)置
→如果標(biāo)識(shí)1為0:標(biāo)識(shí)1為1→主程序1→標(biāo)識(shí)1為0
→播放當(dāng)前音樂
→如果標(biāo)識(shí)1為0:標(biāo)識(shí)1為1→主程序2→等待IRQ完畢→主程序3
→結(jié)束
4:42 把蘑菇頂出來(lái)的東西改成崩潰()是盜版ROM 瞎搞
4:51 114514屏幕 應(yīng)某人所求
4:59 洛克人2的BGM "Dr.Willy Stage 1 Theme" 拿了NSF自己改過的顯示一些東西 我不玩洛克人()只是覺得音樂不錯(cuò)
5:40 奧拓普雷先生進(jìn)軍SMB1(不是) 實(shí)際是用HL的4:54.032Any%TAS的fm2粘貼到游戲里,每一幀讀取按鍵代替手柄輸入。這個(gè)是需要用到上面IRQ涉及到的那種不管是不是lag frame都要執(zhí)行一些程序的架構(gòu)的,因?yàn)閒m2文件在延遲幀也有輸入??上б?yàn)閳?zhí)行了更多的程序,Warpless18:37的TAS放進(jìn)來(lái)因?yàn)橛辛嗽緵]有的延遲幀,導(dǎo)致了一幀偏差,無(wú)法繼續(xù)播放。
6:55 B-1和K-1的BRK導(dǎo)致堆棧變化的太多的版本。這兩關(guān)崩潰問題詳見百度貼吧帖子5322657196
7:31 SMB1,SMB2J FDS版的NES移植版。這種移植版使用了MMC5的增量SRAM,可以映射到6000-DFFF的任何一個(gè)8K處,剛好就用進(jìn)來(lái)了。FDS系統(tǒng)本身也是6000-DFFF都是RAM,可以很好的模擬實(shí)際效果,總體對(duì)原ROM的改動(dòng)量也比其他移植版要小很多。以及SMB2J用了FDS擴(kuò)展音效,MMC5沒法模擬。
9:19 GARUNA的幻游 打了之前IRQ的補(bǔ)丁 因?yàn)槭潜3諶OM大小不變所以用了一些程序優(yōu)化空間,包括金幣閃爍。原版金幣閃爍會(huì)一次寫入4個(gè)字節(jié),但實(shí)際只需要1個(gè),總共可優(yōu)化出51個(gè)字節(jié),但相應(yīng)的程序入口也要改變。原版只有一個(gè)地方金幣閃爍程序入口,但是幻游不止一個(gè),所以就出現(xiàn)了各種問題。
10:29 本質(zhì)上這個(gè)ROM是個(gè)有2J元素的1代hack。這一類hack最早出現(xiàn)在Insectduel之手,后來(lái)我還制作了各種各樣的這類ROM,這個(gè)是其中之一。Insectduel使用了MMC1擴(kuò)容并在SRAM里放入代碼,而這一個(gè)ROM將加的代碼全部用在了切bank的ROM內(nèi)。
12:00 純水下版本SMB1()以前沒事的時(shí)候隨便搞的,而且音樂保留了原本場(chǎng)景的音樂
12:56 YEAAAA:8080-07 ATAEEY:8F08-60 8080=07表示屏幕圖塊寫入緩沖區(qū)的起始點(diǎn)(原本是00)變成了07,那么其他程序仍然在使用的0300作為緩沖區(qū)指針就不會(huì)被清零,寫入就會(huì)有問題。8F08處的程序是更新屏幕上分?jǐn)?shù)時(shí)間等數(shù)據(jù)的程序,也需要寫入0300緩沖區(qū),為了避免體驗(yàn)過差就關(guān)閉HUD顯示數(shù)字了。然后使用的lua是自己寫的
14:44 把IRQ補(bǔ)丁打到魔法小分隊(duì)版后又多開了個(gè)金手指()就是執(zhí)行完主程序3后更改2000使得顯示的圖標(biāo)與正常不一致,可以體現(xiàn)出程序是在哪一條掃描線執(zhí)行完的。至于金手指,原本JMP $8212執(zhí)行完主程序3之后就可以直接結(jié)束了,如果是JSR $8212那么在后面的還會(huì)被執(zhí)行,后面的程序是IRQ預(yù)先留好的(?
15:45 “磚塊炸裂耳機(jī)”磚塊被頂碎的音頻使用了噪聲通道,而$FFEA-$FFF9的幾個(gè)字節(jié)數(shù)據(jù)就是每個(gè)特定時(shí)間的音量值。如果這些數(shù)據(jù)被更改,那么音效的音量就會(huì)有一些改變。注:所有“盜版SMB1”的ROM頂磚塊都會(huì)有類似的音量值問題,與原版不一致,可以作為盜版判斷依據(jù)之一。(還有之一就是會(huì)有0-1問題)
16:44起都是我的自制改版Warpworld展示,版本為最新的build0054-4。0054-3即加了新的標(biāo)題音樂,可以按↑+B+A重置存檔
音樂系統(tǒng)也有一些大改,比如fb輸入#$7F和#$82以上的情況,可試試對(duì)比原版
18:40 拉旗條件演示 地圖塊25就是旗桿的中間部分(一豎條),24則是旗桿頂,現(xiàn)在不需要城堡都可以算分(后面也有演示)。那個(gè)小旗子其實(shí)就是城堡一般要附帶的敵人31負(fù)責(zé)算分,但是現(xiàn)在可以它的功能可以直接被代替,它自己的程序只負(fù)責(zé)顯示。
19:14 暫停界面可保存存檔。SAVE的是關(guān)卡信息,也就是當(dāng)前進(jìn)行到第幾關(guān)
19:20 啟用金手指SKYSKYOK后可以直接在標(biāo)題界面按A,B鍵選關(guān),→鍵可以改變是否為加大難度后模式,食人花會(huì)變?yōu)榧t色類型
22:29 吃了無(wú)敵星之后最大速度變?yōu)?x33,即3.1875像素/frame,而且過關(guān)后如果切換音樂放的話有可能可以提前結(jié)束關(guān)卡
23:20 水下可頂磚,踩敵人
23:53 水下炮臺(tái)生效(原版因?yàn)榕谂_(tái)和水下氣流用同一片內(nèi)存空間,所以炮臺(tái)在水下不生效,現(xiàn)在刪除氣流)
24:44 水下可使用藤蔓(原版爬藤途中會(huì)被卡住并且擾亂敵人指針)