跳转到内容

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 的 下载部分获取“修复校验和”实用程序。

华夏公益教科书