有關遊戲模擬器

2021-06-04 17:45:26 字數 3251 閱讀 4836

寫在前面:最近公司在做

gba的模擬器,順便找了點資料研究了一下。

提起模擬器,愛好者們一定會想到

neoragex

、mame, n64

等著名遊戲機的模擬器。在這些模擬器上可以模擬一些功能強大的街機板,可以讓我們在自己的

pc上免費玩街機的遊戲。想起當初數著錢買遊戲幣的日子,

真是乙個天堂乙個人間啊。玩著讓人熱血沸騰的遊戲的時候,你是否想過這些模擬器是怎樣開發出來的?你是否了想解這些模擬器的執行原理?本文將給你乙個回答。

模擬器的功能就是用軟體模擬硬體環境,讓原本只能在硬體環境下執行的程式可以在軟體模擬的環境下執行。而現今硬體的結構都是大同小異的,所以這些模擬器的

技術不但可以模擬遊戲機的機板,也可以模擬其它的硬體環境,例如微控制器、

pda, mac

等等,只是細節上有一點不同罷了。不過,模擬器的開發用一句話來說,就是

「底層、底層、再底層

」,從最低層的硬體角度入手來模擬硬體,這才是正確的

模擬道路。

要了解模擬器的工作原理,首先

我們要了解一些計算機硬體的知識

.我們現在使用的計算機的模型是圖靈機,主要是由儲存器、控制器和運算

器組成的。所

謂儲存器就是記憶體、硬碟等可以儲存資料的裝置

;控制器就是計算機內部用來控制程式執行的裝置,計算機的指令都是由它來排程執行的:而運算器顧名思義就是運

算用的啦。由儲存器、控制器和運算器組

成了乙個以控制器為中心的工作系統,大概的工作流程是這樣的: 1

、準備執行,將指令調入儲存器;

2、開始執行程式;

3、在乙個時鐘週期內,控制器從儲存器裡面取回一條指令

;    4

、解釋指令,指出要做什麼,並產生對應的控制命令和運算元位址

(如果有的話)

;  5、由

cpu執行指令

;    6

、重複到第

3步,一直到有外界干預或者程式執行完畢為止。

通過這個工作流程解釋,我們可以知道,

cpu不停地在取指令、解釋指令、執行指令,一直迴圈直到中止。其中當然還有一些其他的控制,下面我們細細談來。

首先,cpu什麼時候取指令?答案是

cpu在乙個時鐘週期內取指令,指令執行要耗費一定的時鐘週期,指令執行完畢以後,

cpu會再來取指令,然後重複。這是一般的工作模式,什麼流水線之類的東西就不提了。

其次,什麼時候執行中斷?

cpu在每乙個取指令週期之前都會檢查是否有中斷產生,如果有的話,就去執行中斷,直到中斷返回。

第三,定時器怎樣工作?定時器是乙個硬體裝置,設定了一些相關的引數以後,它就會在特定的時候產生乙個定時中斷。

cpu在檢查中斷的時候就會檢測到這個中斷。

好了,了解了這麼多複雜的硬體工作原理以後,我們就可以了解一下模擬器是怎樣來模擬這些硬體的工作原理了。模擬器的主要工作原理是,模擬儲存器,將指令放到儲存器裡面,然後不斷地從儲存器裡面取回指令、通過模擬硬體的指令集來解釋指令,再將原來硬體環境中的指令轉換成為

pc機上的指令,在模擬的環境下重執行指令,以達到模擬指令執行的目的。

首先要模擬的是儲存器,可以說就是模擬乙個硬體的記憶體。我們執行的

pc機上也有記憶體,所以直接在

pc開乙個記憶體空間,用來給要模擬的硬體環境儲存指令。因為要模擬的硬體訪問這段記憶體時通過指令來達成目的,所以在

cpu執行指令的時候直接來訪問這段記憶體就可以了。

其次要模擬的是

cpu,根據上面說到的工作流程,

