• 首发公号:Rand_cs,求关注支持

Controller&Format

Controller

本文讲述 NES 的输入设备,最为常见的就是手柄 joypad:

一般支持两个手柄,手柄 1 和手柄 2 分别映射到 CPU 的地址空间 0x4016 和 0x4017,我们可以从这两个寄存器读出手柄按键的状态,1 代表按下,0 表示弹起状态。

手柄的内部有个移位寄存器来存放这些键的状态,每次从 0x4016 读取的数据只表示一个键的状态,需要连续读取 8 次才能读取所有键的状态,8 个键的读取顺序如下所示:

A→B→Seclect→Start→Up→Down→Left→RightA \rightarrow B \rightarrow Seclect \rightarrow Start \rightarrow Up \rightarrow Down \rightarrow Left \rightarrow RightA→B→Seclect→Start→Up→Down→Left→Right

读取 Right 后,如果继续读会一直返回 1。

手柄内部有个 strobe,可以通过写 0x4016 来设置这个 strobe,如果设为 1,手柄会不停的将当前键的状态装载到移位寄存器,此模式下,CPU 读取键位状态会一直获取键 A 的状态。如果 strobe 设为 0,会停止装载键的状态,这个模式下连续读取 8 次就是我们想要的 8 个键的状态。

看个代码好理解些:

  LDA #$01      ; strobe 设为1,装载键的状态 STA $4016LDA #$00      ; strobe 设为0,停止装载STA $4016     ; tell both the controllers to latch buttonsLDA $4016     ; player 1 - ALDA $4016     ; player 1 - BLDA $4016     ; player 1 - SelectLDA $4016     ; player 1 - StartLDA $4016     ; player 1 - UpLDA $4016     ; player 1 - DownLDA $4016     ; player 1 - LeftLDA $4016     ; player 1 - RightLDA $4017     ; player 2 - ALDA $4017     ; player 2 - BLDA $4017     ; player 2 - SelectLDA $4017     ; player 2 - StartLDA $4017     ; player 2 - UpLDA $4017     ; player 2 - DownLDA $4017     ; player 2 - LeftLDA $4017     ; player 2 - Right

NES 手柄的工作原理就是这样,很简单,不够写一篇哪,下面就说说 NES 文件格式:

Format

NES 文件最初是 Marat Fayzullin 为了他的 NES 模拟器而定义的一种文件格式,之后就一直沿用,只是有了些更新,来看看 NES 文件是怎样的:

iNES header

byte0-2,魔数字符串 “NES”,很多文件格式的开头都有这么一个标识,比如说 elf 文件,这里也一样的道理。

byte3,包含了值 0x1A,也是标识魔数的一部分

byte4,16KB 的 PRG 的数量

byte5,8KB 的 CHR 的数量

byte6,Rom control byte 1:

  • bit0:0-水平镜像,1-垂直镜像
  • bit1:是否有 RAM 映射到 0x6000-0x7FFF,这部分可用作存档
  • bit2:是否存在 512 字节的 trainer,trainer 用于一些被修改过的游戏使其运行在不同的硬件上,比如说早期的一些 RAM 卡带,这里就要放置一些额外的兼容性代码,一般没有 trainer。
  • bit3:此位置 1 会覆写 bit0,表示 four-screen mirroring
  • bit4-7:mapper number byte 低 4 位,表示使用的哪种 mapper

byte7,ROM control byte 2:

  • bit0-3,保留,全 0
  • bit4-7,mapper number byte 高 4 位

byte8,8KB 的 RAM banks 的数量,主要是为了兼容前代的 ines 文件格式

byte9-15,保留,全 0

后面就是文件主题,如果有 trainer,那紧接着 header 的就是trainer,否则就是 PGR 和 CHR 紧跟其后。

NES 的文件格式就是这样,来看超级马里奥的例子,同样的直接使用 FCEUX 打开超级马里奥,截图如下所示:

然后再直接查看二进制文件:

byte0-3:0x4e, 0x45, 0x53, 0x1a 为 NES+0x1a

byte4:0x02,表示 16KB 的 PRG 有 2 个,说明 PRG 有 32KB

byte5:0x01,表示 8KB 的 CHR 有 1 个,说明 CHR 有 8KB

byte6-7:0x01,0x00,表示垂直镜像,mapper number 为 0

上述就是超级马里奥文件头的基本信息,可以与从 FCEUX 截的图做对比,发现是吻合的没问题。

好了本文就到这里,有什么问题还请批评指正。

  • 首发公号:Rand_cs,求关注支持

