作者: zchou (Nelson Chou) 看板: Emulator
標題: 認識MAME DRIVER VOL.1(翻譯版-1)
時間: Tue Sep 8 18:25:46 1998
┌───────────────────────────────┐
│ │
│ 這是一系列介紹MAME DRIVER的第一份文件,不過原作者只寫到第一 │
│ 份文件,等到他繼續寫下去,跟著再繼續翻譯下去. │
│ │
│ 我承認有些地方的確是翻的不好,如果發現有任何疑問的地方,請參 │
│ 照原文!對於內文翻譯上有任何意見,也請不吝指教! │
│ │
│ NELSON CHOU │
│ │
└───────────────────────────────┘
認識 MAME DRIVER
Volume 1: Data Structures v1.0
by Daniel Boris
目錄表
1.0 導論
2.0 /drivers/rockola.c
2.1 GameDriver Structure
2.2 MachineDriver Structure
2.3 ROM Definition
2.4 MemoryReadAddress Structure
2.5 MemoryWriteAddress Structure
2.6 Input Ports
2.7 GfxDecodeInfo Structure
2.8 GfxLayout Structure
3.0 Linking in the Driver
1.0 導論
這個文件的目的在於幫助人們了解一個MAME DRIVER如何運作,並且幫助想
要寫自己的MAME DRIVER的人們.一個DRIVER是一群定義一個特定ARCADE遊
戲運作的MAME原始檔中一部份的檔案組合.
這個文件之中,我將描述遊戲ZARZON的DRIVER.在閱讀這個文件之前,你應
該先讀過我的Decoding Schematics文件,這文件描述了ZARZON的硬體.(
譯注:這個名稱換了!變成"轉換概圖(Schematics)成為模擬器"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">
我所要描述的DRIVER是基於MAME 0.33 DOS版原始碼.這裡描述的某些東東
可能在其他版的MAME原始檔中沒有加入.
ZARZON DRIVER 可以在兩個檔案中找到,/driver/rockola.c 及
/vidhrdw/rockola.c.會在這裡找到是因為硬體十分類似於某些其他的
ROCKOLA遊戲.製作MAME的資料結構以幾個層級的方式連結在一起,所以你
可能不太了解某些在較高層級的事物,直到閱讀過較低層級之後.
2.0 /drivers/rockola.c
這個DRIVER的第一部份包含在 /drivers/ 目錄中.在這裡的檔案是MAME
DRIVER的主要部份.它們包含了定義被模擬機器如何運作的所有資料結構.
2.1 GameDriver Structure
MAME中每個遊戲的最高層結構是GameDriver結構.ZARZON的GameDriver
Structure 看起來像這樣(每行開頭都編上編號,所以在內文中可以容易的
參考到行數.)
1 struct GameDriver zarzon_driver =
2 {
3 __FILE__,
4 &satansat_driver,
5 "zarzon",
6 "Zarzon",
7 "1981",
8 " (Taito America license)",
9 "Dan Boris\nTheo Philips",
10 0,
11 &satansat_machine_driver,
12
13 zarzon_rom,
14 0, 0,
15 0,
16 0, /* sound_prom */
17
18 satansat_input_ports,
19
20 satansat_color_prom,0,0,
21 ORIENTATION_ROTATE_90,
22
23 0, 0
24 };
第一行開始於DRIVER的宣告.結構的名稱,在這個例子 zarzon_driver,通
常是用來開始遊戲的名稱後面加上"_driver".
第三行DRIVER所包含的原始檔.應該總是設成:__FILE__
如果這個遊戲是另一個遊戲的複製品,則第四行應該是指到母遊戲的
GameDriver結構的指標.舉例來說,ZARZON就是SATAN OF SATURN的複製品.
第五行是用來開始遊戲的名稱,同時也是放置這個遊戲ROM的目錄/壓縮檔目
錄.每個遊戲應該最多以8個字母命名.
第6行是遊戲的全名.
第7行是這個遊戲出現的年代,第8行是生產這個遊戲的公司名稱.第9行是
DRIVER作者,當DRIVER開始時所顯示的作者.
第10行設計成保持不同的旗標值.現在只有一個旗標,定義為GAME_NOT_WORKING
,表示遊戲現在不能執行.
第11行是指到MachineDriver結構的指標,這個結構定義了這個機器的硬體
如何運作.可能有超過一個遊戲能在同樣機器硬體上執行.例如有一堆不同
版本的小精靈(PAC-MAN)都可在相同的硬體上執行,所以他們都能共用相同
的MachineDriver結構.
第13行是指到一個結構的指標,定義了這個遊戲使用哪些ROM及哪裡載入它
們.
第14行中的兩個0可以是一個指標指到解譯ROM的常式及一個指標指到解譯
ROM 中的運作碼(OPCODE).這是選擇性的並且在這個遊戲中是沒有使用的.
第15行是一個指標指到SAMPLES檔名陣列,這是遊戲用來產生聲音的檔名.這
個遊戲現在不使用SAMPLES,所以打"0".
第16行是一個指標到聲音ROM資料.這個遊戲不使用.
第18行是一個指標指到這個遊戲的InputPort結構.注意那裡,這是定義遊
戲的一部份而不是硬體的一部份,因為這是負責那些像改變功能的指撥開
關(DIPSWITCH).
第20行中的3個數值是一些指標指到調色盤及顏色表,儲放於DRIVER之中.
這些表格現在被從程式碼中移走並且放在ROM IMAGES中,就像他們在原來遊
戲中的位置,所以這是從磁碟載入這些表格的最好方式.第1個數值是一個
指到這個遊戲的調色盤ROM的指標,第2個是指到目前顏色值的表格,用來產
生這個遊戲的調色盤,第3個是指到色彩鎖定表格(color lookup table)的
指標.
第21行定義了遊戲顯示器的方向.看看driver.h,有這一行的合法數值.
第23行是一些指標到用來儲放及載入高分記錄的常式.ZARZON現在沒有儲
存高分記錄,所以這裡是"0".
2.2 MachineDriver Structure
下一層資料結構是MachineDriver.這個結構定義了遊戲執行的硬體.本例
中,ZARZON是SATAN OF SATURN的一個複製品,所以MachineDriver結構被呼
叫為satansat_machine_driver.
1 static struct MachineDriver satansat_machine_driver =
2 {
3 /* 基本硬體結構*/
4 {
5 {
6 CPU_M6502,
7 11289000/16, /* 700 kHz */
8 0,
9 satansat_readmem,satansat_writemem,0,0,
10 satansat_interrupt,2
11 },
12 },
13 60, DEFAULT_60HZ_VBLANK_DURATION, /* 每秒頁框數, vblank 持續時間 */
14 1, /* 單CPU,不須間隔(interleaving) */
15 0,
16
17 /* 影像硬體 */
18 32*8, 32*8, { 0*8, 32*8-1, 0*8, 28*8-1 },
19 satansat_gfxdecodeinfo,
20 32,4*4 + 4*4,
21 satansat_vh_convert_color_prom,
22
23 VIDEO_TYPE_RASTER | VIDEO_SUPPORTS_DIRTY,
24 0,
25 generic_vh_start,
26 generic_vh_stop,
27 satansat_vh_screenrefresh,
28
29 /* 聲音硬體 */
30 0,0,0,0
31 };
第1行開始這個遊戲的MachineDriver的定義.
第4-12行定義這個遊戲使用的CPU.可能一個遊戲有多個CPU.每個CPU都必
須有自己的MachineCPU結構,並且每一個都要一個接一個的列出來在
MachineDriver結構中.ZARZON只使用一個CPU.
第6行定義CPU的種類,本例中是一個6502.
第7行是CPU執行時的時序速度.保持遊戲在正確的速度執行是很重要的.以
ZARZON來說,它是11289000/16.會這樣寫是因為在ZARZON基版上的主時序
是11289000並且被16除由基版上的硬體.(譯注:這表示另一篇寫錯了!)
第8行是個處理器所使用記憶體區域(memory region).當你載入ROM時,為
了從ROM處保存資料,你要定義一個或更多個記憶體區域.每個處理器要有
自己的記憶體區域並且可能有其他的記憶體區域配置給像圖形ROM等.本例
中,這個CPU所使用的記憶體區域是"0".
第9行包含了4個指標指到定義如何處理記憶體及IO存取的結構.這些指標
是Memory Read, Memory Write, IO Read, IO Write.6502沒有IO存取,所
以這裡沒有定義.
第10行決定了向量"BLANK中斷"如何處理.第一個數值是一個指標指到處理
中斷的常式.第二個數值是每個頁框(FRAME)有多少中斷,這裡通常是"1".
第13行標明了這個遊戲每秒產生多少影像頁框,這行的第二個數值標明了
VBLANK最少需要多長(看看driver.h可以得到更多資訊).
第14行是CPU間隔值(interleave value).這個數值決定了對在機器中每個
CPU,MAME要多頻繁的切換.較高的數值,MAME將更為頻繁的切換於處理器之
間.更頻繁的切換,模擬的速度會越慢,但是有時是必需的為了保持每個CPU
同步於其他的CPU.因為ZARZON只有一個CPU,所以這個數值設定為"1".
第15行是一個指標指到用於處理機器硬體所需執行的任何特殊初始動作的
常式.
第18行定義了以點來說,遊戲畫面的長寬,及畫面的可視範圍多大.因為
ZARZON是一個瓷磚為主的繪圖方式(tile based graphics),(譯注:這種方
式的說法很多,例如作者的另一篇是用"character based display",日式
的說法是"動畫拼合"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">32*8標示用來標明畫面是32個瓷磚交錯及每個瓷磚
是8個像點寬,畫面也是32*8個像點寬.接下來4個數值定義了畫面可視範圍
的角落.以ZARZON來說,左上角是0,0,右下角是255,223.
19行是一個指標指到定義圖型在圖形ROM中以怎樣格式儲放的資料結構.
20行中,第一個數值是這個遊戲色彩調色盤中的顏色數.第二個數值是在遊
戲中顏色鎖定表格(color lookup table)中的項目數.
21行是一個指標指向被呼叫用以轉換原始ROM資料成為實際調色盤RGB數值
的常式.這個常式通常可以在 /vidhrdw/ 目錄找到.
23行是顏色屬性.這個屬性標明了這是一個光域遊戲(raster game ,與向
量相反之意)並且支援dirty rectangle處理.完整的屬性列表可以參考
driver.h.
Line 24 ???
25,26,27行是一些指標分別的指到初始顯示器硬體,停止顯示器硬體,及更
新螢幕的常式.ZARZON使用了MAME通用的初始及停止常式,因為對影像來說
,不須任何特定的設定.大部分的遊戲有自己的螢幕更新常式,負責專門為
這個遊戲實際上繪製影像顯示的常式.
這個結構其餘的部份描述聲音的硬體.因為ZARZON現在不支援聲音,這裡我
不討論DRIVER的這一個部份.
2.3 ROM Definition
DRIVER下一個段落定義了遊戲需要載入的ROM IMAGE及哪裡可以載入它們.
這一個段落看起來不像正常的C程式碼,因為使用巨集會使得它可讀性更高.
1 ROM_START( zarzon_rom )
2 ROM_REGION(0x10000) /* 程式碼用的64k */
3 ROM_LOAD( "ZARZ122.07", 0x4000, 0x0800, 0xa260b9f8 )
4 ROM_LOAD( "ZARZ123.08", 0x4800, 0x0800, 0xf2b8072c )
5 ROM_LOAD( "ZARZ124.09", 0x5000, 0x0800, 0xdea47b9a )
6 ROM_LOAD( "ZARZ125.10", 0x5800, 0x0800, 0xa30532d5 )
7 ROM_LOAD( "ZARZ126.13", 0x6000, 0x0800, 0x043c84ba )
8 ROM_LOAD( "ZARZ127.14", 0x6800, 0x0800, 0xa3f1286b )
9 ROM_LOAD( "ZARZ128.15", 0x7000, 0x0800, 0xfbc89252 )
10 ROM_LOAD( "ZARZ129.16", 0x7800, 0x0800, 0xc7440c84 )
11 ROM_RELOAD( 0xf800, 0x0800 ) /* 保留給RESET/中斷向量 */
12 ROM_LOAD( "ZARZ130.22", 0x8000, 0x0800, 0x78362c82 )
13 ROM_LOAD( "ZARZ131.23", 0x8800, 0x0800, 0x566914b5 )
14 ROM_LOAD( "ZARZ132.24", 0x9000, 0x0800, 0x7c4f3143 )
15
16 ROM_REGION(0x1000) /* 圖形用的暫存空間 (在轉換之後的排列) */
17 ROM_LOAD( "ZARZ135.73", 0x0000, 0x0800, 0xbc67fa61 )
18 ROM_LOAD( "ZARZ136.75", 0x0800, 0x0800, 0x2364fe46 )
19
20 ROM_REGION(0x1000) /* Vanguard-style 聲音區域聲音資料 */
21 ROM_LOAD( "ZARZ133.53", 0x0000, 0x0800, 0x4b404b14 )
22 ROM_LOAD( "ZARZ134.54", 0x0800, 0x0800, 0x01380400 )
23 ROM_END
第1行定義了這個遊戲的ROM資訊的開頭,括號中的名稱(zarzon_rom)是指
到GameDriver結構的名稱.
第2行定義了ROM區域的開頭.括號中的數值是這個區域的大小.這行定義了
ROM區域0為64K大小.
第3到14行是載入到這個ROM區域的那些ROM.每行的第一個參數是要載入的
ROM檔名.第二個參術是說明這個ROM應該被載入到記憶體區域的哪裡.第三
個參數說明這個ROM有多少BYTE長.最後一個參數是這個ROM的CHECHSUM,用
來確認ROM是否正確.舉例來說,第3行會載入0x800 BYTE長從檔案ZARZ122.07
開始於位址0x4000在記憶體區域0中.
11行有些不同於其他行.這行是ROM_RELOAD,代替ROM_LOAD.ROM_RELOAD用
來再載入這個ROM,載入到記憶體中到不同區域.所以第10行載入ZARZ129.16
到記憶體在0x7800,第11行再載入一次在記憶體位址0xf800.這樣做的主要
理由是如果ROM不在或是有錯誤的CHECKSUM,只要重複使用ROM_RELOAD,就
不會重複回報同樣的錯誤.
第16行是結束ROM區域0並且開始ROM區域1.在ZARZON中,這個記憶體區域用
來存放圖形ROM.20行結束ROM區域1並且開始用來存放產生聲音用的PROM的
ROM區域2.ZARZON還不支援聲音,所以這些ROM不使用.
23行結束這些ROM的定義.
2.4 MemoryReadAddress Structure
MemoryReadAddress結構定義了這個機器的MEMORY MAP.它告訴MAME,當處
理器想要讀取資料從一個特殊的記憶體位置,應該做些什麼.這裡是ZARZON
的MemoryReadAddress結構(記住!ZARZON是Satan of Saturn的複製品,所
以名稱是satansat_readmem):
1 static struct MemoryReadAddress satansat_readmem =
2 {
3 { 0x0000, 0x1fff, MRA_RAM },
4 { 0x4000, 0x97ff, MRA_ROM },
5 { 0xb004, 0xb004, input_port_0_r }, /* IN0 */
6 { 0xb005, 0xb005, input_port_1_r }, /* IN1 */
7 { 0xb006, 0xb006, input_port_2_r }, /* DSW */
8 { 0xb007, 0xb007, input_port_3_r }, /* IN2 */
9 { 0xf800, 0xffff, MRA_ROM },
10 { -1 } /* 表格結尾 */
11 };
第一行是這個結構定義的開頭.名稱,本例是satansat_readmem,指到
MachineDriver結構.
結構內的每一行開頭跟著兩個數字,記憶體區段開始及結束的位址.接下來
是一個或更多物件,定義記憶體節區是什麼及它應該如何處理.
第3行定義了一個記憶體區域,開始於0x0000及結束於0x1FFF.它被定義為
MRA_RAM,意指這個區域是RAM的位置.當一次執行在這個區段中的位址的讀
寫時,對處理器而言相當於在記憶體區域(當你載入ROM時定義的)中相對應
的位置做一次讀寫.
第4行定義了MRA_ROM,意指這個區域是ROM的區域.本質上,與MRA_RAM的行
為相同.
第5行顯示了一個稍微不同類型的記憶體區段.因為起始及終止的位址相同
,表示這個區段只有一個BYTE長,這是十分合理的.這個區域的功能代替一
個預先定義(pre-defined)的一個常式名稱的功能.當處理器讀取這個記憶
體位置時,MAME會呼叫常式"input_port_0_r",並且這個常式會傳回一個適
當的數值.本例中,"input_port_0_r"是一個功能雖然由MAME定義,不過它
也很簡單的能由你自己寫你專用的常式."input_port_0_r"會在IO 結構的
段落中更進一步的討論.
6,7,8行所有功能都和第5行一樣.
第9行定義了位址0xf800到0xffff的ROM的最後一塊.
第10行設定為"-1"表示是這個表格的結尾.