易码技术论坛

 找回密码
 加入易码
搜索
查看: 161626|回复: 9

[写给菜鸟]为你的超级玛莉加上连发键

[复制链接]
发表于 2005-5-29 19:30:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2005-5-29 21:07:00 | 显示全部楼层
支持..!经典啊!!
 楼主| 发表于 2005-6-2 16:46:00 | 显示全部楼层
以下是引用QIQI在2005-6-2 15:53:37的发言:
恩,不错 键盘模拟应该是FC移植中最简单的一个了
楼主可以的话把PPU和APU的部分放上来好了
 楼主| 发表于 2005-6-2 16:58:00 | 显示全部楼层

不知道是论坛的毛病还是我的网络有问题,我打了一句话,竟然没算上
我说啊,我可没那技术.这光荣的任务还是交给你来做好了.
发表于 2005-6-3 20:54:00 | 显示全部楼层
键盘模拟应该是FC移植中最简单的一个?????
          记得你的FC移植上说是最难的一项还有就是字模的压缩....
发表于 2005-6-3 20:58:00 | 显示全部楼层
1020不可以连续按3个键,就是在加速的时候不可以跳跃...2600却可以...这是为什么?(菜啊,不懂哦)
         
 楼主| 发表于 2005-6-3 22:21:00 | 显示全部楼层
NC1020并非不可同时按三个键,只是有个规律.你可以到4.3内核自带的NC-TOOLS中的键盘扫描功能试一下,只要按下的键没有同一行的,就不会发生冲突.

注意,O L 上方向 下方向 P 输入键 下翻页键 右方向 这八个键属于同一行的不同列.这个在键盘扫描里可以轻易地得出结论.

按键冲突是键盘电路决定的.当发生按键冲突时,发生冲突的两个或多个键所在的行/列的键全部无效..

从理论上说,NC1020的键盘是两个字节控制的($08和$09),键盘最多可以分成8行*8列=64个键.既然可以分成八行,那么理论上说,NC1020最多可以检测到八个键同时按下的情况.再多的话就会有冲突了..
发表于 2005-6-16 10:09:00 | 显示全部楼层
NC1020/N最多好象可以按7个键一次
发表于 2005-11-5 20:35:00 | 显示全部楼层
808的呢?
 楼主| 发表于 2005-5-29 18:31:52 | 显示全部楼层 |阅读模式
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编辑过]

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-29 09:54 , Processed in 0.010077 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表