距离上一篇文章的发布已经快一年了,在第一篇文章发布之后才发现原来一个模拟器真的不是一般的大,也可能和我的学艺不精有关,这期间花了大量的时间来学习,终于又决定继续写下去,不过还是一些基础的东西,希望被标题吸引过来的朋友不要太失望

卡带头部:
在卡带中,内部信息位于0100-014F的这个地址区间中。它包含以下内容

0100-0103-入口点
在显示完任天堂的LOGO后,内置的启动程序会跳到这个地址(100h),然后在从这里跳转到位于卡带内的实际程序。通常情况下,这个4字节的区域包含有一条JP 0150h指令,后面跟着一条NOP指令。但也并不总是如此

0104—0133—任天堂LOGO
这些字节定义了任天堂LOGO的位图图像,这个图像会在gameboy启动是显示。这个位图的16进制数据为:
CE ED 66 66 CC 0D 00 0B 03 73 00 83 00 0C 00 0D
  00 08 11 1F 88 89 00 0E DC CC 6E E6 DD DD D9 99
  BB BB 67 63 6E 0E EC CC DD DC 99 9F BB B9 33 3E
Gameboy的启动程序会在现在它们之后校验这些数据,如果数据不对,就自己把自己锁住。CGB只校验前面18个字节,其他的如果pocket gameboy校验全部的30h个字节。

0134—0143—标题
游戏标题,用ASCII码表示的大小字母。如果标题字数少于16个字母,余下的部分用00h填充。在开发CGB是,任天堂把这一区域缩小到15个字母,几个月之后,他们有把它缩小到只有11个字母。新的标题结构的其他字节表示的意思如下:
013F—0142—制造商代码
在老的卡带里面,这一区域是标题的一部分(如上所诉),在新的卡带中,这一区域包含一个用4个大写字母表示的制造商代码。代码的详细意思未知。
0143-CGB标志
在老的卡带里面,这一区域是标题的一部分(如上所诉)。在CGB卡带中,这一标志的高位用来设置CGB功能。这是必须的,否则,CGB把自己转换为非CGB模式。这一标志的典型值有:
80H—支持CGB功能的游戏,但也能在老的gameboy下工作。
C0H-只能在CGB下工作(physically the same as 80h)
如果第7位被置位,或者2、3位中的某一位被置位,gameboy会被切换到一个特殊的没有初始化调色板的非CGB模式下。还不知道为什么要这么做,后来这一模式被用来支持在ROM的特定位置有固定调色板数据的单一色彩的游戏。

0144—0145—新的许可证代码
指定一个2个ASCII字母的许可证代码,用来表示游戏的发行商或者开发公司。这两个字节只在最新的游戏中被使用(“最新”指的是在SGB发布之后上市的游戏)。老游戏只用在014B位置的的头部条目

0146-SGB标志
指定游戏是否支持SGB功能,常见的值有:
00H=没有SGB功能(通常情况下只有普通gameboy或者CGB是这样)
03H=支持SGB功能的游戏
SGB会自己把SGB的功能禁止掉,如果该值不是03H的话

0147—卡带类型
指定在卡带中使用了哪种内存控制器(如果有的话),也用来指定卡带是否使用了其他的硬件。
00h  ROM ONLY                 13h  MBC3+RAM+BATTERY
  01h  MBC1                     15h  MBC4
  02h  MBC1+RAM                 16h  MBC4+RAM
  03h  MBC1+RAM+BATTERY         17h  MBC4+RAM+BATTERY
  05h  MBC2                     19h  MBC5
  06h  MBC2+BATTERY             1Ah  MBC5+RAM
  08h  ROM+RAM                  1Bh  MBC5+RAM+BATTERY
  09h  ROM+RAM+BATTERY          1Ch  MBC5+RUMBLE
  0Bh  MMM01                    1Dh  MBC5+RUMBLE+RAM
  0Ch  MMM01+RAM                1Eh  MBC5+RUMBLE+RAM+BATTERY
  0Dh  MMM01+RAM+BATTERY        FCh  POCKET CAMERA
  0Fh  MBC3+TIMER+BATTERY       FDh  BANDAI TAMA5
  10h  MBC3+TIMER+RAM+BATTERY   FEh  HuC3
  11h  MBC3                     FFh  HuC1+RAM+BATTERY
  12h  MBC3+RAM

注:BATTERY为电池,RAM为随机存储器

0148—卡带的ROM容量
指定卡带的ROM的大小,典型的计算方式为"32KB shl N".
00h -  32KByte (no ROM banking)
  01h -  64KByte (4 banks)
  02h - 128KByte (8 banks)
  03h - 256KByte (16 banks)
  04h - 512KByte (32 banks)
  05h -   1MByte (64 banks)  - only 63 banks used by MBC1
  06h -   2MByte (128 banks) - only 125 banks used by MBC1
  07h -   4MByte (256 banks)
  52h - 1.1MByte (72 banks)
  53h - 1.2MByte (80 banks)
  54h - 1.5MByte (96 banks)
注:bank指的是内存块,不是银行哦

0149—RAM的大小
指定卡带中额外的RAM的大小
00h - None
  01h - 2 KBytes
  02h - 8 Kbytes
  03h - 32 KBytes (4 banks of 8KBytes each)—8K字节占用一个内存快
如果使用MBC2类型的卡带,这个字节必须被设置为00H。尽管MBC2有自带的512*4 个位大小的RAM

014A—目标代码
指定这个版本的游戏是否能在日本销售,或者只能在其他地方销售。只定义了两个值:
00h - Japanese
  01h - Non-Japanese

