SS-BLOGの2025年3月末でのサービス終了に伴い
本ブログは https://piclabo.seesaa.net へ移行します |
X(Twitter)での今年(2024年)の振り返り [日記]
1.はじめに
もう数時間で今年(2024年)も終わろうとしていますが、日記を書かない私にとってはX(Twitter)への投稿したメッセージが過去を振り返るのに適した媒体かもしれません。ブログもありますが発信頻度から言ってXに敵いません。今年を振り返るといっても長々と書くのも何なので勝手に賞を決め、自分で選定してみたいと思います。
2.いいね貰ったで賞
私のポストは全体的に「いいね」の数は少ない傾向なのですが今年の過去のポストからいいねを多く貰ったポストを拾ってみますw
尚、以降に記載のポスト内容では画像をクリックするとX(Twitter)の該当ポストに飛びます。
■第一位
栄光ある第一位のポストは ・・・ ジャーン
趣味の工作の作品関連ではなくorz、なんとTシャツに関するポストでしたw
※2024年12月31日時点でいいねカウントは467
いいね貰ったで賞 第一位 |
---|
おぉ~Z80版があれば欲しいかも・・ |
![]() |
■第二位
惜しくも次点になったのはアセンブラを使ってMSXでアメリカンハットを最も高速に描画したポストでした。
※2024年12月31日時点でいいねカウントがキリ番の128
いいね貰ったで賞 第二位 |
---|
メキシカンハットの高速化ために16bit固定小数点演算(COSはテーブル引き)を使い全体をアセンブリ言語化してみました 更にMSXturboRに搭載されているR800の符号無し16bit乗算命令を利用するように変更 結果、実行時間は2秒程度まで短縮されました |
![]() |
■第三位
第三位はポケコン用の自作の拡張メモリの頒布を周知するためのメッセージでした。海外の人からも注文がありました。
※2024年12月31日時点でいいねカウントは43
いいね貰ったで賞 第三位 |
---|
ポケコン(PC-G850)でCP/Mを動かせるようになる増設メモリボードのEborsyEEPが長い間品切れ状態でしたがエッジコネクタを入手できやっと補充出来ました(価格を若干見直しました^^;) 個数は多くありませんが宜しくお願い致します |
![]() |
既にカウントが二桁台ですね^^;
3.褒められたで賞
更に希少な褒められたポストを探してみましたw
この一年で最も褒められたポストは・・・・
Z80でAregの値によりリターン値を決定する課題で分岐無しで実現したポストで少し褒められました^^
褒められたで貰 |
---|
この変換処理は11バイトが最短という結果でした すごいですね 処理の流れを見ると最短処理の特徴が見えてきます 別領域からの検討として時間切れで途中だった変換式の探索をやってみました 8bit処理では結果40Hのデータを連続化する必要があるようです 更に短い式もあるかも・・気が向けば再検討します |
![]() |
全ての引用ポストを見る |
ん~、予想したとおり企画倒れ感がしますが、それでは皆様良いお年を
GAME言語で作った簡易モニタ(Gamon)(その2)ステップ機能 [Z80]
1.はじめに
「HD64180Compact(その8)Z80未定義命令のエミュレーション」の記事で書いたように敏雪さん作の HD64180 用デバッグモニタ(H18MON)を使用したところ、「やはりステップ動作できるのは便利だなぁ」と感じました。ステップ動作の実装に興味が湧いてきたので「GAME言語で作った簡易モニタ(Gamon)」で書いた自作の簡易モニタに実験的にステップ機能を実装してみました。
2.ステップ機能の実装
ステップ動作するにはプログラムカウンタ(以降、PCと記す)のアドレスにある命令を実行後にブレークする必要があるのでコードから命令長を求める処理が必要です。このステップアドレス関連処理(以降、StepAdと記す)をアセンブラで作成しました。
はじめはPCとフラグの値くらいを StepAd に渡せばいいだろうと安易に考えていましたが「DJNZ」命令では次の PC を求めるためにBレジスタの値が必要ですし、「JP (HL)」ではHLレジスタペアの値が必要になります。最終的には StepAd 処理へはモニタが保持しているレジスタ情報の保存場所のアドレスを渡すことにしました。
コード短縮の最適化はしていませんがコーディング段階で短いコードになるように配慮した結果、0xcb,0xed,0xdd,0xfd 関連の Z80 で拡張された命令はまだ網羅的には実装していませんが、StepAd 処理のコード長はほぼ 256 バイトに収まりしました。
ニーモニックの文字情報が不要なのでディスアセンブラよりはコンパクトになりますが、条件ジャンプの実行後のアドレス算出等、よりCPUの動作に近い処理が必要になります。
3.ステップ機能の評価
作成した StepAd 処理の 0x00~0xff のコードに対する動作の確認を行った後、Gamon に実装して簡単な処理で実際に動作を確認してみました。確認用の処理をどれにするか迷いましたがゲーム開発業界で有名な内藤さんの「 除算アルゴリズム」のブログ記事で紹介して頂いた1バイト除算処理を使いました。
ステップ機能確認用の除算処理 |
![]() |
下図が Gamon に実装したステップ機能を実行しているサンプル画面です。しっかり動いているみたいですね。
ステップ機能実行例 |
![]() |
4.まとめ
今回は興味本位からGAME言語で作成した自作モニタ(Gamon)にステップ実行機能を実験的に実装して動かしてみました。ステップ実行後のアドレス算出等の処理はGAME言語では厳しいのでアセンブラを使ってみた結果、Z80の拡張命令等はフル実装ではありませんがサイズは256バイト程でした。
しかしまぁ、21世紀も1/4が過ぎようとしている昨今、Z80のステップ処理をコーディングしている人が世界に何人いるのか知りたいものですね。もしかして一人だったりして・・w
★追記 2024/12/24
Z80 で拡張された 0xcb,0xed,0xdd,0xfd 系の命令(IX/IYバイト分割の未定義命令を含む)に対応した結果、アドレス算出処理は
★追記 2024/12/25
フラグ関連で検索していた際にたまたま Yahoo QA での「Z80のVフラグについて」の回答で
LD A,33H
SUB 0FFH
の結果、「Vフラグがセットされる」との回答を見かけ???となった。
早々に出来立てのステップ機能で確認した結果が下図です。Z80のVフラグはPフラグと共用でPフラグは Areg が偶数の時に1になるのでVフラグが1の時はフラグには'E'と表示されます。
Gamonでの確認結果 |
![]() |
念のためにCP/MのZSIDでも確認して見ました。下図が確認結果で上図のGamonの結果と同じです。
しかし、TコマンドのUIがGamonとZSIDで異なることが判明しました。Tコマンド実行時に表示されるレジスタはZSIDが実行前のものであるのに対してGamonでは実行後の値です。慣れてしまったせいもあるかもしれませんがGamon方式の方が見易く感じます。
ZSIDでの確認結果 |
![]() |
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
HD64180Compact(その9)PCBへの部品実装 [Z80]
1.はじめに
「HD64180Compact(その7)PCB化」の記事で書いた HD64180Compact のプリント基板が製造依頼先から届いたので部品を実装し、動作確認しましたので記録しておきます。
2.プリント基板への部品実装
HD64180Compact のプリント基板が着荷したので部品を実装し動作確認しました。今回設計した HD64180Compact のプリント基板が下の写真です。見た目を重視して DIP IC は全てトップ面に配置しました。また、動作しない際に確認の手間が掛からないように主要な制御信号をピンヘッダのフットプリントに出したこと、及び大きな面積を占める HD46180 の直下(ソケットの内側)には部品を配置しないことの2点を考慮しました。
部品実装後が下の写真です。トップ面の左下の8ピンの空きパターンは SD カードの代わりにシリアル EEPROM をストレージとして使用可能にするためのものです。チップ抵抗は手持ちの関係で 0603 と 0805 が混在しています。「HD64180Compact(その2)開発機完成」の記事で書いたようにポリウレタン線で結線した開発用のボードの作成には時間が掛かりましたが、プリント基板だとあっという間に完成し楽でいいですね。
3.一発では動作せず
電源系がショートしていないこと等の簡易的な確認を行った後に USB ケーブルを接続してみたところ、電源モニタ用の LED は点灯しましたが、TeraTerm には全く反応がありませんでした。デバイスマネージャで確認するとシリアルデバイスとしては認識されているようです。
こうなると表面実装のプリント基板はやや面倒です。しかし、今回は前述したように動作確認用に基本的な制御信号もピンヘッダ用ホールに出していて、X(Twitter)で見かけた技を真似てピンヘッダのホールに釣り糸を通すことでブレッドボード用の線材を固定できロジアナでの確認が割合楽に行えました。
下図が無反応時のロジアナ画面のキャプチャに HD64180 が実行している命令を追記したものです。尚、これらの命令は PIC がデータバス上に出力しています。
リセット後にI/O命令を2回実行して最小限のレジスタ設定を行った後に INI命令でアプリケーションを HD64180 のメモリ内にロードするのですが、最初のINI命令で止まっていました。PIC 側のソースと突合してみると HD64180 の ME/(Z80のMREQ/相当)がアクティブになるまで待つ部分で止まっているので ME/ 信号を接続するチップ抵抗(R23)を確認したところ基板と垂直方向に若干傾いていて片側が導通していない状態でしたorz
事前に目視確認も行ったのですが、今回のこのチップ抵抗の不具合の状態は正面からの目視では発見できず、敢えて横から見ないと判り辛い状態(目が滅茶良かったら検出できた?)だと思います。
4.プリント基板が無事動作
上記のチップ抵抗を修正後、無事動作しました(^^)/
下図は前回の記事で書いた TRAP を使った Z80 の未定義命令のエミュレーション機能のチェックプログラムを自作のモニタで実行している様子です。
プリント基板が完成した記念に手配線の開発用基板の写真(再掲)と今回完成したプリント基板を並べてみました。
プリント基板はサイズが半分程になっていますね。この小さなプリント基板で RAM が512Kバイトのフル実装でクロックは6MHzのノーウェイトで動きます。SDカードを利用して CP/M も立ち上がるので当時の HD64180 の自作基板とは隔世の感がありますね。
PIC への書き込みやロジアナでの信号確認は開発用基板の方が楽なので今後も開発用基板が活躍する場面がありそうです。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
「HD64180Compact(その7)PCB化」の記事で書いた HD64180Compact のプリント基板が製造依頼先から届いたので部品を実装し、動作確認しましたので記録しておきます。
2.プリント基板への部品実装
HD64180Compact のプリント基板が着荷したので部品を実装し動作確認しました。今回設計した HD64180Compact のプリント基板が下の写真です。見た目を重視して DIP IC は全てトップ面に配置しました。また、動作しない際に確認の手間が掛からないように主要な制御信号をピンヘッダのフットプリントに出したこと、及び大きな面積を占める HD46180 の直下(ソケットの内側)には部品を配置しないことの2点を考慮しました。
HD64180CompactのPCB(トップ面) | HD64180CompactのPCB(ボトム面) |
![]() |
![]() |
部品実装後が下の写真です。トップ面の左下の8ピンの空きパターンは SD カードの代わりにシリアル EEPROM をストレージとして使用可能にするためのものです。チップ抵抗は手持ちの関係で 0603 と 0805 が混在しています。「HD64180Compact(その2)開発機完成」の記事で書いたようにポリウレタン線で結線した開発用のボードの作成には時間が掛かりましたが、プリント基板だとあっという間に完成し楽でいいですね。
部品実装後(トップ面) | 部品実装後(ボトム面) |
![]() |
![]() |
3.一発では動作せず
電源系がショートしていないこと等の簡易的な確認を行った後に USB ケーブルを接続してみたところ、電源モニタ用の LED は点灯しましたが、TeraTerm には全く反応がありませんでした。デバイスマネージャで確認するとシリアルデバイスとしては認識されているようです。
こうなると表面実装のプリント基板はやや面倒です。しかし、今回は前述したように動作確認用に基本的な制御信号もピンヘッダ用ホールに出していて、X(Twitter)で見かけた技を真似てピンヘッダのホールに釣り糸を通すことでブレッドボード用の線材を固定できロジアナでの確認が割合楽に行えました。
下図が無反応時のロジアナ画面のキャプチャに HD64180 が実行している命令を追記したものです。尚、これらの命令は PIC がデータバス上に出力しています。
無反応時のロジアナ画面 |
![]() |
リセット後にI/O命令を2回実行して最小限のレジスタ設定を行った後に INI命令でアプリケーションを HD64180 のメモリ内にロードするのですが、最初のINI命令で止まっていました。PIC 側のソースと突合してみると HD64180 の ME/(Z80のMREQ/相当)がアクティブになるまで待つ部分で止まっているので ME/ 信号を接続するチップ抵抗(R23)を確認したところ基板と垂直方向に若干傾いていて片側が導通していない状態でしたorz
事前に目視確認も行ったのですが、今回のこのチップ抵抗の不具合の状態は正面からの目視では発見できず、敢えて横から見ないと判り辛い状態(目が滅茶良かったら検出できた?)だと思います。
4.プリント基板が無事動作
上記のチップ抵抗を修正後、無事動作しました(^^)/
下図は前回の記事で書いた TRAP を使った Z80 の未定義命令のエミュレーション機能のチェックプログラムを自作のモニタで実行している様子です。
拡張命令エミュ試験実行時の画面 |
![]() |
プリント基板が完成した記念に手配線の開発用基板の写真(再掲)と今回完成したプリント基板を並べてみました。
手配線の開発用基板 | 完成したプリント基板 |
![]() |
![]() |
開発基板とプリント基板 |
![]() |
※追記 2024/12/30 |
プリント基板はサイズが半分程になっていますね。この小さなプリント基板で RAM が512Kバイトのフル実装でクロックは6MHzのノーウェイトで動きます。SDカードを利用して CP/M も立ち上がるので当時の HD64180 の自作基板とは隔世の感がありますね。
PIC への書き込みやロジアナでの信号確認は開発用基板の方が楽なので今後も開発用基板が活躍する場面がありそうです。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
HD64180Compact(その8)Z80未定義命令のエミュレーション [Z80]
1.はじめに
前回の記事で書いた HD64180Compact のプリント基板は製造依頼先からもうすぐ届く予定で、久々に HD64180Compact を弄ってみました。
このタイミングで X(Twitter)のTLで HD64180 は Z80 にあった IX、IY をバイト分割した未定義命令が使えないので好きではないというようなメッセージを見かけました。そこで HD64180 の TRAP 機能を利用して未定義命令のエミュレーション実験を行ってみましたので記録しておきます。
2.HD64180 界隈の状況
HD64180 は未定義命令で TRAP をかけられるのでこれを利用して未定義命令をエミュレートすることが可能です。しかしウィキペディアの HD64180 のページには下記のような記述があります。
このような状況であり、ネットで HD64180 の TRAP を利用したコードを探してみましたが殆ど見つかりませんでした。
3.HD64180 のTRAP
未定義命令で発生する HD64180 の TRAP 動作の概要は
参考として ITC レジスタのビット構成を下図に示します。
4.未定義命令エミュレーション機能の実装
未定義命令と言っても多種あるのですが、今回は Z80 での高速化で使用するであろう下記の命令をエミュレート対象としました。
実際にエミュレーションするコードを作ってみると成程これでは遅いと言わざるを得ません。Z80 で未定義命令を使ってまで高速化したい部分がエミュレートすることで遅くなるのは致命的と言えるかもしれませんね。
5.実装したエミュレーション機能の試験
Z80 の未定義命令を駆使してガチガチに最適化されたコードで今回作成したエミュレーションの速度評価をしたいところですが、I/Oの殆どない今の環境で動作するようなコードは見つかりませんでした。πの算出処理等が良さそうですが「Z80 で円周率を計算」では未定義命令は一切使わない方針のようです。
速度評価は今後の課題として実装した未定義命令のエミュレーション機能を試験する簡単なプログラム(下図参照)を作成して動作を確認してみました。
「HD64180Compact(その4)ディバッグモニタ」の記事で紹介した敏雪さん作の HD64180 用ディバッグモニタ(H18MON)を使って動作確認してみました。確認結果の画面キャプチャが下図で問題なく動作しているようですね。
下図は今回のプログラムにパッチを当てて EX DE,IX 命令の動作を拡張命令のエミュ環境で確認した際の画面キャプチャです。見辛いですが 8100H は TRAP 処理の先頭アドレスなので EX DE,IX で TRAP が発生していることが確かめられ、その後に 8018H のブレークで DE と IX が入れ替わっています。
}
★追記 2024/12/26 {
「GAME言語で作った簡易モニタ(Gamon)(その2)ステップ機能」の記事で書いたようにGAME言語で作成したデバッグモニタにステップ機能を追加したので HD64180 の CPU 上で前述の
「未定義命令エミュレーション機能の試験プログラム」をステップ動作してみました。メモリアサインの関係で開始アドレスを 4000H に変更し、トレース結果を見易くするために PUTS 処理の先頭を RET 命令に書き換えています。
処理の最後のリターン命令がある 4049H にブレークを設定し、多めのトレース回数を指定し、トレースを実行するとブレークに達した時点で停止し、途中のレジスタ状態が全て表示されます。Z80で実行した場合と比較し、動作は同じでしたがフラグ内の未定義の2つのビット(28H)に差異が発生しました。
下記のようにZ80で「OR L」と「OR IXL」を実行してみると同様の差異が発生することも確認しました。
}
エミュ環境と Z80 の環境で計測した結果が以降に貼った画面キャプチャです。クロックの差も加味した実行時間比率(HD64180/Z80)は
16倍( = 111.5s / 2.1s * 6MHz / 20MHz )
となりました。しかし、実際のアプリケーションでは必ずループ内で処理を行うのでこの実処理とループ全体の処理の比率によってエミュ環境での速度評価が変わってきます。「HD64180Compact(その6)16bit乗算処理」の記事での評価からZ80 と HD64180 の速度差としては HD64180 の方が 1.10 ~ 1.26 倍速いという結果だったので仮に HD64180 が 1.2 倍速く、「ループ内の実処理/ループ全体」の比率を rと仮定すると Z80 と HD64180 のエミュ環境が同等の速度になるのは
r / 1.2 + (1 - r)*16 = 1
⇒ r = 99%
結果としてインデックスをバイト分割してループ制御に使用した場合、ループ内の実処理がループ全体の99%以上であれば、エミュ環境が Z80 と同等以上の速度になるということになります。因みに上記の等式で右辺が2(HD64180側が半分の速さ)になるのは r=92% でループ処理の約9割が実処理の場合となりこれくらいの比率になるケースの頻度は高そうな気もします。
判ってはいましたがエミュ環境は速度面では厳しいです。1命令実行毎のトラップも掛けられたらもっと高速なエミュレートが可能なのですが無いものねだりですね。
下図は Z80 環境でのループ時間測定画面です。
7.未定義命令エミュレーション機能のソース
今回作成した未定義命令エミュレーション機能のソースも張っておきます。上記のテスト処理も含まれています。実行した環境のCPUは HD64180RP8 です。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
前回の記事で書いた HD64180Compact のプリント基板は製造依頼先からもうすぐ届く予定で、久々に HD64180Compact を弄ってみました。
このタイミングで X(Twitter)のTLで HD64180 は Z80 にあった IX、IY をバイト分割した未定義命令が使えないので好きではないというようなメッセージを見かけました。そこで HD64180 の TRAP 機能を利用して未定義命令のエミュレーション実験を行ってみましたので記録しておきます。
2.HD64180 界隈の状況
HD64180 は未定義命令で TRAP をかけられるのでこれを利用して未定義命令をエミュレートすることが可能です。しかしウィキペディアの HD64180 のページには下記のような記述があります。
Wikipedia HD64180 からの抜粋 最終更新 2024年4月5日 (金) 08:15 |
---|
理屈としては、必要に応じてエミュレーションプログラムに処理を移し、スタックポインタの値から、不正命令によるトラップを起こしたコードを読み取って同等な処理を実行するサブルーチンを呼び出すことは可能である。しかしながら、それを実現するためのクロック数は、未定義命令を直接実行できる従来のZ80よりもはるかに増える。 ・ ・ 未定義命令の部分も書きなおせばよく、HD64180によるZ80未定義命令のエミュレーションは、実用的とは言えない。 |
このような状況であり、ネットで HD64180 の TRAP を利用したコードを探してみましたが殆ど見つかりませんでした。
3.HD64180 のTRAP
未定義命令で発生する HD64180 の TRAP 動作の概要は
- ITC レジスタの TRAP ビットを立て、TRAP が発生した箇所に応じて UFO ビットを設定する
UFO = 0 : 2番目のオペコードで発生
UFO = 1 : 3番目のオペコードで発生
- 未定義オペコードのアドレスをスタックに退避し、論理アドレスの0000Hへジャンプ
参考として ITC レジスタのビット構成を下図に示します。
HD64180 のITCレジスタ 日立のデータシート「HD64180R/Z」から抜粋 |
![]() |
4.未定義命令エミュレーション機能の実装
未定義命令と言っても多種あるのですが、今回は Z80 での高速化で使用するであろう下記の命令をエミュレート対象としました。
- レジスタ間ロード命令 ex. LD A,IXL
- 演算命令 ex. OR IXL
- INC/DEC命令 ex. DEC IXL
- 直値ロード命令 ex. LD IXL,23H
実際にエミュレーションするコードを作ってみると成程これでは遅いと言わざるを得ません。Z80 で未定義命令を使ってまで高速化したい部分がエミュレートすることで遅くなるのは致命的と言えるかもしれませんね。
5.実装したエミュレーション機能の試験
Z80 の未定義命令を駆使してガチガチに最適化されたコードで今回作成したエミュレーションの速度評価をしたいところですが、I/Oの殆どない今の環境で動作するようなコードは見つかりませんでした。πの算出処理等が良さそうですが「Z80 で円周率を計算」では未定義命令は一切使わない方針のようです。
速度評価は今後の課題として実装した未定義命令のエミュレーション機能を試験する簡単なプログラム(下図参照)を作成して動作を確認してみました。
未定義命令エミュレーション機能の試験プログラム |
![]() |
「HD64180Compact(その4)ディバッグモニタ」の記事で紹介した敏雪さん作の HD64180 用ディバッグモニタ(H18MON)を使って動作確認してみました。確認結果の画面キャプチャが下図で問題なく動作しているようですね。
試験プログラムの実行結果 |
![]() |
★追記 2024/12/14 {
少し意外だったのが Z80 において DE と HL を交換する命令に対応するインデックスレジスタ命令(例 EX DE,IX)が動作しないことです。下図は Zilog 製 Z80 を実装した CP/M 環境で ZSID を使った実験で EX DE,IX(DD EB) を実行し、結果としてレジスタは変化していませんプレフィックスの DD が無視され HL と DE が入れ替わりました。
(訂正 2024/12/15)
少し意外だったのが Z80 において DE と HL を交換する命令に対応するインデックスレジスタ命令(例 EX DE,IX)が動作しないことです。下図は Zilog 製 Z80 を実装した CP/M 環境で ZSID を使った実験で EX DE,IX(DD EB) を実行し、結果として
(訂正 2024/12/15)
Z80での EX DE,IX の実験結果(機能せず) |
![]() |
下図は今回のプログラムにパッチを当てて EX DE,IX 命令の動作を拡張命令のエミュ環境で確認した際の画面キャプチャです。見辛いですが 8100H は TRAP 処理の先頭アドレスなので EX DE,IX で TRAP が発生していることが確かめられ、その後に 8018H のブレークで DE と IX が入れ替わっています。
HD64180 エミュ環境での EX DE,IX の実験結果(機能する) |
![]() |
★追記 2024/12/26 {
「GAME言語で作った簡易モニタ(Gamon)(その2)ステップ機能」の記事で書いたようにGAME言語で作成したデバッグモニタにステップ機能を追加したので HD64180 の CPU 上で前述の
「未定義命令エミュレーション機能の試験プログラム」をステップ動作してみました。メモリアサインの関係で開始アドレスを 4000H に変更し、トレース結果を見易くするために PUTS 処理の先頭を RET 命令に書き換えています。
処理の最後のリターン命令がある 4049H にブレークを設定し、多めのトレース回数を指定し、トレースを実行するとブレークに達した時点で停止し、途中のレジスタ状態が全て表示されます。Z80で実行した場合と比較し、動作は同じでしたがフラグ内の未定義の2つのビット(28H)に差異が発生しました。
下記のようにZ80で「OR L」と「OR IXL」を実行してみると同様の差異が発生することも確認しました。
Z80での OR 実行時の未定義フラグの相違例 |
---|
]s5000 5000 FF - DD 5001 20 - B5 5002 FD - 0 5003 84 - 0 5004 FE - . ]xh1234 HL=FA03:1234 ]xa0 -Z.-.-N- AF=7742:0000 ]xp5000 PC=4049:5000 ]x * --.-.--- AF=0000 BC=0000 DE=5678 HL=1234 SP=AC24 PC=5000:DD B5 00 00 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 ]t * --.-.E-- AF=480C BC=0000 DE=5678 HL=1234 SP=AC24 PC=5002:00 00 FE 01 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step ]xa0 --.-.E-- AF=480C:0000 ]xp5001 PC=5002:5001 ]x * --.-.--- AF=0000 BC=0000 DE=5678 HL=1234 SP=AC24 PC=5001:B5 00 00 FE --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 ]t * --.-.--- AF=3420 BC=0000 DE=5678 HL=1234 SP=AC24 PC=5002:00 00 FE 01 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step ] |
未定義命令エミュレーション機能の試験プログラムのトレース結果(HD64180) |
|
6.エミュ環境の速度評価 ※追記 2024/12/16
エミュ環境の速度評価に使えそうなアプリケーションが見つからなかったので IXL レジスタを使った下記の単純なループ処理の時間を Z80 環境と比較してみました。時間測定は TeraTerm のマクロで行っています。
エミュ環境の速度評価に使えそうなアプリケーションが見つからなかったので IXL レジスタを使った下記の単純なループ処理の時間を Z80 環境と比較してみました。時間測定は TeraTerm のマクロで行っています。
IXL レジスタでのループ処理時間評価用コード |
---|
8012 DD DB IXCODE 8013 2E 00 LD L,0 ; LD IXL,0 8015 01 0020 LD BC,0020H 8018 DD LOOP: DB IXCODE 8019 2D DEC L ; DEC IXL 801A 20 FC JR NZ,LOOP 801C 10 FA DJNZ LOOP 801E 0D DEC C 801F 20 F7 JR NZ,LOOP |
エミュ環境と Z80 の環境で計測した結果が以降に貼った画面キャプチャです。クロックの差も加味した実行時間比率(HD64180/Z80)は
16倍( = 111.5s / 2.1s * 6MHz / 20MHz )
となりました。しかし、実際のアプリケーションでは必ずループ内で処理を行うのでこの実処理とループ全体の処理の比率によってエミュ環境での速度評価が変わってきます。「HD64180Compact(その6)16bit乗算処理」の記事での評価からZ80 と HD64180 の速度差としては HD64180 の方が 1.10 ~ 1.26 倍速いという結果だったので仮に HD64180 が 1.2 倍速く、「ループ内の実処理/ループ全体」の比率を rと仮定すると Z80 と HD64180 のエミュ環境が同等の速度になるのは
r / 1.2 + (1 - r)*16 = 1
⇒ r = 99%
結果としてインデックスをバイト分割してループ制御に使用した場合、ループ内の実処理がループ全体の99%以上であれば、エミュ環境が Z80 と同等以上の速度になるということになります。因みに上記の等式で右辺が2(HD64180側が半分の速さ)になるのは r=92% でループ処理の約9割が実処理の場合となりこれくらいの比率になるケースの頻度は高そうな気もします。
判ってはいましたがエミュ環境は速度面では厳しいです。1命令実行毎のトラップも掛けられたらもっと高速なエミュレートが可能なのですが無いものねだりですね。
拡張命令でのループ処理(HD64180 6MHz エミュレーション環境) |
![]() |
下図は Z80 環境でのループ時間測定画面です。
拡張命令でのループ処理(Z80 20MHz) |
![]() |
7.未定義命令エミュレーション機能のソース
今回作成した未定義命令エミュレーション機能のソースも張っておきます。上記のテスト処理も含まれています。実行した環境のCPUは HD64180RP8 です。
HD64180 未定義命令エミュレーション&試験のソース |
|
※Ver0.02 2024/12/19 faster slightly |
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
MPLAB SNAPのケース作成 [3D_printer]
1.はじめに
PICの書込みは今までPickit3を使っていましたが今となってはかなり古い環境と言わざるを得ません。マイクロチップ社純正の低価格なインサーキットデバッガ/プログラマであるMPLAB SNAP(以降SNAPと記す)は発売当初(2018年?)は1700円台で購入できましたが、何故かすぐに値段が跳ね上がり7千円後半になってしまいました。しかし最近3千円程度に値下がりしたみたいなので購入してみました。
SNAPは基板が剥き出しの状態でショートの危険がある為、ケースを作成しましたので記録しておきます。
2.購入したSNAP
下の写真のようにSNAPは基板がむき出しになっています。Atmel のチップの右上に PIC/AVR の切り替え用のジャンパーピンがあり、従来のバージョンのようにR48の抵抗を取り外すことが不要になったようです(公式情報は未確認)。SNAPが入っていた箱には「Rev 2」と書いてありました。
ボトム面が下の写真で基板に直にゴム足が貼られています。尚、シリアル番号はぼかしています。
3.ケースの設計
いつものCAD(Design Spark Mechanical )を使ってケースを設計しました。
はじめにSNAPをざっくり採寸しました。
採寸したデータをもとにケースを設計していきます。ネジを使わずにキャップをはめ込む方式にしました。
4.3Dプリンタでの出力
「3DプリンタBambuLabA1miniの購入」の記事にも書いた最近購入したA1miniで出力してみました。最近の3Dプリンタは手を掛けなくても綺麗に出力できて楽ですね。
下の写真がトップ面のUSBコネクタ側です。SNAPの文字を入れてみました。外見からは見えませんがSNAP基板上のLED部分のケースの板厚を薄くしてLEDの点灯状況が見えるようにしています。
下の写真がピンヘッダ側でピンヘッダ用の窓サイズもピッタリですね^^
ケースのボトム面が下の写真です。ゴム足の代わりに同様の形状の足を付けました。
5.STLファイルのダウンロード
今回作成したケースのSTLファイルを下記のリンクからダウンロード可能です。商用利用以外であれば使用可能とします。
[履歴]
・Ver0.03 2024/12/22
放熱用の網目を追加し、ロゴを太文字化
・Ver0.02 2024/12/12
ピンヘッダ付近に信号名称のアルファベット文字を追加(下図参照)
・Ver0.01 2024/12/11
公開
PICの書込みは今までPickit3を使っていましたが今となってはかなり古い環境と言わざるを得ません。マイクロチップ社純正の低価格なインサーキットデバッガ/プログラマであるMPLAB SNAP(以降SNAPと記す)は発売当初(2018年?)は1700円台で購入できましたが、何故かすぐに値段が跳ね上がり7千円後半になってしまいました。しかし最近3千円程度に値下がりしたみたいなので購入してみました。
SNAPは基板が剥き出しの状態でショートの危険がある為、ケースを作成しましたので記録しておきます。
2.購入したSNAP
下の写真のようにSNAPは基板がむき出しになっています。Atmel のチップの右上に PIC/AVR の切り替え用のジャンパーピンがあり、従来のバージョンのようにR48の抵抗を取り外すことが不要になったようです(公式情報は未確認)。SNAPが入っていた箱には「Rev 2」と書いてありました。
MPLAB SNAP(トップ面) |
![]() |
ボトム面が下の写真で基板に直にゴム足が貼られています。尚、シリアル番号はぼかしています。
MPLAB SNAP(ボトム面) |
![]() |
3.ケースの設計
いつものCAD(Design Spark Mechanical )を使ってケースを設計しました。
はじめにSNAPをざっくり採寸しました。
SNAPの採寸結果 |
![]() |
採寸したデータをもとにケースを設計していきます。ネジを使わずにキャップをはめ込む方式にしました。
SNAPのケース(CAD画面) |
![]() |
4.3Dプリンタでの出力
「3DプリンタBambuLabA1miniの購入」の記事にも書いた最近購入したA1miniで出力してみました。最近の3Dプリンタは手を掛けなくても綺麗に出力できて楽ですね。
下の写真がトップ面のUSBコネクタ側です。SNAPの文字を入れてみました。外見からは見えませんがSNAP基板上のLED部分のケースの板厚を薄くしてLEDの点灯状況が見えるようにしています。
SNAPのケース(トップ面USBコネクタ側) |
![]() |
下の写真がピンヘッダ側でピンヘッダ用の窓サイズもピッタリですね^^
SNAPのケース(トップ面ピンヘッダ側) |
![]() |
ケースのボトム面が下の写真です。ゴム足の代わりに同様の形状の足を付けました。
SNAPのケース(ボトム面) |
![]() |
5.STLファイルのダウンロード
今回作成したケースのSTLファイルを下記のリンクからダウンロード可能です。商用利用以外であれば使用可能とします。
[履歴]
・Ver0.03 2024/12/22
放熱用の網目を追加し、ロゴを太文字化
・Ver0.02 2024/12/12
ピンヘッダ付近に信号名称のアルファベット文字を追加(下図参照)
・Ver0.01 2024/12/11
公開
SNAPのケース Ver0.03 |
![]() |
SNAPのケース Ver0.02 |
![]() |