Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SSブログ
English Version
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のデータを連続化する必要があるようです
更に短い式もあるかも・・気が向けば再検討します
全ての引用ポストを見る


 ん~、予想したとおり企画倒れ感がしますが、それでは皆様良いお年を

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

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バイト分割の未定義命令を含む)に対応した結果、アドレス算出処理は328333バイトになりました。(※修正 2024/12/28)


★追記 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] [ 前へ ] 連載記事一覧 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

HD64180Compact(その9)PCBへの部品実装 [Z80]

1.はじめに
 「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] [ 前へ ] 連載記事一覧 [ 次へ ]

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

HD64180Compact(その8)Z80未定義命令のエミュレーション [Z80]

1.はじめに
 前回の記事で書いた 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 動作の概要は

  1. ITC レジスタの TRAP ビットを立て、TRAP が発生した箇所に応じて UFO ビットを設定する
       UFO = 0 : 2番目のオペコードで発生
       UFO = 1 : 3番目のオペコードで発生
  2. 未定義オペコードのアドレスをスタックに退避し、論理アドレスの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での 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)
** Gamon(Game Monitor) V0.04g 2024/12/23 by skyriver ?:Help ** ]r HexLoader start 00000000001 ]s40ea 40EA 7E - c9 40EB 23 - . ]bs 4049 Break0:4049 ]xp4000 PC=0000:4000 ]x * --.-.--- AF=0000 BC=0000 DE=0000 HL=0000 SP=AC24 PC=4000:21 6C 40 CD --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=0000 IY=0000 ]t1000 * --.-.--- AF=0000 BC=0000 DE=0000 HL=406C SP=AC24 PC=4003:CD EA 40 CD --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=0000 IY=0000 Step * --.-.--- AF=0000 BC=0000 DE=0000 HL=406C SP=AC22 PC=40EA:C9 23 B7 C8 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=0000 IY=0000 Step * --.-.--- AF=0000 BC=0000 DE=0000 HL=406C SP=AC24 PC=4006:CD 4A 40 06 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=0000 IY=0000 Step * --.-.--- AF=0000 BC=0000 DE=0000 HL=406C SP=AC22 PC=404A:2A 01 00 22 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=0000 IY=0000 Step * --.-.--- AF=0000 BC=0000 DE=0000 HL=0100 SP=AC22 PC=404D:22 58 40 21 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=0000 IY=0000 Step * --.-.--- AF=0000 BC=0000 DE=0000 HL=0100 SP=AC22 PC=4050:21 00 41 22 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=0000 IY=0000 Step * --.-.--- AF=0000 BC=0000 DE=0000 HL=4100 SP=AC22 PC=4053:22 01 00 C9 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=0000 IY=0000 Step * --.-.--- AF=0000 BC=0000 DE=0000 HL=4100 SP=AC22 PC=4056:C9 21 00 01 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=0000 IY=0000 Step * --.-.--- AF=0000 BC=0000 DE=0000 HL=4100 SP=AC24 PC=4009:06 00 DD 21 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=0000 IY=0000 Step * --.-.--- AF=0000 BC=0000 DE=0000 HL=4100 SP=AC24 PC=400B:DD 21 48 12 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=0000 IY=0000 Step * --.-.--- AF=0000 BC=0000 DE=0000 HL=4100 SP=AC24 PC=400F:DD 7C FE 12 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=0000 Step * --.-.--- AF=1200 BC=0000 DE=0000 HL=4100 SP=AC24 PC=4011:FE 12 28 01 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=0000 Step * -Z.-.-N- AF=1242 BC=0000 DE=0000 HL=4100 SP=AC24 PC=4013:28 01 04 DD --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=0000 Step * -Z.-.-N- AF=1242 BC=0000 DE=0000 HL=4100 SP=AC24 PC=4016:DD B5 FE 5A --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=0000 Step * --.-.E-- AF=5A04 BC=0000 DE=0000 HL=4100 SP=AC24 PC=4018:FE 5A 28 01 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=0000 Step * -Z.-.-N- AF=5A42 BC=0000 DE=0000 HL=4100 SP=AC24 PC=401A:28 01 04 FD --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=0000 Step * -Z.-.-N- AF=5A42 BC=0000 DE=0000 HL=4100 SP=AC24 PC=401D:FD 26 56 FD --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=0000 Step * -Z.-.-N- AF=5A42 BC=0000 DE=0000 HL=4100 SP=AC24 PC=4020:FD 2E 78 FD --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5600 Step * -Z.-.-N- AF=5A42 BC=0000 DE=0000 HL=4100 SP=AC24 PC=4023:FD E5 E1 11 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5678 Step * -Z.-.-N- AF=5A42 BC=0000 DE=0000 HL=4100 SP=AC22 PC=4025:E1 11 78 56 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5678 Step * -Z.-.-N- AF=5A42 BC=0000 DE=0000 HL=5678 SP=AC24 PC=4026:11 78 56 B7 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5678 Step * -Z.-.-N- AF=5A42 BC=0000 DE=5678 HL=5678 SP=AC24 PC=4029:B7 ED 52 28 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5678 Step * --.-.E-- AF=5A04 BC=0000 DE=5678 HL=5678 SP=AC24 PC=402A:ED 52 28 01 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5678 Step * -Z.-.-N- AF=5A42 BC=0000 DE=5678 HL=0000 SP=AC24 PC=402C:28 01 04 FD --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5678 Step * -Z.-.-N- AF=5A42 BC=0000 DE=5678 HL=0000 SP=AC24 PC=402F:FD 2D FD E5 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5678 Step * --.-.-N- AF=5A02 BC=0000 DE=5678 HL=0000 SP=AC24 PC=4031:FD E5 E1 7D --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * --.-.-N- AF=5A02 BC=0000 DE=5678 HL=0000 SP=AC22 PC=4033:E1 7D FE 77 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * --.-.-N- AF=5A02 BC=0000 DE=5678 HL=5677 SP=AC24 PC=4034:7D FE 77 28 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * --.-.-N- AF=7702 BC=0000 DE=5678 HL=5677 SP=AC24 PC=4035:FE 77 28 01 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=5677 SP=AC24 PC=4037:28 01 04 04 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=5677 SP=AC24 PC=403A:04 05 20 05 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * --.-.--- AF=7700 BC=0100 DE=5678 HL=5677 SP=AC24 PC=403B:05 20 05 CD --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=5677 SP=AC24 PC=403C:20 05 CD 5E --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=5677 SP=AC24 PC=403E:CD 5E 40 18 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=5677 SP=AC22 PC=405E:21 BB 40 CD --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=40BB SP=AC22 PC=4061:CD EA 40 C9 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=40BB SP=AC20 PC=40EA:C9 23 B7 C8 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=40BB SP=AC22 PC=4064:C9 21 D8 40 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=40BB SP=AC24 PC=4041:18 03 CD 65 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=40BB SP=AC24 PC=4046:CD 57 40 F7 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=40BB SP=AC22 PC=4057:21 00 01 22 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=0100 SP=AC22 PC=405A:22 01 00 C9 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=0100 SP=AC22 PC=405D:C9 21 BB 40 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step at Break0 * -Z.-.-N- AF=7742 BC=0000 DE=5678 HL=0100 SP=AC24 PC=4049:C9 2A 01 00 --.-.--- AF'0000 BC'0000 DE'0000 HL'0000 IX=1248 IY=5677 Step ]
}


