【读取按键】

我们假设你要读取的是一个普通的方形NES手柄,而不是一些其他乱七八糟的东西。为了知道一个按键是否按下,你一次一键地读取0x4016(手柄1)或0x4017(手柄2)。如果按键按下,右边的bit0将被置位(1)。你用1同它相“与”,若结果不为0则跳转。在你读取任何内容之前,你需要先复位手柄(选通)。

【选通/复位】

为了选通/复位手柄,我们写入一个1然后一个0到0x4016(手柄1)或0x4017(手柄2)。可以这么搞:

lda #$01

sta $4016

lda #$00

sta $4016

对,就这样!之后可以真正读取手柄信息。

【读取顺序】

在对0x4016或0x4017进行的的每个读取操作,你获得了不同按键的状态,这些被读出按键的顺序为:

读取序号 | 对应按键

1. A

2. B

3. SELECT

4. START

5. UP

6. DOWN

7. LEFT

8. RIGHT

那么在我们搞些事情之前先学习一些条件和跳转指令怎么样?

【条件跳转】

我们在大多数指令中设置了一些特定“条件”,他们是:

EQ——EQual-Zero, 等于0

NE——Not Equal,不等于0

LT——Less Than,小于0

GT——Greater Than, 大于0

PL——Plus,正数

MI——Minus,负数

CC——Carry Clear,进位标志为0

CS——Carry Set,进位标志为1

VC——oVerflow Clear,溢出标志为0

VS——oVerflow Set, 溢出标志为1

这些条件会被大多数指令设置,甚至包括数据载入。所有这些条件都有一个分支指令。在条件码前加上“B”就构成了条件跳转指令,例如:

;假设有个标签叫做Loopto

beq Loopto;跳到Loopto如果上个比较结果为相等或者上条指令结果为0

bpl Loopto;跳到Loopto如果上次结果bit7为0

bmi Loopto;你懂的

我希望你已经发现规律了。我相信只有NE和EQ条件能被一个非比较指令影响。

以防万一你不知道,偷偷告诉你,一个label(标签)就是一个名称后面跟上冒号,例如

Loopto:

aslkdfj:

Hello_a:

我希望你懂了。记住:标签很好玩。

【读取按键的一个小栗子】

说够了。上代码:

lda #$01 ; |

sta $4016 ; \

lda #$00 ; - 设置手柄用来读

sta $4016 ; _/

lda $4016 ; 读取按键A

and #1 ; 判断是否按下

bne WasDown ; 按下就走

; 我不确定为什么是个BNE,但就是这样,所以就用吧!

lda $4016 ; 读取按键B

lda $4016 ; 读取按键SELECT

lda $4016 ; 读取按键START

and #1 ; 看看是否按下了?

bne StartDown ; 按下了,走起~

lda $4016 ; UP

lda $4016 ; DOWN

lda $4016 ; LEFT

lda $4016 ; RIGHT

jmp NothingDown ; 滚远点

StartDown:

; 开始了开始了

WasDown:

; AAAAAAAAAAAAAAAA

NothingDown:

; 啥都不干

希望你不认为这太难。

个人认为GBA是更容易编程的。所以对我而言,NES程序需要更多学习来搞明白。

【复习今天内容】

首先我想提一点,你可能知道我的GBA 汇编系列教程了,或许你也知道我的x86(DOS)汇编教程?在三门汇编语言中穿梭有时让人抓狂,所以如果你看到一些奇怪的或者错误,让我知道就行。谢谢。

按键检测不那么激情澎湃,但我可以告诉你后面更精彩。。。