【读取按键】
我们假设你要读取的是一个普通的方形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)汇编教程?在三门汇编语言中穿梭有时让人抓狂,所以如果你看到一些奇怪的或者错误,让我知道就行。谢谢。
按键检测不那么激情澎湃,但我可以告诉你后面更精彩。。。