SSブログ
English Version

HD64180Compact(その4)ディバッグモニタ [Z80]

 前回の記事で書いたように手配線で製作した開発機がハード的には動いているようなのでディバッグモニタを入れることにしました。

 GAME言語で自作した簡易モニタのGAMONを入れてみたところ、ブレークが動作しない場合があるので少し悩みましたが、Z80を使用したZ80PicCompactでも同様の現象が発生することが判り、GAMONを修正し正常動作を確認しました。ブレーク機能のディバッグにはブレーク機能が使えないので机上ディバッグですw。
 ついでにHD64180でも使えるようにI/O入出力のコマンドのアドレスを16bit対応しました。「GAME言語で作った簡易モニタ」のページでアップデート版を公開しています。

 HD64180関連の情報をネットで眺めていたところ、敏雪さんの「Softいろいろ」のページでHD64180用のモニタであるH18MONを見つけ、インストールしてみました。アセンブルには IR80.EXE 相当のアセンブラが必要なようなのですがネットでは見つけられなかったのでperlを使ってローカルのテンポラリラベルを自動変換する等してアセンブルしました。HD64180固有の命令は前回の記事で書いたマクロで対応しました。
 コンソール入出力部分を変更しただけでは動かなかったのですが、メモリチェック部分を変更することで動作するようになりました(ROMでの運用を想定しているため、RAM上にロードした状態では動かなかった)。

 起動画面のキャプチャが下図になります。今回作成したHD64180Compactではブート時にPICからロードされるHexLoaderを0xff00に配置していて、この領域をH18MONがデータ領域として使用しているので、GAMONを使ってロードしています。

H18MON起動画面
※2024/02/29 最新版に差し替え


 上図のヘルプ表示にもあるようにH18MONは逆アセンブルやトレース機能もあり、このような高機能なモニタを公開されている作者に感謝致します。

 ブレーク機能の試行として「メモリ上で実際に動くプログラム(その2)」の記事で書いたフラグの未使用ビット設定確認のソフトを実行した際の画面キャプチャが下図になります。Hexファイルは'^Z'で終端されている必要があるようです。実行結果として"Ok"が表示されているのでHD64180でもフラグの未使用ビットに値を設定できることが判ります。

H18MONでのブレーク動作
※2024/02/29 最新版に差し替え


 因みにGAMONで同様にブレークした際の画面が下図です。

GAMOMでのブレーク動作
※2024/03/02 最新版に差し替え


 逆アセンブル機能はいいとしてトレース機能には食指が動きますが、暫くは手に馴染んだGAMONを使っていきたいと思います。


