資料介紹
描述
背景
如果您像我一樣喜歡復(fù)古電腦,那么您很有可能會(huì)在很多場(chǎng)合看到 KENBAK-1,它被許多人視為第一臺(tái)商用個(gè)人電腦。十年前,Mark Wilson 推出了KENBAK-uino ,這是一個(gè)在 ATmega328 上模擬運(yùn)行的復(fù)制品。2016 年,Brian Benchoff發(fā)表了一篇關(guān)于John Blankenbaker KENBAK-1 創(chuàng)造者的精彩文章。對(duì)于 KENBAK-1 故事的第一手資料,您真的應(yīng)該看看 John Blakenbaker 自己的KENBAK-1 計(jì)算機(jī)網(wǎng)站。
有一段時(shí)間你可以購(gòu)買(mǎi)一個(gè)全尺寸的 KENBAK-1 復(fù)制套件,帶有 PCB、電源、正宗金屬外殼、132 個(gè)標(biāo)準(zhǔn)系列 TTL 邏輯 IC 作為 CPU/過(guò)程控制邏輯(沒(méi)錯(cuò),沒(méi)有微處理器)和兩個(gè) 1024 位移內(nèi)存寄存器。不幸的是,此選項(xiàng)不再可用,但根據(jù) Mark Wilson 的代碼,Adwater & Stir提供了尺子大小的nanoKENBAK-1 、半尺寸μKENBAK-1 套件,并且很快還將提供全尺寸套件。此外,您還可以在網(wǎng)上找到像這樣的 KENBAK-1 仿真器。
動(dòng)機(jī)
因此,有了所有這些當(dāng)之無(wú)愧的 KENBAK-1 愛(ài),我為什么還要?jiǎng)?chuàng)造另一個(gè) KENBAK-1 復(fù)制品?翻轉(zhuǎn)的答案可能是我想要并且我可以,但這還不是全部。雖然所有精彩的復(fù)制品都模仿了原版的發(fā)球臺(tái)并提供真正的 KENBAK-1 體驗(yàn),甚至還有一些附加功能,如內(nèi)置程序,但在一天結(jié)束時(shí),您仍然在許多情況下手動(dòng)翻譯機(jī)器指令并通過(guò)前面板按鈕一次一步地鍵入它們。當(dāng)出現(xiàn)問(wèn)題時(shí),雖然您可以一次單步執(zhí)行一條指令,但您在前面板顯示屏上一次只能看到一件事,即指令或內(nèi)存/寄存器地址。它變老得很快。
我認(rèn)為我可以增加一些價(jià)值的地方是將機(jī)器代碼模擬器與匯編器和調(diào)試器集成在一起。您仍然可以啟動(dòng)我的 KENBAK-2/5 控制臺(tái),通過(guò)前面板在本機(jī)模式下鍵入和運(yùn)行您的程序。此外,您將能夠打開(kāi)一個(gè)集成開(kāi)發(fā)環(huán)境,通過(guò)匯編語(yǔ)言輸入一個(gè) KENBAK-1 程序并使用實(shí)際控制臺(tái)運(yùn)行該程序。同樣,您將能夠單步調(diào)試您的匯編代碼,設(shè)置斷點(diǎn),并像您一樣觀察內(nèi)存和寄存器內(nèi)容。
我對(duì)這個(gè)項(xiàng)目的另一個(gè)動(dòng)機(jī)是我真的很想深入研究這臺(tái)機(jī)器。當(dāng)我查看編程參考手冊(cè)時(shí),我對(duì)機(jī)器架構(gòu)和指令集印象深刻。我的意思是用邏輯芯片構(gòu)建的機(jī)器上的間接索引尋址模式。非???。
設(shè)計(jì)注意事項(xiàng)
控制臺(tái)本身將以 2:5 的比例渲染(因此命名為 KENBAK-2/5)。這主要是為了讓所有部件都能安裝到我的 Prusa MK3S 的打印床上。內(nèi)置的 Raspberry Pi 4 將通過(guò) 32 通道端口擴(kuò)展器連接到前面板。除了運(yùn)行 KENBAK-1 仿真器外,還需要額外的 Pi 馬力來(lái)運(yùn)行“集成開(kāi)發(fā)環(huán)境”(IDE)。可以通過(guò)將顯示器、鍵盤(pán)和鼠標(biāo)連接到控制臺(tái)的 Pi 4 本身或通過(guò) VNC(首選)來(lái)訪問(wèn) IDE。模擬器、匯編器和調(diào)試器將用 Python 編寫(xiě)。
補(bǔ)給品:
除了 3D 打印部件之外,您還需要以下物品:
- 1樹(shù)莓派 4
- 1 MCP23017 32 通道 I/O 擴(kuò)展帽(https://www.buyapi.ca/product/mcp23017-hat-32-channel-io-expansion-hat/ )
- 12 個(gè)3mm LED(8 個(gè)白色和 4 個(gè)黃色)
- 2 個(gè)撥動(dòng)開(kāi)關(guān)(KINYOOO SPDT 迷你撥動(dòng)開(kāi)關(guān),開(kāi)/開(kāi) 3 針 2 位 - 亞馬遜)
- 15 個(gè)按鈕開(kāi)關(guān)(迷你 7 毫米瞬時(shí)(關(guān)-開(kāi))按鈕 - 亞馬遜 - 8 個(gè)黑色和 7 個(gè)白色)
- 接上電線。我用的是 22 AWG。
- 間距為 2.54 毫米的母頭。
打印零件
我打印了沒(méi)有支撐的零件和以下設(shè)置(除非另有說(shuō)明):
打印分辨率:0.2 毫米
填充:20%
燈絲:AMZ3D PLA 顏色:我使用了灰色和湖藍(lán)色來(lái)與原版保持一致。你的來(lái)電。
注意:以默認(rèn)方向打印零件。
要制作 KENBAK-2/5,您需要打印以下部件:
- 1 - 身體底部
- 1 - 身體頂部
- 1 - 前面板
- 2 - 側(cè)夾
組裝控制臺(tái)
KENBAL-2/5 控制臺(tái)具有 3D 打印框架并使用面板安裝組件。在原始大小的 40% 時(shí),必須做出一些妥協(xié)。一方面,John Blankenbaker 機(jī)器前面板上出色的鍵盤(pán)式按鈕被證明是無(wú)法復(fù)制的。事實(shí)上,按鈕位置必須在我的復(fù)制品上水平拉伸一點(diǎn),以適應(yīng)我確實(shí)找到的小面板安裝按鈕。同樣,面板燈也沒(méi)有漂亮的插座,只有后部安裝的 3 毫米 LED。
小尺寸的優(yōu)點(diǎn)是這些部件可以安裝在相當(dāng)多的 3D 打印機(jī)上。據(jù)我所知,表殼的形狀與原版非常接近。它分五個(gè)部分打印。底部有用于該項(xiàng)目的 Raspberry Pi“引擎”的安裝釘和用于布線的切口。
頂部沒(méi)有什么特別的。請(qǐng)注意用于將前面板固定到位的頂部和底部部件中的凹槽。
前面板上有用于固定按鈕、開(kāi)關(guān)和燈的孔。由于復(fù)制品的尺寸很小,我無(wú)法像過(guò)去在其他項(xiàng)目中那樣直接在面板上 3D 打印標(biāo)簽。相反,我保存了一個(gè) DXF 文件,其中包含來(lái)自我的 Fusion 360 模型的面板輪廓和孔位置,并將其帶到我添加標(biāo)簽的 Inkscape 中。我將生成的 SVG 文件打印到透明的醋酸纖維板上,我將其層壓以保護(hù)印刷并增加覆蓋層的硬度。我沿著輪廓切出覆蓋層,并用標(biāo)準(zhǔn)的手持 1/4" 紙打孔器在按鈕和開(kāi)關(guān)孔上打孔。面板燈凹入覆蓋層后面,因此不需要孔。
我不能使用面板安裝按鈕和開(kāi)關(guān)附帶的螺母,因?yàn)樗鼈儾贿m合這個(gè)比例。相反,我調(diào)整了前面板上的孔的大小,以便組件可以像它們一樣從背面自螺紋擰入。LED 只是摩擦配合。
帶有標(biāo)簽的覆蓋層將恰好適合按鈕和開(kāi)關(guān),需要一點(diǎn)技巧。
前面板適合切入頂部和底部的凹槽。
將頂部和底部部件與開(kāi)槽的側(cè)部件連接起來(lái)。
這就是控制臺(tái)。
連接控制臺(tái)
?
前面板燈、按鈕和開(kāi)關(guān)通過(guò)上圖所示的端口擴(kuò)展器連接到 Raspberry Pi。端口擴(kuò)展器帶有支架,因此我使用 Raspberry Pi 上的兩個(gè)對(duì)角角孔將其安裝到底部框架上,并使用支架對(duì)面的兩個(gè)角孔來(lái)支撐帽子。看起來(lái)相當(dāng)扎實(shí)。
接線如下,引腳編號(hào)映射到前面板組件:
IC1
1 - 停車(chē)燈
2 - 儲(chǔ)存燈
3 - 設(shè)置燈
4 - 清除燈
5 - 關(guān)閉
6 - 開(kāi)啟
7 - 切換解鎖
8 - 切換鎖定
9 - 數(shù)據(jù)燈 0
10 - 數(shù)據(jù)燈 1
11 - 數(shù)據(jù)燈 2
12 - 數(shù)據(jù)燈 3
13 - 數(shù)據(jù)燈 4
14 - 數(shù)據(jù)燈 5
15 - 數(shù)據(jù)燈 6
16 - 數(shù)據(jù)燈 7
IC2
1 - 停止按鈕
2 - 啟動(dòng)按鈕
3 - 存儲(chǔ)按鈕
4 - 讀取按鈕
5 - 設(shè)置按鈕
6 - 顯示按鈕
7 - 清除按鈕
8 - 不適用
9 - 數(shù)據(jù)按鈕 0
10 - 數(shù)據(jù)按鈕 1
11 - 數(shù)據(jù)按鈕 2
12 -數(shù)據(jù)按鈕 3
13 - 數(shù)據(jù)按鈕 4
14 - 數(shù)據(jù)按鈕 5
15 - 數(shù)據(jù)按鈕 6
16 - 數(shù)據(jù)按鈕 7
在下面的照片中,我大約完成了一半。接地線已連接到所有前面板組件,十五個(gè)按鈕已連接到帽子,十二個(gè) LED 有一根短線,連接了一個(gè)限流電阻。電阻為 10k 以降低亮度。
我使用母頭將前面板燈和按鈕連接到擴(kuò)展器。因?yàn)轫敳靠蚣苌蠜](méi)有太多的頭部空間,而且板上公頭之間的空間有限,我不得不像下面的照片那樣調(diào)整電線的角度。
它有點(diǎn)緊,當(dāng)我將電線焊接到接頭上時(shí),我一直在問(wèn)自己為什么沒(méi)有為前面板設(shè)計(jì) PCB。在一天結(jié)束時(shí),雖然它工作正常。
紅色熱縮管保護(hù) LED 的“串聯(lián)”限流電阻。前面板組件接地線連接到 Raspberry Pi 接地引腳(黑線)。幾根電纜扎帶和我的 KENBAK-2/5 硬件準(zhǔn)備就緒。
關(guān)于 KENBAK-2/5 IDE
IDE 用 Python 編寫(xiě),在 KENBAK-2/5 硬件核心的 Raspberry Pi 上運(yùn)行。它由四個(gè)主要部分組成:
- 控制臺(tái)- 允許 Raspberry Pi 通過(guò)端口擴(kuò)展器與前面板開(kāi)關(guān)、按鈕和燈進(jìn)行交互。
- 仿真器- 在軟件中模擬組成原始KENBAK -1 硬件的 134 個(gè)集成電路的操作。它接受一個(gè) 256 字節(jié)數(shù)組作為輸入,該數(shù)組表示 KENBAK-1 中的整個(gè)內(nèi)存塊,并執(zhí)行編碼到這些字節(jié)中的指令,直到遇到 HALT 指令或用戶按下停止按鈕。
- Assembler - 采用 KENBAK-1 指令的符號(hào)表示,如Programming Reference Manual的 Symbolic Representation of Instructions 部分中所定義,并將它們轉(zhuǎn)換為可由模擬器執(zhí)行的機(jī)器代碼(或原始 KENBAK-1,如果您是有幸接觸到一個(gè))。
- 調(diào)試器- 允許用戶在他們的代碼中設(shè)置斷點(diǎn),該斷點(diǎn)將在該點(diǎn)停止執(zhí)行,以便可以查看機(jī)器內(nèi)存和寄存器。
查看上圖,您可以看到我剛剛加載了一個(gè)用 KENBAK-1 匯編語(yǔ)言編寫(xiě)的斐波那契數(shù)列計(jì)算器程序。右上象限當(dāng)然是匯編代碼,左邊是等效的二進(jìn)制指令。通過(guò)單擊二進(jìn)制指令,您可以設(shè)置或清除斷點(diǎn)(例如,skp 指令設(shè)置了斷點(diǎn))。
左下方是預(yù)定義“寄存器”的狀態(tài),包括用于加載和讀取內(nèi)存位置的地址寄存器。在 KENBAK-1 架構(gòu)中,寄存器只是預(yù)定義的內(nèi)存位置。以下是 KENBAK-1 中九個(gè)特殊內(nèi)存位置的值(地址為十進(jìn)制):
Name Address Usage
~~~~ ~~~~~~~ ~~~~~
A 000 A register.
B 001 B register.
X 002 X register.
PC 003 Program counter.
OUTPUT 128 Maps to front panel data display lamps.
OCA 129 Overflow/Carry bits for A register.
OCB 130 Overflow/Carry bits for B register.
OCX 131 Overflow/Carry bits for C register.
INPUT 255 Maps to the front panel data input button
中間底部是所有 256 個(gè)內(nèi)存位置的十六進(jìn)制轉(zhuǎn)儲(chǔ),右下角更詳細(xì)地顯示了相同的內(nèi)存位置,每個(gè)位置用十六進(jìn)制、十進(jìn)制、八進(jìn)制和二進(jìn)制表示。所有對(duì)內(nèi)存位置的引用都是十進(jìn)制的(指令、十六進(jìn)制轉(zhuǎn)儲(chǔ)和詳細(xì)信息面板中的最左邊的列以及指令面板中的最右邊的列)。
以綠色呈現(xiàn)的條目表示程序計(jì)數(shù)器 (PC) 當(dāng)前指向的內(nèi)存位置。
前面板控制臺(tái)與 IDE 完全集成。因此,例如,您可以通過(guò)按下控制臺(tái)上的物理 START 按鈕或單擊 IDE 中的 Run 按鈕來(lái)啟動(dòng)上面顯示的 Fibonacci 程序。類似地,按住 STOP 按鈕,然后按 START 將執(zhí)行一個(gè)步驟,IDE 的 Step 按鈕也是如此。
任何寫(xiě)入 OUTPUT 寄存器的內(nèi)容都會(huì)顯示在控制臺(tái)的數(shù)據(jù)燈上。通過(guò)地址寄存器從控制臺(tái)存儲(chǔ)到內(nèi)存位置的數(shù)據(jù)將反映在 IDE 中。
IDE 確實(shí)提供了一些附加功能。您的程序可以保存并加載到磁盤(pán)(匯編代碼和二進(jìn)制內(nèi)存映像)。重新啟動(dòng)按鈕會(huì)將所有內(nèi)容重置為上次加載的圖像。Clear 會(huì)將內(nèi)存和匯編程序空間清零,然后將 PC 設(shè)置為內(nèi)存位置 4。 Auto 將以大約每秒一條指令的速度運(yùn)行程序。
您可以通過(guò)單步調(diào)試或設(shè)置斷點(diǎn)并觀察內(nèi)存和寄存器來(lái)調(diào)試程序。
如果您只想使用 KENBAK-1 代碼,您可以在任何支持 Python 的平臺(tái)上“獨(dú)立”運(yùn)行 IDE,但當(dāng)然您只能將 KENBAK-2/5 控制臺(tái)集成到 Raspberry Pi 上,因?yàn)樗壎ǖ絯iringpi庫(kù)。
安裝軟件
KENBAK-IDE.py 文件可從我的GitHub 存儲(chǔ)庫(kù)中獲得。如果在 KENBAK-2/5 硬件環(huán)境之外使用,它應(yīng)該可以在任何支持 Python3 且不依賴任何庫(kù)的機(jī)器上運(yùn)行。在這種模式下,您仍然可以編寫(xiě)、調(diào)試和運(yùn)行 KENBAK-1 匯編語(yǔ)言程序。這本身就是一個(gè)很棒的學(xué)習(xí)環(huán)境。
如果您在帶有端口擴(kuò)展帽的 KENBAK-2/5 的 Raspberry Pi 上運(yùn)行,您必須首先確保安裝了 Wiringpi 庫(kù)。
pip3 install wiringpi
我在 Pi 上創(chuàng)建了一個(gè)文件夾
mkdir /home/pi/KENBAK-1
并在那里復(fù)制了 KENBAK-IDE.py、Assembler Syntax.txt、Fibonacci.asm 和 Fibonacci.bin 文件。然后是運(yùn)行 Python 腳本的簡(jiǎn)單問(wèn)題。
cd /home/pi/KENBAK-1
python3 KENBAK-IDE.py
自動(dòng)啟動(dòng) KENBAK-2/5 IDE
如果您像我一樣在內(nèi)置 Raspberry Pi 上將 KENBAK-1 IDE 作為專用控制臺(tái)運(yùn)行,那么在機(jī)器啟動(dòng)時(shí)讓程序自動(dòng)啟動(dòng)會(huì)很方便。這是我為實(shí)現(xiàn)這一目標(biāo)所做的。
我在我的 Pi 上創(chuàng)建了一個(gè)自動(dòng)啟動(dòng)文件夾并切換到該文件夾??。
mkdir /home/pi/.config/autostart
cd /home/pi/.config/autostart
在剛剛創(chuàng)建的自動(dòng)啟動(dòng)文件夾中,我添加了以下兩個(gè)文件。
運(yùn)行KENBAK-1
cd /home/pi/KENBAK-1
/usr/bin/python3 KENBAK-IDE.py
KENBAK-1.desktop
[Desktop Entry]
Type=Application Name=KENBAK-1
Exec=/home/pi/.config/autostart/runKENBAK-1
此外,必須使用以下命令使 runKENBAK-1 文件可執(zhí)行:
chmod 777 runKENBAK-1
現(xiàn)在,如果您重新啟動(dòng)系統(tǒng),您應(yīng)該會(huì)短暫看到桌面出現(xiàn),并且在 KENBAK-IDE 應(yīng)用程序加載后不久。
設(shè)置 VNC
當(dāng)前的 Raspberry Pi OS 版本已嵌入 RealVNC。如果您像我一樣在 KENBAK-2/5 控制臺(tái)中運(yùn)行 Raspberry Pi,那么您必須設(shè)置一個(gè)虛擬桌面以供 VNC 客戶端連接。我發(fā)現(xiàn)執(zhí)行此操作的最簡(jiǎn)單方法是將以下行添加到/etc/rc.local文件的末尾,在 Pi 上的exit 0之前。
# Setup a virtual screen for the VNC server.
sudo -u pi vncserver -randr=1920x1080
將屏幕尺寸設(shè)置為與您將訪問(wèn) KENBAK-IDE 的機(jī)器相同。然后,您應(yīng)該能夠在控制臺(tái)機(jī)器的 IP 地址上使用 RealVNC 客戶端連接到 KENBAK-2/5,并附加:1 ,例如在我的情況下192.168.123.122:1 。
整理起來(lái)
?
如上圖所示,我添加了一個(gè)幫助按鈕來(lái)彈出一些關(guān)于匯編語(yǔ)言語(yǔ)法的信息。與原版一樣,您只需使用控制臺(tái)前面板上的開(kāi)關(guān)、按鈕和指示燈即可輸入和運(yùn)行程序,并查看內(nèi)部機(jī)器內(nèi)存。當(dāng)您鍵入時(shí),匯編程序指令會(huì)不斷被解析,當(dāng)相應(yīng)的二進(jìn)制代碼不再有任何問(wèn)號(hào)時(shí),您就知道該行的語(yǔ)法是正確的。它似乎工作得很好。
有了斷點(diǎn)、單步模式和內(nèi)存可視化,調(diào)試突然變得容易多了。
當(dāng)我第一次查看 KENBAK-1 編程參考手冊(cè)時(shí),我對(duì)沒(méi)有微處理器、只有離散邏輯芯片的機(jī)器的指令集印象深刻。實(shí)現(xiàn)一個(gè)匯編器和仿真器只會(huì)加深我對(duì) John Blankenbaker 所創(chuàng)造的東西的欣賞。這在當(dāng)時(shí)是一項(xiàng)相當(dāng)大的成就,約翰·布蘭肯貝克(John Blankenbaker)作為早期個(gè)人計(jì)算機(jī)先驅(qū)者,在歷史上應(yīng)該占有一席之地。
還有一件事
1971 年,當(dāng) John Blankenbaker 展示他的 KENBAK-1 個(gè)人計(jì)算機(jī)時(shí),他總是展示的程序之一是星期計(jì)算器。給定任何日期,它可以告訴您該日期是一周中的哪一天。這是一件很酷的事情,每個(gè)人都可以產(chǎn)生共鳴。
嗯,我不覺(jué)得我的 KENBAK-2/5 復(fù)制品會(huì)很完整,直到它可以做到這一點(diǎn)。這是一個(gè)有趣的編程挑戰(zhàn),它鍛煉了我機(jī)器的更多功能,實(shí)際上發(fā)現(xiàn)了我的模擬器軟件的一些小問(wèn)題:
- JMK 操作數(shù)未正確保存返回地址
- 推進(jìn)程序計(jì)數(shù)器 (PC) 所需的 HALT 操作數(shù)
- 我調(diào)整了一些控制臺(tái)交互。
- 我添加了一個(gè) DB 指令來(lái)保留一個(gè)字節(jié)的內(nèi)存。
我現(xiàn)在更有信心,因?yàn)槲业膹?fù)制品與原作非常接近。這是代碼:
; Program to calculate the day of the week for any date. To start this program you will
; have to input the date in four parts: Century, Year, Month, and Day. Each of the parts
; is entered as a two digit Binary Coded Decimal number (ie. the first digit will occupy
; bits 7-4 as a binary number, and the second digit bits 3-0) using the front panel data
; buttons. The steps to run this program are:
;
; 1) Set the PC register (at address 3) to 4.
; 2) Clear the input data then enter the date Century.
; 3) Press Start.
; 4) Clear the input data then enter the date Year.
; 5) Press Start.
; 6) Clear the input data then enter the date Month.
; 7) Press Start.
; 8) Clear the input data then enter the date Day.
; 9) Press Start.
;
; The day of the week will be returned via the data lamps using the following encoding:
;
; 7-Sunday 6-Monday 5-Tuesday 4-Wednesday 3-Thursday 2-Friday 1-Saturday
;
; All lamps turned on means the last item entered was invalid and you have to restart.
;
;
; Get the date we want the day for.
;
load A,INPUT ; Get the century.
jmk bcd2bin
store A,century
halt
load A,INPUT ; Get the year.
jmk bcd2bin
store A,year
halt
load A,INPUT ; Get the month.
jmk bcd2bin
sub A,1 ; Convert from 1 based to 0 based.
store A,month
halt
load A,INPUT ; Get the day.
jmk bcd2bin
store A,day
load A,0b10000000 ; Setup the rotation pattern.
store A,rotate
;
; All the inputs should be in place. Start the conversion.
;
load A,year ; Get the year.
sft A,R,2 ; Divide by 4.
store A,B ; Save to B the working result.
add B,day ; Add the day of the month.
load X,month ; Use X as index into the month keys.
add B,monkeys+X ; Add the month key.
jmk leapyr ; Returns a leap year offset in A if applicable.
jmk working ; Working...
sub B,A ; Subtract the leap year offset.
jmk cencode ; Returns a century code in A if applicable.
jmk working ; Working...
add B,A ; Add the century code.
add B,Year ; Add the year input to the working result.
chkrem load A,B ; Find the remainder when B is divided by 7.
and A,0b11111000 ; Is B > 7?
jmp A,EQ,isseven ; No then B is 7 or less.
sub B,7 ; Yes then reduce B by 7.
jmk working ; Working...
jmp chkrem ; Check again for remainder.
isseven load A,B ; Is B = 7?
sub A,7 ; Subtract 7 from B value.
jmp A,LT,gotday ; No B is less than 7.
load B,0 ; Set B to zero because evenly divisible.
gotday load X,B ; B holds the resulting day number. Use as index.
load A,sat+X ; Convert to a day lamp.
store A,OUTPUT
halt
error load A,0xff ; Exit with error
store A,OUTPUT ; All lamps lit.
halt
;
; Store inputs.
;
century db
year db
month db
day db
;
; Static table to hold month keys.
;
monkeys 1
4
4
0
2
5
0
3
6
1
4
6
;
; Need to preserve A while performing some steps.
;
saveA db
;
; Subroutine to blink the lamps to indicate working.
;
rotate db ; Pattern to rotate.
working db ; Save space for return adderess.
store A,saveA ; Remember the value in A.
load A,rotate ; Get the rotate pattern.
store A,OUTPUT ; Show the rotated pattern.
rot A,R,1 ; Rotate the pattern.
store A,rotate ; Save the new rotation.
load A,saveA ; Restore the value of A.
jmp (working) ; Return to caller.
org 133 ; Skip over registers.
;
; Subroutine takes a BCD nuber in A as input and returns the equivalent binary number
; also in A.
;
bcd2bin db ; Save space for return address.
store A,X ; Save A.
sft A,R,4 ; Get the 10's digit.
jmk chkdig ; Make sure digit is 0 - 9.
store A,B ; B will hold the 10's digit x 10 result
add B,B ; B now X 2
sft A,L,3 ; A is now 10's digit X 8
add B,A ; B now 10's digit X 10
store X,A ; Retrieve original value of A
and A,0b00001111 ; Get the 1's digit value in binary.
jmk chkdig ; Make sure digit is 0 - 9.
add A,B ; Add the 10's digit value in binary.
jmp (bcd2bin) ; A now has the converted BCD value.
;
; Subroutine determines if the date is a leap year in January or February and returns
; an offset of 1 if it is, and 0 otherwise.
;
leapyr db ; Save space for return address.
load A,month ; Check to see if month is January or February.
and A,0b11111110 ; Are any bits other than bit 0 set?
jmp A,NE,notlpyr ; Yes then not January or February. Return 0.
load A,year ; Is this an even century?
jmp A,NE,chkyear ; No then have to check the year.
load A,century ; Yes so see if century evenly divisible by 4.
and A,0b00000011 ; Are bits 1 or 0 set?
jmp A,EQ,islpyr ; Yes evenly divisible by 4 and is a leap year.
jmp notlpyr ; No this is not a leap year.
chkyear load A,year ; See if rear evenly divisible by 4.
and A,0b00000011 ; Are bits 1 or 0 set?
jmp A,NE,notlpyr ; Yes so not evenly divisible by 4 and not a leap year.
islpyr load A,1 ; Offset 1.
jmp (leapyr) ; Return offset.
notlpyr load A,0 ; Offset 0.
jmp (leapyr) ; Return offset.
;
; Subroutine determines if a century code needs to be applied to the calculation.
;
cencode db ; Save space for return address.
load A,century ; Century must be between 17 - 20.
chkmin sub A,17 ; Is century less than 17?
jmp A,GE,chkmax ; Yes so century >= 17. Check max boundry.
load A,century ; Increase century by 4.
add A,4
store A,century
jmp chkmin
chkmax load A,century ; Century must be between 17 - 20.
sub A,20 ; Is century greater than 20?
jmp A,LT,retcode ; No so calculate century code.
jmp A,EQ,retcode
load A,century ; Decrease century by 4.
sub A,4
store A,century
jmp chkmax+2
retcode load X,century ; Calculate the century code
sub X,17 ; Create an index into the century codes.
load A,ctcodes+X ; Get the appropriate century code.
jmp (cencode) ; Return century code.
;
; Subroutine that checks if the digit passed in A is in range 0 - 9.
;
chkdig db ; Save space for return adderess.
store A,saveA ; Remember value in A.
load A,9
sub A,saveA ; Subtract value passed from 9.
and A,0b10000000 ; Is negative bit set?
jmp A,NE,error ; Yes so value in A not in range 0 - 9.
load A,saveA ; No so A value in range.
jmp (chkdig) ; Return to caller.
;
; Static table to hold the output pattern for the day of the week.
;
sat 0b00000010
sun 0b10000000
mon 0b01000000
tues 0b00100000
wed 0b00010000
thur 0b00001000
fri 0b00000100
;
; Static table to hold century codes.
;
ctcodes 4
2
0
6
雖然有一項(xiàng)檢查以確保 BCD 輸入僅包含數(shù)字 0-9,但由于內(nèi)存空間不足,未實(shí)施對(duì)月份 (1-12) 和日期 (1-31) 的一些額外檢查。上述程序占用了 255 字節(jié)可用內(nèi)存中的 251 字節(jié)。因此,雖然指令集對(duì)于大多數(shù)任務(wù)來(lái)說(shuō)綽綽有余,但在這臺(tái)機(jī)器上做有趣事情的限制因素是內(nèi)存。
更新后的 IDE 和此示例已添加到此項(xiàng)目的GitHub中。
- 終極電腦旋轉(zhuǎn)輸入開(kāi)源分享
- 消毒機(jī)器人Hanth-x1開(kāi)源分享
- Commodore 64 KU主板復(fù)制品開(kāi)源硬件
- 掃地機(jī)器人開(kāi)源資料 43次下載
- 手提電腦開(kāi)源分享
- 平板電腦開(kāi)源項(xiàng)目
- 杰華特服務(wù)器和個(gè)人電腦JWH6374 JWH7067 JWH7030 JWH7222 JW7221
- USB控制16個(gè)繼電器中1個(gè)的開(kāi)源案例
- 5合1 Arduino機(jī)器人開(kāi)源項(xiàng)目
- 嵌入式軟考——尷尬不,就一個(gè)人報(bào)名
- Apacheproxy負(fù)載均衡和Session復(fù)制
- 一個(gè)開(kāi)源的擬人機(jī)器人仿生手系統(tǒng)HRI-hand 0次下載
- 使用Python復(fù)制文件的方法有哪些 6次下載
- 如何實(shí)現(xiàn)PC機(jī)與單片機(jī)實(shí)現(xiàn)通信 49次下載
- 開(kāi)架式通用水下機(jī)器人開(kāi)源搭建手冊(cè).pdf 11次下載
- 平板電腦是什么端 平板電腦屬于pc端嗎 4272次閱讀
- 如何使用cp和rsync命令復(fù)制文件和目錄 6673次閱讀
- 一個(gè)易于構(gòu)建且成本極低的電子設(shè)備保護(hù)器電路圖 1025次閱讀
- 不輸入密碼即可登錄電腦的方法 2w次閱讀
- 分析總結(jié)網(wǎng)優(yōu)的過(guò)去及現(xiàn)狀、未來(lái)發(fā)展趨勢(shì) 2929次閱讀
- 朗銳智科Nvidia K1安卓主板介紹 2355次閱讀
- 如何用個(gè)人電腦打造量子模擬器? 4439次閱讀
- USB實(shí)現(xiàn)隔離的四種方法分析 5.9w次閱讀
- 用FPGA使當(dāng)年風(fēng)靡的Atari 2600 VCS游戲機(jī)和Apple II個(gè)人電腦再次重生 6317次閱讀
- 閃存芯片陣列+計(jì)算加速器,在個(gè)人電腦達(dá)到服務(wù)器級(jí)性能 4216次閱讀
- Web3.0-去中心化網(wǎng)絡(luò)消滅服務(wù)器:重新設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu) 6223次閱讀
- 電腦硬件基礎(chǔ)篇gpu(gpu工作原理及作用_特性參數(shù)及型號(hào)和位置) 8448次閱讀
- 圖形處理器在電腦上的哪個(gè)地方 1.5w次閱讀
- 讓機(jī)器人通過(guò)一段只有一個(gè)人的視頻來(lái)模仿學(xué)習(xí) 6024次閱讀
- 一百個(gè)人對(duì)“電源”有一百種不同的理解 887次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開(kāi)發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多