0

我一直在尝试为摩托罗拉 68000 格式化二进制操作码,但我一直发现不可能同时对目标内存地址、指令指定和寻址模式/大小以及要复制到内存映射的地址总线的数据值进行编码输入/输出。

对于 Sega Genesis 的视频显示处理器,我正在尝试写入控制端口,该控制端口在 Genesis 的内存映射中的 C00004 内存映射。

C0004 是二进制的 1100 0000 0000 0000 0000 0100 或三个字节。我正在写入的值是 87,VDP 在 VDP 寄存器 #7 中将其识别为 8787。我遇到的问题是弄清楚如何编码 32 位的数据,例如指令前缀指定move.b、值 87,以及MMIO 重新路由到正确 VDP 端口#$87的目标内存地址C00004人民民主党。

总而言之,它看起来像这样:

move.b  #$87, $00C00004,

松散地转换为不是四个,而是四个字节和一个半字节(准确地说是 36 位!)

0001 1000 0111 1100 0000 0000 0000 0000 0100

由于 Motorola 68000 在处理到microcode时只会解析 32 位,如果没有足够的空间(并且在同一指令内),如何编码所需的信息?

也许我理解不正确?

我知道这超出了大多数程序员的预期水平,但我希望周围的人可以为我分解它并解释这种编码方案是如何工作的。

4

1 回答 1

0

你的指令,move.b #$87, $$00C00004应该编码为

0001111001111100 0000000010000111 00000000110000000000000000000100

(或类似的;我不确定操作数的顺序)。

第一个 16 位字可以这样分解:

  • 前四位表示这是一条move.b指令。
  • 接下来的六位表示目标寻址模式是绝对 32 位地址。
  • 最后六位表示源操作数是立即数。

之后是带有操作数的指令扩展字。第一个是立即数的 16 位,最后 32 位是地址。(可能反过来。)

有关详细信息,请参阅http://www.freescale.com/files/archives/doc/ref_manual/M68000PRM.pdf

于 2014-01-31T06:57:31.277 回答