這段程式的主要結構是這樣的:

while

(

沒有外界的結束命令)

接下來要模擬就是定時器,我曾經寫過二個微控制器的模擬器,但是定時器的問題困惑我很久,因為用

pc的定時器來模擬對應硬體的模擬器,一般達不到要求。

pc 機的定時器最小的時鐘週期是

1ms (1

毫秒,1/ 1000

秒),但是用來模擬

mhz級數的時鐘需要納秒級的定時,這是

pc所不能達到的。所以,乾脆模擬到底,將

cpu的時鐘週期也來個計數,模擬硬體的定時裝置工作原理。這樣就可以正常地控制定時,當然速度取決於個人機器的快慢了,這就是大多數模擬器對機器的要求比較高的原因,畢竟軟體模擬時鐘週期的運作要慢很多。

那麼上面的核心程式流程就可以轉化為這樣:

intcycle = 0;

while

(

沒有外界的結束命令)

if(

程式沒有結束)//

這裡應該是

if(程式結束)吧

跳出迴圈;

} 下面是模擬取指令,一般的

cpu有乙個程式計數器

pc,是乙個記憶體位址,指向下面一條指令的執行位址。那麼,在程式開始的時候,

pc是指向程式第一條指令的記憶體位址,取回一條指令後,

pc自動加

1,指向下面一條要執行的指令。

取指令的結構是這樣的:

intpc;

byte code;

//指令碼

byte mem[65535];

//儲存器設定為

65535

個位元組

初始化pc = 0;

//起始位址

取指令code = mem[pc];

pc++;

解釋指令就比較簡單了,取回指令以後,就可以轉移到特定的處理去。一般來說有兩種方法。一種是使用

switch

語句,根據指令碼來轉移到特定的處理過程中

;另外一種是構建乙個指令表,表中儲存的是指令的相關資訊和處理函式的函式指標。這兩種方法都是可取的,只是前者比較直觀、簡單,後者靈活、適合於通用結構。這兩種方法都是根據

cpu的指令集來構造的。

中斷模擬也比較簡單,不同的

cpu都有不同的中斷控制暫存器,根據中斷暫存器來判斷是否有中斷。而如果檢測到中斷就轉移到對應的處理過程中去。一般的來說,中斷號是固定的,處理過程一般是由要模擬程式定義的,而位址也是由要模擬程式定義的。所以,我們本身的模擬器不需要關心太多。

windows

下面的圖形相關指令,這樣才能夠很好地模擬出應有的圖形效果。與聲音相關的指令同樣如此。不過,如果你只是想模擬乙個

cpu的話,那還是比較簡單的。如果你想成為乙個模擬器的開發者,還是從最簡單的

cpu模擬開始吧。

永遠記住,模擬器主要是來模擬硬體環境的。

模擬器不全屏 Mac原生遊戲模擬器

你是否想為自己的mac電腦安裝一款蘋果原生的遊戲模擬器呢?快來試試openemu for mac吧!openemu mac版是執行在mac平台的原生遊戲模擬器。openemu的遊戲主管介面直觀友好,即使是新手也能一眼看懂。把 rom 檔案拖拽進對應的頻道就能新增遊戲,雙擊右側主介面裡的遊戲封面開始玩...

街機遊戲模擬器 mame for linux

偶爾在linux裡也是要玩下遊戲的,裝乙個街機模擬器玩玩kof也不行噢。sudo apt get install xmame 修改sudo vi etc xmame xmamerc配置檔案,下面的路徑指向你實際的rom目錄 rompath usr share games xmame roms 比如執...

安卓模擬器 exagear模擬器安卓模擬器

讓android 裝置使用者重溫經典 pc 遊戲,來自俄羅斯的初創公司 eltechs發布了一款全新的 android 遊戲模擬器 exagear strategies。該遊戲模擬器的主要功能就是將經典的 pc 遊戲帶到 android 智慧型手機或平板電腦上來。1.exagear軟體和遊戲,完全免...