本作品是一臺32位紅石電腦,CPU部分是一個 32 位通用處理器,配有512Byte RAM(其中 128Byte為顯示緩沖區),8 鍵輸入(其中四個方向鍵,四個功能鍵),32x32像素屏幕輸出。
本電腦由論壇小組The Redpixel成員HappyWater于2016年4月完成,@乙烯_中國代為發布至mcbbs。機器編號為RSC-3230。
RSC-3230使用說明鏈接://pan.baidu.com/s/1bF9nCq密碼: 艦C
RSC-3230最新存檔鏈接://pan.baidu.com/s/1pLy4aH9密碼: 艦C
一、作品總覽
本作品總體由運算器模塊,存儲器模塊,控制器模塊,顯示屏模塊,以及輸入按鈕等部分組成。下面簡要介紹各個模塊。
1、運算器
運算器包含一個加法器,兩個單向串行移位器(分別對應左移和右移),一個串行乘法器和一個串行除法器。運算器組可以完成加減乘除四則運算,與或非邏輯,移位運算等運算。
2、存儲器
存儲器總共 128個字,每個字長 32 位,不允許非對齊訪問。建筑結構為多層結構,總共分四層,每層容量 128Byte,其中最上面一層被連接在顯示屏上,使用屏幕刷新指令即可將這部分存儲器中的數據顯示在屏幕上。存儲器中,靠下的層為地址低位,靠上的為高位。
3、控制器
控制器部分負責產生控制時序,指揮整機的運轉。控制器也是分層結構的,面板上每一行對應內部的一層。每一層負責一種基本動作,按下每一層右邊的按鈕,即可執行這一層的動作。
在正常自動運行時,控制器會依照指令,輪流執行相應的動作,完成程序預期的操作和運算。在單步運行時,玩家可以手動執行每一個動作,觀察程序運行狀態,以便調試程序。
下數第四層,也就是橙色的一層為取指動作層。通常情況下,按下這一層的啟動按鈕即是啟動整臺機器。
在面板右側有一個拉桿,是整機的停機拉桿。當退出游戲時,應先停止機器的運行。MC在保存地圖時,對各個部分的保存時間并不同步,若此時機器處于運行狀態,則可能導致紅石電腦出錯,甚至處于失控狀態。
4、顯示屏
顯示屏為32x32 像素紅燈屏幕。利用活塞BUD暫存屏幕畫面,當程序正在繪制顯示緩沖區中的畫面時,顯示屏上的畫面不受影響,當繪制完成后,可使用刷新屏幕指令將畫面刷新到屏幕。
6、輸入按鍵
本作品提供了8 個輸入按鍵,如圖中所示,中間是四個方向鍵,下面四個是功能鍵。
8 個按鍵直接連接在寄存器 R30上,軟件訪問寄存器 R30即可獲取當前按鍵狀態,對R30寫入則無意義。R30 最高 8bit中,每一個 bit對應一個按鍵,從最高位(31位)向低位依次為“上”“右”“左”“下”四個按鍵,緊接著下面從左向右依次四個功能按鍵。
當按鍵沒有按下時,對應 bit位為0,按下時對應比特位為 1。R30中其余 bit位沒有連接外部設備,可留給玩家自己MOD 添加。按鍵按下后并不會對系統產生中斷,按鍵信息的輸入只能通過軟件輪詢實現。
二、指令表
本CPU的指令為32位定長,在內存中對齊存放。內存訪問時忽略地址的最低 2bit。
CPU中包含32個 32 位通用寄存器,其中R31 為指令計數器,R30 為鍵盤狀態寄存器。當指令運算中引用 R31時,R31 永遠指向當前指令的下一條指令地址。當指令執行結果修改 R31時,程序流程即跳轉。
1、 數據傳送指令
單寄存器指針內存讀取指令:LDRs R1,R2
即以寄存器 R1 中的數值為指針訪問內存,將內存中的數據傳送寄存器 R2 中。兩個寄存器編號可以相同。
雙寄存器指針內存讀取指令:LDRd R1,R2,R3
即以寄存器 R1、R2 之和為指針訪問內存,將內存中的數據傳送到寄存器 R3中。三個寄存器編號可以交叉。
單寄存器內存寫入指令:STRs R1,R2
道理同上,以 R1 為指針,將 R2 寫入內存。
雙寄存器指針內存寫入指令:STRd R1,R2,R3
道理同上,以 R1、R2之和為指針訪問內存,將 R3 寫入內存。
立即數輸入指令:LDRi R1, $xx
即向寄存器 R1 中輸入一個有符號整數立即數。該立即數長度 19 位,符號擴展至32位存入R1.
上述指令編碼如下:
LDRsSTRsLDRdSTRd
0000010010001100 =>AAAA
[11][AAAA][00][R1][R2][R3][000000000] 左邊 msb,右邊 lsb。
LDRi R1, $int
[11][0010][00][R1][int]
例:
LDRs R1, R2 11 0000 00 00001 00000 00010 000000000
STRd R4, R5, R6 11 1100 00 00100 00101 00110 000000000
LDRi R16 , $12345 11 0010 00 10000 1001110000001100000
LDRi R7 , $ -19 11 0010 00 00111 1111111111111101101
2、 算術運算及邏輯運算指令
本機器中ALU 支持 ADD SUB OR NOR AND NAND XOR NXOR 等指令,指令結構相似。
ADD R1, R2,R3即將R1,R2中的數值相加,結果存入R3 中。三個寄存器的編號可以交叉。 SUB R1, R2, R3 即將R2-R1結果存入R3。三個寄存器編號可以交叉。
OR、NOR、AND……等其余指令類似不再贅述。
本機中移位器支持邏輯左移(BSL)、循環左移(BCL)、邏輯右移(BSR)、循環右移(BCR)以及算術右移(BAR)等指令。
BSL R1,R2,R3 即將R1 中的數值邏輯左移R2 位,將結果存入R3。三個寄存器編號可以交叉。R2中的數值忽略高位,僅關注最低 5bit。
BCL、BSR、BCR、BAR等指令同理,不再贅述。
本機中乘法器和除法器分別完成乘法和除法指令。需注意的是,乘法器與除法器指令涉及4個寄存器,兩個源操作數,兩個目的操作數。
MUL R1,R2,R3,R4 即將R1 R2 中的數值相乘,結果存入R3 R4中。其中R3存放結果低位,R4 存放結果高位。四個寄存器的編號可以交叉,若R3 R4編號相同,則最終寄存器中只存放結果低位。
上述指令編碼如下:
[00][AAAA][F][C][R1][R2][R3][R4][A][000](注意:A 字段有前后兩組,共5bit)
ADD SUB OR NOR AND NANDXORNXOR
00000 01000 00001 00101 11101 11001 00110 00010 => AAAAA
(本組指令可影響標志位)
BSL BSR BCL BCR BAR MUL DIV
00011 10011 01011 11011 101111000010100 => AAAAA
(對本組指令使用標志影響位結果將不可預知)
指令中,F和C 各占1個bit。利用這兩個指示位可實現if goto指令。
F為標志影響位,若為1,則本指令執行結果將影響標志位,若運算結果為0,則標志位為1,反之標志位為0。
C為條件執行位,若本為1,則本指令在標志位為1 時才執行,否則將跳過不執行。若本位為 0,則本條指令無條件執行。
3、 屏幕控制指令
清白屏:WS011000[其余填零]
清黑屏:BS010100[其余填零]
刷新屏:RS010010[其余填零]
WS和 BS用于清屏,區別是WS讓全屏變亮,BS 讓全屏變暗。由于顯示屏利用活塞BUD 暫存畫面,有時活塞可能“失去粘性”,此時應使用清白屏指令使其恢復。
刷新屏指令將RAM 中顯示緩沖區里的數據顯示在屏幕上。
顯示緩沖區為128 字節,每4 字節對應屏幕上一行,高位對應靠左的像素,低位對應靠右的像素。靠高地址端的對應屏幕底下的像素,靠高地址端的對應屏幕上方的像素。
三、使用方法簡述
本機未設置 ROM,整個存儲器部分都為 RAM,既可存放指令,亦可存放數據。可手動修改每一個存儲位狀態以完成編程。若不希望指令被意外修改,可將存儲區相應的存儲位上的活塞去除,以固定存儲位狀態。
在機器處于停止狀態時,按下下圖中左數第二個燈上的按鈕即可將R31 清零,以完成程序復位。軟件的第一條指令應按放在內存中的第一個單元內。可以在第一個內存單元處安置一條跳轉指令,即可跳躍至任意程序入口。軟件亦可在各個寄存器中存放初始化數據,而不必各個都從RAM 中加載,以節省RAM 空間和運行加載時間。
如上圖所示,控制器面板中橙色的一層為指令讀取動作層。按下右邊的按鈕,機器將從R31所指向內存單元讀入指令并存入指令暫存器中,然后立即跳躍到對應的動作層去執行該指令。
如圖所示,圖中的拉桿為停機拉桿。任意時刻,若拉桿充能,則當前指令執行完畢后,整機便停止運行,機器停止時,左邊的指示燈會閃爍一次。
在拉桿充能的情況下,按下取指令動作的按鈕,則機器將完成取指和執行兩個動作后停止運行。此方法可適用于程序單步執行。
若按下其它各層動作指令按鈕,則將按各層方式解析當前指令并執行。每條指令只可以對應一個動作層,若啟動的動作層與當前指令不匹配,則結果將不可預知。
屏幕面前地板上的按鍵連接至寄存器 R30上,軟件需輪詢 R30以完成按鍵輸入,無按鍵中斷功能。