[原创] 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,以此类推。
一般的,我们可以通过设置街机板上DIP开关的值,来对游戏参数进行相应的配置,如调节游戏难度、设置player生命数量等,这些游戏配置参数一般是由游戏厂家设定的,其具体设置方式基本上都可以在机板的使用说明书中找到。一个DSW也许对应着若干个游戏设置参数,而一个游戏配置参数则有可能占用DSW中的若干个连续比特位,其具体位数取决于该参数的取值数量。
在了解了上述基本概念后,下面来看一个具体的实例,以游戏Zero Hour为例,从机板手册中可知其DSW0的配置方式及含义如下:

















其中,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_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条命。