014B—旧许可证代码
指定游戏/发行商的代码,范围为00-FFh。值33h用来指明在0144-0145存在新的许可证代码。
在SGB中,如果值不是33h,则SGB无法工作

014C-游戏版本掩码(mask)
指定游戏的版本号,通常为00h

014D-头部校验和
包含一个跨越0134-014C的大小为8位的校验和。校验和的计算方式如下:
x=0:FOR i=0134h TO 014Ch:x=x-MEM-1:NEXT
这个计算结果的底8位必须和该位置的值相等。如果校验和错误,游戏则不会运行。

014E—014F-全局校验和
包含一个跨越整个卡带ROM的大小为16位的校验值。计算方式为:
除了这两位外,把卡带的所有位相加得到的值。如果校验和错误,游戏则不会运行

翻译的原文地址为:http://nocash.emubase.de/pandocs.htm

[翻译] WindowsPhone-GameBoy模拟器开发二--Rom文件分析相关推荐

  1. gameboy模拟器开发_CoreBoy是使用C#编写的跨平台GameBoy模拟器,甚至可以执行ASCII

    gameboy模拟器开发 .NET and C# are great languages for programming emulators. Specifically retrogaming and ...

  2. 图解使用Win8Api进行Metro风格的程序开发二----使用文件选择器访问和保存文件

    我们紧接着上篇,这篇将介绍如何使用文件选择器访问和保存文件 -----------------------------------我是华丽的分割线--------------------------- ...

  3. WindowsPhone-GameBoy模拟器开发系列

    这是一个资源集合贴,用来作为该系列的索引. 欢迎大家在园子里和论坛留下脚印 今天开始决定写一些模拟器开发的文章,本人之前没有过任何模拟器相关的开发经验,学习了一个月的Silverlight.XNA开发 ...

  4. 单片机开发---ESP32S3移植NES模拟器(二)

    书接上文 <单片机开发-ESP32-S3模块上手> <单片机开发-ESP32S3移植lvgl+触摸屏> <单片机开发-ESP32S3移植NES模拟器(一)> 暖场视 ...

  5. 【Android游戏开发二十七】讲解游戏开发与项目下的hdpi 、mdpi与ldpi资源文件夹以及游戏高清版本的设置...

    今天一个开发者问到我为什么游戏开发要删除项目下的hdpi.mdpi和ldpi文件夹:下面详细给大家解答一下: 首先童鞋们如果看过我写的<[Android游戏开发二十一]Android os设备谎 ...

  6. WindowsPhone-GameBoy模拟器开发四--Gameboy显示系统分析

    这次说一下GB的显示系统,先从一幅Gb的内存分布图说起,请看图: 图中红色框框起来的部分就是这篇文章关注的部分,这一部分的内存地址从8000-9Fff,共8KB,这一部分是从来存储背景和游戏" ...

  7. Python SolidWorks 二次开发---SolidWorks保存文件

    Python SolidWorks 二次开发-SolidWorks保存文件 Python SolidWorks 二次开发-SolidWorks保存文件 文章目录 Python SolidWorks 二 ...

  8. iOS 11开发教程(五)iOS11模拟器介绍二

    iOS 11开发教程(五)iOS11模拟器介绍二 3.iOS11模拟器中设置语言 对于不同国家的人来说,使用到的语言是不一样的.一般情况下iOS11模拟器默认使用的English(英语).对于英文不好 ...

  9. 用 Python 写出了一个 Gameboy 模拟器

    点击上方"编程派",选择设为"设为星标" 优质文章,第一时间送达! 感觉用 Atari 游戏研究人工智能有点「不够接地气」?现在我们可以使用 Gameboy 模 ...

最新文章

  1. 巴曙松:收到了Roger送的BCH,已全捐给慈善基金
  2. C++标准:C++不允许修改任何基本型别(包括指针)的暂时值
  3. SpringBoot 45个注解
  4. 13个开发者技能必知必会!
  5. jMeter HTTP Request Defaults 的学习笔记
  6. leetcode 1356. 根据数字二进制下 1 的数目排序(排序)
  7. Windows中安装MongoDB以及studio3t
  8. uart怎么判断帧错误_UART通讯总线工作原理的理解
  9. php省城联动_thinkPHP实现的省市区三级联动功能示例
  10. 为什么 SQL 程序员也要懂 Python?
  11. 第一次用PHP做电影站 用thinkphp开发的!!
  12. java 模糊查询 分页(自定义标签)
  13. Navicat15注册时报错“rsa public key not find”的解决办法
  14. 计算机专业色弱限制,体检标准变成建议 色盲色弱能报高校计算机专业
  15. 生物计算机 量子计算机,生物计算机光子计算机量子计算机哪个更先进
  16. 【luogu P5055】【模板】可持久化文艺平衡树
  17. win2d CanvasCommandList 使用方法
  18. C语言 投票系统:给定候选人,从键盘输入候选人的名字,统计票数,并输出最终获胜者...
  19. access 升迁 mysql_随说秋色园从Access升迁到MSSQL过程
  20. Android 2D游戏引擎1

热门文章

  1. 扩展 日历_日历功能的拓展:Apple Watch能在屏幕上显示年日历
  2. homestead开发php,介绍ThinkPHP开发环境之Homestead
  3. druid不能close mysql连接_alibaba druid mysql连接问题
  4. PodPresent-K8s时区配置
  5. android百度地图sdk定位权限,Android:使用百度地图SDK实现定位:下载SDK、申请密钥、动态获得Android权限...
  6. 搭建K8s集群(kubeadm方式)-部署master节点
  7. Spring中的Events
  8. ZkServer服务启动的逻辑-NIOServerCnxnFactory.configure
  9. compareAndSwapInt
  10. 数据库事务原理详解-数据库隔离级别