作者ggg12345 (ggg)
站内Programming
标题Re: [问题] 电玩模拟器是怎麽写出来的?
时间Tue Sep 2 12:31:36 2008
※ 引述《[email protected] (哇哩咧...)》之铭言:
: > 有种东西叫做示波器, 它可以探测讯号
: > 有种东西叫做三用电表, 它的好处我举例不完
: > 硬体高手可以藉着这两种基本工具和其他测试工具
: > 画出大概的图或是 spec.
: > 举例:
: > 破解光碟保护不挑片的破解晶片就是这样来的
: 光靠这两个东西没那麽容易出名堂来
: 还有一个动辙百万台币起跳的东西叫做逻辑分析仪 (Logical Analyzer)
: 这东西才是真正破解硬体的好帮手
: 光是厂商公布的或外流出来的硬体规格而没有线路图的话, 是半个影都
: 不可能生得出来的. 光知道 CPU, GPU, Audio Processor 等主要晶片的
: 型号而不知道其它辅助晶片有哪些, 要猜出线路是怎样兜出来的恐怕比
: 中乐透头彩或被闪电击中的机率还低
======
设计制造硬体使之相容, 可以使用原厂软体产品的一个方法就是 emulation .
1.所有的零件完全照用连接线路完全照抄, 这一定触犯 copyright , 而且原制
造商会掌握几个关键零组件, 成本上因此偏高, 所以行不通.
这个方法就是用三用电表与示波器查出连接的线路图, 但做成 IC 的零组件就
罩在 IC 封装里面, 普通探针是伸不进去的. 像 ROM 程式内建在 processor
的 IC 封装里, 如果又被程式锁遮蔽, 那就不容易被拿出来参考.
这种方法能行得通的是零组件有 2nd source 及代用品, ROM 程式可以用其他
指令合成代替, 特殊的关键零组件能找到廉价供应源或用以其他零组件合成.
同时, 电路板的配置与配线不得完全相同.
当然, 不能在专利有效期内触犯专利.
: > 拆解硬体是一样要的
: 拆电路板量线路重建线路图也还只算是基本功
: MAME team 在解保护 ROM 有一个方法是把 ROM chip 拆开拿到高倍显
: 微镜下去解读矽晶上的线路逻辑
: > 基本上, 经由 1, 2 的步骤就可以得知大致上的规格 (CPU/讯号 ... 等)
: > 如果不知道, 换找一个硬体工程师来帮你检测
: > 而 CPU 的指令码资料, 要弄到不是难事, 大部分资料网路上都有
: 没那麽简单. 尤其是某些游戏大厂特别爱用特制型的 CPU 来设计硬体
: 平台以提高某些特定部份的执行效率, 或是加入某些原 CPU 所没有的
: 特异功能. 那些特异化的部分虽然不多, 可也不是那麽容易就找得到
: 资料的, 甚至都是根本就没有资料的 undocumented function
: 再说如果板子上有用到 FPGA/CPLD 这一类的可程化逻辑阵列, 那要猜
: 出里面怎麽运做可就更是难罗
2. 如果有关键的零组件被捏在原设计/制造者的手上又没有其他的 2nd source ,
例如 cpu 或 某些 chip set 是独家的; 除了费力找规格功能, 用廉价与来源容
易的组件合成外, 此时, 代用组件的衔接点可以提升到被叫用软体模组的较高阶
层, 下层的硬体就可以偏离原来的实际硬体, 例如用 RAM 与 file 代替的虚拟
光碟. 合成的方法就是用普通的硬体加上软体代用. PC 里出名的例子就是 浮点
运算的 FPU , 数学运算的 library 可以按有无 FPU 事先替换, 也可以执行浮点
运算指令时, 才调用软体代替(相当於关闭 FPU chip)使之合成; 不过, 後一种方
法就要有硬体配合检测与跳转, 碰到特殊指令时就要能栏截跳转代替.
纯软体的方法就是事先捡测, 就程式码位置查出後, 替代改接一段程式再
接回去就是 patch 法 或 传统病毒法. 在程式置入後, 再在 RAM 中修改就可
不必破坏原来的档案(如 ROM 卡夹).
现在的另一种技术跟以前的 microprogramming 类似, 也用在 java code
interpreter 里, 只是把每个指令或特定程式入口(如 system call) 用一段
高阶语言程式码的入口点对映, 对整段机器码做 block translation , 优点就
是碰到 block loop 就不必再重覆查察与转换, 可以迳自执行; 每段 block 之
间才做 state update , 也可减少不必要的检测与切换.
电玩的输入与显示装置跟 PC 是类似的, 多数的功能是能软体合成代替的
可能的不同是采用不同的 CPU , 但现在的 X86 与 GPU 是相当快的, 像前面
某大说的把 电玩程式码 当 data 来处理就是一般的 interprter 做法.
: > 没有的话, 最好可以找到有在 "游戏开发产商" 内部工作的人
: > 因为他们都会有 "整包的开发工具"
: 这个也没有那麽简单. 第一, 要找得到在游戏开发厂商内工作有交情的
: 人不是那麽容易, 更何况他们当初被雇用时一定会签保密合约. 第二,
: 就算透过种种正式授权之外的管道取得了开发包, 也不可能直接用, 因
: 为有法律问题. 而且写模拟器顶多拿这开发包当做模拟正确度的验证工
: 具, 不可能拿开发包来写模拟器. 第三, 就算取得开发包没有法律上的
: 问题, 开发包里面可能也只给你 object code library 而没有附上这
: 些 library 的 source code
: > 等到这些都完备後, 基本上, 就可以开始写模拟器
: 其实, 写模拟器通常都是先写或找一个可运作的 CPU 模拟核心, 然後
: 再慢慢的把周边的支援晶片的模拟建立起来. 至於模拟器的正确度, 则
: 是手上有多少资料能有多少正确度就算多少, 不正确的部份再边猜边改
找到原制造商的工程师, 其实就是挖角或者是买情报.
现在这部份也有公司机密法与旋转门的转职限制, 正规的情报收集就是参加发
表会, 办研讨会, 工程师彼此技术交流.
二战的列强都会造飞机汽车, 因为都是同一时代一起做, 一起玩, 一起观看批
评, 细节诀窍彼此都清楚, 落後太多的地区就不行了, 一旦那个时间点过去了
很多窍门就被视为理所当然彼此心照不宣. 而很重要的技术先进国都不太会给
後进者, 除非像老共有大陆的市场做本钱来换. 台湾的硬体制造还不错, 其实
就是一直是陪着玩这种破解相容跟进突出, 而这些招式是早在 PC 时代之前就
已知的. 所谓软体业都在替硬体制造业服务就是指这类事.
Emulation 是一种技术, 但商业上不仅是相容, 还要有一点点额外的特异功能
才能避免抄袭的困扰.
完成一个好的与堪用的 Emulator 确实不容易, 需要对软硬体都要有概念, 现
在的技术更是少不了 Language tanslation/compilation 的知识.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.4.12
1F:推 Dungeon:扯太远了啦!没讲到重点><218.170.112.114 09/02 21:22
2F:→ ggg12345:骄车长相用法都类似,但不用emulation一词 140.115.4.12 09/03 09:00
3F:→ ggg12345:Emulator强调相容,但用韧(软)体程示合成 140.115.4.12 09/03 09:06
4F:→ ggg12345:其基本原理就是 interpreter 140.115.4.12 09/03 09:09