用arduino模擬Z80系統的ROM/RAM
目前網上有一套4晶片的結合Z80與arduino的專案
https://hackaday.io/project/19000-a-4-4ics-z80-homemade-computer-on-breadboard/details
他的特別之處在於雖然是利用arduino來上傳程式碼到Z80的記憶體,可是他不需要控制Z80的位址匯流排而是只控制資料匯流排就可以上傳。找不到它的原理說明,猜測是所謂的上傳就是把資料一筆一筆傳送到記憶體位址,所以是個迴圈程式,所以
後來明白,他是利用這道指令
LD (HL),A
從中截斷Z80與RAM的機器週期
禁制RAM的動作讓資料匯流排釋出
arduino把資料放在資料匯流排
等Z80機器週期把資料吃進去
Arduino再放手RAM給Z80控制
Z80就會把資料接手放進RAM裡面
位址則是來自HL暫存器
所以資料放完之後
arduino要再下一道
INC HL
將HL暫存器加一
Z80微電腦製作,劉秋良,欣大出版
ABC-80
目前根據書中ABC-80的架構
有一顆8255負責IO存取
ABC-80的周邊有:
在8255
- 七段顯示器
- 6x4鍵盤
- 錄音機存取
- 喇叭與LED(同在PC7)
在CPU
- HALT指示燈
在arduino 作為Z80 周邊方面
以IO 位址0H 為存取位址
導向arduino 本身的串列埠作為終端輸出入
但是arduino對Z8來說屬於慢速周邊
因此硬體需要自動產生WAIT信號讓Z80 等待 arduino 反應
使用7400 NAND 組成的RS 正反器
IORQ與A7 OR 的信號作為正反器的RESET 信號
當Z80 程式 IN/OUT 定位到Arduino 為存取對象時
正反器產生WAIT 信號回授給Z80 插入等待週期
直到Arudino 程式反應到了
程式會產生清除正反器的信號
讓Z80 脫離WAIT 狀態
如此完成Z80與arduino 之間的周邊存取行為
遇到問題
在終端字串的輸出方面沒有問題
以正確執行圓周率計算為例子
但是在從arduino 串列埠輸入給Z80 方面就有問題
Z80的IN 指令抓不到資料
目前推測是 來自IORQ與A7 OR 起來的CS328信號與RD 信號之間有時間差
導致沒有攔截到
arduino做z80周邊所遇到的問題,已解決
其一,主要是IO週期之後,在wait條件還沒有解除之前,以單步方式帶z80走完緊接在IO指令之後的指令的擷取週期,這樣就可以讓z80脫離wait條件(IORQ以及位址命中)
其二,是simple-monitor.z80裡面有錯,他的換行字元比對值設定錯誤,導致程式無法進入執行階段(結果是我自己寫錯的😂