
[CHIP-8 小東西] 指令集虛擬化與解碼機制
CHIP-8 的每條指令固定由 2 bytes,也就是 16 bits 組成,並利用不同位置的位元表示操作類型、暫存器、記憶體位址與常數值。本篇將先說明 opcode 中常見的 nnn、x、y、kk 與 n 等欄位,再利用 bit mask、位移運算與 switch-case 建立指令解碼流程,最後依序實作控制流程、條件判斷、暫存器運算、繪圖、鍵盤、計時器、BCD 與記憶體存取等 CHIP-8 核心指令。

CHIP-8 的每條指令固定由 2 bytes,也就是 16 bits 組成,並利用不同位置的位元表示操作類型、暫存器、記憶體位址與常數值。本篇將先說明 opcode 中常見的 nnn、x、y、kk 與 n 等欄位,再利用 bit mask、位移運算與 switch-case 建立指令解碼流程,最後依序實作控制流程、條件判斷、暫存器運算、繪圖、鍵盤、計時器、BCD 與記憶體存取等 CHIP-8 核心指令。

虛擬硬體元件開發完成後,接下來就進入模擬器最核心的階段:實作指令集模擬器(Instruction Set Simulator)!相較於現代處理器,CHIP-8 的指令集規模非常小,因此非常適合作為理解處理器取指(Fetch)、解碼(Decode)與執行流程(Execute)的入門專案。本篇將先介紹 CHIP-8 指令與機器碼的基本概念,接著實作二進位程式載入機制與最基本的 fetch 流程,為後續真正執行 CHIP-8 遊戲程式奠定基礎。

本文將介紹如何在 CHIP-8 模擬器中實作延遲計時器(delay timer)與聲音計時器(sound timer)。兩者皆以 60 Hz 的頻率遞減,其中 delay timer 主要用於控制程式中的時間延遲與事件節奏,我們將透過 main loop 的睡眠機制模擬其遞減行為,並利用暫存器賦值進行編譯測試;Sound Timer 則採用相同的遞減機制,並在數值大於 0 時產生蜂鳴聲(beep)。

在完成 CHIP-8 的系統初始化與內建字元集後,接下來就要開始建立真正能顯示畫面的螢幕模組啦!這一階段會先使用布林二維陣列保存 64×32 的像素狀態,再加入像素設定、讀取功能。最後,透過 SDL 將開啟的像素依照視窗倍率放大並繪製到畫面上,讓模擬器首次具備完整的螢幕資料儲存與顯示能力。

這一階段會先建立統一的初始化流程,確保各項硬體資料在程式啟動時都有一致的初始值;接著加入 CHIP-8 內建的十六進位字元集,將 0 到 F 的精靈資料載入直譯器保留的記憶體區段。

本文將探討堆疊(Stack)的運作原理,並依據 CHIP-8 的硬體規格實作堆疊資料結構,以及如何在 CHIP-8 模擬器中實作十六進制的虛擬鍵盤。

本文將介紹如何根據 CHIP-8 硬體規格,在模擬器中實作記憶體(Memory)以及暫存器(Registers)結構。

在開發 CHIP-8 emulator 前,我們除了背景知識外,還需要先進行架構規劃以及引用需要的函式庫。除了專案架構應該大同小異外,這次專案引入 Simple DirectMedia Layer,能讓開發者輕鬆建立視窗並將像素繪製到畫面上,以達到顯示遊戲畫面之目的。

CHIP-8 是一種簡單的直譯式程式語言,也是一套簡單的虛擬機規格,出現於 1970 年代末期至 1980 年代初期,主要應用在 DIY 電腦系統上。本篇將藉由介紹 CHIP-8 背景以及實際規格,為之後的小型專案鋪路。


這篇是我搬運自己以前在 GitHub Pages 上 2020年 7 月的文章,最近要開始慢慢搬家、把那個網站改成實驗其他東西的地方,剛好搬到這一篇是那個網站誕生的文章,內心百感交集……

這一系列是我讀 The little book about OS development 的一些實作紀錄,此篇為介紹有關於 C 的使用,讓組合語言和 C 語言可以結合在一起……

這一系列是我讀 The little book about OS development 的一些實作紀錄,此篇為介紹一些基礎概念,以及利用這些簡化的流程,實作一個非常簡單的奈米級作業系統……

鑒於以前大部分應用程式都是用 C# 或是用 Python 寫,最近突然想試試看用 C++ 比較不同之處,並且從管理系統著手(以前有陣子蠻常寫這個的),殊不知將近兩到三個小時幾乎是忙著大改裡面的東西……

現在要打造一座城堡,目前已經有任務清單,例如建造牆壁、打地基、安裝窗戶等等,但還沒有排序哪個任務要先完成,目前有個檔案有每個任務的 index、每個任務的名稱以及每個任務的先備條件,目前我們需要一個能夠排序任務的小工具……

這次我想爬取 majortests 中的英文列表。這個網站的組成蠻簡單的(雖然廣告很多),標籤也很一致整齊,很適合做為爬取單字的爬蟲練習……

為了複習關於物件移動的概念,我用網路上所能找到的最簡單的例子去理解。後來決定實作看看彈力球……

Software Engineer from Taiwan