2010-06-14 40 views

回答

3

如果你有仿真器的源代碼,這應該不會太難。您可以使用通常用於將圖像存儲在c源文件中的方法。

基本上,您需要做的是在頭文件中創建一個char *變量,並將rom文件的內容存儲在該變量中。你可能想寫一個腳本來爲你自動化。

然後,您將需要更改源代碼,以便不使用文件讀取ROM,而是使用內存版本的ROM,存儲在變量中幷包含在頭文件中。

如果您需要模擬文件指針等,可能需要一點工作,或者您可能很幸運,發現rom加載函數只是一次加載整個文件。在這種情況下,它可能會像使用函數替換文件加載函數來返回指針一樣簡單。

但是,請小心許可問題。如果仿真器獲得GPL許可,您可能不會在法律上允許將專有文件存儲在可執行文件中,因此值得檢查,特別是在您發佈/分發之前(如果您打算這麼做的話)。

+1

+1提醒我們關於GPL的法西斯主義。 :) – cHao 2010-06-21 07:35:22

1

是的,超過可能,已經做了很多次。 Google:靜態二進制翻譯。格雷厄姆·托爾在這個問題上有一個很好的howto論文,應該在影片的早期出現。可能有一些代碼,我可能會在那裏留下一些代碼。

完全刪除ROM可能比您想象的要多一點工作,但不能使用仿真器,絕對有可能。實際上,這兩項要求都是可能的,您可能會驚訝有多少手持控制檯遊戲或機頂盒遊戲被翻譯而不是模擬。 Esp平臺就像那些沒有足夠處理能力的實時模擬任天堂的平臺。

您需要一個很好的仿真器作爲參考和/或編寫您自己的仿真器作爲參考。然後你需要編寫一個反彙編程序,然後你有反彙編程序生成C代碼(請不要試圖直接翻譯到另一個目標,我犯了一次錯誤,C是可移植的,編譯器會處理大量的死代碼消除您)。所以化妝的指令相信指令集可能是:

 
add r0,r0,#2 

這可能轉化爲:

 
//add r0,r0,#2 
r0=r0+2; 
do_zflag(r0); 
do_nflag(r0); 

它看起來像SNES是關係到6502這就是小行星使用,這是我一直致力於翻譯作爲業餘愛好的一段時間。您正在使用的仿真器可能是針對運行時性能進行編寫和調優的,可能很難作爲參考使用,並且使用翻譯後的代碼檢查鎖定步驟。 6502是很好的,因爲相比於說z80真的沒有那麼多的指令。與任何可變字長指令集一樣,反彙編器是您的第一個大障礙。不要認爲是線性的,認爲執行順序,像仿真器一樣思考,不能將指令從零到N或N的線性轉換爲零。您必須遵循所有可能的執行路徑,將ROM中的字節標記爲指令的第一個字節,而不是指令的第一個字節。一些字節可以解碼爲數據,如果選擇標記,則假設所有其他字節都是數據或填充。弄清楚如何處理這些數據來擺脫ROM是擺脫ROM的問題。有些代碼地址數據直接是其他人使用寄存器間接含義在翻譯時你不知道數據在哪裏或者有多少。一旦你標記了指令的所有起始字節,那麼將ROM從零移到N分解和/或翻譯是一件簡單的任務。

祝你好運,享受,這是非常值得的經驗。

+0

SNES實際上使用一個65816處理器,我記得。它大部分與6502是二進制兼容的,但是標誌可以設置爲給你16位寄存器和偏移量等。除此之外,是的。很簡單,如果繁瑣的話,可以拆卸。 – cHao 2010-06-21 07:37:41

相關問題