2011-09-07 71 views
5

我正在编写一个解释的68k模拟器作为个人/教育项目。现在我正在尝试开发一个简单的,通用的解码机制。解码68K指令

据我所知,每条指令的前两个字节足以唯一地标识操作(有两个罕见的例外),并且剩下要读取的字的数量(如果有)。

这里是我想在我的解码阶段完成的任务:

1. read two bytes 
2. determine which instruction it is 
3. extract the operands 
4. pass the opcode and the operands on to the execute phase 

我不能只通过前两个字节为查找表像我可以在RISC拱前几位,因为操作数是“在途中”。我怎样才能以一般方式完成部分2

一般来说,我的问题是:如何从解码过程中去除操作数的可变性?

更多的背景:

这里是从程序员的参考手册的8.2节的部分表:

Table 8.2. Operation Code Map 

Bits 15-12  Operation 
0000   Bit Manipulation/MOVEP/Immediate 
0001   Move Byte 
... 
1110   Shift/Rotate/Bit Field 
1111   Coprocessor Interface... 

这对我来说取得了很大的意义,但后来我看每个位模式指令,并注意到在15到12位是0001,0010或0011时没有单个指令。我必须有一些大的图片丢失。

Decoding Z80 Opcodes网站明确解释解码,这是我没有在68k程序员的参考手册或通过谷歌搜索找到的东西。

+0

您的项目发展到什么程度,您有反汇编程序还是仿真程序? –

+0

我还在构建一个生成完整查找表的脚本。大约完成了70%。 – mwcz

+0

@CountablyInfinite你正在做一个类似的项目吗? – mwcz

回答

2

我决定简单地为每条指令创建一个查找表,并为每个指令创建一个可能的模式。这是我的第一个想法,但我把它放弃为“浪费,不雅”。现在,我接受它“非常快”。

+1

啊,模拟器编码的第一条规则:有时看起来笨重的蛮力方法是最好的一。 :) –

+1

而且它非常依赖运行仿真的CPU。一个16兆字节的L2可以创造奇迹。 :) –