Z80-MBCのI/Oで遊んでみた(MCP23017と82C55)

Z80-MBCのI/Oで遊んでみる前に、I/Oマップを確認して空きアドレスを確認する。
ソースファイル(S221116_R100218_Z80.ino)を眺めてATMEGA32A上にあるI/Oマップを書き起こしてみた。

IOadd WRITE READ
0x00 USER LED USER KEY
0x01 SERIAL TX SERIAL RX
0x02 READ BOOT PHASE 2 PAYLOAD
0x03 GPIOA write GPIOA read
0x04 GPIOB write GPIOB read
0x05 IODIRA write ERRDISK
0x06 IODIRB write READSECT
0x07 GPPUA write SYSFLAGS
0x08 GPPUB write DATETIME
0x09 SELDISK
0x0a SELTRACK
0x0b SELSECT
0x0c WRITESECT

0x0cまで使われているので、それ以降のI/Oは自由に使えそうだ。

まずはMCP23017で遊んでみる。

Aポートは入力で、Bポートは出力として、CP/MのMBASICでプログラムを組んでみる。
ついでに日時の表示も行ってみた。

 
10 PRINT "I/O test"
20 SECONDS = INP(7)
30 SECONDS = INP(8)
40 MINUTES = INP(8)
50 HOURS = INP(8)
60 DAY = INP(8)
70 MONTH = INP(8)
80 YEAR = INP(8)
90 PRINT "THE TIME IS: ";HOURS;":";MINUTES;":";SECONDS
100 PRINT "THE DATE IS: ";DAY;"/";MONTH;"/";YEAR
110 PRINT
120 PRINT "Port A is input"
130 PRINT "Port B is output"
140 PRINT "Poat A => B"
150 PRINT "Port A = 0xFF is end"
160 OUT 5,255
170 OUT 6,0
180 OUT 7,0
190 OUT 8,0
200 PA = INP(3)
210 OUT 4,PA
220 IF PA=255 THEN END
230 GOTO 200

次はポケコン用に作った82C55ボードをつないでみる。
まずは、Z80から直で出ている信号からI/Oに必要な信号を82C55ボードをつなぐための拡張ボードを作成。

リセット信号がZ80ではLでリセットされるのに対し、ポケコンではリセット時にはHが出力されるので、トランジスタを使って信号を反転させてある。

拡張ボードを実装してみたところ。

早速82C55ボードを接続してテストしてみる。
ポートA,Bは出力に、ポートCは入力に設定。
あとはポートA,Bにデータを出力しながら、ポートCの値を読み取って表示するプログラムを組んでみる。

 
10 out &h23,&h89
20 for y=0 to 255
30  out &h21,y
40  for x=0 to 255
50   out &h20,x
60   a=inp(&h22)
70   print a
80  next
90 next


出力については問題ないが、I/Oの読み取りはできないようだ。
ソースファイル(S221116_R100218_Z80.ino)を読んでみると、I/Oの読み取りに関しては、ATMEGA32Aで使用しているI/Oアドレス外を指定した場合ATMEGA32Aから0が出力されるようになっている。


ソースファイルからどう直せばいいかある程度の見当はついているけど、果たしてうまくいくだろうか。
ATMEGA32をArduinoの環境で使うには、若干準備が必要らしいのでまずはその準備をしなければ。

カテゴリー: Z80-MBC, 電子工作 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください