2007年8月6日 星期一

FreeBSD 如何 mount iso image? 2006/1

FreeBSDmount 一個燒錄用的 iso 檔,並不像 GNU/Linux 般的容易。無法直接使用 mount 指令給 mount 上來,這究竟是怎麼一回事?


在 GNU/Linux 有個 loop device(/dev/loop*),可以給燒錄用的 iso 檔使用,就是把 iso 檔使用 -o loop 參數直接 mount 上來,查看裡頭的內容細節,這本是非常平常的事。可是,到了 FreeBSD,發現並沒有 loop device 可以用,這下要怎麼把 isomount 上來呢?

首先想到的是 FreeBSD Handbook,找了一下,藏在第 17 章,而且敘述也很簡短,不過,總算是能用了。原來 FreeBSD 有一個虛擬的 memory disk device(/dev/md*),他有多種用途,其中的 vnode 型態就可以給 iso 檔來用。

但手續上就比較麻煩一點,例如,我們想把 xxx.isomount 上來的話,首先要去製作一個 vnode type 的 memory disk,並把 iso 檔內容映射至這個 md device,然後再來 mount 這個 md device:

mdconfig -a -t vnode -f xxx.iso -u 0
mount -t cd9660 /dev/md0 /mnt/iso
這樣就行了,要把他 umount 也是要兩個動作:
umount /mnt/iso
mdconfig -d -u 0
是否有此 md device 可以使用 mdconfig -l 來得知。

好像有點給他麻煩,我試著寫了兩個很醜的 sh script 來做這些動作,如果有人有更好的寫法,請不吝借我一用:

#!/usr/bin/env sh
# vim:ts=2 sw=2 et
# isom.sh : mount iso on FreeBSD box using md device.
# Edward G.J. Lee (08/02/06)

if [ $# -eq 0 ]
then
echo
echo "Usage: `basename $0` youriso"
echo
exit 1
fi

file $1 | grep 'ISO 9660' > /dev/null 2>&1
IFIOS=$?

if [ $IFIOS -eq 0 ]
then
if [ ! -d $HOME/mnt/iso1 ]
then
mkdir -p $HOME/mnt/iso1
fi
mdconfig -a -t vnode -f $1 -u 0
mount -t cd9660 /dev/md0 $HOME/mnt/iso1
if [ $? -eq 1 ]
then
mdconfig -d -u 0
echo
echo "mount failed."
echo
exit 1
else
echo
echo "mount under $HOME/mnt/iso1"
echo
exit 0
fi
else
echo
echo 'This is not an iso file, abort!'
echo
exit 1
fi
不過,你要讓這個 user 有 md device 讀寫權限,否則就要使用 root 的身份來 mount。umoun 是寫在另外一個 sh script:
#!/usr/bin/env sh                                                             
# vim:ts=2 sw=2 et
# isoum.sh : umount iso from FreeBSD md device
# Edward G.J. Lee (08/02/06)

umount $HOME/mnt/iso1
mdconfig -d -u 0
當然,由於我的環境很單純,只有我一個人在用,所以就固定在 /dev/md0 了。雖然麻煩了點,不過 FreeBSD 的做法還真的感覺有點 hacker 風格呀!:-)

2007年8月3日 星期五

X window 字型

  1. 安裝 outta-port/mingliu 繁體中文字型。

    # cd /usr/ports/chinese
    # fetch http://netlab.cse.yzu.edu.tw/~statue/outta-port/mingliu.shar
    # sh mingliu.shar
    # cd mingliu
    # make MASTER_SITE_OVERRIDE= install clean

    接著編輯 /etc/XF86Config, 在 Section "Module" 區段, 加入 Load "xtt"

    Section "Module"
    :
    Load "xtt"
    EndSection

    Section "Files" 區段, 加入 FontPath "/usr/X11R6/lib/X11/fonts/TrueType/"FontPath "/usr/X11R6/lib/X11/fonts/local/"

    Section "Files"
    :
    FontPath "/usr/X11R6/lib/X11/fonts/TrueType/"
    FontPath "/usr/X11R6/lib/X11/fonts/local/"
    EndSection

    先檢查 fontconfig 的字型設定是否正確, 以 fc-list :lang=zh-tw 檢查是否有安裝繁體字型, 或是 fc-list :lang=zh-cn 檢查是否有安裝簡體字型, 如果確定字型已經放到 fonts.conf 指定的目錄下, 試著手動執行 fc-cache -f -v 後再試試看。

    接著檢查 X11 Core Font 的字型設定是否正確, 進入 X Window 後,以 xlsfonts | grep big5 檢查是否有安裝繁體字型, 或是 xlsfonts | grep gb2312 檢查是否有安裝簡體字型, 如果確定字型已經放到 XF86Config 指定的目錄下, 試著手動執行 xset +fp /usr/X11R6/lib/X11/fonts/TrueType/ 後再試試看。

    請參考 輸出字型 一節。

