Genesis 程式設計/68000 程式設計注意事項
外觀
ROM 頭部從 $000100 開始,包含有關卡帶的資訊。以下彙編程式碼展示瞭如何宣告頭部
- dc.b "SEGA GENESIS"
- dc.b "(C)SEGA 1992.SEP"
- dc.b "YOUR GAME HERE"
- dc.b "YOUR GAME HERE"
- dc.b "GM XXXXXXXX-XX"
- dc.w $D951
- dc.b "J"
- dc.l 0
- dc.l ROM_End
- dc.l $FF0000
- dc.l $FFFFFF
- dc.b (空白)
- dc.b (空白)
- dc.b (空白)
- dc.b (空白)
- dc.b (空白)
- dc.b "JUE"
每個欄位的解釋
- 控制檯的名稱。應該為 "SEGA GENESIS" 或 "SEGA MEGA DRIVE"(取決於您計劃為其程式設計遊戲的區域)。必須是 16 個字元長。
- 公司名稱和構建日期。必須是 16 個字元長,公司名稱是四個字元長。
- 國內名稱。必須是 48 個字元長。
- 國際名稱。必須是 48 個字元長。
- 程式型別和序列號。前兩個字元是 "GM"(遊戲)或 "AL"(教育)。在空格之後,一系列八位數字給出序列號。最後兩位數字給出版本號。
- 校驗和.
- I/O 裝置支援(未使用)
- ROM 的開始。這始終為 0。
- ROM 的結束。最好在原始檔末尾使用標籤來確定這一點。
- RAM 的開始。幾乎所有遊戲都從 $FF0000 開始,但 RAM 在幾個其他位置映象,如果您願意,可以使用這些位置。
- RAM 的結束。在起始點之後應該是 $FFFF。
- 備份 RAM ID。如果不存在,則用空格填充,否則,使用以下公式
dc.b "RA",%1x1yy000,%0010000
其中 x 在 RAM 用於備份時為真,否則為假。(我不知道它們的區別。)yy 如果地址是奇數字節,則為 11,如果為偶數字節,則為 10,如果兩者都是,則為 00。 - 備份 RAM 的起始地址。如果不存在備份 RAM,則用空格填充。
- 備份 RAM 的結束地址。
- 調變解調器支援。如果不存在調變解調器,則用空格填充,否則,按照以下公式
"MOxxxxyy.zzz"
其中 xxxx 是公司名稱,yy 是調變解調器號,zzz 是版本號。(這也沒有使用) - 註釋。在此處放置您想要的任何內容,並用零填充空白空間。
- 國家程式碼。J 代表日本,U 代表美國,E 代表歐洲。您需要用空格填充該欄位的其餘部分。因此,JU 作為國家程式碼將告訴世嘉遊戲適用於日本和美國,JUE 將告訴世嘉遊戲適用於日本、美國和歐洲
早在 1990 年,Accolade 就釋出了幾款針對 Genesis 的非授權遊戲。世嘉對此並不滿意,因此他們發明了 TMSS 並將其應用於他們製造的所有新控制檯上。TMSS 強制遊戲在短時間內將 ASCII 字串 "SEGA" 寫入 $A14000,否則 VDP 將被停用。在控制檯版本 0 上,此位置是保留的,在此寫入可能會導致崩潰,因此遊戲必須首先確保它是在安裝了 TMSS 的控制檯上執行的。世嘉使用以下例程來實現這一點
move.b $A10001,d0
andi.b #$0F,d0
beq.b version_0
move.l #'SEGA',$A14000
version_0:
校驗和是一個 16 位數字(字),位於所有授權遊戲中的頭部。它用於透過儲存使用原始資料預先計算的數字(校驗和)來檢查資料的完整性,並將該數字與卡帶中現有資料的校驗和進行比較,這可能是為了防止未經授權的程式碼更改(內部)。
校驗和基本上是整個卡帶的總和,包括從地址 $200 開始的所有位元組。如您所料,如果只更改了一個位元組,校驗和也會改變。有點像 CRC/CRC32 演算法,儘管這些演算法比這種方法精確得多。
如果您程式設計自己的自制 ROM,則不需要實現校驗和,因為校驗和僅由軟體檢查。但是,無論如何,這是一種典型的授權遊戲的校驗和例程的樣子。
movea.l #$200,a0 movea.l #ROM_End,a1 move.l (a1),d0 moveq #0,d1 loop: add.w (a0)+,d1 cmp.l a0,d0 bcc.s loop movea.l #$18E,a1 ; Checksum cmp.w (a1),d1 bne.w WrongChecksum
要停用它,請註釋掉最後一個分支。如果您希望修復校驗和,請從 Hacking CulT 的 下載部分獲取“修復校驗和”實用程式。