» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


发新话题
打印

[老游杂谈] 前无古人的遭遇:刚玩了一把MD的12人街霸,结果....忽然出蓝屏debug了(又出新状况)

1111 Emulater是68000的一个软件中断,留给程序员作自定义指令集指令模拟的。和1111类似的还有1010 Emulater。
上面这句话估计不是程序员都看不懂,总之,屏幕上的Emulator指的不是你在用模拟器玩游戏,觉得人生烦恼太少的话可以继续往下看。。。。



详细点说,68000的指令都是16bit长的,也就是2个字节,比如nop的对应字节码字节就是4E 75(换算成二进制就是0100 1110 0111 0101),其中红色字标出来的是高4bit,68000的指令集对应的字节码中不存在高4bit为1010或1111的指令,换算成16进制就是A和F

也就是说某个指令对应的2个字节如果是十六进制A? ??或者F? ??,那这条指令肯定不属于68000的指令集里的,很多字节码都不属于68000的指令集,通常CPU遇到这些字节就会触发Illegal Instruction异常进而死机,但是对于A? ??或者F? ??这两种情况,68000不会触发,而是将程序执行流程跳转到2个特殊的中断函数中(如果没有接触过汇编,只知道高级编程的,就把中断程序想象成一个回调函数吧。。。),这两个特殊的中断函数由程序员自己编写,常用来模拟68000的所不存在的指令或功能(所以称作line 1010/1111 Emulator,模拟的是指令),当然也可以用来编写特定扩展的功能

这里,Capcom的程序员就用它来写了一个扩展功能,把内存dump功能用了一个特殊的自定义指令来触发,这个指令的对应字节码是F? ??(问号具体是多少我不知道,我没去跟过代码也没兴趣跟了。。),然后68000遇到了这样一个指令,就去ROM的头部开始的0x2C偏移处确定line 1111的中断程序的起始位置(为什么是0x2C?没有为什么,这是一个固定位置,属于68000中断描述表,具体可以查http://clarkson.me.uk/academic/Lecture_notes/aldm8.htm)。确定了这个中断程序的起始位置,CPU就会转去这个中断程序,而这个程序会把当前的所有寄存器值、部分内存值显示在屏幕上,也就是你看到的。。。

你看到的屏幕上方的A1-A7,D1-D7,PC,SR都是68k的寄存器,下方是某块内存区域的内存数据,至于是哪个区域,只有卡婊的程序员知道了,如果不出意外,那应该是栈顶指针所指向的一段内存。希望语文老师看完不会内牛满面

[ 本帖最后由 SONIC3D 于 2013-12-7 13:56 编辑 ]


本帖最近评分记录
  • 十夜春树 激骚 +1 疯狂厨房 2013-12-7 22:14
  • yzb 激骚 +6 威武! 2013-12-7 21:54
  • segachzh 激骚 +5 版务处理 2013-12-7 21:11
  • md2 激骚 +6 太骚了 2013-12-7 08:27
  • hkt3010 激骚 +6 精品文章 2013-12-6 02:53

TOP

补充一下,因为图上有PC寄存器的信息,这个地址实际上应该正是中断发生前的程序执行地址,显示是0xE02C824E,这个是MD内存中的地址,而非卡带中的地址
有可能内存的偶发故障导致某一个字节错误,导致代码执行跳转到了本不应所处的内存区域中
或是这部分代码的确是先解压到内存再执行,只是内存的偶发故障导致了某个字节的高4bit正好变成了1111
这两种可能性的存在都会导致有几率触发1111 Emulator代码。

所以出现这个屏幕的另一种原因就是Capcom程序员留了那么一段异常捕获程序在1111 Emulator中断表中,以捕捉未知的错误(他们在错误发生时,可以通过查看打印在屏幕上的PC寄存器的值确定程序执行到哪里,以及此时其他寄存器的上下文情况),而正巧遇到hkt3010你机器内存出现偶发故障,偶然触发到了这段异常部或程序,所以出现了这个屏幕。Youtube上有人在SSF II上也遇到了一次。

[ 本帖最后由 SONIC3D 于 2013-12-6 03:03 编辑 ]



TOP

3010,我开始怀疑是你机器的状态寄存器(就是图里的SR)有老化故障了,也就是我5楼说的情况。。。
然后触发了Capcom留在代码里的异常处理代码。。。

状态寄存器的第15bit和第13bit(左数第1位和第3位)分别是trace和supervisor位,这两个bit位在制品游戏中应该是不会有代码将它们置成1的,可能是程序代码出错,也可能是SR寄存器老化故障的可能性较大,但是你第二次发生和第一次发生时代码分别在ROM和RAM中执行,不太可能ROM和RAM都坏了,所以估计SR寄存器坏的可能性比较大。建议另外换一盘原版的街霸12人或16人,然后再玩玩,如果还是会偶尔出现,甚至出现频率不断上升,那就应该确定了。没办法的,换CPU吧。。。。


TOP

引用:
原帖由 hkt3010 于 2013-12-14 21:23 发表
posted by wap, platform: GALAXY S III Verizon

不是吧,第一次听说cpu还会坏的,目前在12人上出现了两次,别的游戏还没遇到过,当然别的玩的也少。
几乎没有游戏会在最终成品ROM里写line1010和1111还有trace的中断程序,capcom是奇葩。
其他游戏遇上同样的情况,定位中断程序地址时发觉没有对应的中断处理程序,就会死机,所以你只会看到死机的情况。

另外,寄存器故障的CPU损坏并不少见啊,我是说在损坏案例中所占的比例。:D

TOP

发新话题
     
官方公众号及微博