2015年1月6日 星期二

所謂的 illegal (unofficial) code

illegal 英文中是非法的.不合規定的意思,在這邊所謂的 illegal code 並沒有嚴重到所謂非法的涵義,而是指這個CPU操作瑪並沒有在官方技術文件上列出(所以也叫unofficial code),通常因為有一些不確定性,不是很建議使用,但可能有某些遊戲就正好使用到,因此illegal code的實作對於相容性有幫助,不過一般來說會用到的是少數,模擬器撰寫初期可以先省略不談.

至於為何會有這種 illegal code ? 有很多可能,以8 bit cpu來說,最少就可以有 256個操作碼(如果使用延伸碼可以更多,像z80中就可以用 0xCB 來當擴展, 其後面可以再加子操作碼), 並不是每一個 可能編碼的數字都有使用到,有些可能是為了編譯器留一手(純屬個人猜測).有些可能是為了未來預留.有些可能有某些不穩定的特性.有些會造成運作crash ,總之諸如此類的因素,沒有被列到官方文件中記載.

附帶一提的是,像是GameBoy用z80並不算是標準的z80,而紅白機用的6502也並不算是標準的6502,但大體上可以說是大同小異,只是在其中要特別注意到某些功能可能已經被移除.某些opcode的功能可能已經有變,這種差異性影響程度會更甚於illegal code有無被完整實作.

6502 opcode官方列出151個,但如果再加上illegal code,則有240多個,少掉的那幾個連illegal code可能也不算,會導致cpu 運作癱瘓(這種我覺得連illegal code都稱不上),這幾個是連實作都沒必要,而這些沒被官方列出來的opcode中很多的功能僅止是占用記憶體.時間與NOP而已.

PS.但因為公開測試ROM中,指令集測試連 illegal code都一起併入,為求測試完整性,因此我在實作中還是將非官方的部分實作進去.

沒有留言:

張貼留言