2007年8月2日 星期四

嘸蝦米輸入法安裝[gcin]

如已有liu57a.gtab,請直接跳到第4步驟)

1.修改liu57a_tra_big5.cin如下:
代碼:
%ename liu57a
%cname 嘸蝦米
%selkey 1234567890
%keyname begin
a A
b B
c C
d D
e E
f F
g G
h H
i I
j J
k K
l L
m M
n N
o O
p P
q Q
r R
s S
t T
u U
v V
w W
x X
y Y
z Z
, ,
. .
' ’
[ 〔
] 〕
%keyname end
%chardef begin
a 對
aa 寸
..
..
]]v ︼
]]v ︾
%chardef end


2.用kwrite或gedit等支援中文utf-8的editor開啟liu57a_tra_big5.cin,然後以utf-8另存新檔,檔名可自定,舉例:liu57a_tra_utf8.cin
(ps:不要用iconv轉檔,因實測結果發現片假名、平假名的部分不會出現…)

3.此時的liu57a_tra_utf8.cin已是utf-8了。執行代碼:
gcin2tab liu57a_tra_utf8.cin
mv liu57a_tra_utf8.gtab liu57a.gtab


,就可產生liu57a.gtab。

(第4步驟請用root)
4.把liu57a.gtab 拷到/usr/share/gcin/table/
然後用支援utf-8的editor編輯 /usr/share/gcin/table/gtab.list
加入代碼:
嘸蝦米 9 liu57a.gtab
存檔
如此一來,就大概安裝完成了,接下來是一些細部設定工作。


5.第5步驟是為了讓嘸蝦米更方便打字:

執行gcin-setup
選擇「外觀鈴聲行為設定」-「空白鍵選項-按空白立即送出第一字(嘸蝦米)」-「ok」

選擇「內定輸入法 & 開啟/關閉」-「嘸蝦米」-「ok」

6.重新啟動X,即可享用嘸蝦米with gcin

附上.xinitrc
代碼:
export XMODIFIERS="@im=gcin"
export GTK_IM_MODULE="gcin"
export LC_ALL=zh_TW.UTF-8
gcin&
icewm-session

嘸蝦米輸入法安裝[xcin]

.修改liu57a.cin如下:
代碼:

%gen_inp
%ename liu57a
%cname 嘸蝦米
%selkey 0123456789
%keyname begin
a A
b B
c C
d D
e E
f F
g G
h H
i I
j J
k K
l L
m M
n N
o O
p P
q Q
r R
s S
t T
u U
v V
w W
x X
y Y
z Z
, ,
. .
' ’
[ 〔
] 〕
%keyname end
%chardef begin
a 對
aa 寸
..
..
]]v ︼
]]v ︾
%chardef end


2.執行
代碼:
cin2tab liu57a.cin

會產生liu57a.tab

(以下用root)
3.然後把liu57a.tab拷到/usr/lib/xcin/tab/big5/
4.修改/etc/xcinrc,把嘸蝦米的設定加進來

代碼:
(define zh_TW.Big5
'((DEFAULT_IM "liu57a")
(DEFAULT_IM_MODULE "gen_inp")
(DEFAULT_IM_SINMD "phone")
(PHRASE "default.phr")
(CINPUT (liu57a cj .....))
...

代碼:
(define liu57a@big5
'((SETKEY 11)
(AUTO_COMPOSE YES)
(AUTO_UPCHAR YES)
(AUTO_FULLUP NO)
(SPACE_AUTOUP YES)
(SELKEY_SHIFT NO)
(SPACE_IGNOR NO)
(SPACE_RESET YES)
(AUTO_RESET YES)
(WILD_ENABLE YES)
(BEEP_WRONG YES)
(BEEP_DUPCHAR YES)
(END_KEY NO)
(AUTO_SELECT NO)
(SINMD_IN_LINE1 NO)
))


然後把 (CINPUT (liu57a cj .....))裡的jyutping0去掉

完成後,請重新啟動xcin,或者是重新啟動X-window也可以。
代碼:
killall xcin
xcin&

2007年8月1日 星期三

如何使用游戏手柄gameport

