Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18673318
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: BSD

2008-04-02 17:42:11

如果你生于70年代,那么你一定还记得《魂斗罗》、《战斧》、《名把》吧。想再听一次令人热血沸腾的《魂斗罗》的主题曲吗?好,现在就让我们重温我们的儿时之旅。

我们的讨论范围包括任天堂红白机模拟器(Fceu),世嘉五代模拟器(DGen/SDL),和街机模拟器(Xmame),有同好愿意帮助补上其他模拟器的资料吗?

Fce Ultra

这是一个跨平台的任天堂红白机模拟器,可以运行在Dos/Windows/BeOS/MacOS/MacOSX/和Unix下(需要SDL库支持)是我用过的Linux/FreeBSD下最好的红白机模拟器,支持绝大部分常见的MAP格式,支持zip格式的压缩rom、全屏模式、网络联机、游戏杆输入,甚至游戏作弊。遗憾的是作者似乎不打算继续发展这个项目,然而你仍然可以在 下找到该模拟器不定期发表的最新版本,目前的最新版本为0.96。

编译安装这个模拟器是一件相当简单的事:下载fceu096src.tar.gz,展开到一个临时目录下,进入该目录,把Makefile.unixsdl拷贝成Makefile,然后运行make,如果一切顺利,把在该目录下生成fceu的执行程序。在指令行输入"$ ./fceu"把得到指令行帮助,试试"$ ./fceu -fs contra.zip",看到你久违的《魂斗罗》画面了吗?"-fs"选项把使fceu在全屏幕方式下运行。

Fce ultra假定axis0为游戏杆的X轴向,axis1为游戏杆的Y轴向,对于大多数Gameport游戏杆,这个假设是成立的,但我的Topway USB Joypad单人手柄向系统报告自己是一个4轴向游戏杆/20按键手柄(实际使用2轴向10 按键),axis2为x轴向,axis3为Y轴向,有效按键0-9。这可能是由于Game-pad制造商为了减少成本,让单人手柄与双人手柄共用芯片的结果,而我的Gamtec Twin USB Game-pad双人手柄同样报告自己是一个4轴向/20按键手柄,其中axis0为Player1的X轴向,axis1为Player1的Y轴向,axis2为Player2的X轴向,axis3为Player2的Y 轴向,手柄1的有效按键为0-9,手柄2的有效按键为10-19。是的,这个结果看起来相当的怪诞,但这不是厂商或是驱动编写者的错,毕竟,支持Joystick重映射应当是应用程序的职责,但这却造成相当一部分USB游戏杆在 Fce Ultra下无法正常使用,有哪位红白机迷愿意为她写个补丁吗?

Linux用户在编译运行之前应当先检查是否已安装了SDL的运行库和开发库(当然还要有gcc)。Redhat/Mandrake的发行版均有这个安装包,你可以运行 "sdl-config --version"来检查你的SDL库的版本号,确保你的SDL库版本在1.1以上,否则在编译时可能会遇到麻烦。

FreeBSD用户需要确保sdl12 (/usr/ports/devel/sdl12),gmake (/usr/ports/devel/gmake)等ports已经安装,sdl12会在/usr/local/bin/下安装sdl11-config这个执行文件,由于FreeBSD的ports包含了许多不同版本的SDL库(甚至包括在linux模拟环境下运行的linux-sdl),因此需要以不同的配置程序名加以区别。记住为sdl11-config创建一个符号连接,像这样:"# cd /usr/local/bin; ln -s sdl11-config sdl-config",fceu编译时需要通过这个标准的SDL环境配置程序以确定所需的SDL库和头文件的路径,另外,你需要执行"gmake"以明确表示你使用gnu-make而不是系统缺省的bsd-make

在写完这个主题后大约一个星期,我兴奋地发现,FreeBSD终于把FCEU正式加入了PORTS,如果你使用cvsup 同步PORTS,那么进入"/usr/ports/emulators/fceu",然后"make && make install"就大功告成了。

DGen/SDL

这是基于windows的世嘉模拟器DGen的SDL环境移植版,支持全屏模式、分屏模式、zip格式的压缩rom、游戏杆输入和游戏作弊,你可以在 pknet.com/~joe/dgen-sdl.html找到该模拟器的最新版本,目前的最新版本是1.23。

