レトロマイコンZ80ボードの構想(その15)エスケープシーケンスの実験 [Z80]
前回の「レトロマイコンZ80ボードの構想(その14)CP/MでのWM動作実験」ではWordMasterにANSIエスケープコード用のパッチを入れて動かしましたが、今回はPIC側のCONOUT処理に次のエスケープシーケンスの処理を入れてみました。
picleソース側への追加なので前回記事のような限られた領域にZ80のコードを詰め込むより簡単です。
試しに ここ から QTITRIS.COM(キャラクタ版テトリス)をダウンロードして動かしてみました。
下記の操作ログはエスケープシーケンスのサブセット対応(37行目~73行目部分)したpicleのリストを表示後、runコマンドで実行し、CP/Mブート後、QTITRISを起動している様子です。
簡易的なエスケープシーケンス対応実験ログ
テトリスが起動した画面のキャプチャが下の画面です。
数字キーで操作するので結構難しい(Z80が16MHz動作なので最低速設定にしても早すぎる・・)
因みにWordStarは他にも表示属性設定等のエスケープシーケンスを使っているのできれいな画面にはなりませんでしたが、PIC側で対応するのは容易だと思います。
WindowsとCP/M間のファイルのやり取りは前回記事のコメント欄にも書いたようにCP/M側でXMODEMというアプリを使っています(Windows側はTeraTermのXMODEM送受信機能を使用)。
ファイルのやり取りの際、SDカードを経由する必要がなくなったので便利になりましたが、私の環境では大きなファイルの転送に失敗(オプション指定でZ80のクロック設定しても駄目)することがあるので対策を考え中です。
PIC側に今回のようなコンソールデータの変換ロジックを入れるとバイナリデータの透過性が保証できなくなる問題が新たに発生します。(転送にはPUN:ディバイスを使えば解決できるけどね)
★2018/03/24 追記
下記のエスケープシーケンスを対応したことで無事 WordStar が動きました。
ANSIエスケープコードへの変換としては Reverse をそのままReverseに変換したところ、WordStarを終了してもReverseのままになったのでItalic(ESC+'[3m')に変換しています(TeraTermでは画面上は変化なし)。
BoldはANSIのBold(ESC+'[1m')に変換していますがTeraTermでは文字が黄色になります。(設定で変更可能らしい)
この頃のディスプレイはまだカラー化していないのでモノクロで識別可能な表示属性になっていますが、今ならエスケープシーケンスを色付きに対応させた方が見易くていいです(当時の状態の再現という観点では好ましくないかも)
私は普段、秀丸エディタを使っていますが、今でもWordStarライクな操作にカスタマイズしています。
WordStarを改めて使ってみると、今でもあまり遜色なく使えるエディタであることに驚かされました。
WordStarのソースコードはアセンブラで13万7000行あり、開発者のRob Barnabyさんはこれを4ヵ月で作ったのだそうです。平均的な生産性で換算すると42人が1年かけて開発する規模だということです。すご~ぃですね。
WordStarの画面はこんな感じです。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
- 画面クリア : ESC+'*'
- カーソル位置制御 : ESC+'='+nm
n:Y position,m:X position(position offset:20H)
picleソース側への追加なので前回記事のような限られた領域にZ80のコードを詰め込むより簡単です。
試しに ここ から QTITRIS.COM(キャラクタ版テトリス)をダウンロードして動かしてみました。
下記の操作ログはエスケープシーケンスのサブセット対応(37行目~73行目部分)したpicleのリストを表示後、runコマンドで実行し、CP/Mブート後、QTITRISを起動している様子です。
|
テトリスが起動した画面のキャプチャが下の画面です。
数字キーで操作するので結構難しい(Z80が16MHz動作なので最低速設定にしても早すぎる・・)
因みにWordStarは他にも表示属性設定等のエスケープシーケンスを使っているのできれいな画面にはなりませんでしたが、PIC側で対応するのは容易だと思います。
WindowsとCP/M間のファイルのやり取りは前回記事のコメント欄にも書いたようにCP/M側でXMODEMというアプリを使っています(Windows側はTeraTermのXMODEM送受信機能を使用)。
ファイルのやり取りの際、SDカードを経由する必要がなくなったので便利になりましたが、私の環境では大きなファイルの転送に失敗(オプション指定でZ80のクロック設定しても駄目)することがあるので対策を考え中です。
PIC側に今回のようなコンソールデータの変換ロジックを入れるとバイナリデータの透過性が保証できなくなる問題が新たに発生します。(転送にはPUN:ディバイスを使えば解決できるけどね)
QTITRIS画面 |
|
★2018/03/24 追記
下記のエスケープシーケンスを対応したことで無事 WordStar が動きました。
- ESC+'C'+'0' : Reverse off(たぶん・・^^;)
- ESC+'C'+'1' : Reverse on
- ESC+'B'+'0' : Bold off
- ESC+'B'+'1' : Bold on
ANSIエスケープコードへの変換としては Reverse をそのままReverseに変換したところ、WordStarを終了してもReverseのままになったのでItalic(ESC+'[3m')に変換しています(TeraTermでは画面上は変化なし)。
BoldはANSIのBold(ESC+'[1m')に変換していますがTeraTermでは文字が黄色になります。(設定で変更可能らしい)
この頃のディスプレイはまだカラー化していないのでモノクロで識別可能な表示属性になっていますが、今ならエスケープシーケンスを色付きに対応させた方が見易くていいです(当時の状態の再現という観点では好ましくないかも)
私は普段、秀丸エディタを使っていますが、今でもWordStarライクな操作にカスタマイズしています。
WordStarを改めて使ってみると、今でもあまり遜色なく使えるエディタであることに驚かされました。
WordStarのソースコードはアセンブラで13万7000行あり、開発者のRob Barnabyさんはこれを4ヵ月で作ったのだそうです。平均的な生産性で換算すると42人が1年かけて開発する規模だということです。すご~ぃですね。
WordStarの画面はこんな感じです。
WordStar画面 |
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]
レトロマイコンZ80ボードの構想(その14)CP/MでのWM動作実験 [Z80]
前回の記事「レトロマイコンZ80ボードの構想(その13)」で書いたように CP/M が起動できた(まだまだ細かい調整は必要ですが)ので懐かしいソフトを動かしたりして遊んでいましたが、エディタが無いと何かと不便なのでWordMasterを動かしてみることにしました。
「CP/M Text Editors and Word Processors」からダウンロードできるので簡単に動かせるだろうと思っていましたが意外と難関でした・・・^^;
ネット上ではエミュレータで動かしている例はありましたが、リアルのCP/MでTeraTerm等を接続してWordMasterを動かしている例は見つからなかった(みんなどうしてるんだろう?)
ダウンロードしたWordMasterファイルには画面制御のエスケープシーケンスをカスタマイズできるようにアセンブラのサンプルソースが付いています。
昔、画面表示部分を作ったこともあったので思い出しましたが、当時のエスケープシーケンスは移動先のカーソル位置を表現するのにスペースコード(20H)に位置情報を足したコードで表現していて、カスタマイズ用のサンプルソースも同様でした。
しかし TeraTerm のVT100モード等ではANSIのエスケープコードが採用されていてカーソル位置情報を10進文字で表現する必要があります。
(ANSIエスケープコードは碧色工房さんのウェブサイト等を参照させていただきました)
WordMasterに添付されているカスタマイズ用のソースはWordMasterの画面制御部を置き換えるパッチ形式になっていて使用できる領域が小さくて通常の10進変換はとても入れ込めそうにありません・・・
小さな領域にマシン語コードを埋め込む・・これぞマイコンの醍醐味なのでチャレンジしてみました ^^
最大の問題はバイナリから十進数への変換です。当然除算処理が必要になってきますが、今回の用途に限って言えば10進2桁までの数字を対象としていいのでこの条件で簡略化した除算処理が下のリストです。
A-regで渡されたデータを処理し、E-reg に10の桁、A-reg に1の桁が入ります(やっていることは筆算の計算と同様)
エミュレータではなく、(ワザワザ)実機CP/M上のZSIDで動作確認しています ^^
Binary to Decimal Transfer(Z80 Assembler)
WordMaster内の1文字出力処理である OUTCHR のアドレスを確認したら相対ジャンプ到達範囲内だったので関数末尾の OUTCHRコールは相対ジャンプ化しました。
ESC+'[' の出力をサブルーチン化する等して細切れの使用可能領域に断片的にコードを埋め込み、とうとう完成と思ったところ、ESC+'[2J'での画面クリアではカーソルがホームに戻らないので画面が乱れることが判明・・・orz
もうこれ以上の処理は入らないと諦めかけたましたが、メモリダンプを見たところ、パッチ領域の直前がメッセージのアスキーデータ領域であることに気づき、メッセージの最後の部分の領域を若干拝借してコードを埋め込みました。 ^^;;
hexファイルのパッチ適用操作は下記の操作ログを参照してください。(シリアルNoをつぶして悪さしているみたいだけどそうじゃないよ)
WordMasterへのパッチ適用作業工程
WordMasterのカーソルが最上位行での上スクロール時の再描画ぶりを久々に見れて懐かしい・・^^
無事WordMasterが動作したことを記念してキャプチャを貼っておきます。
また、カスタマイズしたパッチソース(macro-80用)とヘキサファイルは下記からダウンロードしてください。
スクリーンの行数を24から32に変更しています(32行の画面じゃないと上スクロール時に画面が乱れます)
※2018/03/18 コメントに書いたように単純ループ式に変更しました。
WordMaster ANSI用パッチ
★追記 2020/12/04
24行モードに変更するパッチ適用方法(下記)を追記しました。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
「CP/M Text Editors and Word Processors」からダウンロードできるので簡単に動かせるだろうと思っていましたが意外と難関でした・・・^^;
ネット上ではエミュレータで動かしている例はありましたが、リアルのCP/MでTeraTerm等を接続してWordMasterを動かしている例は見つからなかった(みんなどうしてるんだろう?)
ダウンロードしたWordMasterファイルには画面制御のエスケープシーケンスをカスタマイズできるようにアセンブラのサンプルソースが付いています。
昔、画面表示部分を作ったこともあったので思い出しましたが、当時のエスケープシーケンスは移動先のカーソル位置を表現するのにスペースコード(20H)に位置情報を足したコードで表現していて、カスタマイズ用のサンプルソースも同様でした。
しかし TeraTerm のVT100モード等ではANSIのエスケープコードが採用されていてカーソル位置情報を10進文字で表現する必要があります。
(ANSIエスケープコードは碧色工房さんのウェブサイト等を参照させていただきました)
WordMasterに添付されているカスタマイズ用のソースはWordMasterの画面制御部を置き換えるパッチ形式になっていて使用できる領域が小さくて通常の10進変換はとても入れ込めそうにありません・・・
小さな領域にマシン語コードを埋め込む・・これぞマイコンの醍醐味なのでチャレンジしてみました ^^
最大の問題はバイナリから十進数への変換です。当然除算処理が必要になってきますが、今回の用途に限って言えば10進2桁までの数字を対象としていいのでこの条件で簡略化した除算処理が下のリストです。
A-regで渡されたデータを処理し、E-reg に10の桁、A-reg に1の桁が入ります(やっていることは筆算の計算と同様)
エミュレータではなく、(ワザワザ)実機CP/M上のZSIDで動作確認しています ^^
|
WordMaster内の1文字出力処理である OUTCHR のアドレスを確認したら相対ジャンプ到達範囲内だったので関数末尾の OUTCHRコールは相対ジャンプ化しました。
ESC+'[' の出力をサブルーチン化する等して細切れの使用可能領域に断片的にコードを埋め込み、とうとう完成と思ったところ、ESC+'[2J'での画面クリアではカーソルがホームに戻らないので画面が乱れることが判明・・・orz
もうこれ以上の処理は入らないと諦めかけたましたが、メモリダンプを見たところ、パッチ領域の直前がメッセージのアスキーデータ領域であることに気づき、メッセージの最後の部分の領域を若干拝借してコードを埋め込みました。 ^^;;
hexファイルのパッチ適用操作は下記の操作ログを参照してください。(シリアルNoをつぶして悪さしているみたいだけどそうじゃないよ)
|
WordMasterのカーソルが最上位行での上スクロール時の再描画ぶりを久々に見れて懐かしい・・^^
無事WordMasterが動作したことを記念してキャプチャを貼っておきます。
また、カスタマイズしたパッチソース(macro-80用)とヘキサファイルは下記からダウンロードしてください。
スクリーンの行数を24から32に変更しています(32行の画面じゃないと上スクロール時に画面が乱れます)
※2018/03/18 コメントに書いたように単純ループ式に変更しました。
WordMaster画面 |
|
★追記 2020/12/04
24行モードに変更するパッチ適用方法(下記)を追記しました。
24行モードに変更するパッチ適用方法 |
---|
b>a:ddt wmm.com DDT VERS 2.2 NEXT PC 2700 0100 -s1b9 01B9 20 18 01BA 50 . -g0 b>save 38 wmm.com |
[TOP] [ 前へ ] 連載記事 [ 次へ ]
レトロマイコンZ80ボードの構想(その13)CP/M80 boot成功 [Z80]
前回の記事でRESETでのHALT抜け方式でBIOS内コンソール関連の機能確認が出来たのでREAD/WRITEを追加しBIOSを仕上げました。
また、「レトロマイコンZ80ボードの構想(その9)CP/M80 BIOS」の記事の最後の方でbootはPIC内のフラッシュメモリから展開するようなことを書きましたが、PIC側のI/O不足対策により、PIC側からアクセスできる外部メモリの範囲は 0x0000 - 0x07ff, 0xf800 - 0xffff になったのでPIC内フラッシュからの展開はやめて先頭セクタにIPLを入れたCP/M本来の形式にしました。
IPLはこんな感じです。
PicCPM用のIPL(Z80アセンブラ)
★2018/03/15 追記 iplの版数が古かったので差し換えました^^;
前回の記事のBIOS試験の延長でIPLを読込み起動してみたところ、多少のゴニョゴニョした作業はあったものの CP/M の初起動に成功しました。(^^)/
picle言語で色々確認後、最終的にはC言語に置き換えようかと思っていましたが、picle言語だけでCP/M起動までできてしまいました。^^
初起動の様子が下の表示です。IPL試験用のpicleのリスト表示後、runコマンドで実行しています。IPLのロード状態確認のためにメモリダンプ表示後、Z80にリセットをかけてIPLを実行させています。
ディバッグ用の表示のコメントアウトがあったり、少し生々しい状態で今後整理が必要ですがCP/M 初ブート記念として貼っておきます。
IPL試験・・CP/Mが起動した(picle言語)
ついでにブレッドボードの写真も貼っておきます(写真で見るとメッチャ汚い・・冷静に見たら肉眼で見ても汚いw)。
使用しているICは Z84C0020PEC(Z80 20MHz:40-Pin DIP)、HM628128ALP-7(128Kbytes SRAM:32-Pin DIP)、PIC24FJ64GA004(44-Pin TQFP) の3個でTTL等は使っていません。右下の緑の基板はSDカードホルダ基板です。
SDカードはSDHCタイプの16GBのものを使っています。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
また、「レトロマイコンZ80ボードの構想(その9)CP/M80 BIOS」の記事の最後の方でbootはPIC内のフラッシュメモリから展開するようなことを書きましたが、PIC側のI/O不足対策により、PIC側からアクセスできる外部メモリの範囲は 0x0000 - 0x07ff, 0xf800 - 0xffff になったのでPIC内フラッシュからの展開はやめて先頭セクタにIPLを入れたCP/M本来の形式にしました。
IPLはこんな感じです。
|
前回の記事のBIOS試験の延長でIPLを読込み起動してみたところ、多少のゴニョゴニョした作業はあったものの CP/M の初起動に成功しました。(^^)/
picle言語で色々確認後、最終的にはC言語に置き換えようかと思っていましたが、picle言語だけでCP/M起動までできてしまいました。^^
初起動の様子が下の表示です。IPL試験用のpicleのリスト表示後、runコマンドで実行しています。IPLのロード状態確認のためにメモリダンプ表示後、Z80にリセットをかけてIPLを実行させています。
ディバッグ用の表示のコメントアウトがあったり、少し生々しい状態で今後整理が必要ですがCP/M 初ブート記念として貼っておきます。
|
ついでにブレッドボードの写真も貼っておきます(写真で見るとメッチャ汚い・・冷静に見たら肉眼で見ても汚いw)。
使用しているICは Z84C0020PEC(Z80 20MHz:40-Pin DIP)、HM628128ALP-7(128Kbytes SRAM:32-Pin DIP)、PIC24FJ64GA004(44-Pin TQFP) の3個でTTL等は使っていません。右下の緑の基板はSDカードホルダ基板です。
SDカードはSDHCタイプの16GBのものを使っています。
PicCPM実験用Z80ブレッドボード |
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]
レトロマイコンZ80ボードの構想(その12)CP/M80 BIOS検討4 [Z80]
前回の記事「レトロマイコンZ80ボードの構想(その11)CP/M80 BIOS検討3」でBUSACK/信号のチェックは省略可能なことが判り、Z80と接続する信号はほぼ決まったのでPICとZ80とのソフトインターフェースについて動作検証してみました。
PIC側で使用するI/O数を削減するため、Z80からのサービスコール時のHALTの脱出は NMI(またはINT)ではなく、RESETを使用することにします。
NMIを使う場合は66HのコードをRETNコードに書き換えてからHALTします。RESETの場合は0000Hから実行が開始するので0000HのコードをJP XXXXに書き換えてもいいのですが、処理簡略化(かつ高速化)のためにJP (HL):0E9H に書き換えます。
NMI方式と比較し、スタック操作がなく、書き換えが1バイト(NMI方式は2バイト)なので若干ですが処理が簡易かつ高速になります(NMIのための制御出力が不要であることが最大のメリット)。
ディメリットとしてはRESETにより割込み用FFと割り込みモードがクリアされるという点がありますが、今回のように割込みを使わない場合は問題ありません。
Z80がPIC側のサービスを受ける際の手順の概要としては次のようになります(下記のサンプルソースでは「PIC_SRV」部分)
PIC側の処理手順は次のようになります(下記のサンプルソースでは「 PicSrv()」部分)
動作検証としてCP/MのBIOSにもあるコンソール入出力関連の処理を実験した際の信号サンプルが下のキャプチャです。
キーセンスの繰り返し処理の部分を1周期分抜き出したものです。
Z80側はキー入力状態をチェックする短いループ処理であるということもありますが、PIC側の処理時間(BUSREQ/がLOWの期間)がZ80の3倍弱程度(PIC側の7割程度が外部メモリアクセスの処理)になっています。
Z80は16MHz、PICは32MHzで動作しています。PIC側はPMPを使っているものの内部のメモリに展開しながらの外部メモリアクセスなので時間がかかっていますが、PIC側もアセンブラで書けば外部メモリアクセス部を数倍程度高速化できると思います。
Z80側のソースは次のとおりです。
「Start」と表示後、キー入力状態をチェックし、キー入力があった場合には入力データを読込み16進で表示します。
RESETによるBIOS処理実験(Z80:アセンブラ)
PIC側では上記のZ80のアセンブル結果のバイナリファイルを MemWr() での書込み処理に変換するツールを作り、picleソース内に取り込んでいます。
PIC側でのリスト表示と実行結果を下記に示します。
末尾にある「pushed」の部分は '1'、'2'、'3'のキー入力をした結果です。
RESETによるBIOS処理実験(PIC側:picle言語)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
PIC側で使用するI/O数を削減するため、Z80からのサービスコール時のHALTの脱出は NMI(またはINT)ではなく、RESETを使用することにします。
NMIを使う場合は66HのコードをRETNコードに書き換えてからHALTします。RESETの場合は0000Hから実行が開始するので0000HのコードをJP XXXXに書き換えてもいいのですが、処理簡略化(かつ高速化)のためにJP (HL):0E9H に書き換えます。
NMI方式と比較し、スタック操作がなく、書き換えが1バイト(NMI方式は2バイト)なので若干ですが処理が簡易かつ高速になります(NMIのための制御出力が不要であることが最大のメリット)。
ディメリットとしてはRESETにより割込み用FFと割り込みモードがクリアされるという点がありますが、今回のように割込みを使わない場合は問題ありません。
Z80がPIC側のサービスを受ける際の手順の概要としては次のようになります(下記のサンプルソースでは「PIC_SRV」部分)
- ワークエリアにサービスIDとサービス処理に必要なパラメータを設定
- 0000Hのコード(多くの場合、0C3H(=JP XXXX)))を保存
- HLレジスタにHALTの次のアドレスを設定
- 0000Hに0E9H(=JP (HL))を設定
- HALT実行
- 0000Hを元のコードに戻す
- ワークエリアからPICが設定した処理結果を参照
PIC側の処理手順は次のようになります(下記のサンプルソースでは「 PicSrv()」部分)
- Z80がHALT状態になるまで待つ
- BUSREQ/をアクティブ(アサート)にしBUSの制御権を得る
- サービスIDとパラメータに従い処理し、結果をワークエリアに保存する
- RESETをアクティブにする
- BUSREQ/をインアクティブ(ディアサート)にする
- RESETをインアクティブにする
動作検証としてCP/MのBIOSにもあるコンソール入出力関連の処理を実験した際の信号サンプルが下のキャプチャです。
キーセンスの繰り返し処理の部分を1周期分抜き出したものです。
Z80側はキー入力状態をチェックする短いループ処理であるということもありますが、PIC側の処理時間(BUSREQ/がLOWの期間)がZ80の3倍弱程度(PIC側の7割程度が外部メモリアクセスの処理)になっています。
Z80は16MHz、PICは32MHzで動作しています。PIC側はPMPを使っているものの内部のメモリに展開しながらの外部メモリアクセスなので時間がかかっていますが、PIC側もアセンブラで書けば外部メモリアクセス部を数倍程度高速化できると思います。
Z80からPICへのサービス要求処理時の信号サンプル |
|
Z80側のソースは次のとおりです。
「Start」と表示後、キー入力状態をチェックし、キー入力があった場合には入力データを読込み16進で表示します。
|
PIC側では上記のZ80のアセンブル結果のバイナリファイルを MemWr() での書込み処理に変換するツールを作り、picleソース内に取り込んでいます。
PIC側でのリスト表示と実行結果を下記に示します。
末尾にある「pushed」の部分は '1'、'2'、'3'のキー入力をした結果です。
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]
レトロマイコンZ80ボードの構想(その11)CP/M80 BIOS検討3 [Z80]
前回の記事「レトロマイコンZ80ボードの構想(その10)CP/M80 BIOS検討2」で書いたようにPIC側で使用するI/O数を節約するため BUSACK/ のチェックを省略できるか確認してみました。
まずは Z80 の仕様を確認するため、本棚から「保存版・Z80の徹底研究」の特集記事が掲載されているトラ技を引っ張り出してきました ^^
このトラ技には「サッポロシティ・スタンダードのすべて」の特別企画も掲載されていて思わず読みふけってしまいましたw
広告付きで保存しているので MZ-80C の広告も載っています ^^
「応用CP/M」等の本もずっと持っていたのですが数年前に捨ててしまったので今はありません ^^;(CP/Mを動かそうとする日が来るとは思ってもいなかった・・)
BUSREQ/の話に戻るとBUSREQ/は各マシンサイクルの最後のステート(ここでいうステートはクロック1周期分)の立上りでサンプリングされ次のマシンサイクルでbusを開放すると記載されています。
今回は HALT 状態の時にBUSREQ/をアクティブにするので最悪ケースはサンプリング直後にBUSREQ/を出した場合で5ステート分待てば問題ないはずです(HALT命令は4ステート)。
但し、前回の実験でHALT状態では次の命令のフェッチを繰り返しているのでHALTの次にはNOP(これも4ステート)を置いておくことにします。
★2018/03/02 追記 {
気になったのでHALTの次のコードの影響を確認してみました。具体的には
076h HALT ; 1 マシンサイクル、4 ステート
0f9h LD SP,HL ; 1 マシンサイクル、6 ステート
HALT命令を実行しHALT状態になった後、「LD SP,HL」のフェッチを行いますが、4 ステートでマシンサイクルを完了していました。マニュアルに書いてあった「HALT状態では内部でNOPを実行している」とはこのこと(M1サイクルもNOPと同じ)のようです。
従ってHALTの後にNOPは不要ということになります。HALTの次のコードを実行していないのだから当然といえば当然ですね。
}
Z80は16MHzで動かしているので5クロックは0.3125usになります。
実際にBUSREQ/からBUSACK/までの時間を10回程、測定した結果が下表です。(ロジアナは100MHzサンプリングなので解像度は10ns)
また、測定時のロジアナ画面のサンプルも貼っておきます。
表 BUSREQ/ -> BUSACK 応答時間測定結果
PIC24FJ64GA004のピンアサインも数ヶ所見直しました。
★2018/05/05 変更 ピンアサイン表をアップデート
★2018/07/01 変更 ピンアサイン表をアップデート(OBL部更新)
あれ・・BIOS検討という副題なのにBIOS検討まで進まなかった・・・^^;
[TOP] [ 前へ ] 連載記事 [ 次へ ]
まずは Z80 の仕様を確認するため、本棚から「保存版・Z80の徹底研究」の特集記事が掲載されているトラ技を引っ張り出してきました ^^
トラ技 Z80保存版 |
|
このトラ技には「サッポロシティ・スタンダードのすべて」の特別企画も掲載されていて思わず読みふけってしまいましたw
広告付きで保存しているので MZ-80C の広告も載っています ^^
「応用CP/M」等の本もずっと持っていたのですが数年前に捨ててしまったので今はありません ^^;(CP/Mを動かそうとする日が来るとは思ってもいなかった・・)
BUSREQ/の話に戻るとBUSREQ/は各マシンサイクルの最後のステート(ここでいうステートはクロック1周期分)の立上りでサンプリングされ次のマシンサイクルでbusを開放すると記載されています。
今回は HALT 状態の時にBUSREQ/をアクティブにするので最悪ケースはサンプリング直後にBUSREQ/を出した場合で5ステート分待てば問題ないはずです(HALT命令は4ステート)。
但し、前回の実験でHALT状態では次の命令のフェッチを繰り返しているのでHALTの次にはNOP(これも4ステート)を置いておくことにします。
★2018/03/02 追記 {
気になったのでHALTの次のコードの影響を確認してみました。具体的には
076h HALT ; 1 マシンサイクル、4 ステート
0f9h LD SP,HL ; 1 マシンサイクル、6 ステート
HALT命令を実行しHALT状態になった後、「LD SP,HL」のフェッチを行いますが、4 ステートでマシンサイクルを完了していました。マニュアルに書いてあった「HALT状態では内部でNOPを実行している」とはこのこと(M1サイクルもNOPと同じ)のようです。
従ってHALTの後にNOPは不要ということになります。HALTの次のコードを実行していないのだから当然といえば当然ですね。
}
Z80は16MHzで動かしているので5クロックは0.3125usになります。
実際にBUSREQ/からBUSACK/までの時間を10回程、測定した結果が下表です。(ロジアナは100MHzサンプリングなので解像度は10ns)
また、測定時のロジアナ画面のサンプルも貼っておきます。
No. | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Max | Time[us] | 0.20 | 0.14 | 0.20 | 0.26 | 0.27 | 0.14 | 0.26 | 0.21 | 0.21 | 0.21 | 0.27 |
---|
BUSREQ/ -> BUSACK/ 応答波形サンプル |
|
PIC24FJ64GA004のピンアサインも数ヶ所見直しました。
- SDカード状態信号読込み
BUSACK/の入力が不要になったのでSDカードの装着状態の入力に変更
- SDカード用SDI
SDカードからの出力信号なのでアドレス線とぶつかるのはまずい。抵抗を入れたりして調整可能だと思うけど不安定要素は少なくしたいのでNMI出力を廃止してSDカード用に変更
- OneBitLoader
PMD6と兼用にしていたが、データ線はZ80が出力状態にもなるのでローダー動作が不安定。とりあえずUARTのTXと兼用にした。ブートローダーを1線式ではなく、2線式にすればそのままUARTの通信を利用したローダーに変更可能(でも作業としては後回し)
ピンアサイン表(変更版) |
|
★2018/05/05 変更 ピンアサイン表をアップデート
★2018/07/01 変更 ピンアサイン表をアップデート(OBL部更新)
あれ・・BIOS検討という副題なのにBIOS検討まで進まなかった・・・^^;
[TOP] [ 前へ ] 連載記事 [ 次へ ]