[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

HD64180Compact(その3)MBASICでASCIIART [Z80]

 HD64180 と USB 機能を有する 20 ピンの PIC を使った 3 チップ構成のボードの開発の続編です。
 前回の記事でジャンプ命令によるループができたことを書きましたが、後述するように Hello 表示と HexLoader も動いたので「CP/M-80でのBIOSエミュレートによるMBASICの起動」の記事で書いたように CP/M の BIOS をエミュレートして MBASIC を起動し ASCIIART を動かしてみました。
 今回開発の HD64180Compact と類似の構成で Z80 を実装した Z80PicCompact との実行時間比較も行ってみました。

No.machine environmentclocktimeratio
1Z80PicCompact12MHz95.4s1.00
2HD64180Compac(maximal Wait)6MHz314.1s3.29
3HD64180Compact(minimal Wait)6MHz165.2s1.73


 最初にソフト制御可能なメモリと I/O アクセス時の WAIT 設定を行わず(リセット直後の状態では WAIT ステート数がメモリ:3、IO:4)実行したところ(上表のNo2)かなり遅い結果でしたが、WAIT を最小の設定(メモリ:0、IO:1)にした結果(上表のNo3)、Z80PicCompact のクロックから比例計算した Z80 の速度の 1.15(=95.4x2/165.2)倍になり、ASCIIART.BAS の実行では HD64180 は Z80 より 1.15 倍速いことになります。尚、リフレッシュは禁止の設定にしています。HD64180 には 8bit の乗算命令もあるのでこれを活用できる場面では速度差が更に大きくなると思います。
 WAIT を最小に設定して ASCIIART.BAS を実行した際の画面のキャプチャーが下図です。PIC に実装した BootROM 機能により Z80 側で HexLoader が起動し、その後 BIOS エミュと MBASIC の Hex ファイルを読み込ませています。

HD64180Compact での ASCIIART 実行画面( WAIT 最小設定時)


 上記の比較表のエビデンスとして HD64180Compact(最大 WAIT)と Z80PicCompact での ASCIIART 実行時の画面キャプチャーも貼っておきます。

HD64180Compact での ASCIIART 実行画面(WAIT 最大設定時)


Z80PicCompact での ASCIIART 実行画面


 CP/M の BIOS エミュレートのソースも短いので貼っておきます。HD64180 の拡張命令は macro 定義して使いました。

CP/M BIOS エミュレーター(Z80 アセンブラ)
; CP/M-80 BIOS emulator for Z80PicCompact ; Ver 0.01 2023/01/14 by skyriver ; based on CP/M-80 bios for Z80GAL ; Ver 0.01 2020/11/07 by skyriver ; Ver 0.02 2021/10/02 by skyriver ; save BC-reg at CONOUT ; test for Emurate CP/M BIOS environment 2023/05/15 ; change for HD64180Compact ;++++ CP/M parameter ++++ 0006 MAXDSK EQU 6 ;number of drives. 0040 MAX_SEC EQU 64 ;sectors/track 0006 MAX_SIF EQU 6 ; MAX_SEC = 1 << MAX_SIF 0040 MSIZE EQU 64 ;size of available RAM in KB B000 BIAS EQU (MSIZE-20) * 1024 E400 CCP EQU 3400H+BIAS ;base of cpm ccp EC06 BDOS EQU CCP+806H ;base of bdos FA00 BIOS EQU CCP+1600H ;base of bios 0004 CDISK EQU 0004H ;current disk number (0 ... 15) 0003 IOBYTE EQU 0003H ;intel iobyte 0080 BUFF EQU 0080H ;default buffer address 000D CR EQU 13 000A LF EQU 10 0080 SECSIZE EQU 128 ; sector size 0800 CPMBKSZ EQU 2048 ; CP/M block size 0200 SDBLKSZ EQU 512 ; SD card block size 0038 RSTAD EQU 038H ; interrupt entry adr 0100 CPM_AP EQU 0100H ; CP/M app entry .LIST .Z80 0000' ASEG ORG BIOS FA00 C3 FA56 JP BOOT FA03 WBOOTE: FA03 C3 FAA0 JP WBOOT FA06 C3 FA87 JP CONST FA09 C3 FA8F JP CONIN FA0C C3 FA92 JP CONOUT FA0F C3 FAA1 JP LIST FA12 C3 FAA1 JP PUNCH FA15 C3 FAA1 JP READER FA18 C3 FAA1 JP HOME FA1B C3 FAA1 JP SELDSK FA1E C3 FAA1 JP SETTRK FA21 C3 FAA1 JP SETSEC FA24 C3 FAA1 JP SETDMA FA27 C3 FAA1 JP READ FA2A C3 FAA1 JP WRITE FA2D C3 FAA1 JP LISTST FA30 C3 FAA1 JP SECTRAN FA33 StMsg: FA33 0D 0A 36 DB CR,LF,MSIZE/10+'0' FA36 34 DB (MSIZE mod 10) + '0' FA37 6B 20 43 50 DB 'k CP/M Ver 2.2 BIOS Emulator' FA3B 2F 4D 20 56 FA3F 65 72 20 32 FA43 2E 32 20 42 FA47 49 4F 53 20 FA4B 45 6D 75 6C FA4F 61 74 6F 72 FA53 0D 0A 00 DB CR,LF,0 FA56 F3 BOOT: DI FA57 ED 56 IM 1 FA59 31 0100 LD SP,CPM_AP FA5C AF XOR A FA5D 32 0080 LD (BUFF),A ; clear command line OUT0 (HDDCNTL),Areg ; set wait mem:0 IO:0 FA60 ED 39 32 + DB 0EDH,(Areg shl 3) OR 1,(HDDCNTL) FA63 3E C9 LD A,0C9H FA65 32 0038 LD (RSTAD),A FA68 21 FA33 LD HL,StMsg FA6B CD FA96 CALL Puts ;; JR GOCPM FA6E GOCPM: FA6E 3E C3 LD A,0C3H FA70 32 0000 LD (0),A FA73 21 FA03 LD HL,WBOOTE FA76 22 0001 LD (1),HL FA79 32 0005 LD (5),A FA7C 21 EC06 LD HL,BDOS FA7F 22 0006 LD (6),HL FA82 36 C9 LD (HL),0C9H ; return code FA84 C3 0100 JP CPM_AP ; ; check console key data ; A -> 0ffh:data exist 00h:none FA87 CONST: FA87 DB FF IN A,(CMDPORT) ; get status FA89 E6 01 AND RXRDY_B FA8B C8 RET Z ; no data FA8C 3E FF LD A,0FFH FA8E C9 RET ; ; input console ; A -> key data FA8F DB FE CONIN: IN A,(DATPORT) FA91 C9 RET ; out console ; C <- data FA92 79 CONOUT: LD A,C FA93 D3 FE OUT (DATPORT),A FA95 C9 RET ; print string ; HL <- string addr FA96 Puts: FA96 7E LD A,(HL) FA97 B7 OR A FA98 C8 RET Z FA99 4F LD C,A FA9A CD FA92 CALL CONOUT FA9D 23 INC HL FA9E 18 F6 JR Puts FAA0 76 WBOOT: HALT FAA1 LIST: FAA1 PUNCH: FAA1 READER: FAA1 HOME: FAA1 SELDSK: FAA1 SETTRK: FAA1 SETSEC: FAA1 SETDMA: FAA1 READ: FAA1 WRITE: FAA1 LISTST: FAA1 SECTRAN: FAA1 C9 RETURN: RET END



[補足]
 以降に Hello 表示の際のデータをメモとして記録しておきます。下記は Z80 側のソースです。EnPic で PIC が提供するサービスが有効になり、DisPic で無効になります。

Hello 表示プログラム(Z80 アセンブラ)
;++++++++++++++++++++++++++++++++++++ ; hello program for Z80PicCompact ; Ver 0.01 2024/02/23 by skyriver ;++++++++++++++++++++++++++++++++++++ .LIST 1000 STACK EQU 1000H 0000' ASEG ORG 0100H 0100 31 1000 START: LD SP,STACK 0103 AF XOR A OUT0 (HDDCNTL),Areg ; set wait mem:0 IO:0 0104 ED 39 32 + DB 0EDH,(Areg shl 3) OR 1,(HDDCNTL) EnPic ; enable PIC I/O 0107 ED 38 00 + DB 0EDH,Areg shl 3,(HDCNTLA0) 010A E6 EF + AND 0EFH 010C F3 + DI 010D ED 39 00 + DB 0EDH,(Areg shl 3) OR 1,(HDCNTLA0) 0110 3E 01 LD A,SIO_CHAR OUT0 (CMDPORT),Areg ; set character mode 0112 ED 39 FF + DB 0EDH,(Areg shl 3) OR 1,(CMDPORT) 0115 21 0130 LD HL,msg 0118 CD 0127 CALL Puts DisPic 011B ED 38 00 + DB 0EDH,Areg shl 3,(HDCNTLA0) 011E F6 10 + OR 10H 0120 FB + EI 0121 ED 39 00 + DB 0EDH,(Areg shl 3) OR 1,(HDCNTLA0) 0124 C3 0124 JP $ ; PUTS : put string to serial ; HL <- message address 0127 7E Puts: LD A,(HL) 0128 23 INC HL 0129 B7 OR A 012A C8 RET Z OUT0 (DATPORT),Areg 012B ED 39 FE + DB 0EDH,(Areg shl 3) OR 1,(DATPORT) 012E 18 F7 JR PUTS 0130 68 65 6C 6C msg: DB "hello, world", 13, 10, 0 0134 6F 2C 20 77 0138 6F 72 6C 64 013C 0D 0A 00 END


 下記が初めて Hello 表示した際の画面です^^
 Z80PicCompact の環境を若干変更することで動作しました。

Hello 表示画面


 下図が Hello 表示時のロジアナ波形のサンプルです。1文字を PIC に送信するのに 60us 程度の時間がかかっています。突発的に時間がかかっている部分は PIC 側が USB 関連の処理をしているためだと思います。

Hello 表示時のロジアナ波形例


 下図は Puts をコールする部分を拡大したもので WR/ が2回アクティブになっている部分(マーカー:0)がスタックへのリターンアドレスの書込み部分です。


ロジアナ波形の CALL 部の拡大図


 その後、毎回テストプログラムを PIC に書き込むのは面倒なので、PIC に HexLoader を書き込んだ状態で冒頭に書いた MBASIC と ASCIIART.BAS で実行速度の評価を行いました。


[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

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) 
共通テーマ:趣味・カルチャー

メモリ上で実際に動くプログラム(その3) [Z80]

 メモリ上で実際に動き(移動し)通過した後にはNOP命令のみを残してひたすらメモリ上を駆け回る自走プログラムで新たな案を思い付いたので記録しておきたいと思います。

 前回の記事で書いた PUSH によるコード生成方式は自走プログラムの移動量が究極の1バイトであり、自走プログラムの移動量という点ではこれ以上小さくするのは不可能ということになります(プログラムの仕掛けという観点でも素晴らしいと思う)。
 本連載の初回記事「メモリ上で実際に動くプログラム」に PUSH を使わずブロック転送のみを使用した自走プログラムを追記しましたが、同様にブロック転送のみの場合でも移動量をもっと小さくできないか考えてみました。

 インクリメント方式のブロック転送である LDIR 命令では次のブロック転送のために16ビットの減算をする必要があり、キャリーのクリア等が必要になることを考えるとデクリメント方式の LDDR を使いたいものです。ブロック転送を利用した場合の最小移動量は2バイトになりそうですが、ブロック転送命令(LDDR=EDH,B8H)を二つ並べてブロック転送命令をブロック転送命令で上書きすることでブロック転送を中断しないようにするとブロック転送終了直後にコピーしたブロック転送を実行してしまうのでうまくいきません・・・

 しかし、巧妙な仕掛けを思い付きました^^ 
 方式のアイディアさえ固まれば、ブロック転送を利用した自走プログラムには慣れてきたのでほぼ机上コーディングのみで完成しました。完成したソースが下記で移動量は2バイトです。このソースを見て今回のアイディアの仕掛けが判りますか?

ブロック転送での自走プログラム例(Z80 アセンブラ)
;+++++++++++++++++++++++++++++++++++++ ; runner code on memory ; Ver 0.02 2024/01/18 by skyriver ; Ver 0.02a 2024/01/28 by skyriver ; Ver 0.02b 2024/01/29 by skyriver ; Ver 0.02c 2024/02/09 by skyriver ;+++++++++++++++++++++++++++++++++++++ 0000' ASEG ORG 0100H 0100 21 011A START: LD HL,CEND 0103 11 011C LD DE,CEND + 2 0106 06 00 LD B,0 0108 3E 10 LD A,CNEXT - CSTART + 2 010A F3 DI 010B 18 0A JR SETC 010D 00 00 CSTART: DB 0,0 010F 47 LD B,A ; ED 47 = LD I,A   0110 ED B8 CLDR: LDDR 0112 4F LD C,A 0113 09 ADD HL,BC 0114 EB EX DE,HL 0115 09 ADD HL,BC 0116 EB EX DE,HL 0117 0E 0E SETC: LD C,CNEXT - CSTART 0119 18 F5 JR CLDR 011A CEND EQU $ - 1 011B CNEXT EQU $ END


★追記 2024/02/09
 X(Twitter)に投稿した自走状況を可視化した動画を貼っておきます。


★追記 2024/02/10
 X での書込みメッセージに対して返信を頂きました。LDIR を使用し、移動量が1バイトというものです。コピー後の LDIR を再利用する部分とキャリーによる条件ジャンプの部分が味わい深いですね。LDIR で検討してみました(下記)が DI を除けば同じサイズになりました。

LDIR による1バイト移動の自走プログラム例(Z80 アセンブラ)
;+++++++++++++++++++++++++++++++++++++   ; runner code on memory ; Ver 0.02 2024/01/18 by skyriver ; Ver 0.02a 2024/01/28 by skyriver ; Ver 0.02b 2024/01/29 by skyriver ; Ver 0.02c 2024/02/09 by skyriver ; Ver 0.02d 2024/02/09 by skyriver ;+++++++++++++++++++++++++++++++++++++ 000E CSIZE EQU CEND - CSTART 0000' ASEG ORG 0100H 0100 11 0117 START: LD DE,CSTART + CSIZE 0103 06 00 LD B,0 0105 3E 0E LD A,CSIZE 0107 F3 DI 0108 2E DB 2EH ; LD L,xx 0109 ED B0 CSTART: LDIR 010B EB EX DE,HL 010C 4F LD C,A 010D ED 42 SBC HL,BC 010F 5D LD E,L 0110 54 LD D,H 0111 1B DEC DE 0112 ED B0 LDIR 0114 18 F2 JR CSTART - 1 0116 00 NOP 0117 CEND EQU $ END



[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

HD64180Compact(その1)構想 [Z80]

 X(旧Twitter)のタイムラインで日立製の Z80 系 CPU である HD64B180ROP が共立エレショップさんで販売されていることを知り2個確保できました。

入手した HD46B180ROP


 パッケージは 64 ピンのシュリンク DIP なので秋月さんからシュリンク DIP のソケットと 1.778mm ピッチの汎用基板を購入しました。

HD64180 と汎用基板とソケット


 かなり前に 旧Twitter のタイムラインで HD64180 はハーフピッチの汎用基板に斜めに刺さるという情報を見た覚えがあります。しかし、今回購入した基板には逆に通常の DIP IC を斜めに刺すことができます。PIC を使って使用 IC 数を少なくすれば 大きな HD64180 をきれいに収めた方が作り易いと思ったからです。秋月さんでは通常ピッチとシュリンクピッチが縦横で混在している汎用基板も販売していますが最大でC基板サイズなので HD64180 を搭載するには残念ながら小さすぎます。

 今回開発するワンボードを HD64180Compact と命名します。使用 IC 数を最小限にするように設計したいと考えていて、CPU 以外の IC としては SRAM と USB 機能を有した 20 ピンの PIC(PIC18F14K50)の3チップ構成にする予定です。以前に同様の構成でほぼ Z80 のチップサイズの CP/M が動くワンボードマイコンの Z80PicCompact を開発しましたが、今回は下記の課題についても対処したいと思います(まったく同じ仕掛けではつまらないですからね)。
  • I/O の拡張性
     Z80PicCompact では I/O 空間に PIC だけを配置していて、PIC はアドレスの A0 だけを見ており、コマンド/データのポートの識別に A0 を使っていたので I/O 空間に空きがなかった

  • 割込み対応
     Z80 は IORQ/ をアクティブにすると自動的に wait するようにしていたので割込み(Z80PicCompactでは未使用)時に wait してしまうので PIC が割込みの都度 wait を解除する必要がある

 下表に Z80PicCompact での PIC のピンアサインを再掲します。

Z80PicCompactのピンアサイン


 HD46180ROP には RTS0/ のような Z80 にはなかった出力ピンがあるので、これを PIC アクセス用のコントロール信号として利用することで PIC を I/O アクセスする時のみ、 IORQ/ で wait 状態になるようにします。

 初めに考案したトランジスタを使った回路をシミュレータで検証してみました。CNT がコントロール信号です。
 想定通り CNT が low の時は WAIT/ はマスクされ、CNT が high の時に IORQ/ により、WAIT/ がアクティブになります。しかし、WAIT/ の low レベルが 0.8V 程度であり、HD64180 の規格である 0.8V 以下に対してマージンがありません。

トランジスタ案1


 下図はベースとエミッタの抵抗を小さくした場合のシミュレーション結果です。今度は WAIT/ の low レベルは規格を満たせていますね。

トランジスタ案2


 別の案としてショットキーバリアダイオードを使った OR 回路構成の案もシミュレートしてみました。これも WAIT/ 信号の low レベルが高すぎますね。

ショットキー案1


 プルダウン抵抗の値を小さくしてシミュレートした結果が下図です。これなら行けそうですね。

ショットキー案2


 部品数から考えてまずはショットキー案2で行こうかと思います。PIC の RB7 が抵抗を介して R2 へ接続することになるかと思います。

 今回はプライオリティを下げて気が向いた時に開発を進める予定なので進捗はゆっくりになりそうです。


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

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