日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/20 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java按键机nes模拟器_NES 模拟器开发教程 12 - 输入设备 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

NES 支持許多設(shè)備,最常見的還是官方手柄,它有 8 個按鍵:

A

B

SELECT

START

UP

DOWN

LEFT

RIGHT

讀取的時候比較奇怪,按道理來講 8 個按鍵剛好可以用 1 個 byte 表示,讀一次就可以了,但是 NES 讀取的時候卻是串行的,讀 8 次,每次讀一個按鍵,這樣做應(yīng)該是為了兼容性第三方控制器

1. 寄存器

手柄的寄存器位于 CPU 總線的 0x4016 和 0x4017,分別對應(yīng) 1P 和 2P

7 bit 0

---- ----

xxxx xxxS

|

+- Controller shift register strobe

寄存器只有 bit 0 有效,做為選通標志。當寫入選通為 1 時,則可以通過讀取寄存器,每次返回一個按鍵狀態(tài),下一次讀取返回下一個按鈕狀態(tài)。當寫入 0 時,offset 被置位,再次選通讀取時會重新從第一個按鈕讀取

需要注意的是,只能往 4016 寫(寫 4017 給 APU 用了),讀可以往 4016 和 4017 讀。寫 4016 時,對兩個手柄都有效,讀時則 4016 為 P1,4017 為 P2

2. 按鈕映射

按鈕對應(yīng)的比特位為:

bit

7

6

5

4

3

2

1

0

button

A

B

Select

Start

Up

Down

Left

Right

3. 實現(xiàn)

手柄實現(xiàn)非常簡單,只需要讀寫和更新按鈕狀態(tài)的函數(shù)

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;

}

}

總結(jié)

以上是生活随笔為你收集整理的java按键机nes模拟器_NES 模拟器开发教程 12 - 输入设备的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。