[原创] MAME驱动中的DIP Switches布局定义

DIP Switches(简称DSW)全称为Dual In-line Package Switches,即直接焊接在街机机板上的小开关组,如下图所示。在MAME的驱动中,默认情况下,一个DSW由8个小开关(switch,简称SW1-8)组成,每个SW的状态可由1个bit来表示,而1个DSW的状态则可以用1个byte表示,其中的bits排列顺序被定义为:SW8为该字节的LSB,SW1为MSB,以此类推。

DSWs.PNG

一般的,我们可以通过设置街机板上DIP开关的值,来对游戏参数进行相应的配置,如调节游戏难度、设置player生命数量等,这些游戏配置参数一般是由游戏厂家设定的,其具体设置方式基本上都可以在机板的使用说明书中找到。一个DSW也许对应着若干个游戏设置参数,而一个游戏配置参数则有可能占用DSW中的若干个连续比特位,其具体位数取决于该参数的取值数量。

在了解了上述基本概念后,下面来看一个具体的实例,以游戏Zero Hour为例,从机板手册中可知其DSW0的配置方式及含义如下:

---------------------------------
            SW1  SW2  
2 Lives     ON   ON  
3 Lives     OFF  OFF   (default)
4 Lives     OFF  ON  
5 Lives     ON   OFF  
---------------------------------
            SW3  SW4 
Over 
5000   OFF  OFF   (default) 
Over 
8000   OFF  ON
Over 
10000  ON   OFF
No Extra    ON   ON
---------------------------------
            SW5
Table       OFF  
Upright     ON         (default)
---------------------------------

其中,DSW0中的SW1、SW2两个开关是用来控制游戏开始时player生命数量的;SW3、SW4则用来控制多少分便额外奖励1条生命;最后,SW5用来控制双打时视频显示的方向,Upright方式就是我们通常在街机厅里看到的那种直立机柜的方式,两人双打时肩并肩,而Table则对应着Cocktail方式,这种机台只有国外有,国内没有,其实就一张桌子,摇杆啥的都在桌面上,桌子里面摆着两个显示器,两人双打时各坐一头,面对面。

根据手册中的信息,我们可以得到如下表格。表格中的“位置掩码”给出了相应的游戏配置参数在DSW0字节中具体的比特位置;而默认值则给出了各游戏参数所对应的出厂配置;最后,为了方便,MAME驱动中还给出了一种以字符串解析方式来定义DIP布局的机制,注意,其字符串中的“SW1”对应着DSW0开关组,而不是SW1开关;后面逗号分隔的数字则给出了对应配置参数在DSW0字节中所占用的比特位(这些比特位的书写顺序值得特别注意,从DSW0字节的LSB到MSB,不要写反了)

SW 1234  5678 位置掩码 默认值

   含义

  字符串表示

  0000  0111 0x07  N/A  Unused  "SW1:8,7,6"
  0000  1000 0x08  0x00  Cabinet  "SW1:5"
  0011  0000 0x30  0x00  Bonus Life  "SW1:4,3"
  1100  0000 0xc0  0xc0  Lives  "SW1:2,1"

现在可以来看看驱动代码中的DIP布局定义了,打开drivers/redclash.c文件,查找Zero Hour的DIP定义,可发现如下宏代码段:

PORT_START    /* DSW0 */
    PORT_DIPUNUSED_DIPLOC(
0x01,0x01,"SW1:8")    
    PORT_DIPUNUSED_DIPLOC(
0x02,0x02,"SW1:7")
    PORT_DIPUNUSED_DIPLOC(
0x04,0x04,"SW1:6")
    
    PORT_DIPNAME(
0x08,0x00,DEF_STR(Cabinet))               PORT_DIPLOCATION("SW1:5")
    PORT_DIPSETTING(
0x00,DEF_STR(Upright))
    PORT_DIPSETTING(
0x08,DEF_STR(Cocktail))
    
    PORT_DIPNAME(
0x30,0x00,DEF_STR(Bonus_Life))            PORT_DIPLOCATION("SW1:4,3")
    PORT_DIPSETTING(
0x00,"5000")
    PORT_DIPSETTING(
0x10,"8000")
    PORT_DIPSETTING(
0x20,"10000")
    PORT_DIPSETTING(
0x30,"NoBonus")
    
    PORT_DIPNAME(
0xc0,0xc0,DEF_STR(Lives))                 PORT_DIPLOCATION("SW1:2,1")
    PORT_DIPSETTING(
0x00,"2")
    PORT_DIPSETTING(
0xc0,"3")
    PORT_DIPSETTING(
0x80,"4")
    PORT_DIPSETTING(
0x40,"5")

对于不同机板的游戏驱动而言,DIP布局定义一般互不相同,但它们所采用宏却是大致一样的。这些宏都是MAME的核心开发者们为了方便驱动开发者的使用而定义的,其名称基本上都比较知文见义;对于大多数的驱动开发者而言,重要的是知道去用哪些宏,而不是去关注这些宏的具体实现,因此在这里我们将不对其宏定义进行详细讨论,仅从字面上理解一下含义便足矣。

在上述代码中,宏PORT_START表示一个新DSW布局定义的开始;PORT_DIPUNUSED_DIPLOC用来指出DSW中哪些SW是没有用的;而宏PORT_DIPNAME则用来具体定义当前DSW中的一个游戏配置参数,其3个宏参先后对应着该配置参数的位置掩码、默认值和字符串名称(如前文表格中所示),而PORT_DIPSETTING则具体给出了该参数所有可能的取值及含义。

至此,可以看出,上述MAME驱动代码跟我们从机板手册上所获取的信息是完全一致的。而通过修改驱动代码中的DIP布局定义,我们完全可以实现对默认游戏配置参数的修改,比如,我们可以通过修改PORT_DIPNAME中的第2个宏参来修改游戏参数的默认值:如果将PORT_DIPNAME(0xc0,0xc0,DEF_STR(Lives))中的第二个宏参数0xc0改为0x40话,那么player在游戏一开始便会拥有5条命,而不是默认情况下的3条命。

posted @ 2007-05-09 20:47  neoragex2002  阅读(3719)  评论(0)    收藏  举报