今回は前回の記事の末尾で書いたように hello 表示の実現について書いてみます。
Z80 上のプログラムから hello を表示するためには PIC から Z80 へプログラムコードをロードする boot ROM 機能と Z80 からの文字出力要求に対して PIC 側が Z80 から出力データ受け取り、USB 経由でパソコンへ送信する USB I/F 機能(= I/O 機能の一部)を実現する必要があります。
それではそれぞれの機能の実現方法について書いてみます。
- boot ROM 機能
前回の記事で書いたように PIC からのプログラムコードを Z80 が実行できるようになったので B レジスタ回数分 I/O 入力したデータを HL レジスタの示すメモリに書き込む命令である INIR 命令を使ってプロムラムをメモリ上にロードするようにしました。PIC 側が出力したコードを Z80 がメモリ上に保存した後、PIC からのジャンプ命令を受けて、保存したプログラムを Z80 が実行するようにしています。
このロード動作をするためのコードは PIC 側がデータバスに直接出力しているのでロード対象プログラムを任意のアドレスにロードすることが出来ます(ロードするためのコードの実行アドレスと重なっていても問題ありません)。
0100H から始まる JP 命令でループ動作を繰り返すプロムラム( 0C3H, 00H, 01H )をロード & 実行してみた時のロジアナ波形が下図になります。
"JP 0100H" の繰り返し時のロジアナ波形例(サンプリング:25MHz)
カーソルで囲った部分がロードされた JP 命令 を初めて実行している部分でウェイト無しで実行時間は 0.84 us になっています。JP XXXX 命令は 10 クロック必要なので上図から Z80 は 12MHz で動作していることが判ります(計算上は 0.833 us ですがロジアナのサンプリングが遅いために 0.84 us に見えている)。
下図は boot 処置中の INIR 命令実行部分のロジアナ波形です。INIR 命令は 21 クロック必要なのでウェイト無しで実行した場合の時間は 1.75 us です。下図では ウェイトが入っているため 5 us 掛かっているので boot 処理時の速度は 4.2 MHz 相当(=1/(5/21)) と言うことになります。
INIR 実行時のロジアナ波形例(サンプリング:25MHz)
- USB I/F 機能
boot ROM機能で boot 後、 Z80 は I/O 命令を使って PIC とインターフェースをとります。
Z80 は自らの IORQ/ でウェイト状態になるようにしているので PIC 側はウェイト状態を監視しておもむろに対応する処理を行うことができます。また、Z80 は I/O 命令以外はウェイト無しで動作するようになります。
PIC 側の I/O ピン数が少ないため、アドレス線は A0 しか監視していません。
Z80 の I/O 命令で A0 が 1 の場合はコマンドポート、0 の場合はデータポートとして割り振りました。
具体的な割り振りは下表のとおりです。
No. A0 R/W memo 1 1 write モード設定 2 1 read ステータス読出し 3 0 write データ書込み 4 0 read データ読出し
モードとしては暫定的に下記のようにしました。ストリングモードは USB へ文字列データを一括して渡すので効率よく処理できます。
キャラクタモード : 1 文字単位でのシリアル入出力
ストリングモード : 文字列単位でのシリアル出力
下のリストが今回作成した Z80 側の hello 表示プログラムです。キャラクタモードを使用しています。
Z80 側の hello 表示プログラム( Z80 アセンブラ) ;++++++++++++++++++++++++++++++++++++ ; hello program for Z80PicCompact ; Ver 0.01 2022/10/05 by skyriver ;++++++++++++++++++++++++++++++++++++ 0000 DATPORT EQU 0 ; data port 0001 CMDPORT EQU 1 ; command port 0001 SIO_CHAR EQU 1 ; char mode 1000 STACK EQU 1000H 0000' ASEG ORG 0100H 0100 31 1000 START: LD SP,STACK 0103 3E 01 LD A,SIO_CHAR 0105 D3 01 OUT (CMDPORT),A ; set character mode 0107 21 0119 LD HL,msg 010A CD 0110 CALL PUTS 010D C3 010D JP $ ; PUTS : put string to serial ; HL <- message address 0110 7E PUTS: LD A,(HL) 0111 23 INC HL 0112 B7 OR A 0113 C8 RET Z 0114 D3 00 OUT (DATPORT),A 0116 C3 0110 JP PUTS 0119 68 65 6C 6C msg: DB "hello, world", 13, 10, 0 011D 6F 2C 20 77 0121 6F 72 6C 64 0125 0D 0A 00 END Macros: Symbols: 0001 CMDPORT 0000 DATPORT 0119 MSG 0110 PUTS 0001 SIO_CHAR 1000 STACK 0100 START No Fatal error(s)
下図は hello 実行時の Z80 が OUT 命令を実行している部分のロジアナ波形です。 PIC 側はデータを受け取った後に USB 関連の関数をコールしているため、結構時間が掛かっています。
hello 実行時の OUT 命令部のロジアナ波形例(サンプリング:25MHz)
2文字目の 'e' を出力した後の Z80 の処理部分を拡大したものが下図になります。 OUT 命令から解放されて次の文字を準備するために 5 個の命令を実行後に OUT 命令で再度ウェイト状態になっています。
'e' を出力後の Z80 の動作部の拡大波形例(サンプリング:25MHz)
今回の実験の成果として hello が表示された画面のキャプチャが下図になります。
"Start" の文字列は PIC が USB 初期化後に表示しているもので、 2 行目の文字列が Z80 からの要求により表示されたものです。TeraTerm へは 38400 bps で接続していますが、外付けの USB-Serial 変換を介していないので好きなボーレイトで接続可能です。
hello 表示画面(サンプリング:25MHz)
★追記 2022/10/08 {
ストリングモードで hello 表示を行った場合の OUT 命令実行部のロジアナ波形を追記します。上記のキャラクタモードより 5 倍程度速くなっています。
}ストリングモードでの OUT 命令部のロジアナ波形例(サンプリング:25MHz)
以上が、hello 表示を実現させるために行った作業の概要になります。
今回の実験途中にインストールしたばかりの MPLABX Ver6.0 が不調になってしまいましたorz
具体的な症状としては下図のようにプロジェクトのプロパティ変更ができない( 「OK」ボタンが押せない)状態になり、別のプロジェクトで試しても同様に変更できませんでした。
再インストールしても問題が再発する可能性もあるので、従来使っていた MPLABX Ver5.45 を使って上記の確認作業を継続しました。
| MPLAB Ver6.0の問題発生画面 |
|
|
[TOP] [ 前へ ] 超小型Z80マイコン [ 次へ ]