6.1 part
Port: linux-js-2.2 Path: /usr/ports/devel/linux-js
Info: The Linux joystick interface ported to FreeBSD
Maint: jylefort@FreeBSD.org
B-deps:
R-deps: WWW:
To load the linux_js kernel module immediately, type the following commands: kldload joy (if PC joystick support is desired)
kldload uhid (if USB joystick support is desired)
kldload linux_js
To load the linux_js kernel module at boot, add the following lines to /boot/loader.conf:
joy_load="YES" (if PC joystick support is desired)
uhid_load="YES" (if USB joystick support is desired)
and add the following line to /etc/rc.conf:
linux_js_enable="YES"
To test a joystick, type the following command:
jstest /dev/input/jsXXX To calibrate a joystick,
type the following command:
jscal -c /dev/input/jsXXX To save the calibration data at system shutdown and restore it at boot, add the following line to /etc/rc.conf: jscal_enable="YES"
===============================================
5.x or others
如果你生于70年代,那麼你一定還記得《魂鬥羅》、《戰斧》、《名將》吧。想再聽一次令人熱血沸騰的《魂鬥羅》的主題曲嗎?好,現在就讓我們重溫我們的兒時之旅。
我們的討論範圍包括任天堂紅白機模擬器(Fceu),世嘉五代模擬器(DGen/SDL),和街機模擬器(Xmame),有同好願意幫助補上其他模擬器的資料嗎?
Fce Ultra這是一個跨平台的任天堂紅白機模擬器,可以運行在 Dos/Windows/BeOS/MacOS/MacOSX/和Unix下(需要SDL庫支持)是我用過的Linux/FreeBSD下最好的紅白機模 擬器,支持絕大部分常見的MAP格式,支持zip格式的壓縮rom、全屏模式、網絡聯機、遊戲桿輸入,甚至遊戲作弊。遺憾的是作者似乎不打算繼續發展這個 項目,然而你仍然可以在http://fceultra.sourceforge.net/files/ 下找到該模擬器不定期發表的最新版本,目前的最新版本為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、遊戲桿輸入和遊戲作弊,你可以在http://www. 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~32767joy_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 = j0b3joy_pad1_b = j0b0joy_pad1_c = j0b1joy_pad1_x = j0b2joy_pad1_y = j0b6joy_pad1_z = j0b7joy_pad1_mode = j0b9joy_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找到她。www.usb.org提供了更多深入的細節
XMAME
所有的MAME Fans請起立,注視這個LOGO並高呼3聲MAME萬歲
無需多說,著名的多街機模擬器MAME的UNIX平台版本,支持各種Unix的變體,甚至是PS2上的Linux! 她能夠模擬自1975年起發行的超過4000個大型街機遊戲。如果你尚不了解MAME為何物,那麼,請先去www.mame.net朝聖。
不要去找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.2screen #0Adaptor #0: "ATI mach64 Video Overlay"number of ports: 1port base: 61operations supported: PutImagesupported visuals:depth 16, visualID 0x23depth 16, visualID 0x24depth 16, visualID 0x25depth 16, visualID 0x26depth 16, visualID 0x27depth 16, visualID 0x28depth 16, visualID 0x29depth 16, visualID 0x2anumber 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 attributeclient gettable attribute (current value is 1)"XV_COLORKEY" (range 0 to -1)client settable attributeclient gettable attribute (current value is 6208)"XV_DOUBLE_BUFFER" (range 0 to 1)client settable attributeclient gettable attribute (current value is 1)"XV_ENCODING" (range 0 to 12)client settable attributeclient gettable attribute (current value is 1)"XV_FREQ" (range 0 to -1)client settable attributeclient 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 attributeclient gettable attribute (current value is 1)"XV_VOLUME" (range -1000 to 1000)client settable attributeclient gettable attribute (current value is -1000)"XV_BRIGHTNESS" (range -1000 to 1000)client settable attributeclient gettable attribute (current value is 0)"XV_CONTRAST" (range -1000 to 1000)client settable attributeclient gettable attribute (current value is 0)"XV_SATURATION" (range -1000 to 1000)client settable attributeclient gettable attribute (current value is 16)"XV_COLOR" (range -1000 to 1000)client settable attributeclient gettable attribute (current value is 16)"XV_HUE" (range -1000 to 1000)client settable attributeclient gettable attribute (current value is 0)maximum XvImage size: 2048 x 2048Number of image formats: 4id: 0x32595559 (YUY2)guid: 59555932-0000-0010-8000-00aa00389b71bits per pixel: 16number of planes: 1type: YUV (packed)id: 0x59565955 (UYVY)guid: 55595659-0000-0010-8000-00aa00389b71bits per pixel: 16number of planes: 1type: YUV (packed)id: 0x32315659 (YV12)guid: 59563132-0000-0010-8000-00aa00389b71bits per pixel: 12number of planes: 3type: YUV (planar)id: 0x30323449 (I420)guid: 49343230-0000-0010-8000-00aa00389b71bits per pixel: 12number of planes: 3type: 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.0Xlib: extension "XFree86-DRI" missing on display ":0.0".display: :0 screen: 0direct rendering: Noserver glx vendor string: SGIserver glx version string: 1.2server glx extensions:GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_EXT_import_contextclient glx vendor string: SGIclient glx version string: 1.2client glx extensions:GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_EXT_import_contextGLX extensions:GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_EXT_import_contextOpenGL vendor string: Mesa project: www.mesa3d.orgOpenGL renderer string: Mesa GLX IndirectOpenGL version string: 1.3 Mesa 4.0.4OpenGL 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_biasglu version: 1.3glu extensions:GLU_EXT_nurbs_tessellator, GLU_EXT_object_space_tessvisual x bf lv rg d st colorbuffer ax dp st accumbuffer ms cavid 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 None0x24 16 tc 1 16 0 r y . 5 6 5 0 0 16 8 16 16 16 0 0 0 None0x25 16 tc 1 16 0 r y . 5 6 5 8 0 16 8 16 16 16 16 0 0 None0x26 16 tc 1 16 0 r . . 5 6 5 8 0 16 8 16 16 16 16 0 0 None0x27 16 dc 1 16 0 r y . 5 6 5 0 0 16 0 0 0 0 0 0 0 None0x28 16 dc 1 16 0 r y . 5 6 5 0 0 16 8 16 16 16 0 0 0 None0x29 16 dc 1 16 0 r y . 5 6 5 8 0 16 8 16 16 16 16 0 0 None0x2a 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 均不存在這樣的問題,這不能不說是一個小小的遺憾。
GGI,Glide及其他
我喜歡開源軟件之間的競爭,然而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/" 下。
如何在指令行模式下使用XMAMExmame.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中文f明 是另一個有關mame主題不錯的中文文檔
使用GXMAME圖形前端如果你覺得命令行過于專業而你想讓娛樂變得輕鬆一些的 話, GXMAME是個不錯的主意。這是一個GNOME環境下的xmame的前端(不要害怕,只要安裝了gtk+的庫,她在諸如 KDE這樣的窗口環境裡也一樣能運行),與mame32(著名的windows下的mame圖形界面)及其相似的外觀與操作習慣,相信你會喜歡的。
關于xmame-0.71.12003年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 Meaningnone No analog joystick on that portauto Autodetect joystick2btn 2-button n-axis joysticky-joy Two 2-button 2-axis joysticks on an Y-cablefcs Thrustmaster FCS compatible joystickchf Joystick with a CH Flightstick compatible hatfullchf CH Flightstick compatible with two hats and 6 buttonsgamepad 4/6-button n-axis gamepadgamepad8 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/Pad0 None1 SNES pad2 NES pad4 Multisystem 1-button joystick5 Multisystem 2-button joystick6 N64 pad7 Sony PSX controller
另一個並口遊戲桿驅動db9的參數形式是這樣的:db9=port,type。她支持以下類型的並口遊戲桿
Type Joystick/Pad0 None1 Multisystem 1-button joystick2 Multisystem 2-button joystick3 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.koContains modules:Id Name216 isa/joy3 1 0xc1d94000 4000 snd_cmi.koContains modules:Id Name211 pci/snd_cmi4 1 0xc1d99000 14000 snd_pcm.koContains modules:Id Name210 snd_pcm
而Alex Teslik給出的結果是這樣的
4 1 0xc3053000 3000 joy.koContains modules:Id Name99 isa/joy100 pci/joy5 1 0xc305a000 14000 snd_pcm.koContains modules:Id Name101 snd_pcm
我沒有興趣只是為了驅動遊戲手柄而回滾內核代碼,這麼做沒有意義,由于手邊沒有ISA聲 卡,我無從得知FreeBSD對于ISA-GAMEPORT的支持究竟如何,但至少SDL的JOYSTICK驅動中包含了對FreeBSD的 GAMEPORT的支持(SDL12/src/joystick/bsd/SDL_sysjoystick.c 2003-06-02),因此,如果你有被列在FreeBSD兼容列表裡的ISA的聲卡,和GAMEPORT口的遊戲手柄,你應當不會失望。
後記我實在沒有想到這個主題會涵蓋如此之多的內容,而其中的很多內容是我不熟悉 的,因此,如果你發現了任何問題,或者有任何的建議、意見或是補充,請給我發EMAIL,從而讓更多的人能夠分享。我的EMAIL是 h u a n g s o n g @ l i n g t u . c o m,原諒我讓您手動輸入郵件地址,垃圾郵件真的很煩人:-< 請不要向我詢問任何與模擬器ROM下載有關的問題,我不會回答的。