java按键机nes模拟器_NES 模拟器开发教程 12 - 输入设备

news/2025/2/13 5:52:21/

NES 支持许多设备,最常见的还是官方手柄,它有 8 个按键:

A

B

SELECT

START

UP

DOWN

LEFT

RIGHT

读取的时候比较奇怪,按道理来讲 8 个按键刚好可以用 1 个 byte 表示,读一次就可以了,但是 NES 读取的时候却是串行的,读 8 次,每次读一个按键,这样做应该是为了兼容性第三方控制器

1. 寄存器

手柄的寄存器位于 CPU 总线的 0x4016 和 0x4017,分别对应 1P 和 2P

7 bit 0

---- ----

xxxx xxxS

|

+- Controller shift register strobe

寄存器只有 bit 0 有效,做为选通标志。当写入选通为 1 时,则可以通过读取寄存器,每次返回一个按键状态,下一次读取返回下一个按钮状态。当写入 0 时,offset 被置位,再次选通读取时会重新从第一个按钮读取

需要注意的是,只能往 4016 写(写 4017 给 APU 用了),读可以往 4016 和 4017 读。写 4016 时,对两个手柄都有效,读时则 4016 为 P1,4017 为 P2

2. 按钮映射

按钮对应的比特位为:

bit

7

6

5

4

3

2

1

0

button

A

B

Select

Start

Up

Down

Left

Right

3. 实现

手柄实现非常简单,只需要读写和更新按钮状态的函数

export enum StandardControllerButton {

A = 0x80,

B = 0x40,

SELECT = 0x20,

START = 0x10,

UP = 0x08,

DOWN = 0x04,

LEFT = 0x02,

RIGHT = 0x01,

}

export class StandardController implements IStandardController {

private data: number;

private isStrobe = false;

private offset = 0;

public updateButton(button: StandardControllerButton, isPressDown: boolean) {

if (isPressDown) {

this.data |= button;

} else {

this.data &= ~button & 0xFF;

}

}

public write(data: uint8) {

if (data & 0x01) {

this.isStrobe = true;

} else {

this.offset = 0;

this.isStrobe = false;

}

}

public read(): uint8 {

const data = this.isStrobe ? this.data & StandardControllerButton.A : this.data & (0x80 >> this.offset++);

return data ? 1 : 0;

}

}


http://www.ppmy.cn/news/330924.html

相关文章

基于i.mx6q平台的NES模拟器移植

基于i.mx6q平台的NES模拟器移植 小时候一直希望自己能够制作一台游戏机,那时玩的游戏大多都是NES游戏和GBA游戏,那今天就在i.mx6q平台下移植一下NES模拟器吧,后续有时间再移植一下GBA模拟器。下面开始移植NES模拟器。 硬件环境:…

单片机---HLK-W801移植Nes模拟器(一)

总目录 《单片机—HLK-W801移植Nes模拟器(一)》 《单片机—HLK-W801移植Nes模拟器(二)》 《单片机—HLK-W801移植Nes模拟器(三)》 背景介绍 年关将至,不过学习的脚步不能停,最近在…

挖个大坑:挑战用纯micropython写一个nes模拟器(一)

驱动类的micropython程序基本都已经会了,现在给自己挖个大坑:挑战用纯micropython写个nes模拟器。 为啥干这个事儿,其实从小就对模拟器特别又兴趣,很好奇是怎么做到的,在30岁终于动手干了,难度很大&#xf…

嵌入式linux加入nes模拟器,成功运行于 ARM 上的 NES模拟器(InfoNES)

回复: 108 成功运行于 ARM 上的 NES模拟器(InfoNES) (330851310) 出0入0汤圆 楼主| 发表于 2010-11-12 23:19:43 | 只看该作者 程序运行图:

NES模拟器源码阅读

前言 编程语言是一门工具。它用于实现逻辑。看到C实现的任天堂红白机模拟器这篇推荐之后,遂去阅读SimpleNES的源码。 代码中关于日志设置和按键映射的相关代码阅读完毕。关于nes模拟的代码并没有阅读。使用软件来模拟硬件,需要先熟悉游戏机的硬件。这里…

从零开始写NES模拟器

之前写了如何写一个nes模拟器,感觉有些语焉不详,现补充一个小白文章。 FC游戏模拟器是如何工作的 我们小时候很多人玩过任天堂的红白机游戏。但是它是如何工作的,却很少有人提及。 今天我们来讨论任天堂的游戏机工作机制。首先我们看到的是…

天肌处理器天梯排行榜2022 2022天玑处理器天梯图

1、联发科天玑9000 2、联发科天玑9000 3、联发科天玑8100-MAX 我用的手机就是活动时8折抢购的太给力了机会不容错过 http://shouji.adiannao.cn/7 4、联发科天玑8100 5、联发科天玑8000-MAX 6、联发科天玑1200 7、联发科天玑1100 8、联发科天玑1000 9、联发科天玑1000L 1…

骁龙处理器排名天梯图2022

1 骁龙8gen1 2 骁龙888 plus 3 骁龙888 4 骁龙870 5骁龙865 Plus 6 骁龙865 7我用的手机就是活动时8折抢购的太划算了 http://shouji.adiannao.cn/7 7 骁龙855 Plus 8 骁龙855 9 骁龙845 10 骁龙765 11 骁龙765G 12 骁龙835 13 骁龙821 14 骁龙730G 15 骁龙730 高通骁龙处理器排…