6.エミュ環境の速度評価  ※追記 2024/12/16
 エミュ環境の速度評価に使えそうなアプリケーションが見つからなかったので 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 未定義命令エミュレーション&試験のソース
;+++++++++++++++++++++++++++++++++++++++++++++ ; emulate Z80 extend instruction for HD64180 ; Ver 0.01 2014/12/14 by skyriver ; Ver 0.02 2014/12/19 faster slightly ;+++++++++++++++++++++++++++++++++++++++++++++ ; ; TRAP:1 UFO:0 -> trap at second opcode ; if (code != 26H) && (code != 2EH) then 2bytes code set ex. LD A,IXL ; else 3bytes code set ex. LD IXL,23H or LD IYL,34H ; TRAP:1 UFO:1 -> trap at third opcode ; not emulate with this version ex. SET 0,IXL .list 000D CR EQU 13 000A LF EQU 10 00DD IXCODE EQU 0DDH 00FD IYCODE EQU 0FDH 0000' ASEG ORG 8000H 8000 21 806C START: LD HL,MsgStart 8003 CD 80EA CALL PUTS 8006 CD 804A CALL SetVec 8009 06 00 LD B,0 800B DD 21 1248 LD IX,1248H 800F DD DB IXCODE 8010 7C LD A,H ; LD A,IXH 8011 FE 12 CP 12H 8013 28 01 JR Z,$ + 3 8015 04 INC B 8016 DD DB IXCODE 8017 B5 OR L ; OR IXL 8018 FE 5A CP 5AH 801A 28 01 JR Z,$ + 3 801C 04 INC B 801D FD DB IYCODE 801E 26 56 LD H,56H ; LD IYH,56H 8020 FD DB IYCODE 8021 2E 78 LD L,78H ; LD IYL,78H 8023 FD E5 PUSH IY 8025 E1 POP HL 8026 11 5678 LD DE,5678H 8029 B7 OR A 802A ED 52 SBC HL,DE 802C 28 01 JR Z,$ + 3 802E 04 INC B 802F FD DB IYCODE 8030 2D DEC L ; DEC IYL 8031 FD E5 PUSH IY 8033 E1 POP HL 8034 7D LD A,L 8035 FE 77 CP 77H 8037 28 01 JR Z,$ + 3 8039 04 INC B 803A 04 INC B 803B 05 DEC B 803C 20 05 JR NZ,Chk10 803E CD 805E CALL PrnOk 8041 18 03 JR Exit 8043 CD 8065 Chk10: CALL PrnNg 8046 CD 8057 Exit: CALL LodVec 8049 C9 RET 804A 2A 0001 SetVec: LD HL,(1) ; get original vector 804D 22 8058 LD (SavVec),HL 8050 21 8100 LD HL,CodTrap 8053 22 0001 LD (1),HL 8056 C9 RET 8057 21 0000 LodVec: LD HL,0 8058 SavVec EQU $ - 2 805A 22 0001 LD (1),HL 805D C9 RET 805E 21 80BB PrnOk: LD HL,MsgOk 8061 CD 80EA CALL PUTS 8064 C9 RET 8065 21 80D8 PrnNg: LD HL,MsgNg 8068 CD 80EA CALL PUTS 806B C9 RET 806C MsgStart: 806C 0D 0A 20 2A DB CR, LF, " ** undefined instructions emulating and testing for HD64180 **" 8070 2A 20 75 6E 8074 64 65 66 69 8078 6E 65 64 20 807C 69 6E 73 74 8080 72 75 63 74 8084 69 6F 6E 73 8088 20 65 6D 75 808C 6C 61 74 69 8090 6E 67 20 61 8094 6E 64 20 74 8098 65 73 74 69 809C 6E 67 20 66 80A0 6F 72 20 48 80A4 44 36 34 31 80A8 38 30 20 2A 80AC 2A 80AD 0D 0A 72 65 DB CR, LF, "result ... ", 0 80B1 73 75 6C 74 80B5 20 2E 2E 2E 80B9 20 00 80BB 4F 4B 20 3A MsgOk: DB "OK : all checks are passed !", 0 80BF 20 61 6C 6C 80C3 20 63 68 65 80C7 63 6B 73 20 80CB 61 72 65 20 80CF 70 61 73 73 80D3 65 64 20 21 80D7 00 80D8 4E 47 21 21 MsgNg: DB "NG!!!!", 0 80DC 21 21 00 ; print character ; A <- data 80DF F5 PUTC: PUSH AF 80E0 DB 01 PUTC1: IN A,(CMDPORT) 80E2 E6 80 AND TXRDY_B 80E4 28 FA JR Z,PUTC1 80E6 F1 POP AF 80E7 D3 00 OUT (DATPORT),A 80E9 C9 RET ; print string ; HL <- str adr 80EA 7E PUTS: LD A,(HL) 80EB 23 INC HL 80EC B7 OR A 80ED C8 RET Z 80EE CD 80DF CALL PUTC 80F1 18 F7 JR PUTS ORG 8100H ; **** undefined code trap **** 8100 CodTrap: 8100 F5 PUSH AF IN0 Areg,(HDITC+IOOFST) ; input ITC reg 8101 ED 38 B4 + DB 0EDH,Areg shl 3,(HDITC+IOOFST) 8104 07 RLCA 8105 30 2E JR NC,NoEmu 8107 07 RLCA 8108 38 2B JR C,NoEmu ; if thied opcode trap then not emulate 810A F1 POP AF 810B E3 EX (SP),HL ; get undef code adr 810C F5 PUSH AF 810D 2B DEC HL 810E 7E LD A,(HL) ; get undefined start code 810F 32 812A LD (IXYCod1),A 8112 32 8130 LD (IXYCOD2),A 8115 23 INC HL 8116 7E LD A,(HL) ; get second opcode 8117 32 812D LD (UnCode),A 811A E6 F7 AND 0F7H 811C FE 26 CP 26H 811E 20 03 JR NZ,CodTr2 ; if not LD IXH,xx or LD IXL,xx 8120 23 INC HL 8121 7E LD A,(HL) ; get third opcode 8122 FE DB 0FEH ; CP xx 8123 AF CodTr2: XOR A 8124 32 812E LD (UnCode + 1),A 8127 23 INC HL 8128 F1 POP AF 8129 E5 PUSH HL ; save return adr 812A DD E5 PUSH IX 812A IXYCod1 EQU $ -2 812C E1 POP HL 812D 00 00 UnCode: DB 0,0 812F E5 PUSH HL 8130 DD E1 POP IX 8130 IXYCOD2 EQU $ - 2 8132 E1 POP HL ; return adr 8133 E3 EX (SP),HL ; restore HL 8134 C9 RET 8135 F1 NoEmu: POP AF 8136 E5 PUSH HL 8137 2A 8058 LD HL,(SavVec) 813A E3 EX (SP),HL 813B C9 RET END
※Ver0.02 2024/12/19 faster slightly



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

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

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」と書いてありました。

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


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