未分類

CHIP8模擬器開發-模擬器與CHIP8簡介

模擬器基本概念

模擬器主要是讓一台A電腦能夠模擬B電腦上執行的程式,其中B電腦是一款對於A電腦來說完全不同處理器架構的系統,例如我能夠在x86下執行ARM的程式。但畢竟是透過”模擬”出來的,與原電腦中間隔了一層模擬執行的階段,效能當然也就不比原生系統上快速。

電腦怎麼執行指令?

電腦的CPU有一套屬於自己的指令集,根據架構的不同,CPU所能接受的指令集也會有所不同,如x86架構與ARM架構的處理器指令集是完全不同的,幾乎無法相容,這也就是為什麼要在電腦上玩手機遊戲需要藉由模擬器來”模擬”ARM架構的指令執行過程。電腦執行一連串的指令需要經過以下流程:

  1. Fetch : 從記憶體中取出下一個要執行的指令
  2. Decode : 將指令解析成對應的資料格式
  3. Execute : 執行該指令
  4. Store : 儲存執行結果

Hello CHIP-8

什麼是CHIP-8

CHIP-8其實是一種程式語言,它需要執行在它專屬的模擬環境中,這套模擬環境是一個小型的系統架構,總共只有35個指令需要實作,非常適合第一次學習模擬器開發的一套系統。這一系列筆記將使用C語言開發CHIP-8模擬器。

CHIP-8 模擬環境規格

Memory

總共 4096 Bytes,其中前512Bytes(0x000~0x200)通常用來存放CHIP-8本身語言的interpreter(直譯器),最末端的96Bytes(0xEA0-0xEFF) + 256Bytes(0xF00-0xFFF)前者是用來存放CallStack,後者是用來處理畫面刷新。

Registers

共 16 個 8 bits registers,個別的名稱為V0, V1, V2….VF,其中VF被拿來做為flag使用,當執行加法運算時VF為CarryFlag,減法運算為BorrowFlag,繪圖運算為CollisionFlag(像素碰撞旗標)

Stack

Stack用來存放return addresses,與現行系統的概念一樣,目前設計通常以16層堆疊上限為原則。

Input

輸入共有16個按鍵能使用(如下圖),通常以2,8,4,6為上下左右,CHIP-8有三個關於鍵盤輸入的Opcode要實作,分別為某個鍵是否被按下、某個鍵是否沒被按、等待某個鍵被按下後存放至register中。

Graphics

Chip-8的螢幕解析度為 64×32 pixels,螢幕色彩為Monochrome(單色),繪製畫面到螢幕上顯示時以Sprite為單位,每個Sprite最多占15bytes的資料量,所以最大能繪製的單一大小為8x15 pixels

Sound and Timer

Timer有兩種
第一種是Delay timer用來控制整個系統的速率,其值非零時會持續以60Hz的頻率減少1。
第二種是Sound timer,主要是用來控制音效,當timer值為零時就會發出聲音,同樣是60Hz的頻率。

CHIP8模擬器開發系列文章

  1. CHIP8模擬器開發-模擬器與CHIP8簡介
  2. CHIP8模擬器開發-指令集
  3. CHIP8模擬器開發-來寫程式吧
分享到