与Fce Ultra一样,DGen/SDL同样不支持游戏杆重映射,甚至假定系统报告的第一游戏杆设备为Player1,第二游戏杆设备为Player2,并且限制游戏手柄的最大按键数为16!但SEGA MD上留下了我太多难以割舍的回忆,因此我为她编写了游戏杆重映射的PATCH,由于DGen/SDL 原本的游戏杆支持的代码是由另一位hacker加上的,并且使用了完全不同的事件映射模式,这花了我2个小时去弄清楚代码是怎么样工作的,这个补丁耗费了我整个周末并让我错过了与PPMM的晚餐:-< 然而应用这个PATCH是非常简单的,你只需在展开的dgen-sdl-1.23目录下执行"patch-p1<../dgen-sdl-1.23-jsmap. patch",记住你需要用你下载的patch文件的路径替换指令里的"../dgen-sdl-1.23-jsmap.patch",但直到目前为止,我仍然没有收到DGen/SDL的作者关于这个PATCH的任何答复,因此,这个PATCH是"非官方的",是否使用她取决于你对我的信任,如果这个PATCH给你带来麻烦或是快乐,或者你有任何意见或是建议,请让我知道。

得益于autoconf脚本的帮助,编译模拟器的源代码是相当简单的,下载dgen-sdl-1.23.tar.gz,展开到一个临时目录,进入该目录,如果你需要游戏杆重映射的Patch,请先按上文的方法应用Patch,之后顺序执行"./configure","make"就可完成编译,FreeBSD的用户则需要首先符号连接sdl-config,安装gnumake,并执行"gmake"而不是"make"。然而该版本的autoconf测试宏中有两处错误地包含了SDL/SDL.h而不是SDL.h,在Redhat Linux下,由于SDL-devel把SDL的头文件放在了/usr/local/SDL/下,而/usr/include/是系统的标准包含路径,因此,Redhat的用户在编译时不会遇到任何麻烦,其他Linux发行版和*BSD的用户恐怕就没这么幸运了,当你运行"./configure"时,配置脚本会抱怨找不到SDL/SDL.h这个头文件从而引起SDL环境测试失败,你可以修改acinclude.m4和aclocal.m4这两个宏定义文件然后重新运行autoconf以生成configure 脚本或是干脆自己直接修改configure脚本。

怎么样使用PATCH提供的游戏杆重映射功能?

你可以按照sample.dgenrc文件中给出的例子修改游戏杆的映射以适应你的要求,这是一个我的游戏杆设置的例子:

# joy_pad1_up = j0a1(-16384) 表示Player1的上方向设为游戏杆设备0的第1轴。

# 向的负方向,只有当该方向的轴向位置绝对值超过16384时,才认为该事件发生。

# 这个设置让你可以避免游戏杆传回的噪音信号干扰你对游戏主角的控制,对于。

# 飞行摇杆类的游戏杆(如Logitech WingMan 3D)是一个很有用的设置,轴向位置。

# 绝对值的取值范围是1~32767。

joy_pad1_up = j0a1(-16384)
joy_pad1_down = j0a1(+16384)
joy_pad1_left = j0a0(-16384)
joy_pad1_right = j0a0(+16384)

# joy_pad1_a = j0b3表示Player1的A键被定义为游戏杆设备0的第3按钮。

joy_pad1_a = j0b3
joy_pad1_b = j0b0
joy_pad1_c = j0b1
joy_pad1_x = j0b2
joy_pad1_y = j0b6
joy_pad1_z = j0b7
joy_pad1_mode = j0b9
joy_pad1_start = j0b8

在Linux下,你可以通过jstest的输出以确定该怎么样填写配置项,一个类似于GXMAME的图形化前端会使这一工作简单许多,有谁对这个主意感兴趣吗?

这个PATCH可以在Linux下完美地支持各种游戏手柄,然而在FreeBSD上使用UHID手柄时却响应缓慢,这可能是FreeBSD的UHID驱动传回了大量的噪音信号导致的,但XMAME-0.70.1却能在这样的噪声信号下正常处理游戏杆输入,我是FreeBSD的忠实FANS,然而我并不在意FreeBSD的这些不是很"UNIX"的特性,个人认为与其继续修改模拟器以适应FreeBSD下的噪音环境,还不如修改FreeBSD的UHID驱动,毕竟一件这样的工作的有趣程度取决于对社会幸福总量的贡献:-D,如果你是FreeBSD的FANS,那么UHID驱动入口是个不错的开始,你可以在/usr/src/sys/dev/usb/uhid.c找到她。

XMAME

