跳轉到內容

Genesis 程式設計/68000 程式設計注意事項

來自華夏公益教科書

68000 程式設計注意事項

[編輯 | 編輯原始碼]

ROM 頭部

[編輯 | 編輯原始碼]

ROM 頭部從 $000100 開始,包含有關卡帶的資訊。以下彙編程式碼展示瞭如何宣告頭部

  1. dc.b "SEGA GENESIS"
  2. dc.b "(C)SEGA 1992.SEP"
  3. dc.b "YOUR GAME HERE"
  4. dc.b "YOUR GAME HERE"
  5. dc.b "GM XXXXXXXX-XX"
  6. dc.w $D951
  7. dc.b "J"
  8. dc.l 0
  9. dc.l ROM_End
  10. dc.l $FF0000
  11. dc.l $FFFFFF
  12. dc.b (空白)
  13. dc.b (空白)
  14. dc.b (空白)
  15. dc.b (空白)
  16. dc.b (空白)
  17. dc.b "JUE"

每個欄位的解釋

  1. 控制檯的名稱。應該為 "SEGA GENESIS" 或 "SEGA MEGA DRIVE"(取決於您計劃為其程式設計遊戲的區域)。必須是 16 個字元長。
  2. 公司名稱和構建日期。必須是 16 個字元長,公司名稱是四個字元長。
  3. 國內名稱。必須是 48 個字元長。
  4. 國際名稱。必須是 48 個字元長。
  5. 程式型別和序列號。前兩個字元是 "GM"(遊戲)或 "AL"(教育)。在空格之後,一系列八位數字給出序列號。最後兩位數字給出版本號。
  6. 校驗和.
  7. I/O 裝置支援(未使用)
  8. ROM 的開始。這始終為 0。
  9. ROM 的結束。最好在原始檔末尾使用標籤來確定這一點。
  10. RAM 的開始。幾乎所有遊戲都從 $FF0000 開始,但 RAM 在幾個其他位置映象,如果您願意,可以使用這些位置。
  11. RAM 的結束。在起始點之後應該是 $FFFF。
  12. 備份 RAM ID。如果不存在,則用空格填充,否則,使用以下公式
    dc.b "RA",%1x1yy000,%0010000
    其中 x 在 RAM 用於備份時為真,否則為假。(我不知道它們的區別。)yy 如果地址是奇數字節,則為 11,如果為偶數字節,則為 10,如果兩者都是,則為 00。
  13. 備份 RAM 的起始地址。如果不存在備份 RAM,則用空格填充。
  14. 備份 RAM 的結束地址。
  15. 調變解調器支援。如果不存在調變解調器,則用空格填充,否則,按照以下公式
    "MOxxxxyy.zzz"
    其中 xxxx 是公司名稱,yy 是調變解調器號,zzz 是版本號。(這也沒有使用)
  16. 註釋。在此處放置您想要的任何內容,並用零填充空白空間。
  17. 國家程式碼。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 的 下載部分獲取“修復校驗和”實用程式。

華夏公益教科書