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の環境で使うには、若干準備が必要らしいのでまずはその準備をしなければ。