Z80 CTCとSIO用の拡張ボードの作成
はじめに
先日記事を投稿したZ80ワンボードコンピュータは、Z80 CPU、Z80 PIO、仮想ROM&RAM(PIC16F877A)だけのシンプルなアーキテクチャを取っていた。この構成は、トラブルが起きづらくプログラミングが容易になる反面、使用できる周辺LSIがPIOしかなく、Z80ファミリーの実力を引き出しきれない、という課題があった。
この課題を克服するために、Z80ファミリにラインナップされているCTC(4ch 8bit タイマー)とSIO(シリアルインターフェース)を搭載した拡張ボードを設計・制作した。本記事では、作成した拡張ボードの回路構成とその動作を紹介していきたい。
回路構成
全体のアーキテクチャ
Z80ワンボードコンピュータに接続するサブボードとして、CTC、SIO、および、それらLSIを動作させるための周辺回路を搭載した。搭載した機能は以下の通りである。
- CTC:4ch 8bit タイマー。SHARP製のLH0082Aを使用した。カウンタモードのトリガ入力(TRGx)、および、ゼロカウント出力(ZCx)出力はコネクタでボード外に引き出せるようにしている。
- SIO:シリアル入出力ポート。SHARP製のLH0084A(SIO/0)を使用した。SIOにはAポートとBポートの2個のチャネルがあるが、本ボードではAポートのみを使用した。TX/RX、および、RTS/CTS信号を出せるようにしており、PCのシリアルポートに接続できるようになっている。
- レベル変換回路:SIOとPCを接続するために、RS-232C規格に準じた信号レベルに変換する回路。MAX232を用いたチャージポンプにより実現している。
- ボーレートクロック:SIOのボーレートクロックを生成する回路。74HC4060と4.9152MHzの水晶発振子を使用し、300Hz~30.72kHzまで出力できる。
- アドレスデコーダ:アドレスバスのA5-A7(3bit)から、8種類のCE信号を生成する回路。CTCとSIOへのCE信号もこの回路から生成される。
これらの機能を、なるべく汎用性を損なわないように搭載し、以下のようなアーキテクチャに決定した。
回路図・PCBパターン
また、PCBパターンは以下のようにした。回路図の回路に加え、空き領域に2.54mmピッチのユニバーサル基板領域を仕込み、簡単な拡張や回路修正ができるようにしている。
制作した基板
使用実験
作成したサブボードをメインボードに接続し、CTC、および、SIOを動かすプログラムを動かすことに成功した。以下では、作成したサブボードを用いて動かしたプログラムと実行結果を簡単に紹介する。
CTCを用いたLチカ
CTCのタイマーモードを用いて一定間隔で割り込みを発生させ、割り込み時にLEDの点灯/消灯を切り替えることでLチカするプログラムを作成し実行させてみた。以下のツイートのように周期的にLチカができた。
CTCを用いたLチカプログラム
;*** Title: CTC_test1.txt
;*** Date: 2023/10/22
;*** Author: 4558D
;Address,opecode,mnemonic
PIOAD1 EQU 00H
PIOAC1 EQU 01H
PIOBD1 EQU 02H
PIOBC1 EQU 03H
CTC0 EQU 80H
CTC1 EQU 81H
CTC2 EQU 82H
CTC3 EQU 83H
;***** 初期設定 *****
0000 313001 LD SP, 0130H ; スタッカポインタのアドレスを指定(RAMアドレスの終端を指定)
0003 3e00 LD A, 0 ; Iレジスタに転送するデータをAレジスタに転送 (LD I,n がないため)
0005 ed47 LD I, A ; 割り込みアドレス上位8bit = 00
;***** PIO A portの設定 *****
0007 215000 LD HL, INTPA ; HLレジスタにOTIRの開始レジスタを書き込み
000a 0603 LD B, 3 ; OTIRの繰り返し回数を指定
000c 0e01 LD C, PIOAC1 ; OTIRの書き込み先にPAの制御レジスタを設定
000e edb3 OTIR ; PAのモード書き込み (モード3, 全出力)
;***** PIO B portの設定 *****
0010 215300 LD HL, INTPB ; HLレジスタにOTIRの開始レジスタを書き込み
0013 0605 LD B, 5 ; OTIRの繰り返し回数を指定
0015 0e03 LD C, PIOBC1 ; OTIRの書き込み先にPBの制御レジスタを設定
0017 edb3 OTIR ; PBのモード書き込み (モード3, 全出力)
;***** CTC0の設定
0019 215800 LD HL, INTCTC ; HLレジスタにOTIRの開始レジスタを書き込み
001c 0603 LD B, 3 ; OTIRの繰り返し回数を指定
001e 0e80 LD C, CTC0 ; OTIRの書き込み先にPBの制御レジスタを設定
0020 edb3 OTIR ; CTC0の設定
;***** 割り込み許可 *****
0022 ed56 IM 1 ; 割り込みモードを1に設定する。
0024 fb EI ; 割り込み許可
;***** 割り込み待ちループ *****
0025 3e0f LD A, FFH
0027 d300 OUT (PIOAD1),A ; LEDをすべて点灯
0029 c32900 INTWT JP INTWT ; 割り込み待ち (その場でジャンプ)
;***** 割り込み処理(モード1) *****
ORG 0036H
0036 3800 DEFW PBINT ; PIO B 割り込みの開始アドレスを指定
0038 eeff PBINT XOR FFH ; Aレジスタ反転
003a d300 OUT (PIOAD1),A ; LEDの点灯反転
003c fb EI
003d ed4d RETI ;
;***** PIO・CTC設定 *****
0050 cf INTPA DEFB 0CFH ; PIO A port: Mode 3
0051 00 DEFB 00H ; PIO A port: All Output
0052 07 DEFB 07H ; PIO A port: No Interrupt
0053 36 INTPB DEFB 36H ; PIO B port: INT Vector = 59H
0054 cf DEFB 0CFH ; PIO B port: Mode 3
0055 ff DEFB FFH ; PIO B port: All Input
0056 97 DEFB 97H ; PIO B port: INT Enable, Trigger=OR, Mask=1
0057 00 DEFB 00H ; PIO B port: No Mask
0058 85 INTCTC DEFB 84H ; CTC: タイマーモード、プリスケーラ1:16、時間定数書き込み後起動
0059 19 DEFB 19H ; CTC: 時間定数25(=19H)
005a 70 DEFB 70H ; CTC: 割り込みベクトル70H
;***** ノンマスカラブルインタラプト
ORG 0066H
0066 3e03 LD A, 03H
0068 d300 OUT (PIOAD1),A
006a 76 HALT
;***** CTC割り込み開始アドレス *****
0070 38 DEFB 36H
SIOを用いた文字列送信
SIOを用いて、PCのシリアルポートに"Hello, World!"を送り続けるプログラムを作成し実行してみた。システムクロックを25kHz、ボーレートを4800bpsにすることで、以下のツイートの1枚目の動画のようにPCの端末(TeraTerm)に"Hello, World!"を送ることができた。
SIOを用いて"Hello,World"を送信するプログラム
;*** Title: SIO_test2.txt
;*** Date: 2023/11/24
;*** Author: 4558D
;Address,opecode,mnemonic
PIOAD1 EQU 00H
PIOAC1 EQU 01H
PIOBD1 EQU 02H
PIOBC1 EQU 03H
CTC0 EQU 80H
CTC1 EQU 81H
CTC2 EQU 82H
CTC3 EQU 83H
SIOAD EQU 90H
SIOAC EQU 91H
;***** 初期設定 *****
0000 313001 LD SP, 0130H ; スタッカポインタのアドレスを指定(RAMアドレスの終端を指定)
0003 3e00 LD A, 0 ; Iレジスタに転送するデータをAレジスタに転送 (LD I,n がないため)
0005 ed47 LD I, A ; 割り込みアドレス上位8bit = 00
;***** PIO A portの設定 *****
0007 217000 LD HL, INTPA ; HLレジスタにOTIRの開始レジスタを書き込み
000a 0603 LD B, 3 ; OTIRの繰り返し回数を指定
000c 0e01 LD C, PIOAC1 ; OTIRの書き込み先にPAの制御レジスタを設定
000e edb3 OTIR ; PAのモード書き込み (モード3, 全出力)
;***** PIO B portの設定 *****
0010 217300 LD HL, INTPB ; HLレジスタにOTIRの開始レジスタを書き込み
0013 0603 LD B, 3 ; OTIRの繰り返し回数を指定
0015 0e03 LD C, PIOBC1 ; OTIRの書き込み先にPBの制御レジスタを設定
0017 edb3 OTIR ; PBのモード書き込み (モード3, 全出力)
;***** SIO A portの設定 *****
0019 217600 LD HL, SIOAST ; HLレジスタにOTIRの開始レジスタを書き込み
001c 0609 LD B, 9 ; OTIRの繰り返し回数を指定
001e 0e91 LD C, SIOAC ; OTIRの書き込み先にPBの制御レジスタを設定
0020 edb3 OTIR ; PBのモード書き込み (モード3, 全出力)
;***** メインループ *****
0022 3eff LD A, FFH
0024 d300 OUT (PIOAD1),A ; LEDをすべて点灯
0026 0e90 LD C, (SIOAD) ; データレジスタセット
0028 218000 MLOOP LD HL, (STRG) ; 文字列のアドレスにセット
002b 160f LD D, 15 ; 送信文字数セット
002d 46 SDSTR LD B, (HL) ; Bレジスタに送信文字読み込み
002e db91 XMIT IN A, (SIOAC) ; RR0を読み込み
0030 cb57 BIT 2,A ; TXバッファがEmptyか?
0032 28fa JR Z,XMIT ; FullならEmpty判定に戻る。
0034 ed41 OUT (C), B ; データを送る
0036 23 INC HL
0037 15 DEC D
0038 c22d00 JP NZ,SDSTR
0032 c32800 JP MLOOP ; メインループの開始地点に戻る。
;***** 100サイクル待機 *****
0050 0664 WT100 LD B, 64H313 ; Bレジスタに100を格納
0052 05 LOOP DEC B ; Bレジスタをデクリメント
0053 c25200 JP NZ, LOOP ; 0になるまで戻る
0056 c9 RET ; 0になったら待機をやめる
;***** ノンマスカラブルインタラプト
ORG 0066H
0066 3e03 LD A, 03H
0068 d300 OUT (PIOAD1),A
006a 76 HALT
;***** PIO・CTC設定 *****
0070 cf INTPA DEFB 0CFH ; PIO A port: Mode 3
0071 00 DEFB 00H ; PIO A port: All Output
0072 07 DEFB 07H ; PIO A port: No Interrupt
0073 cf INTPB DEFB 0CFH ; PIO B port: Mode 3
0074 ff DEFB FFH ; PIO B port: All Input
0075 07 DEFB 07H ; PIO B port: INT Enable, Trigger=OR, Mask=1
0076 18 SIOAST DEFB 18H ; SIO A port; WR0 CH-Aリセット
0077 01 DEFB 01H ; SIO A port; WR0 次書き込みをWR1に指定
0078 00 DEFB 00H ; SIO A port; WR1 割り込みなし
0079 03 DEFB 03H ; SIO A port; WR0 次書き込みをWR3に指定
007a c1 DEFB c1H ; SIO A port; WR3 受信設定, 8bit
007b 04 DEFB 04H ; SIO A port; WR0 次書き込みをWR4に指定
007c 04 DEFB 04H ; SIO A port; WR4 *1 STP=1, Parity None (300~4800bps)
007d 05 DEFB 05H ; SIO A port; WR0 次書き込みをWR5に指定
007e ea DEFB EAH ; SIO A port; WR5 送信設定, 8bit, DTR on
;***** 送信文字リスト (15文字)
0080 48 STRG DEFB 'H'
0081 65 DEFB 'e'
0082 6c DEFB 'l'
0083 6c DEFB 'l'
0084 6f DEFB 'o'
0085 2c DEFB ','
0086 20 DEFB ' '
0087 57 DEFB 'W'
0088 6f DEFB 'o'
0089 72 DEFB 'r'
008a 6c DEFB 'l'
008b 64 DEFB 'd'
008c 21 DEFB '!'
008d 0a DEFB '\n'
008e 0d DEFB '\r'
まとめ
今回作成したサブボードにより、Z80で使用された主要な周辺LSIを用いることができるようになった。最後に、成果と今後の課題を以下にまとめる。
成果
・以前作成したZ80ワンボードコンピュータと組み合わせることで、Z80 CTC、および、Z80 SIOを使用できるようになった。
・CTCを使用してタイマー割り込みを掛けられるようになった。
・SIOを使用してPCと通信できるようになった。
今後の課題
・Z80シリーズ以外のICとZ80を接続できるようにすること。
・UVEPROMやDRAM・SRAM等を使用できるようにすること。
参考文献
[1] 横田英一, Z-80の使い方, オーム社, 1993
[2] 額田忠之, Z80ファミリ・ハンドブック, CQ出版, 1985
[3] 機器開発入門 - 秋月電子 Z80 Cコンパイラ (https://side2949be.web.fc2.com/ref/Z80.html)
投稿者の人気記事
-
4558D
さんが
2023/12/03
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する