2016年10月26日 星期三

Nes Rom header

特定檔案類型的標頭照理來說應該要是一個嚴謹而且有組織單位背書的標準規範,但這種事情其實也不是那麼一定,特別是從社群發展的東西有時候牽涉到各個社群的風俗習慣或是發展者的個人想法,在沒有特定單位出面嚴格處理標準化的制定問題下,就會產生標準不一樣的問題,這對開發者來說並不是好事情.

以任天堂的ROM檔來說目前最主流最主流使用的header格式稱為 INES header,標頭共16Bytes大小,緊接著後面連貫的是RPG-ROM與CHR-ROM實際內容,理論上搞定INES header就可以,但實際上這格式內容卻有些新舊衝突的問題要謹慎處理,這東西是由社群和領導制定者產生的東西.

ines header最大的公約數是開頭一定是 'N' 'E' 'S' \0x1a 這四個字元(檔案內容byte 0~3),接著是一個byte的RPG-ROM count (byte 4) , 接著是一個byte的CHR-ROM count (byte 5) , 以及擁有mapper與rom重要屬性flag的 byte 6 與 byte 7 , 接著 byte 8 ~15 是實作上比較沒那麼重要的資訊,輔助性質的一些東西,隨著 ines版本或是各dumper者習慣而有資訊多寡不同,簡單來說如果你找相關介紹資訊,會發現byte 8~15 的定義有些差異 , 通常舊的ines header byte 8~15內容都為 0x00,新版的 nes 2.0 ines header延伸規範則會有新的屬性.

撇開新版的ines 延伸規格 nes 2.0不談 , 就算是舊版只討論 byte 0 ~ 7 的內容,也還是會有些衝突問題會導致mapper解讀錯誤,最主要是早期某些rom 對 mapper的解讀定義是不會理會到 byte 7這邊,從 byte 7 ~ byte 15 會填入 DiskDude! 這幾個ASII code , 如果你拿到這種rom用新的正確規範去解讀,就會踩到地雷,從mapper 0 變成 mapper 64.


Early ROM processing tools were not aware of Flags 7 because the earliest emulators ignored it. For example, one tool put 0x44 (ASCII for 'D', the first character of "DiskDude!") here. This confuses newer emulators, which combine the nibbles from Flags 6 and Flags 7 to form an incorrect mapper number. NES 2.0 redefines the unused bits to always equal binary 10, which happens not to match any of the patterns used by these ROM processing tools:

簡單來說需要有一個判斷方式去對這種特立做解讀mapper上的修正.

流程大概是 

1.如果 byte 7 低4bits 為 0 , 進行標準ines規範maper解讀,
mapper = (byte)(((byte6 & 0xf0) >> 4) | (byte7 & 0xf0));



2.如果 byte 7 低 4bit 不為 0 ,且   byte 7 bit3為1 & byte 7 bit2為 0 ,認定此為遵守nes 2.0延伸規範的header定譯內容.

3.如果 byte 7 低 4bit 不為 0 , 且byte 7的 "bit3與bit2"不為 "1與0" , 則是早期非標準的版本.
mapper = (byte6 & 0xf0) >> 4;



以上.....社群零散發展起來的東西其實就會有這樣的狀況,就算組織單位也常常會有規範衝突的問題,但又是別種層面的狀況.

其實ines的規範標準並不是說很方便完整,也有新的規範方式出現,不過並不普及,模擬器多數實作也不一定會支援,如果我是當初的制定者,我大概會給mapper一個完整的byte,而屬性控制則獨立一個byte分開來放置,不需要把mapper硬切高低 4bits 放置到兩個 byte 跟 屬性控制bits混雜,有可能最早時候沒考慮到 mapper的數量會超過於 4bit範圍這問題.



2016年10月3日 星期一

任天堂紅白機模擬器



去年年初撰寫了任天堂紅白主機的模擬器雛型,大概如上圖,好像有一回事,但其實相當不完善,任天堂紅白機跟GameBoy初代兩台主機相比,若是以初學來說,我會建議學習選擇gameboy做為起步入門的嘗試,因為即使到現在我都還沒辦法將紅白機給摸透 (悟性不夠阿... orz....) , 在整個系統的 timing 模擬設計與記憶體mapping.register與vram address相互影響要摸熟都有一定的複雜度,能實做擁有正確畫面 scroll 效果需要不少功夫的, 這也就是為何我 demo 的遊戲畫面只選擇定格於同一背景的類型.

總覺得這東西沒有好好完成很可惜,想繼續完整實做,這次也放棄單靠閱讀文件來做全部理解 ,應該會參考別的project來輔助理解,甚至部分改採移植的動作,再慢慢理解.

8086模擬器專案目前在io周邊裝置實作上遇到一些瓶頸,也覺得有點疲備,先換個口味吧....如果沒又荒廢掉的話,希望能夠在今年年底或是明年初推出正式的版本.