在個人電腦與智慧型手機普及的今天,我們很難想像一個只有 80 位元組(Bytes)程式記憶體、運算核心只有 4 位元(bit)的電腦是什麼樣子。
2009年的Gakken 推出了這個 GMC-4 (Gakken Micro Computer 4-bit)的微電腦,收錄在大人的科學第24期https://otonanokagaku.net/magazine/vol24/index.html
它的特別之處,就是讓電子愛好者親手接觸電腦程式底層邏輯-機器碼。好幾年前我買了這本書之後,我其實沒弄懂這到底在幹嘛?
不過後來學習了計算機組織與結構之後,我終於懂了那是做什麼了。原來是透過用機器碼寫程式。我們目前用的java script、python都是高階語言,是給人類看的語言。
這些高階語言在背後,其實最終都會被轉譯成低階的機器語言,才能由電腦硬體實際執行。而 GMC‑4 正是一台設計用來讓你跳過所有抽象層、直接「對硬體說話」的教具型微電腦。 你需要手動輸入一行一行的機器碼,設定暫存器、跳躍條件、控制流程,才能讓它執行一個最簡單的加減乘除、閃燈或倒數計時任務。沒有作業系統,沒有變數宣告,甚至連除錯器都沒有。你要完全理解它的 15 條指令集(OPCode),知道 A、B 暫存器、Y 記憶體指標與旗標(Flag)的角色,才能成功寫出一段程式。 也就是說,GMC‑4 可以讓你真實感受到「什麼叫做電腦」的機器,而正因為它的限制明確、架構單純,反而成為理解電腦本質、教學用模擬器與入門編碼邏輯的最佳起點。想真正理解「為什麼程式碼能跑起來」,都可以用這台小小的 GMC‑4來理解。不過純硬體的架構下,其實不容易理解裡頭寫了什麼,後來我就動起念頭想要把硬體做成網頁上的模擬器,重現這台經典的 4 位元微電腦。
想了解計算機原理的人或只是單純好奇,都可以玩玩這個 4 位元電腦。
模擬器介面巡禮
打開模擬器,您會看到一個復古風格的介面,有著 GMC-4 的主要硬體元件:
7 段顯示器 (7-Segment Display):這是主要的輸出裝置,用來顯示一個 4 位元的十六進位數字 (0-F)。
位址 LED (Address LEDs):這 7 顆綠色 LED 燈以二進位形式即時顯示「程式計數器 (Program Counter, PC)」的位址。
2-pin LEDs:這 7 顆黃色 LED 燈主要由 CAL 系列指令控制,用於顯示程式狀態或作為簡單的圖形輸出。
十六進位鍵盤 (Hex Keypad):從 0 到 F 的按鍵,是您輸入程式碼和資料的主要工具。
功能鍵:
A SET:設定記憶體位址。
INCR:將輸入的數值寫入當前記憶體位址,並將位址加一。
RUN:執行程式。
RESET:重置 CPU 狀態,但保留記憶體內容。
HARD RESET:清空所有記憶體並重置 CPU。
記憶體檢視器 (Memory View):
左欄 (Raw):顯示程式與資料記憶體的原始十六進位碼。
右欄 (Disassembled):將機器碼反組譯成人類可讀的助憶碼,有了它你更知道硬體裡在做什麼。
核心概念:4 位元電腦如何「思考」?
GMC-4 的核心是 4 位元架構,這意味著:
暫存器寬度:CPU 內部的暫存器(如 A, Y)一次只能儲存一個 4 位元的數值(也就是 0-15,或十六進位的 0-F)。
資料處理:所有運算都以 4 位元為單位。這也是為什麼它的鍵盤和顯示器都以十六進位為基礎。
記憶體:它擁有極小的記憶體空間,分為 0x00 到 0x4F 的程式區和 0x50 到 0x5F 的資料區。
入門教學:撰寫你的第一個程式
接下來動手操作,感受一下最原始的程式設計方式。
暖身:寫入與讀取記憶體
我們的第一個目標是將數值 A 寫入記憶體位址 10,並驗證它。
操作步驟:
按下 HARD RESET 清空所有狀態。7 段顯示器會顯示 F。
依序按下 1、0、A SET。
這個動作將程式計數器 (PC) 設定到 0x10。注意看,7 顆綠色的 Address LEDs 會顯示 0010000,也就是 16 的二進位表示法 (0x10 = 16)。7 段顯示器則會顯示 F,這是位址 10 目前的內容。
按下 A、INCR。
解說:這會將數值 A 寫入 0x10 位址,然後 PC 自動前進到 0x11。您會看到右方的記憶體檢視器中,10: 的位置出現了 A。
驗證:先RESET,將PC指回00,再次按下 1、0、A SET 將 PC 指回 0x10。看看 7 段顯示器,是不是顯示 A 了呢?恭喜,你完成了最基本的記憶體操作!你作的事情就是指定記憶體的位址,寫入A,然後再回到記憶體的初始位置,然後再去檢查剛剛那個位址寫了什麼。
第一個程式:永不停止的計數器(0x1)
現在,來寫一個真正的程式。這個程式會讓 7 段顯示器從 1 開始,不斷地顯示到 6,然後再從 1 開始循環。
我有把這個程式寫成內建的,你先按下 RESET,再按下 1 (代表這組計數程式),最後按下 RUN,就可以載入這組程式並執行。
程式邏輯:
如果要自己輸入的話,就是這樣的操作步驟:
按下 RESET (或 HARD RESET) 讓 PC 歸零。
依照上表的「指令碼」欄位,依序輸入: 8 INCR 1 INCR 1 INCR E INCR 9 INCR 9 INCR 1 INCR C INCR 7 INCR F INCR 0 INCR 2 INCR 8 INCR 1 INCR F INCR 0 INCR 2 INCR
輸入完成後,再次按下 RESET 將 PC 指回 00。
按下 RUN!
現在,您應該能看到 7 段顯示器上循環顯示 1 到 6 的數字,並伴隨著嗶嗶聲。您可以隨時按下 PAUSE 暫停,或 STEP 來逐一指令執行,觀察暫存器和記憶體的變化。
內建程式-電子琴 Organ(0x9)
本模擬器還有內建了一些範例程式。
操作步驟:
按下 RESET。
按下 9 (代表 Organ 程式)。
按下 RUN。
此時,整個程式記憶體會被載入 Organ 程式的機器碼,按下 1-F 的按鍵會發出不同音階。看右方的反組譯碼,可以試著理解這個電子琴程式是如何運作的!
逐行解析一下它的機器碼。
這個程式展示的是電腦底層的基本輸入、條件判斷和輸出流程。
程式:音樂播放器 (Music Player - 0xA)
這個程式比電子琴複雜一些,它會自動播放儲存在資料記憶體中的一串音符,直到遇到結束標記。
資料 (data array): [1, 1, 5, 5, 6, 6, 5, 4, 4, 3, 3, 2, 2, 1, 0] 這串數字代表了「小星星」的音符序列。0 在這裡作為音樂結束的標記。
程式碼 (code array):
這個程式利用 Y 暫存器作為指標來循序讀取資料,是進階的程式設計技巧。
現在,你可以參考指令集來修改程式,或是設計簡單的機器碼小程式了。像是試著修改計數器程式,讓它數到 F,載入其他的內建程式,研究它們的程式碼。