bbasic吧 关注:108贴子:293
  • 4回复贴,共1

碰到一个问题,明天再更新

只看楼主收藏回复

非常奇怪,之前我误将out 43,0就是StretchBltPage当成StretchBltPageEx来处理,测试大富翁运行正常,所以一直没有发现。前两天测试剑侠风云,发现错了,改正之后剑侠风云贴图没有问题了,大富翁又出问题了,仔细分析,发现很奇怪的一件事,如下是大富翁反汇编得到的:

总共是push了8个参数,最后的CAL int ADD rs,0x20也就是32,确定了DB6应该是个处理8个参数的函数,而事实上的DB6却是StretchBltPage,StretchBltPage应该是4个参数的。如下:

图中的OUT 43,0就是StretchBltPage,StretchBltPageEx是OUT 80,0。我查找了下,在整个汇编代码中也没有找到OUT 80,0,证明大富翁只用了StretchBltPage。
但是,照这个汇编代码来看,第一张图的汇编代码应该是由类似stretchbltpage(0,240,x,80,0,0,x,x)编译而来的。这就诡异了,要让大富翁正确贴图,OUT 43,0必须能实现StretchBltPageEx的功能,不然前面的0,240,x,80这几个参数不起作用了。我的代码就是正确实现了stretchbltpage,大富翁就贴图错误,把out 43,0当成out80,0处理就好了。这么说来out 43,0莫非能分情况处理?根据参数个数?
我这几天脑子被各种蛋疼的BUG烧坏了,帮我看一看 @kydkong9288S


IP属地:广东1楼2015-01-29 23:08回复
    已经有点思路了,我昨天试着压了8个参数进栈然后call StretchBltPage,结果只是取了后面四个参数,然后思路就断了。今天早上想到一件事,之前我想在电脑上玩大富翁,把lib转换成了rlb,但是模拟器会报错,说版本太老,换到以前BBasic1.91开发包的模拟器就可以玩。于是我就把上面那个压了八个参数的代码放到1.91的模拟器中运行,结果成了。
    看了看1.91的stdlib文件,发现居然真是这么写的:

    这就解释了前面的问题,但是这件事倒是引出不少线索,我等下做一些测试看看,能不能找到一种好的思路解决这个问题。


    IP属地:广东2楼2015-01-30 11:27
    回复
      这是bb的原型vmbasic的源代码。
      http://pan.baidu.com/s/1bnF90qr
      你程序差不多已经完成了,这个可能没什么大用了


      IP属地:浙江4楼2015-01-30 13:43
      收起回复
        谜底揭开,一直以为bb1.9就是前面没有标志字节,bb2.0以后的程序前十六个字符是 BBE0000000000000 没想到看漏了,居然还有一个BBE00000 0x40 00000000的标志,看样子这个标志决定了是老版本还是新版本。
        2.0的虚拟机碰到了没有0x40的就会报错,说版本太老无法运行,但是在小机上为了能好好玩大富翁等老版本游戏,会根据标志不同做不同处理,只要把大富翁.bin的第八个字节改成0x40,也就是新版本编译的标志,再在小机上运行就会出贴图位置错误。这也只能怪虫子,把大富翁的源码丢了,要不然重新拿新编译器编译一遍就行了,搞得小机不得不另搞一套兼容旧代码。我反正是被害苦了,一个这样的BUG不知道白了多少头发,感觉人生都没有希望了
        谢谢 @kydkong9288S 的热心帮助,总算把原因找出来啦


        IP属地:广东5楼2015-01-30 15:03
        回复