一。CPU和ISA指令集架构
游戏模拟器本质上是个虚拟机,在宿主机上虚拟目标机(街机)的硬件运行原理,主要是虚拟CPU、指令、内存、中断、定时器、显示屏以及键盘。Space Invaders游戏机的主板是基于Intel的8080 CPU,这是一款8位的微处理器,是英特尔在1973年推出,它的可寻址空间为64K,有256个输入输出端口,一个8位的ALU累加器寄存器,一个8位的标志寄存器,6个8位的通用寄存器B,C,D,E,H,L,它们可以组合成16位的寄存器。一个16位的栈指针SP,一个16位的程序计数器PC。
|
|
8 Bit "General" Registers |
|
B |
|
0 |
|
C |
|
1 |
|
D |
|
2 |
|
E |
|
3 |
|
H |
|
4 |
High Byte |
L |
|
5 |
Low Byte |
A |
|
7 |
Accumulator |
|
Program Registers |
|
SP |
|
|
Stack Pointer |
PC |
|
|
Program Counter |
PSW |
|
|
Program Status Word |
|
Memory Space |
|
216-1 |
|
65,535 |
0 |
|
|
8080微处理器有四种寻址方式:
寄存器寻址、寄存器间接寻址、内存直接寻址、立即数寻址
二。软件架构设计
设计的目标是使虚拟机有良好的结构关系和扩展性,最好建立一个虚拟机库,方便复用。使用面向对象的思想进行架构设计是很自然的考虑,CPU,寄存器,指令,上下文,内存,中断,定时器,显示屏等自然地映射成软件对象,这些对象相互通信,有机地组合成了虚拟机。8080是实模式运行,因此不需要模拟虚拟内存,MMU,页目录表,缓存等。
考虑到扩展性,现在是针对英特尔的8080处理器,以后可能需要针对别的处理器,比如摩托罗拉的6500,Zilog的在Z80,或是x86系列,MIPS系列处理器,因此设计成抽象基类CPU、ISA指令集、内存和Context上下文。再用抽象工厂模式,IntelFactory生产Intel虚拟机,MotorolaFactory生产摩托罗拉虚拟机,ZilogFactory生产Zilog虚拟机,这样想玩哪一款游戏时就使用相应的工厂生产出对应的虚拟机来运行游戏,这种设计也很好低符合了开闭原则,对修改关闭,对扩展开放,假如以后想模拟PSP游戏,可以方便地扩展,这样岂不爽哉!
抽象工厂的UML类图如下: