溢出关卡吧 关注:250贴子:3,572
  • 9回复贴,共1

关于一些SMB1hack“开头卡死”的问题

只看楼主收藏回复

一楼百度


IP属地:贵州1楼2022-01-31 08:35回复
    先说一下这一现象的来源吧,昨天晚上我本来是用一个$90D9为60(就是初始化堆栈顶到015F)的盗版改个地图玩,然后打开SMBR想改一下时间流速,最后就在标题界面卡死,人物不见。有趣的是在游戏运行的第34帧按下开始不会卡死。
    就此现象也出在一些GoodNES中的“Bad SMB1”中,除了933里面有的两个是纯0-1问题,剩下的都是标题卡死的问题。于是,我就在昨晚进行了一定的探索。


    IP属地:贵州2楼2022-01-31 08:42
    回复
      用正版测试对比,SMBR只会更改$B787处的数值,也就是LDA #$18 STA $0787处的18。而$0787正是时间的“步进”帧计时,并不依靠21帧规则。但是,探究崩溃成因时,既然崩溃卡死是从34帧开始的,并且最终地址是$A439(#$02,JAM),那么我给$A439加了个执行断点,重置后开始使用“追踪记录器”(一定程度上相当于VNES中的代码回溯),记录器的代码执行如下:
      $829C:AE 6B 07 LDX $076B = #$00
      $829F:AD 3E 29 LDA $293E = #$80
      $82A2:00 BRK
      $FFF0:07 UNDEFINED
      $FFF2:A9 00 LDA #$00
      $FFF4:60 RTS (自 $3187)
      $A436:0D 0B FE ORA $FE0B = #$2A
      $A439:02 UNDEFINED(JAM)
      甚至正是从这里开始,看到$FFF4的那一刻,我才发现我用的是盗版ROM...
      通过对$829F起的多方代码对比,我反应过来,这里就是著名盗版0-1处的差异($829F-$82A5)成因之一:
      00:829C:AE 6B 07 LDX $076B = #$00
      00:829F:AD 3E 01 LDA $013E = #$00
      00:82A2:EA NOP
      00:82A3:20 EA FF JSR $FFEA
      00:82A6:20 0E 83 JSR $830E
      正版:
      00:829C:AE 6B 07 LDX $076B = #$00
      00:829F:E8 INX
      00:82A0:8A TXA
      00:82A1:29 07 AND #$07
      00:82A3:8D 6B 07 STA $076B = #$00
      00:82A6:20 0E 83 JSR $830E
      SMBR正是在更改时间时发现$82A1是01 EA而非以29开头,才改成了奇怪的29 00 也就是AND #$00,但没料到的是前面还有句LDA $013E,就成了LDA $293E;BRK了。
      正版改时间甚至$82A2也不会改,很可能这是一个盗版的检测机制。


      IP属地:贵州3楼2022-01-31 09:16
      收起回复
        但具体上,那些Bad SMB1都是只有$82A2被改成了00或03,不过都是盗版。至于$82A2是03的标题会画面跳动,00的就直接卡死了。所以修复它很简单,对于盗版为地板的ROM,把$82A2改成EA,或者$82A1也改成01即可。
        最后送上一句:FCEUX真有你的,07显示成1个字节,执行起来2个字节


        IP属地:贵州4楼2022-01-31 09:44
        收起回复


          IP属地:贵州来自Android客户端5楼2022-06-05 23:47
          回复