所有的MAME Fans请起立,注视这个LOGO并高呼3声MAME万岁.无需多说,著名的多街机模拟器MAME的UNIX平台版本,支持各种Unix的变体,甚至是PS2上的Linux! 她能够模拟自1975年起发行的超过4000个大型街机游戏。如果你尚不了解MAME为何物,那么,请先去朝圣。

不要去找RPM,DEB或是PORTS,我们需要的是最新的游戏列表和最好的游戏效果,况且,如果你只需要一个执行文件就能工作,那么有什么理由需要安装包呢?

这里的描述均基于xmame-0.70.1,你可以在x.mame.net找到最新发行版本的源代码包,解开压缩包。删除Makefile(这是一个指向makefile.unix的符号连接),然后把makefile.unix 拷贝成Makefile(在修改出现错误时有一个后备文件总是一件好事),我们剩下所有要做的就是修改Makefile文件以适应我们的系统。总体来说,Makefile选项是一目了然的。但在此之前,还是需要先解释一些背景知识以方便我们做出适当的选择。

XV,OpenGL(xgl),DGA,SVGALIB,SDL,GGI及其他.

XV

XV是X视频扩展的缩写,设计用于加速视频播放的X应用程序,她允许应用程序创建不依赖于当前显示模式色深度的视频缓冲区,并直接向视频缓冲区写入RGB或是YUV值,由视频硬件实现色彩空间转换和拉伸,这意味着,即使当前的显示色深度是256色,应用程序也能够以16bits或是32bits色深播放视频。她还可以在不需要root权限的情况下实现全屏播放,因此,这是我们的最佳选择之一。注意XFree86-4.0.2以后的版本才有XVideo支持,你可以通过执行"xvinfo"来了解你的显卡是否支持Xv扩展,你应当看到类似这样的输出:

X-Video Extension version 2.2
screen #0
  Adaptor #0: "ATI mach64 Video Overlay"
    number of ports: 1
    port base: 61
    operations supported: PutImage
    supported visuals:
      depth 16, visualID 0x23
      depth 16, visualID 0x24
      depth 16, visualID 0x25
      depth 16, visualID 0x26
      depth 16, visualID 0x27
      depth 16, visualID 0x28
      depth 16, visualID 0x29
      depth 16, visualID 0x2a
    number of attributes: 17
      "XV_DEVICE_ID" (range 0 to -1)
              client gettable attribute (current value is 89)
      "XV_LOCATION_ID" (range 0 to -1)
              client gettable attribute (current value is 90)
      "XV_INSTANCE_ID" (range 0 to -1)
              client gettable attribute (current value is 91)
      "XV_SET_DEFAULTS" (range 0 to 1)
              client settable attribute
      "XV_AUTOPAINT_COLORKEY" (range 0 to 1)
              client settable attribute
              client gettable attribute (current value is 1)
      "XV_COLORKEY" (range 0 to -1)
              client settable attribute
              client gettable attribute (current value is 6208)
      "XV_DOUBLE_BUFFER" (range 0 to 1)
              client settable attribute
              client gettable attribute (current value is 1)
      "XV_ENCODING" (range 0 to 12)
              client settable attribute
              client gettable attribute (current value is 1)
      "XV_FREQ" (range 0 to -1)
              client settable attribute
              client gettable attribute (current value is 1000)
      "XV_TUNER_STATUS" (range -1000 to 1000)
              client gettable attribute (current value is 4)
      "XV_MUTE" (range 0 to 1)
              client settable attribute
              client gettable attribute (current value is 1)
      "XV_VOLUME" (range -1000 to 1000)
              client settable attribute
              client gettable attribute (current value is -1000)
      "XV_BRIGHTNESS" (range -1000 to 1000)
              client settable attribute
              client gettable attribute (current value is 0)
      "XV_CONTRAST" (range -1000 to 1000)
              client settable attribute
              client gettable attribute (current value is 0)
      "XV_SATURATION" (range -1000 to 1000)
              client settable attribute
              client gettable attribute (current value is 16)
      "XV_COLOR" (range -1000 to 1000)
              client settable attribute
              client gettable attribute (current value is 16)
      "XV_HUE" (range -1000 to 1000)
              client settable attribute
              client gettable attribute (current value is 0)
    maximum XvImage size: 2048 x 2048
    Number of image formats: 4
      id: 0x32595559 (YUY2)
        guid: 59555932-0000-0010-8000-00aa00389b71
        bits per pixel: 16
        number of planes: 1
        type: YUV (packed)
      id: 0x59565955 (UYVY)
        guid: 55595659-0000-0010-8000-00aa00389b71
        bits per pixel: 16
        number of planes: 1
        type: YUV (packed)
      id: 0x32315659 (YV12)
        guid: 59563132-0000-0010-8000-00aa00389b71
        bits per pixel: 12
        number of planes: 3
        type: YUV (planar)
      id: 0x30323449 (I420)
        guid: 49343230-0000-0010-8000-00aa00389b71
        bits per pixel: 12
        number of planes: 3
        type: YUV (planar)
