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