- 注册时间
- 2004-9-4
- 最后登录
- 1970-1-1
|
LEE的超级玛莉在文曲星端没有连发键,选择键也给屏蔽掉了.这里我们把这三个功能键补上.
原理:使用键盘输入端口扫描和1/256秒端口模拟连发.
修改方法:
打开NCTOOLS,找到超级玛莉所在的页,在地址B48B处可以看到以下程序:
B48B:
LDA #$00
;清空4C
STA $4C
;通过后面我们可以知道,4C在这里用来模拟FC控制器的输入端口.
LDA #$00
STA $09
LDA #$FF
STA $15
LDA #$00
ORA #$01
STA $09
LDA $08
;检测最左侧一列按键是否有被按下的,
;包括: 求助键(80),Z(40),A(20),Q(10),O(08),F1(04),时间键(02)
STA $52 ;读取按键值放52
BPL $B4A9 ;若小于80(即,求助键未被按下),则跳转)
LDA #$02
ORA $4C
STA $4C
;模拟手柄左方向键.
;用过F-BASIC中的STICK函数或者知道FC输入端口机理的朋友都知道,
;上下左右四个方向的值分别为:8,4,2,1
B4A9:
LDA $52
AND #$10
BEQ $B4B4 ;如果没有按下Q键,则跳转
LDA #$FF
STA $0904
B4B4:
LDA $52
AND #$04
BEQ $B4BD ;如果没有按下F1键,则跳转
JMP $4021 ;这个JMP应该是到了复位了.
B4BD:
LDA #$00
STA $09
LDA #$FF
STA $15
LDA #$00
ORA #$02
STA $09
LDA $08
;检测左数第二列的按键是否按下.
;包括: 中英数键(80),X(40),S(20),W(10),L(08),F2(04),测验键(02)
STA $52 ;读取按下的键的值,放52
BPL $B4D7 ;若小于80(即,中英数键未按下),则跳转
LDA #$04
ORA $4C
STA $4C ;模拟手柄下方向键.
B4D7:
BIT $52
BVC $B4E1 ;看X键是否按下,若否,则跳转.
LDA #$08
ORA $4C
STA $4C ;模拟手柄上方向键.
B4E1:
LDA #$00
STA $09
LDA #$FF
STA $15
LDA #$00
ORA #$04
STA $09
LDA $08
;测试左数第三列按键是否按下
;包括: 输入法键(80),C(40),D(20),E(10),上方向键(08),F3(04),行程键(02),红外键(01)
BPL $B4F9 ;若输入法键未按下则跳转
LDA #$01
ORA $4C
STA $4C ;模拟手柄右键.
B4F9:
LDA #$00
STA $09
LDA #$FF
STA $15
LDA #$00
ORA #$08
STA $09
LDA $08
;测试左数第四列的按键是否按下
;包括: 跳出键(80),V(40),F(20),R(10),下方向键(08),F4(04),英汉键(02)
STA $52
AND #$08
BEQ $B515 ;若键盘上的下方向键未按下,则跳转.
LDA #$40
ORA $4C
STA $4C
;模拟手柄B键.
;注: A-80,B-40,SELECT-20,START-10
B515:
LDA $52
AND #$04
BEQ $B521 ;若F4键未按下,则跳转.
LDA #$10
ORA $4C
STA $4C ;模拟手柄上的START键.
B521:
LDA #$00
STA $09
LDA #$FF
STA $15
LDA #$00
ORA #$80
STA $09
LDA $08
;测试左数第八列按键是否按下
;包括: 左方向键(80),上翻页键(40),K(20),I(10),右方向键(08)
AND #$08
BEQ $B53B ;若键盘上的右方向键未按下,则跳转
LDA #$80
ORA $4C
STA $4C ;模拟手柄的A键.
B53B:
LDA #$00
STA $15 ;关闭键盘端口
B53F:
LDA $4C
CMP #$D0
BNE $B54A
LDA #$FF
STA $0905
B54A:
LDX #$00 ;设置为主手柄
LDA $4C ;读取按键信息.
JSR $B554 ;此处JSR可以将主手柄的按键信息传入程序.
INX ;设置为副手柄
B552:
LDA #$00 ;这里是把副手柄的按键信息读出,可以看出,直接清零了,导致副手柄无效.
B554:
STA $06FC,X
PHA
AND #$30
AND $074A,X
BEQ $B556
PLA
AND #$CF
STA $06FC,X
RTS
B566:
PLA
STA $074A,X
RTS
以上是超级玛莉本来的代码.我们完全可以从中间插入一段判断连发键和选择键的代码.考察文曲星的键盘布局,我们可以设置上翻页键为连A(连跳),上方向键为连B(连发子弹),小数点键设为选择键.
从代码中我们可以看到,最好在关闭键盘端口处插入.
这样我们可以把B53B处的程序改为:
B53B:
NOP
JMP $B7A0
然后在B7A0处写入我们要插入的代码:
B7A0:
LDA $3E
PHA
LDA #$04
STA $3E ;设置3F为1/256秒输入端口
LDA $3F
AND #$10 ;调整此值可以改变连发速度.我测试了一下,设置为10还是比较合适的.
BEQ Release ;周期性的按下/放松.
LDA #$00
STA $09
LDA #$FF
STA $15
LDA #$00
ORA #$40
STA $09
LDA $08
;测试左数第七列按键是否按下
;包括: 空格键(80),M(40),J(20),U(10),下翻页键(08),网络键(02)
AND #$08
BEQ Nojump ;若下翻页键未按下,则跳转到 无连跳动作
LDA #$80
ORA $4C
STA $4C ;模拟手柄的A键.
Nojump:
LDA #$00
STA $09
LDA #$FF
STA $15
LDA #$00
ORA #$04
STA $09
LDA $08 ;测试左数第三排按键是否按下.其中有键盘的上方向键(08)
AND #$08
BEQ Noshoot ;若键盘的上方向键未按下,则跳转到 无连射动作
LDA #$40
ORA $4C
STA $4C ;模拟手柄的B键.
Noshoot:
NOP
Release: ;因为在这里之前我们不确定有没有模拟A键和B键,况且B48B这段程序一开始就清空了4C,所以我们在这里不必清空A键和B键所在的位.
PLA
STA $3E
LDA #$00
STA $09
LDA #$FF
STA $15
LDA #$00
ORA #$20
STA $09
LDA $08
;测试左数第六列按键是否按下
;包括: 小数点键(80),N(40),H(20),Y(10),输入键(08),发音键(04),计算键(02)
AND #$80
BEQ Nosel ;若小数点键未按下,则跳转到 无选择键动作
LDA #$20
ORA $4C
STA $4C ;模拟手柄的SELECT键.
LDA #$00
STA $15 ;关闭键盘端口
JMP $B53F ;返回
至此,我们需要的功能已经添加完成.后来我们可以发现,副手柄无法运作.因为在B552处将副手柄的值直接清空了,所以我们还必须把B552处的"LDA #$00"改为"LDA $4C",这样副手柄也读取4C的内容了.
但我们又发现,主手柄和副手柄控制的两个角色的各项属性可能是保存在同一个RAM地址了,所以,副手柄和主手柄控制的是同一个角色,选择"2 PLAYERS"和选择"1 PLAYER"是没什么分别的,仅仅名子不一样罢了.
注:本人机型:NC1020.其它型号的请自行匹配地址.
[此贴子已经被作者于2005-5-29 18:43:13编辑过]
|
|