3dfx用户
请确保你的Xfree86版本在4.2.0以上,否则,你可能会在使用XVideo扩展时遇到麻烦(包括XFree86崩溃)。
S3用户
如果你的显卡早于Savage3D(Virge,Trio64,etc),那么拆下来,出门送给第一个你遇见的人。
nVidia用户
请使用XFree86-4.2.0及以后的XFree86发行版本内建的nVidia驱动,或是向nVidia抱怨使用他们的非开源驱动出现的稀奇古怪的问题。
ATI用户
如果xvinfo告诉你没有合适的适配器,或是XMAME抱怨没有合适的视频模式可用的话,不要慌张,GATOS提供了你想要的XVideo驱动,鼠标留下的黑色方块不是太大的问题,切换到文本控制台再切换回来就行。
OpenGL
在任何情况下,如果有XV,就不要用OpenGL,她对二维光栅游戏没有什么帮助,并且与XV相比,她的加速效果相当糟糕。你可以使用glxinfo来确认你的XFree86是否支持glx扩展,在我的Redhat-9(ATI RAGE MOBILITY M1 AGP)上,她的输出是这样的:
 
name of display: :0.0
Xlib:  extension "XFree86-DRI" missing on display ":0.0".
display: :0  screen: 0
direct rendering: No
server glx vendor string: SGI
server glx version string: 1.2
server glx extensions:
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_EXT_import_context
client glx vendor string: SGI
client glx version string: 1.2
client glx extensions:
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_EXT_import_context
GLX extensions:
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_EXT_import_context
OpenGL vendor string: Mesa project: 
OpenGL renderer string: Mesa GLX Indirect
OpenGL version string: 1.3 Mesa 4.0.4
OpenGL extensions:
    GL_ARB_imaging, GL_ARB_multitexture, GL_ARB_texture_border_clamp,
    GL_ARB_texture_cube_map, GL_ARB_texture_env_add,
    GL_ARB_texture_env_combine, GL_ARB_texture_env_dot3,
    GL_ARB_transpose_matrix, GL_EXT_abgr, GL_EXT_blend_color,
    GL_EXT_blend_minmax, GL_EXT_blend_subtract, GL_EXT_texture_env_add,
    GL_EXT_texture_env_combine, GL_EXT_texture_env_dot3,
    GL_EXT_texture_lod_bias
glu version: 1.3
glu extensions:
    GLU_EXT_nurbs_tessellator, GLU_EXT_object_space_tess
 
   visual  x  bf lv rg d st colorbuffer ax dp st accumbuffer  ms  cav
 id dep cl sp sz l  ci b ro  r  g  b  a bf th cl  r  g  b  a ns b eat
----------------------------------------------------------------------
0x23 16 tc  1 16  0 r  y  .  5  6  5  0  0 16  0  0  0  0  0  0 0 None
0x24 16 tc  1 16  0 r  y  .  5  6  5  0  0 16  8 16 16 16  0  0 0 None
0x25 16 tc  1 16  0 r  y  .  5  6  5  8  0 16  8 16 16 16 16  0 0 None
0x26 16 tc  1 16  0 r  .  .  5  6  5  8  0 16  8 16 16 16 16  0 0 None
0x27 16 dc  1 16  0 r  y  .  5  6  5  0  0 16  0  0  0  0  0  0 0 None
0x28 16 dc  1 16  0 r  y  .  5  6  5  0  0 16  8 16 16 16  0  0 0 None
0x29 16 dc  1 16  0 r  y  .  5  6  5  8  0 16  8 16 16 16 16  0 0 None
0x2a 16 dc  1 16  0 r  .  .  5  6  5  8  0 16  8 16 16 16 16  0 0 None