童年神机小霸王(六) 手柄相关推荐

  1. 童年神机小霸王(七) Mapper

    首发公号:Rand_cs,求关注支持 Mapper mapper,这个概念来源于 memory mapping,又叫做 Memory Management Circuit,它是解决地址映射的一种电路, ...

  2. vivoiqooz1鸿蒙系统,iQOOZ1评测:vivo新一代性价比神机

    [手机中国评测]如果说2019是5G发展的元年,那么2020就是5G技术和终端奋起发力的一年.纵观目前市面上的5G机型我们不难发现,"涨价"已经成为了2020年的新关键词.技术成本 ...

  3. 同级最强!天玑8200实测成绩放出,iQOO Neo7 SE神机配神U

    联发科的天玑8200芯片于12月8日正式发布,首发搭载天玑8200的性能神机iQOO Neo7 SE也在同天发布开售.作为天玑8000家族的新成员,天玑8200不负"神U二代"的威 ...

  4. 神机也有软肋 小米手机

    神机也有软肋 小米手机 2011年09月11日 小米手机是一台战斗机,无论从规格还是价格都让人眼前一亮.然而小米手机也是并不完美的,特别是它的摄像头表现存在不少让人期盼改进的地方.今天就为大家深入分析 ...

  5. 2年Android7K,2月Android手机性能榜:神机K40冲榜功成 天玑820力压麒麟中端芯

    不过有这种实力厂家的毕竟只是少数,更多的手机品牌只是发布了预告,其骁龙888新机都将会在3月份发布,目前已知的品牌就已经接近十位数了,可见3月份的榜单才是国产手机的重头戏,诸多新机将会一一登场. 那接 ...

  6. 怎么通过media foundation将图像数据写入虚拟摄像头_不知道怎么挑手机?性价比神机绝对适合你...

    阅读本文前,请您先点击上面的蓝色字体,再点击"关注",这样您就可以继续免费收到最新文章了.每天都有分享.完全是免费订阅,请放心关注.注:本文转载自网络,不代表本平台立场,仅供读者参 ...

  7. 250鲁大师跑分_我装了一台鲁大师 230W 分的神机,3A 游戏平台装机作业

    原标题:我装了一台鲁大师 230W 分的神机,3A 游戏平台装机作业 今年 AMD 的表现可以说是非常令人震惊,CPU 和 GPU 两开花,拳打 Intel 敬老院,脚踢 NVIDIA 幼儿园,一举成 ...

  8. 6000毫安以上智能手机_三星超长续航神机,6000毫安+128GB,上市半年不到跌至1499...

    现在的手机是越来越智能了,无论是苹果还是安卓,基本都能为用户的生活添加几分乐趣,因为,当我们感到无聊时,基本都可以通过智能手机来打发时间.据我所知,不少人在用智能手机时都有个困扰,就是续航时间偏短,基 ...

  9. k2p 官方固件_继斐讯K2P之后,红米AC2100也将成一代路由器神机?

    如同手机一样,路由器也可以用来刷机,甚至一些路由器通过刷第三方固件还能充分发挥硬件潜力.之前,斐讯K2P依靠可以刷不少第三方固件而一跃成为路由器神机.而继斐讯K2P之后,红米AC2100也被一些极客青 ...

最新文章

  1. 大物实验总结模板_高考化学实验题答题模板归类总结!
  2. 网络营销过程中如何避免网站的过度优化情况的发生?
  3. linux 修复图形界面,图形界面操作的备份和恢复Linux发行版
  4. Direct2D教程(五)复合图形
  5. 每天Leetcode 刷题 初级算法篇-数学问题-计数质数
  6. Vue cli3使用vue-awesome-swiper
  7. 全数字FM接收机 --(1)结构
  8. 淘宝类目 API数据接口
  9. 后端系统开发之技术方案写作
  10. dell服务器分区表修复,使用 BIOSConnect 恢复 SupportAssist OS Recovery 分区
  11. 神仙道丹药材料及掉落地点大全
  12. cts测试linux指令skip,CTS测试命令详细
  13. python的dev包怎么安装_python-dev如何安装 sudo apt-get install python-dev ?
  14. 隐藏微信小程序返回首页按钮(小房子)
  15. 2014年度总结——软件产品化的简要理解
  16. 基于《高级计算机图形学原理与实践》(西安科技大学)的学习笔记(一、二)
  17. root 启动mysql_非root用户随开机而启动mysql服务
  18. 2022G3锅炉水处理特种作业证考试题库及答案
  19. 论文查重系统需要注意哪些细节问题?
  20. 莆田鞋推广引流源码支持直接拉起微信

热门文章

  1. CSS中::after和:after的区别
  2. FD镜像文件生成过程分析
  3. Arduino-CCS-811检测空气中CO2和VOC含量(超详细)
  4. Codeforces Round #713 (Div. 3)题解
  5. 2022年9月高频前端面试题总结
  6. vue 是什么?webpack 是什么?
  7. JAVA替换PDF文字
  8. PCL中使用KdTree在点云中进行K近邻及半径查询
  9. 张俊林:从对比学习视角,重新审视推荐系统的召回粗排模型
  10. 计算机科学技术想象作文,未来科技想象作文