超小型Z80マイコン(その11)動作モニタ用LEDの実装 [Z80]
手軽に CP/M も起動できるので色々遊んで見ると SD カード(以降 TF カードと記す)のアクセス中等の状態を示す LED が無いとコンパイル中等に動いているのか不安になります。
今回の3チップ構成の Z80PicCompact の開発では小型化のために 20 ピンの PIC を使用しており、I/O 数が圧倒的に足りないため一つの I/O で複数の制御を行っています(具体的なピンアサインはこの連載の最初のページを参照してください)。
TF カード イネーブル信号を割り振った I/O ビットには Z80 への WAIT/ 出力及び IORQ/ 読込みの機能の合計で三つの機能を割り振っていて、キー入力時にもアクティブになるので状態表示用の LED 制御には使えません。
色々考えた結果、TF カードとのインターフェースである SPI のクロック信号が low の時に LED を点灯することにしました。クロック信号に割り振った I/O ビットは Z80 の A0 信号の読込みと兼用していますがソフトで何とかするようにします。
結果としてハードウェア的には下図のトランジスタ回路を追加することにしました。low でオンなので珍しく PNP 型トランジスタを使用しています。
モニタ LED 用に追加した回路 |
|
汎用基板で作った開発用基板はブレッドボードより安定していていいのですが部品交換が面倒です。リード部品をメインに使っていましたが、今回はSMD部品を使いました(部品交換等はSMDの方がやり易いですね)。
開発用基板への部品追加例 |
|
これで TF カードアクセス時には点灯し、キー入力待ちの時(待機状態)では消灯する動作確認用 LED を追加することが出来ました。コンソール出力時等でも薄っすら点灯しますが動作モニタと言う観点では問題無い(寧ろ好都合)と思います。動作確認用 LED 実装後の開発用基板が下図になります。
モニタ用 LED 実装後の開発用基板 |
|
下図が今回の追加を反映したグランドベタ化前のパターン図になります。緑色の部分はグランドです。段々込み合ってきてこれ以上の部品の追加が難しくなってきました。
モニタ用 LED 実装後のパターン(グランドベタ化前) |
|
グランドベタ化後のトップ面のパターンが下図になります。左下に追加した LED と従来からある電源表示用の LED が並んでいます。
モニタ用 LED 実装後のトップ面 |
|
下図はボトム面のパターンで左端に追加したトランジスタ等を配置しました。ロゴマークを入れる場所もかろうじて確保できました。
モニタ用 LED 実装後のボトム面 |
|
パターンの更新ができたので製造依頼しました。回路 CAD(DesignSpakPCB)での3D表示画面のキャプチャも貼っておきます。トップ面にはほぼ同サイズの Z80 のチップが実装されます。
3D表示(トップ面) |
|
3D表示(ボトム面) |
|
[ Twitter にポストした開発状況に関するメッセージ]
固定小数点による3DHat高速描画等寄り道をしていましたがポリウレタン配線基板でCP/Mが安定して動くようになりました
— skyriver (@wcinp) January 14, 2023
古いブレッドボードと違って動作が安定しているので問題の調査作業も捗ります#Z80PicCompact #CPM pic.twitter.com/DpVLjOAAc3
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
ポケコン(G850)用拡張基板(その9)コンパクト化 [ポケコン]
グランドベタ化前のパターン図が下図になります。小型化のためメモリと GAL のチップを表裏で同じ位置にしたため、パターン作成に結構時間が掛かりました。緑色の部分はグランド部分で細い斜め線の部分はグランドベタ化により接続されます。
PC-G860V用増設ボード(Eborsy)パターン図(グランドベタ化前) |
|
下図がグランベタ化後のトップ面でコネクタとメモリが実装されています。トップ面と言ってもポケコンに付けた際は内側になり実質的には裏面になります。バージョンやロゴマークは逆の面には適当なスペースを確保できなかったのでこちらの面に書いています。
PC-G860V用増設ボード(Eborsy)パターン図(トップ面) |
|
下図がボトム面のパターンです。TF カードコネクタと GAL を実装しています。上記のようにポケコンに実装した際はこちらが表面になるので電源とアクセス表示の LED もこちらの面に実装しました。
PC-G860V用増設ボード(Eborsy)パターン図(ボトム面) |
|
下図は設計 CAD (DesignSparkPCB)で3D表示した画面のキャプチャです。下側の茶色の直方体がポケコンに接続するコネクタなのでコンパクトにまとめられたことが確認できます。
PC-G860V用増設ボード(Eborsy)3D表示(トップ面) |
|
下図がボトム面(ポケコン実装時は表面)の3D表示です。シルク面を上側に設定していますが3D表示ではレジストに隠れてしまいますね^^;
レイヤーの順番を弄れば表示できたはずですが面倒なのでパターン設計時のままで表示しています。
PC-G860V用増設ボード(Eborsy)3D表示(ボトム面) |
|
もう少し確認後に製造依頼したいと思います。
★追記 2024/07/23
「ポケコン(G850)用拡張ボード(EborsyEEP)でCP/M(その7)改善基板到着」の記事に SD カードの代わりに EEPROM を使用し、更に小型化したプリント基板について記載しました。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
CP/Mコマンドにおける小文字パラメータの実現 [Z80]
また、grep のようなファイルの内容を参照するようなコマンドを作成する場合、コマンドパラメータで対象文字列として小文字を指定できず不便でした。
CP/M でコマンドパラメータに小文字が使えないのは「入力されたコマンドを処理する CCP(Console Command Processor) 内の1行入力処理部で小文字を大文字に変換している」ためです。
そこで CCP の1行入力処理内の大文字変換部にパッチを当て一時的に小文字の入力を可能にするコマンドを作ってみました。注意点として CCP はコマンド解析を大文字前提で行っているのでコマンド自体は大文字で入力する必要があります。
また、このパッチは外部プログラムのみならず ERA 等のビルトインコマンドにも有効になるので上記のような小文字のファイル名の削除も可能になります。上記で”一時的”と書いたのは、コントロールC押下または実行したプログラムの終了時に WBOOT が実行されると CCP が再度読み込まれてパッチが消えてしまうからです(なのでパッチを元に戻すコマンドは準備していません)。
実行例を下図に示します。argtest は実行時に与えられたパラメータを表示するだけのテスト用プログラムです。
小文字パラメータコマンドの実行例 |
|
リストも貼っておきます。0080H に保存されている起動時のパラメータ文字列の長さがゼロ以外の場合、ヘルプ内容を表示するようにしました。
CP/Mー80 用の小文字パラメータ対応コマンドリスト(Z80 アセンブラ) |
|
今回作成したコマンドは下記のリンクからダウンロードできます。
[history]
Ver 0.01a 2023/01/20 8080対応
GAME言語で 3DHAT の高速描画 [Z80]
GAME言語コンパイラはGAME言語自身で記述されているので固定小数点のような新たな演算子の追加も割合楽にできます。
上記の記事では固定小数点の乗算のみを追加しましたが、今回はコンパイラに下記の演算子を追加して3DHATを高速に描いてみたいと思います。
尚、3DHATのプログラムは「Pic24MC68Kマイコン(その9)ehBASICの移植」の記事にアップしたものを今回の拡張GAMEコンパイラ(以降、拡張コンパイラと記す)用に移植します。
No | 演算子記号 | 種別 | 実装方法 | 演算内容 |
---|---|---|---|---|
1 | x | 2項演算子 | アセンブラ | 固定小数点の乗算 |
2 | ¥s | 単項演算子 | アセンブラ | SIN(引数:固定小数点(90°=1)) |
3 | ¥c | 単項演算子 | アセンブラ | COS(引数: 同上 ) |
4 | ¥r | 単項演算子 | アセンブラ | 平方根(引数:固定小数点) |
5 | ¥f | 単項演算子 | コンパイラ※ | 整数から固定小数点への変換 |
6 | ¥i | 単項演算子 | コンパイラ※ | 固定小数点から整数への変換 |
7 | & | 2項演算子 | コンパイラ※ | AND 演算 |
8 | | | 2項演算子 | コンパイラ※ | OR 演算 |
9 | << | 2項演算子 | コンパイラ※ | 左シフト |
10 | >> | 2項演算子 | コンパイラ※ | 算術右シフト |
No.1 の固定小数点の乗算記号を '*' としなかったのは従来の整数演算も並行して使用したかったからです。BASCI 言語等でも整数と浮動小数点を同時に使えますが、こうしないと既存のプログラムの移植の際等に非常に不便であることが今回身に染みて判りました。
No.7 までは今回移植する3DHATを動かす上で必要なものですが No.8 以降はついでに付加したものです。
No.2 と No.3 の三角関数は速度優先で 0 .. pai/2 区間の SIN の値からなる 256 バイトのテーブルから値を引くようにしました。今回の固定小数点では 0x0100 が1の値なのですが、256 は1バイトに収まらないので テーブル先頭の唯一の 0 は参照しないようにして 角度が pai/2 の整数倍の時は -1,0,1 のいずれかを判断して返す様にすることでテーブル内のゼロを 256 と見なすようにしました。
No.4 の平方根は Twitter で見かけた下記の処理手法を Z80 アセンブラで記述しました。
バレルシフタやハードウェア乗算器が無いようなレトロなCPU環境でも使い易いように最適化してみました pic.twitter.com/Zvp9eK9S1j
— skyriver (@wcinp) November 14, 2022
アセンブラのソースも貼っておきます。乗算処理のメインループのステップ数はこれ以上短くならないのではないかと思います。
今回作成した固定小数点演算処理(乗算、平方根、SIN/COS) |
|
[history]
・Ver0.02b 2023/01/15 improve srqt a little
・Ver0.03 2023/05/05 improve Mul
3DHATを描画するGAME言語のソースは下記になります。元々が記号言語なので読み辛いとは思いますが、全てをアセンブラで記述するよりは効率的に記述できるのではないかと思います。
3DHat描画ソース(拡張GAME言語) |
|
GAMEコンパイラでコンパイル後に実行した画面のキャプチャーが下図になります。冒頭で紹介した「ehBASICの移植の記事」の記事で書いたように TeraTerm のテクトロ端末機能(TEKウィンド)を使ってグラフィック描画しています。描画に掛かった時間は開発中の Z80PicCompact(Z80 12MHz)で 8s 程度でした。
★変更 2023/01/09 16s から 14s に変更。STEP幅が大きかったので元版に合わせ 14s から 9s に変更
★変更 2023/01/11 乗算の一部をシフトに変更して 9s から 8s に変更
16 ビットの固定小数点では精度不足で若干ガタガタしている部分がありますが「ehBASICの移植の記事」で書いたように MC68K 16MHz での描画時間が 2 分 34 秒なので今回作成したものはメチャ速いことが判ります。
もう少し精度を上げたいところですが、現状でも処理の一部で MSB まで桁あふれした値を MSB まで対応している 平方根処理で固定小数点の範囲内に戻しているので 16 ビットでのほぼ限界に近い処理になっているのではないかと思います。
3DHAT描画画面 |
|
最後に今回機能追加した拡張GAMEGAMEコンパイラ(GAME80用)も貼っておきます。
★追記 2023/01/09 {
Twitter に投稿した動画付きメッセージを貼っておきます。動画にすると描画のドットの色が薄くて全画面表示にしないと殆ど見えないですね ^^;;
Z80アセンブラで作った16bit長の固定小数点と三角関数を使った3DHATの描画でステップ数が元版と違っていたので合わせました
— skyriver (@wcinp) January 9, 2023
ステップ数の変更でカクカク感が無くなり奇麗に描画できるようになりました
若干の高速化も行い実行時間が9秒になりました^^https://t.co/nYzeMPy24f#3DHAT #固定小数点 #Z80 pic.twitter.com/cHz3Skdxm1
★追記 2023/01/10 {
MSX に移植して MSXPen で実行した際に投稿した動画付きの Twitter コメントも貼っておきます。
グラフィックはオーバーヘッドが少なそうな Graphics7(256x192 in 256 colors)を使っています。
Z80アセンブラで書いた16bitの固定小数点処理に三角関数等を追加しMSXPenに3DHat描画プログラムを移植し実行してみた
— skyriver (@wcinp) January 10, 2023
TL情報ではMZ-2000では11分43秒とのことだが約4秒で描画が完了した(計算範囲や刻み幅は変更していないので計算量は同じはず)
かなり速いですねhttps://t.co/nYzeMPy24f#Z80 #MSX pic.twitter.com/dvgzbXTyQ7
★追記 2023/04/20
MSX 用 3DHat の実行ファイルは下記からダウンロードできます。
★追記 2024/07/03
X(旧Twitter)に投稿した更に高速化した動画を貼っておきます。全体をアセンブリ言語化し、MSXturboRに搭載されているR800の符号無し16bit乗算命令を利用するように変更しています。
メキシカンハットの高速化ために16bit固定小数点演算(COSはテーブル引き)を使い全体をアセンブリ言語化してみました
— skyriver (@wcinp) July 2, 2024
更にMSXturboRに搭載されているR800の符号無し16bit乗算命令を利用するように変更
結果、実行時間は2秒程度まで短縮されました https://t.co/815lFiyyan pic.twitter.com/yMRpKyhf7U
MZ-2200 のエミュレータである EmyuZ-2200 を弄る機会があり関連資料を見ていたところ、MZ 系の CM ではお馴染みの3Dハットを表示中の画面の写真を見つけました。
本家の MZ のエミュで固定小数点+拡張 GAME コンパイラによる高速3Dハット描画を試したところ、CPU クロック 6MHz の設定で描画時間は約 20 秒でした。
EmyuZ-2200 での3Dハット描画画面 |
|
★追記 2024/01/30
MZ-2200 用の 3DHat 描画プログラム( MZT ファイル)は下記URLからダウンロードできます。
[History]
2023/02/03 Ver 2 若干高速化(描画時間は6MHzで約12秒)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
GAME言語での ASCIIART の高速化 [Z80]
最近、Twitter の TL で整数型ベーシックの環境で固定小数点演算処理を行いアスキーアートを表示する例を見かけました。
asciiart のベーシックプログラムの中身を見てみると除算を使用していないので乗算のみを固定小数点対応にすれば対応できそうであることが判ります。
そこで16ビット長の固定小数点の乗算処理をアセンブラで作成することでGAME言語の環境で高速に asciiart を実行できないか検討してみました。16ビット長の固定小数点を使えば元々の加減算処理はそのまま使えます。
結果から先に書くと asciiart の実行時間は下記になりました^^
No. | 実行環境 | 実行時間 | ハード環境 |
---|---|---|---|
1 | GAME80インタープリタ | 30.7s | Z80PicCompact Z80:12MHz |
2 | GAME80コンパイラ | 6.2s | Z80PicCompact Z80:12MHz |
3 | 人間が アセンブラで記述 | 4.8s | skyriver Heartbeat:0.97Hz |
[History]
- 2023/01/05 Ver0.02
Fixed Point処理改善でコンパイラとインタプリタの実行時間がそれぞれ 8.8s⇒8.4s、40.0s⇒39.6sに改善 - 2023/01/05 Ver0.03e
Fixed Point処理変更でコンパイラとインタプリタの実行時間がそれぞれ 8.4s⇒6.2s、39.6s⇒30.7sに改善 - 2023/01/05
人間コンパイラ環境での実行時間を追記。計算方法を修正(5.8s⇒4.8s)
尚、Z80PicCompact は現在開発中の 20 ピンの PIC を使用した3チップ構成で小型の Z80 ワンボードマイコンです。
乗算処理のみをアセンブラの処理に入れ替えれる手段としてGAME言語の環境では次の二通りが考えられます。
- GAMEコンパイラでの対応
GAME言語のコンパイラで乗算処理時にコールするアドレスをアセンブラで作った処理のアドレス(今回は 8500H)に変更してコンパイルすることで生成された実行プログラムは固定小数点の乗算処理をコールするようになります。
- インタープリタ内処理のフック
GAME言語のコンパイラのソースからも判るようにGAME80の乗算処理は 8A0FH にあります。この部分をアセンブラで作った処理へのジャンプ命令に置き換えれば、固定小数点の乗算を行うことができます。
最も悩ましいのは固定小数のフォーマットとして整数部と小数点部にそれぞれ何ビットを割り振るかです。滑らかな描画にするためには小数点部分のビット数をなるべく多くしたいものです。特にマンデルブロの周辺に広がっている楕円形はスムーズに描きたいですね。
試行錯誤の結果下記のようにしました。
- asciiart処理内の最大値
主要な変数の値を確認したところ 37 程度の大きさの変数がありました。最小限のマージンで整数部には6ビット必要で符号の1ビットを加えると整数部で最小でも7ビット必要になります。
- 処理中のオーバーフロー
オーバーフローのために描画させたマンデルブロ図が変になるので X,Y のステップ範囲を元々の処理の 1/2 にし、ステップ幅も同様に 1/2 の 0.5 にしました。
★追記 2023/01/05 オリジナルのものと同じ値に戻しました。
- 小数点部分
上記から必然的に小数点に割り振れるビット数は9ビットになります。ネット上で見かける固定小数点のマンデルブロプログラムの小数点は 50~64 位なので9ビット(512)であればより詳細に描けるのではないかと期待が膨らみます^^
結果として
アセンブラで書いた固定小数点の処理を貼っておきます。高速化を意識して作りましたがまだギリギリまで詰めてはいません。
★追記 2023/01/05 {
固定小数点のループ処理でH,Lそれぞれを右シフトしていましたがシフト方向を左側に変更し、ADD HL,HLを使用することで高速化しました。
また、asciiart の実行時間は描画条件により大きく変動するのでX,Yの範囲やステップ幅等をオリジナルのものと同様にし、固定小数点の整数部のビット数を7ビットから8ビットに変更しました。更にキャリー処理部を修正し、マンデルブロ図のノイズの様なものも無くなりました。
これに伴いマンデルブロ図がオリジナルのものと更に近くなりました。ソース及び図も最新のものと差し換えました。
}
固定小数点乗算処理(ビット長:16[8.8]ビット)(Z80 アセンブラ) |
|
今回の固定小数点用に変更した asciiart のソースが下記になります。
固定小数点用アスキーアート(GAME言語) |
|
下図は上記の2番目の手法であるインタープリタ内処理をフックして実行した場合の画面キャプチャになります。周辺の輪も奇麗に描かれていますね^^
実行時間を 0.1 秒単位で計測する TeraTerm マクロも新規に作成しました。
固定小数点アスキーアート画面(GAMEインタープリタ) |
|
★追記 2023/01/05 {
GAME言語コンパイラ環境での実行画面のキャプチャーを追記しました。
固定小数点アスキーアート画面(GAMEコンパイラ) |
|
★追記 2023/01/05 {
全てアセンブラで記述したプログラムの実行時のキャプチャーを追記しました。
固定小数点アスキーアート画面(フルアセンブラ) |
|
★Ver0.02 22023/01/17 精度を少し上げ、オリジナルの形状により近くなりました。
}
上記画面で使用した TeraTerm 用の実行時間計測マクロ(0.1秒単位で計測可能)は BASIC、CP/M、GAME言語等に対応しています。下記からダウンロード可能です(商用用途以外であれば使用可能)。
Twitterにアップした動画付きコメントも貼っておきます。(Z80:16MHzは誤記で12MHzで動作しています)
asciiartの高速化をGAME言語環境で検討しました
— skyriver (@wcinp) January 4, 2023
固定小数点の乗算処理をアセンブラで作成しコンパイラの変更及びインタープリタ内部のフックの2つの方法で乗算処理を入れ替えました
実行時間はそれぞれ8.8sと40.0s(Z80:16MHZ)
時間計測マクロも公開しましたhttps://t.co/KVHBLGwcLI#Z80 #asciiart pic.twitter.com/fnplCJch2B
★追記 2023/01/09 {
Twitter へのメッセージ投稿後、早い段階で西さんから”いいね”を頂いた MSXPen での asciiart 描画動画を上げたメッセージを貼っておきます。西さんから”いいね”を頂くのは「Z80での1バイトのビット順反転処理」の記事を書いた時に投稿したメッセージ以来、2回目だと思います。
16ビット長の固定小数点演算を使いフルアセンブラでCP/M用に作成したasciiartをMSXPenで実行してみました(マシン設定は"MSX Turbo R Japan(NTSC)")
— skyriver (@wcinp) January 6, 2023
結構速いですね^^https://t.co/KVHBLGwcLI#asciiart #CPM #MSX pic.twitter.com/Iu0eU8TGYZ
★追記 2024/08/04
「GAME言語で 3DHAT の高速描画」の記事にGAME 言語のコンパイラに固定小数点演算を追加して3DHATを高速に描画する試みについて記載しました。
[TOP] [ 前へ ] 連載記事 [ 次へ ]