支持glx扩展与堪用是两回事,XMAME在没有硬件加速支持的OpenGL驱动下大约能跑到5fps就不错了,这个速度还不到期望速度的1/10,试试看去Utah-GLX碰碰运气吧,也许会有惊喜。

DGA

DGA是Direct Graphics Access的简称,是一种使程序绕过X-服务器直接修改帧缓冲显存的方法。由于直接操作硬件,只有以root身份运行的应用程序才能使用DGA方式,在我看来,这种视频加速的手段过于野蛮。然而借助于直接显存操作,DGA应用程序获得了野兽一样的速度,有人见过CELELON-733能把Strikers 1945 III跑到60fps 吗?如果你的CPU比较慢,那么这可能是你较好的选择。

警告:决不要给XMAME设置suid权限,别的用户会通过SUID root的XMAME获得root身份!

SVGAlib

这是一个使控制台应用程序能够进行图形模式输出的库,她能够识别许多图形芯片,并通过直接驱动硬件来工作。除非你没有安装XFree86,否则,不要使用这个库驱动XMAME,与DGA模式一样,她需要root权限,并且,使用 SVGAlib的XMAME无法在FreeBSD上正常工作。

SDL

这是一个跨平台的多媒体支持库,包括了音频/视频/游戏杆/3D加速等接口,SDL能够根据当前的运行环境选择适当的驱动手段(XV, DGA, SVGALib, AAlib, etc)这可以在在一定程度上使你免于纠缠各种稀奇古怪的视频加速接口。你可以通过运行"sdl-config --version"检查系统是否安装了SDL支持库以及库的版本号。这几乎总是最好的选择,在FreeBSD下,这也是唯一能够获得可用的游戏杆支持的方法。不过XMAME的SDL驱动版本似乎不支持超过当前显示模式色深度的显示,也就是说,如果你当前的显示模式是1024x768 16bits色深,你把不能够运行诸如 Strikers 1945 II,Strikers 1945 III这样的需要32位显示色深度的游戏,而XMAME的X11版本无论使用XV或是DGA 均不存在这样的问题,这不能不说是一个小小的遗憾。

我喜欢开源软件之间的竞争,然而SDL小组很活跃,并且已做的足够好了,我总可以在XV,DGA,SDL之间找到适合我的选择。因此,我对GGI没有太多的兴趣,也许她对Sorlaris用户会有所帮助。3dfx的用户可能会对Glide感兴趣,但我没有这种显卡,因此也无法提供这方面的更多帮助。如果有谁试过XMAME的xfx,svgafx,openstep或是 photon2选项,请分享一下经验好吗?

以下是一个Makefile文件的范例:

...
# 去掉这行的注释以使用联网游戏功能
# XMAME_NET = 1
...
...
# 去掉这行的注释以使用68000的x86汇编优化引擎(需要安装NASM)
# X86_ASM_68000 = 1
# 去掉这行的注释以使用DRC MIPS3引擎
# X86_MIPS3_DRC = 1
# gcc on x86
# 把这行注释掉
CFLAGS = -O -Wall -Wno-unused
# gcc on x86 with some optimizations
# 去掉以下两行的注释,以打开一些优化开关,如果你不是i686芯片,
去掉"-mcpu=i686"
# CFLAGS = -O2 -Wall -Wno-unused -mcpu=i686 -fomit-frame-pointer \
#  -fstrict-aliasing -fstrength-reduce -ffast-math
...
...
  # 选择适合你的CPU类型,去掉前面的注释
  # Valid x86 options that work with any version of gcc.
  # CFLAGS += -march=i386
  # CFLAGS += -march=i486
  # CFLAGS += -march=i586
  # CFLAGS += -march=i686
  # CFLAGS += -march=pentium
  # CFLAGS += -march=pentiumpro
  # Valid x86 options that work only with newer versions of gcc.
  # CFLAGS += -march=pentium-mmx
  # CFLAGS += -march=pentium3
  # CFLAGS += -march=pentium4
  # CFLAGS += -march=k6
  # CFLAGS += -march=k6-2
  # CFLAGS += -march=k6-3
  # CFLAGS += -march=athlon
  # CFLAGS += -march=athlon-tbird
  # CFLAGS += -march=athlon-xp
  # CFLAGS += -march=athlon-mp
  # CFLAGS += -march=athlon-4
