# Virtual Machine 此虛擬機不是動態的重新編譯,所以速度上會有差別。 原理是將檔案存入到我們所設的 64K memory 裡面,然後再去執行後面的動作。 螢幕大小為 $A000 ~ $AFA0 將螢幕的64Kmemory的位址用這個函示記錄起來,預設為$A000 ![](https://hackmd.io/_uploads/SyP2Z02B3.png) --- 設定預設的位址和Memory的大小,之後使用for迴圈設定螢幕,32代表的空白,7則是灰色的文字。 ![](https://hackmd.io/_uploads/S107XR3Hn.png) --- 檢查得到的memeory位址是否有超過範圍,有的話回傳error,沒有則是會將值儲存起來,然後再refresh整個螢幕 ![](https://hackmd.io/_uploads/ryXQIChr3.png) --- 跟 poke 是一樣的,只不過poke存的是 value ,peek 存的是 byte ![](https://hackmd.io/_uploads/r1U1vC3rh.png) --- 接下來新增一個事件叫做paint,用來設定 foreground 和 background 的顏色,我們將字形都設定為 Courier New ,因為這個裡面的每個字元都只佔1個byte,再加上大部分電腦上都有這個字形。 決定好顏色後,會將讀到的字元根據顏色加上去 ![](https://hackmd.io/_uploads/SyFeFWAHn.png) ![](https://hackmd.io/_uploads/SklZY-Rr2.png) ![](https://hackmd.io/_uploads/BJvbF-RH2.png) ![](https://hackmd.io/_uploads/SybGYWAS2.png) ![](https://hackmd.io/_uploads/SkOfKWAB2.png) ![](https://hackmd.io/_uploads/r10zt-Crn.png) --- 拿 ABC 和 RGB 的背景顏色來做測試 ![](https://hackmd.io/_uploads/Sy0ttb0H2.png) ![](https://hackmd.io/_uploads/rJDctb0Hh.png) --- ## Start Code 所需變數 ![](https://hackmd.io/_uploads/Sk2VZM0H3.png) --- 將register裡面的值轉成16進制,再跟label加在一起。然後為了避免"$1" 的情況發生,使用padleft()這個函式,所以最後會變成"$01" ![](https://hackmd.io/_uploads/HJ1pQGASn.png) --- 儲存 magic number 用來檢查是否為B32的檔案,如果是就呼叫execute program 這個函示,反則就回傳錯誤。 ![](https://hackmd.io/_uploads/HkKTPG0Bh.png) ![](https://hackmd.io/_uploads/B1ZRDzRr2.png) --- Executeprogram function 執行檔案 ![](https://hackmd.io/_uploads/B1TGuGCHn.png) ![](https://hackmd.io/_uploads/r1m7_zRH3.png) --- 測試虛擬機 把檔案先經過 B32 complier 處理後,丟到 virtual machine 去執行 ![](https://hackmd.io/_uploads/Byfr6MRHh.png) ## 步驟 將B32檔案傳入 ![](https://hackmd.io/_uploads/rJC1cYBP3.png) 結果 ![](https://hackmd.io/_uploads/rykUTzAr2.png) ---