2014-01-16 34 views
0

我一直在嘗試格式化Motorola 68000的二進制操作碼,但我一直髮現無法對目標存儲器地址,指令指定和尋址模式/大小進行編碼,並將數據值複製到內存映射I/O的地址總線。無法在機器指令中編碼32位二進制操作碼

對於Sega Genesis的視頻顯示處理器,我試圖寫入存儲器映射到Genesis存儲器映射中C00004的控制端口。

C0004是1100 0000 0000 0000 0000 0100二進制或三個字節。我正在寫的值是87,VDP在VDP寄存器#7中識別爲8787。我遇到的問題是如何編碼32位的數據,例如指令前綴指定move.b,值87,其爲#$87,以及用於MMIO的目的地存儲器地址C00004在到VDP的路上重新路由到正確的VDP端口。

總之它看起來像這樣:

move.b #$87, $00C00004, 

鬆散地轉化爲不是四個,但四個字節和四位(36位是精確的!)

0001 1000 0111 1100 0000 0000 0000 0000 0100 

由於摩托羅拉68000只在解析到microcode時解析32位數據,如果沒有足夠的空間(並且在相同的指令中),如何編碼所需的信息薦)?

Perhaps I'm understanding this incorrectly?

我知道這是超越同級別大多數程序員會預料,但我周圍希望有人能打破這對我和解釋這個編碼方案將如何工作。

回答

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