...
...
# Linux
# Linux用户去掉这行的注释
ARCH  = linux
# FreeBSD
# FreeBSD用户去掉这行的注释
# ARCH  = freebsd
...
...
# On x86-based OSes, if supported, you can use standard joystick driver.
# Linux用户去掉这行的注释
# JOY_I386 = 1
...
...
# NetBSD/FreeBSD USB joystick support.
# FreeBSD用户去掉这行的注释
# JOY_USB = 1
...
...
# GNOME用户去掉这行的注释以支持esound输出
# SOUND_ESOUND = 1
# SOUND_ALSA = 1
# SOUND_ARTS_TEIRA = 1
# SOUND_ARTS_SMOTEK = 1
# 去掉这行的注释以支持SDL音频输出
# SOUND_SDL = 1
# SOUND_WAVEOUT = 1
...
...
########################################################
# Select your display method; choose only one.
########################################################
# 选择一种(只允许一种)显示方式,去掉注释符号
# Note: x11 is the only one supported on almost all platforms.  For BeOS,
# use SDL.
# X11
# 编译x11版本(xmame.x11)请去掉下一行的注释。如果你的显卡有XV或DGA支持,
这是最好的选择
DISPLAY_METHOD = x11
# SDL library
# 编译SDL版本(xmame.SDL)请去掉下一行的注释。要使用SDL游戏杆
支持则必须使用这个版本
# DISPLAY_METHOD = SDL
# SVGALib, only supported under Linux
# 编译svgalib版本(xmame.svgalib)请去掉下一行的注释。
# DISPLAY_METHOD = svgalib
# GGI, only tested under Linux
# DISPLAY_METHOD = ggi
# OpenGL under X11
# 编译OpenGL版本(xmame.xgl)请去掉下一行的注释。
# DISPLAY_METHOD = xgl
# Glide under X11
# DISPLAY_METHOD = xfx
# Glide in console mode
# DISPLAY_METHOD = svgafx
# OpenStep bitmaps
# DISPLAY_METHOD = openstep
# Photon 2.x (QNX6), currently buggy, but working...
# DISPLAY_METHOD = photon2
...
...
# MIT-Shared Memory X Extensions
# 使能MIT风格共享内存扩展,不要注释她
X11_MITSHM = 1
# Use Xv extension for hardware scaling.
# 使能Xvideo扩展,不要注释她
X11_XV = 1
# Enable XFree86 DGA.  This also causes "make install" to set
 the suid bit 
# on the executable.
# 使能DGA扩展支持,如果你可能需要使用DGA方式(当XV不可用时)的话
,去掉这行的注释
# X11_DGA = 1
# Work around a bug in the XFree86 tdfx driver that 
prevents the original 
# mode from being restored when leaving DGA2 mode.
# 我没有3dfx卡,3fdx用户试试吧
# TDFX_DGA_WORKAROUND = 1
# The XIL library (Solaris 2.5.1 and higher)
# Solaris 9 Sparc 宣称这个库被废弃了。
# X11_XIL = 1
...
...
# Uncomment this to use XInput devices, e.g. additional mice as 
# trackballs.
# 如果你要玩双打枪战游戏(Space Gun,etc),去掉这行注释,
这使XMAME能够接受X-WINDOW下第二鼠标的输入
# XINPUT_DEVICES = 1
...
...
# The name of your sdl-config executable
# FreeBSD用户可能要把"sdl-config"改成"sdl11-config"
SDL_CONFIG = sdl-config

编译XMAME

如果你想使用x86汇编优化的68000核心,你必须首先安装nasm,Redhat Linux发行版包含了这个包。 FreeBSD用户则可以在/usr/ports/devel/nasm/找到这个ports,如果你还没有安装这个ports,进入这个目录 "make && make install"就行。然后使用GNU-MAKE来MAKE工程,像这样"gmake"(linux用户用"make"也一样) 编译完成后,你可能会得到xmame.x11, xmame.xgl, xmame.SDL或是xmame.svgalib这样的执行文件,具体是哪一个取决于你选择的显示驱动,你可以把她放到任何你喜欢的目录里,我习惯把她放在"/usr/local/bin/" 下。

怎么样在指令行模式下使用XMAME

xmame.SDL

你可以用下面这条指令以全屏模式启动Strikers 1945的游戏,并让xmame使用SDL游戏杆驱动:

$ xmame.SDL -fullscreen -jt 7 ./s1945.zip

xmame.x11

下面这条指令以全屏模式启动Strikers 1945的游戏,并强制xmame使用XVideo加速,并使用新版的Linux 游戏杆驱动:

