精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>KENBAK-1個(gè)人電腦復(fù)制開(kāi)源分享

KENBAK-1個(gè)人電腦復(fù)制開(kāi)源分享

2023-06-27 | zip | 0.00 MB | 次下載 | 免費(fèi)

資料介紹

描述

背景

如果您像我一樣喜歡復(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“引擎”的安裝釘和用于布線的切口。

poYBAGNzcf2AXIUuAADxN4rXG0c574.jpg
?

頂部沒(méi)有什么特別的。請(qǐng)注意用于將前面板固定到位的頂部和底部部件中的凹槽。

poYBAGNzcgCAL_owAACq0P_GSek873.jpg
?

前面板上有用于固定按鈕、開(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)孔上打孔。面板燈凹入覆蓋層后面,因此不需要孔。

pYYBAGNzcgSAPokUAAEsspw1sFY063.jpg
?

我不能使用面板安裝按鈕和開(kāi)關(guān)附帶的螺母,因?yàn)樗鼈儾贿m合這個(gè)比例。相反,我調(diào)整了前面板上的孔的大小,以便組件可以像它們一樣從背面自螺紋擰入。LED 只是摩擦配合。

poYBAGNzcgeAZyckAADoI1Cq-0U875.jpg
?

帶有標(biāo)簽的覆蓋層將恰好適合按鈕和開(kāi)關(guān),需要一點(diǎn)技巧。

poYBAGNzcgmABgFUAADuQZ8S48M616.jpg
?

前面板適合切入頂部和底部的凹槽。

poYBAGNzcgyATqT4AAEpjOCQEI0461.jpg
?

將頂部和底部部件與開(kāi)槽的側(cè)部件連接起來(lái)。

pYYBAGNzcg-AEb_EAAEvfurcf_g047.jpg
?

這就是控制臺(tái)。

poYBAGNzchKAf-GLAAEoZBGxJoM490.jpg
?
?

連接控制臺(tái)

poYBAGNzchWAatwFAACFmHKZ_bA690.jpg
?

?

前面板燈、按鈕和開(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 以降低亮度。

poYBAGNzchiAGXxnAAJNO6yse-k797.jpg
?

我使用母頭將前面板燈和按鈕連接到擴(kuò)展器。因?yàn)轫敳靠蚣苌蠜](méi)有太多的頭部空間,而且板上公頭之間的空間有限,我不得不像下面的照片那樣調(diào)整電線的角度。

pYYBAGNzchuAZboVAAFMG3aa_3o080.jpg
?

它有點(diǎn)緊,當(dāng)我將電線焊接到接頭上時(shí),我一直在問(wèn)自己為什么沒(méi)有為前面板設(shè)計(jì) PCB。在一天結(jié)束時(shí),雖然它工作正常。

poYBAGNzch-AFX7PAAQyQAd5pLg378.jpg
?

紅色熱縮管保護(hù) LED 的“串聯(lián)”限流電阻。前面板組件接地線連接到 Raspberry Pi 接地引腳(黑線)。幾根電纜扎帶和我的 KENBAK-2/5 硬件準(zhǔn)備就緒。

關(guān)于 KENBAK-2/5 IDE

pYYBAGNzciSAYjTnAAKuuNhdhxs699.jpg
?

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)

poYBAGNzciiAMTkwAALtHZdbwVo461.jpg
?

?

如上圖所示,我添加了一個(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中。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)