SSブログ
English Version

HD64180Compact(その2)開発機完成 [Z80]

 前回の記事で書いた HD64180Compact の構想での開発用基板(以降、開発機と記す)が完成しました(下の写真)。自作のワイヤリングペンを使ってポリウレタン線で結線しています。
 赤いフッククリップは PIC 書込み用の PICKit3 を接続するためのもので、接続用の PIC に被せるピン台を今回作りました。動作確認するのに必要最小限の信号を中央のピンソケットから取り出し、ロジアナに接続しています。下側で接続されているのは USB ケーブルでボードへ給電とパソコンとの通信(現時点では動作未確認)に使います。
 共立エレショップさんから購入した新品の HD64B180R0P もあるのですがもったいないので以前、海外通販で購入した HD64180RP8 のリユース品を実装しています。メモリは CPU の上限の 512KB です。クロックは PIC 側の USB 用の 12MHz を流用しています(HD64180 は 6MHz 動作)。

完成した HD64180Compact の開発機


 開発機完成記念として結線チェック用の回路図も貼っておきます。動作モニタ用のトランジスタを使った LED 回路の部分は未結線ですが、動作確認後に結線する予定です。

結線チェック用回路図


 実装した USB 機能付きの 20 ピンのPIC(PIC18F14K50)は BootROM と 通信/SPI インターフェースとして機能します。通信インターフェースはパソコンとは USB、HD64180 とはパラレル I/F で接続なので高速です。SPI は EEPROM もしくは SD カードに接続する予定です。Z80PicCompact 用のソフトをほぼそのまま持ってきて動作確認してみました。若干の変更は行ったものの最初の一歩であるジャンプ命令でのループ動作ができました

 実施手順はZ80PicCompact の時とほぼ同様で下記のようになります。
  1. 初期化コード実行
     PIC が下記のコードを HD64180 がフェッチするタイミングでデータバス上に出力し、HD64180 が実行します。
    	LD	HL,StartAdr
    	XOR	A
    	OUT	(00H),A		; set RTS0 to low
    	OUT	(36H),A		; set refresh disable
    	LD	C,0FFH		; set external I/O address  
    
    ※2024/02/22 Creg設定を追加

  2. INI 命令でのメモリ書込み
     PIC からデータバス上に INI 命令のオペコードを出力し、HD64180 が I/O リードするタイミングでメモリに設定するコードを出力する。これを繰り返すことで上記1項で HL レジスタに設定したメモリ上にジャンプ命令のコードを書き込む。今回は 0100H から C3H, 00H, 01H の3バイトのデータを書き込んだ。

  3. メモリ展開したコードへジャンプ
     上記2項でメモリに設定したコードの開始アドレスへのジャンプ命令を PIC が出力し、HD64180 が実行する。


 下図がジャンプループに成功した際のロジアナ波形例です。右端のウェイト無しで実行している部分がジャンプループです。1周期が 3us で 6MHz 動作なので遅い(JPは 9 ステート)感じですが、リセット直後の状態なのでソフト制御のウェイトがかかっているためだと思います。

★追記 2024/02/26 {
 CPUは6MHz動作なので1クロックは(1/6)usでリセット直後は1回のメモリアクセスに3クロックのウェイトが入るので
  3(=(1/6)*(9+3*3))us
となり下図の実測値と一致します。
}
 尚、LIR/ は Z80 の M1 相当の信号でオペコードフェッチの際にアクティブになります。

ジャンプループ実行時のロジアナ波形例(サンプリング:32MHz)


★追記 2024/02/22 {
 HD64180 には内蔵の I/O レジスタがあり、今回のブート時のメモリ書込みに使用する INI 命令で I/O アドレスを明示的に外部アドレスにするために初期化コードの末尾に C-reg の設定を追加しました。追加後のロジアナ波形例を貼っておきます。但し、他のロジアナ波形は追加前のままです。

ジャンプループ実行時のロジアナ波形例(サンプリング:32MHz)
}



 以降に自分へのメモの意味も込めてジャンプループ実現までに発生した問題とその対処の概要を記録しておきます。

  1. IORQ 待ちで停止
    [現象]
     INIR 命令でメモリ設定時に IORQ/ が読み取りできず PIC 側の処理が停止した(下図)。
    [原因と対処]
     今回追加した IORQ を RTS0 でマスクする部分で、RTS0 のリセット後の値が High(マスク状態)だったので初期化コードに RTS0 をlow にする制御を追加した。

    IORQ 待ちで停止

  2. INIR 後に停止
    [現象]
     実行コードをメモリに展開するための INIR 命令実行後 HD64180 が停止する。
    [原因と対処]
     INIR でコード出力後のウェイト解除時間が短すぎて HD64180 がウェイト解除にならないのでウェイト解除時間を長くした。

    ウェイト解除ができない(赤カーソル部分)

  3. メモリ書込みで停止
    [現象]
     HD64180 が INIR で読み込んだデータをメモリに書き込み時にウェイトが解除されず、そのまま停止してしまう。
    [原因と対処]
     PIC 側が INIR に対してメモリに設定するデータを送った後、HD64180 がメモリ書込みできるように一定期間ウェイトを解除する。メモリライト直前のリフレッシュにより MREQ/ がアクティブになり、メモリライト用のウェイト解除が発動した為。対処として初期化コードにリフレッシュ禁止設定を追加した。

    メモリライト直前のリフレッシュ動作(赤カーソル部分)

     下図はリフレッシュ禁止設定後のロジアナ波形例で緑のカーソル部分が INIR の1回分の時間です。

    リフレッシュ禁止後のロジアナ波形例



[補足]
 メモリ設定データを HD64180 へ渡すために INIR 命令を使用していましたが、このコード自体は PIC がデータバスに出力しているので B-reg がゼロになっても繰り返されることから B-reg を設定していません。
 しかし厳密にいうと B-reg がゼロになった場合とそれ以外の場合で実行ステート数が異なる(ゼロの場合が速い)ことから B-reg の影響を受けない INI 命令(ステート数は常に B-reg がゼロの場合と同じ)を使用することにしました。
 ロジアナ波形例を下記に示します。INI の方が若干早くなったようにも見えますが次の INI では時間がかかっているようなので今回の処理ではウェイトが掛かっていることから処理時間はほぼ同じと言えそうです。

INIR から INI に変更後のロジアナ波形例(赤カーソル部分が INI 1回分)



[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。