$ xmame.11 -x11 1 -xv -jt 4 ./s1945.zip

下面这条指令以全屏模式启动Strikers 1945的游戏,并强制xmame不使用XV而使用DGA加速,并使用旧版的Linux游戏杆驱动:

# xmame.11 -x11 1 -noxv -jt 1 ./s1945.zip

xmame默认'5'是Player1投币,'1'是Player1开始,试一试吧,你还有你往日的身手吗?你可以按"TAB"键弹出设置菜单,修改缺省的键盘/游戏杆设置以符合你的口味。"xmame.xxx --help"可以得到xmame的命令行帮助,更详细的帮助可以参考xmame手册(英文) M.A.M.E 32中文說明 是另一个有关mame主题不错的中文文档 。

使用GXMAME图形前端

如果你觉得命令行过于专业而你想让娱乐变得轻松一些的话, GXMAME是个不错的主意。这是一个GNOME环境下的xmame的前端(不要害怕,只要安装了gtk+的库,她在诸如 KDE这样的窗口环境里也一样能运行),与mame32(著名的windows下的mame图形界面)及其相似的外观与操作习惯,相信你会喜欢的。

关于xmame-0.71.1

2003年7月19日,xmame-0.71.1正式发行了,然而事情变得有点复杂:注意配置文件中的这一行,不要取消这行的注释,否则编译把会失败。

# X86_MIPS3_DRC = 1

在Redhat Linux 9 (GCC 3.2.2 20030222)上,她成功地编译并且运行了,然而在FreeBSD-4.8 STABLE上,即使我禁用了X86_MIPS3_DRC引擎,编译却仍然失败了。我知道FreeBSD小组在7月14日把缺省编译器升级到了 gcc-3.3,并且正在解决一部分ports编译出错的问题,于是猜测这可能与编译器有关,7月21日,FreeBSD小组把缺省编译器回滚到了gcc-2.95.4,我重新编译了一次,仍然无法通过(我没有测试过在Linux下的gcc-2.95 的编译情况怎么样),我猜测XMAME需要gcc-3.2,于是,我编译了/usr/ports/lang/gcc32以使FreeBSD使用与 Linux相同的编译器,这个猜想立即得到了验证-- 编译通过了,并且XMAME运行正常。

在你向FreeBSD的mail-list发出你的BUG-REPORT之前,请先检查你的编译器版本,或是使用xmame-0.70.1 (她在2.95/3.2/3.3上编译都没问题),mail-list里的问题已经足够多了,请给FreeBSD小组多一些PATCH、建议或是时间。

使用游戏杆

当然使用游戏杆,我没兴趣用键盘玩游戏,如果你不在乎这个,那么跳过这一节。感谢 Vojtech Pavlik,感谢Suse与Intel,Linux用户拥有Unix环境下最出色的Joystick驱动支持,包括USB 接口,Gameport接口甚至Win2000不支持的并口游戏杆都可以支持。Redhat-7.x以上版本已经自带了这个驱动,并且随内核发布了可装载驱动模块。如果你重编译了核心或是使用了其他的核心发布,请确保你编译了相应的模块。否则以下描述很可能对你不适用。

USB接口HID游戏杆

我们这里所说的USB游戏手柄是指不带力回馈功能的标准UHID设备(M$称为人体工程学输入设备)这是目前市面上最容易买到,也最容易被驱动的游戏手柄,你只需选择一个选择一个usb接口,插上手柄,在/var/log/message里你可以看到发现新的HID设备的的信息,以root身份运行"modprobe joydev",然后执行"jstest /dev/input/js0"(对于Redhat Linux,/dev/js0也同样指向该设备)jstest把报告该游戏手柄的轴向个数和按钮个数,当你按下按钮时jstest报告哪个轴向发生了变化以及哪个按钮被按下。

Gameport游戏杆

这是在史前时代流传下来的游戏杆接口标准,Linux对她们有很好的支持。一个最常见的Gameport接口2轴 6键手柄的驱动方式看起来会像下面这样,你可以使用"jstest /dev/js0"来验证游戏手柄是否已被正确驱动。

# modprobe 
# modprobe ns558
# modprobe analog js=gamepad
# modprobe joydev

如果你安装了kernel-source你可以在/usr/src/linux-2.4.xx/Documentation/joystick.txt里找到关于 js参数的详细描述。

