» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


发新话题
打印

[老游杂谈] 有多少MD游戏只能用六键手柄玩?

引用:
原帖由 快乐猪头 于 2012-4-21 16:16 发表
posted by wap, platform: Opera

知道6键实际上是依靠3键模式组合映射实现的,似乎是X键映射为上下左右齐按,其他的不详。
不是这样的。咸蛋疼的可以看下去,咸蛋不疼的建议按浏览器后退键。

3键手柄靠判断开关方式来判断按键是否按下,总共只需要花2周期时间,其中还用到了74HC157这块4路片选器,接线方式如下表
=======================
手柄____74片选器____手柄口针号
----------------
上------------1
下------------2
左----1B-------3
右----2B-------4
A----3A-------6
B----3B-------6
C----4B-------9
S----4A-------9
=======================
手柄口只有123469这6根针用来传输按键状态,那么怎样在6根针里传输8个键的状态?
手柄口上还有3根线未用,其中两根(5和8)分别是Vcc和Gnd作为供电和参考电平,还余下一根7号线,这根线用来告诉74片选器是输出A路上的信号还是B路上的信号。
这样实际在第一个周期中,7号线先被程序置为高电平,然后,程序可以读到(1,2,3,4,6,9)线上的状态分别对应(上,下,左,右,B,C)这些键的按下或弹起。
而下一个周期,7号线被程序置为低电平,这样程序读到(1,2,3,4,6,9)线上的状态分别对应(上,下,空,空,A,S)这些键的按下或弹起。
这样经过2个周期(注意是2个周期,不是2贞),一个手柄口的按键状态就完全获取到了。


但是6键手柄有了很大不同,这种不同一是因为按键多了不少,二是为了保证手柄可以让以前只支持3键手柄的程序兼容,三是为了订出一套可扩展的协议,为了之后的4分插外设作准备,避免再次出现3键升级到6键时的麻烦(3键的2周期无重置读取以及上下键直接作为输出其实是很草率的缺乏扩展远见的设计)。

6分叉的工作状态比3键的要繁琐很多,具体的可以去http://segaretro.org/Control_Pad_(Mega_Drive)
这里只简单说一下。
首先,实现方式上绝对不是简单地作按键组合来产生新的按键信号,这样做会有很多问题,比如如果有游戏写得逻辑有些问题,判断上和右如果按下,就使角色往前跳起并且不再判断其他按键状态,那么靠上下左右拼合出来的X键一旦按下,可能就会导致这个程序认为前跳这个操作被触发了。。。。这个例子听上去好像是程序员责任,但实际上是程序员和硬件设计人员都有责任,只不过2个SB碰到了一起。
这种奇葩硬件设计人员是不会犯了,他们把MD6键手柄设计成了要求程序每贞读取8次来获取所有按键状态。XYZ还有Mode键状态,只有在第7周期才能读到,前6周期完全是为了兼容那些只支持3键的老游戏。同时8周期后,手柄中的状态强制重置。
这样对于99%的3键老游戏来说,他们依然可以获取他们想获取的状态,只有那1%的游戏,因为每贞读取了手柄数据超过8次,导致状态出错,引发Bug,比如前面帖子里各位提到的个别游戏。

另外,6键手柄如果在供电初始时,自己监测到Mode键按下,手柄硬件本身就会工作在兼容模式,不再以8周期重置模式工作,而是2周期重置,这样就和3键手柄完全一样了,这种变化是手柄内芯片自己完成,即手柄硬件级的切换,和主机还有游戏程序无关了。

[ 本帖最后由 SONIC3D 于 2012-4-22 02:33 编辑 ]


本帖最近评分记录

TOP

引用:
原帖由 快乐猪头 于 2012-4-22 11:19 发表
蛋疼的表示针脚电平之类完全看不懂,也不想看懂。

理解下来貌似是MD的按键输入方式一开始就预留了拓展的余地,或者,说的难听些就是没有物尽其用?
高低电平说白了就是那个对应的二进制Bit位的0和1。。

一开始预留得不好,可以说是根本没有想过之后的扩展,使得游戏软件在开发的时候要兼容6键和4分插的扩展协议时就有一些限制(一帧内不允许8次以上读取手柄状态)。
进而导致不得不以多6个周期的串行通信代价来弥补大多数游戏兼容性上的不足(本来多了这XYZM四个键,理论上只要多1-2周期就足够传输了)。

其实把这个过程想象成发摩尔斯电码的过程可能比较好理解
3键手柄的协议就是:
[主机发一个信号,手柄收到这个信号后回馈6个信号给主机,主机收到回馈后再发下一个信号,手柄收到后回馈另外6个信号给主机,通信完毕]
手柄2次回馈的6个信号就分别代表了(上、下、无意义、无意义、A键、Start键)(上、下、左、右、B键、C键)的按下或弹起状态。

这个协议缺点有2个
1、浪费了2个传输机会给(上、下)键,在上面加粗的部分可以看到,上、下方向键的状态被重复传了2次,占每次传输的1/3数据量,天大的浪费,直接导致之后6键手柄为了兼容该协议不得不每周期也跟着浪费。
2、没有制定一个协议结束周期,或者没有在软件开发包中制定每帧读取手柄状态的次数。使得之后6键手柄和4分插协议不得以扩展2倍以上周期来作为协议结束以兼容以前的软件。但遇上奇葩游戏程序员(比如世界末日的那位),还是会死得不明不白。。。

其实MD手柄口是双向数据口,完全可以做成要游戏程序在获取手柄状态前,传输一个期望获得的手柄按键数据结构的版本号给手柄,如果手柄不支持,返回一个错误码,然后游戏尝试发一个更低的版本号给手柄,如果手柄支持了返回一个正确的状态码,然后游戏程序就以这个手柄支持的最高版本按键数据结构来和手柄进行进一步通信。而手柄端新硬件要实现老硬件所有的信号模式。这样一个软硬件组合设计,即使以后有60键手柄,老游戏都不会遇到不兼容,因为游戏发给了手柄的是一个以前的按键数据结构版本号,手柄自然会工作在老手柄应该工作的模式下。完全不需要用户作什么按住Mode键开机或者插手柄这样的蠢事来解决兼容性。

可惜Sega没有这么干,而且绝对不是因为成本问题,而是因为初始的按键协议设计就已经断送了今后这样修改的可能。。。



TOP

发新话题
     
官方公众号及微博