NESASM教程——第六天——跳转和按键处理

【读取按键】

我们假设你要读取的是一个普通的方形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)汇编教程?在三门汇编语言中穿梭有时让人抓狂,所以如果你看到一些奇怪的或者错误,让我知道就行。谢谢。

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值