Type Meaning 
none No analog joystick on that port 
auto Autodetect joystick 
2btn 2-button n-axis joystick 
y-joy Two 2-button 2-axis joysticks on an Y-cable 
fcs Thrustmaster FCS compatible joystick 
chf Joystick with a CH Flightstick compatible hat 
fullchf CH Flightstick compatible with two hats and 6 buttons 
gamepad 4/6-button n-axis gamepad 
gamepad8 8-button 2-axis gamepad

并口游戏杆

对于并口游戏杆,Linux同样有出色的支持,最常见的PSX并口手柄可以用以下指令驱动:

# modprobe gamecon gc=0,7
# modprobe joydev"

gc参数形式是这样的:gc=port,pad1,pad2,pad3,pad4,pad5。这里gc的第一个参数0表示使用并口1作为输入端口,第二个参数7表示pad1是SonyPSX游戏杆(大部分常见的PSX跳舞毯也可以同样的方式驱动),其他参数类型见下表,你可以在/usr/src/linux-2.4.xx/Documentation/joystick-parport.txt找到完整而精彩的描述。

Type Joystick/Pad 
0 None 
1 SNES pad 
2 NES pad 
4 Multisystem 1-button joystick 
5 Multisystem 2-button joystick 
6 N64 pad 
7 Sony PSX controller

另一个并口游戏杆驱动db9的参数形式是这样的:db9=port,type。她支持以下类型的并口游戏杆。

Type Joystick/Pad 
0 None 
1 Multisystem 1-button joystick 
2 Multisystem 2-button joystick 
3 Genesis pad (3+1 buttons) 
5 Genesis pad (5+1 buttons) 
6 Genesis pad (6+2 buttons) 
7 Saturn pad (8 buttons) 
8 Multisystem 1-button joystick (v0.8.0.2 pin-out) 
9 Two Multisystem 1-button joysticks (v0.8.0.2 pin-out) 
10 Amiga CD32 pad

FreeBSD与NetBSD共享一套uhid设备驱动代码,对于USB游戏手柄有最基本的支持,在我的PC上FreeBSD-5.1current下的SDL库(1.2.5)能够驱动我的Topway 单人手柄,但却坚持认为我的Gametec USB双人手柄有-1个按钮:-< 而使用BSD uhid接口的xmame-0.70.1 则干脆认不出任何游戏手柄设备,但Taik0说UHID游戏手柄设备在*BSD上可以使用,并且成功地在xmame-0.57.1上驱动了他的JOYSTICK,我相信这可能与游戏杆设备有关,你可以按照他给出的CASE试一试,或许这对你适用。但借助SDL的支持,xmame-0.70.1完美地支持了UHID单人手柄,需要注意的是你必须对/dev/uhid0拥有写权限,否则把无法使用手柄。

FreeBSD能够支持ISA声卡上的Gameport接口,但似乎对于PCI声卡上的Gameport接口不感兴趣,无论是4- STABLE还是5-CURRENT,Alex Teslik给出了一个不用修改代码就能让FreeBSD支持Logitech Wingman Attack joystick的方法,然而我在4.8-STABLE(2003-07-18)和5-CURRENT(2003-07-18)上测试均未成功,虽然FreeBSD已经驱动了我的CMEDIA PCI声卡。kldstat -v的输出是这样的:

2    1 0xc1db4000 2000     joy.ko
        Contains modules:
                Id Name
                216 isa/joy
 3    1 0xc1d94000 4000     snd_cmi.ko
        Contains modules:
                Id Name
                211 pci/snd_cmi
 4    1 0xc1d99000 14000    snd_pcm.ko
        Contains modules:
                Id Name
                210 snd_pcm
而Alex Teslik给出的结果是这样的
4    1 0xc3053000 3000     joy.ko
        Contains modules:
                Id Name
                99 isa/joy
                100 pci/joy
 5    1 0xc305a000 14000    snd_pcm.ko
        Contains modules:
                Id Name
                101 snd_pcm

我没有兴趣只是为了驱动游戏手柄而回滚内核代码,这么做没有意义,由于手边没有ISA声卡,我无从得知FreeBSD对于ISA-GAMEPORT的支持究竟怎么样,但至少SDL的JOYSTICK驱动中包含了对FreeBSD的GAMEPORT的支持(SDL12/src/joystick/bsd/SDL_sysjoystick.c 2003-06-02),因此,如果你有被列在FreeBSD兼容列表里的ISA的声卡,和GAMEPORT口的游戏手柄,你应当不会失望。

阅读(799) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~