GAME言語で 3DHAT の高速描画 [Z80]
Z80 アセンブラで作成した 16 ビットの固定小数の乗算演算処理を使って asciiart を高速に描画できたことを「GAME言語での ASCIIART の高速化」の記事で書きました。
GAME言語コンパイラはGAME言語自身で記述されているので固定小数点のような新たな演算子の追加も割合楽にできます。
上記の記事では固定小数点の乗算のみを追加しましたが、今回はコンパイラに下記の演算子を追加して3DHATを高速に描いてみたいと思います。
尚、3DHATのプログラムは「Pic24MC68Kマイコン(その9)ehBASICの移植」の記事にアップしたものを今回の拡張GAMEコンパイラ(以降、拡張コンパイラと記す)用に移植します。
※:コンパイラ内に Z80 のマシン語への変換ロジックを実装
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 アセンブラで記述しました。
アセンブラのソースも貼っておきます。乗算処理のメインループのステップ数はこれ以上短くならないのではないかと思います。
[history]
・Ver0.02b 2023/01/15 improve srqt a little
・Ver0.03 2023/05/05 improve Mul
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 ビットでのほぼ限界に近い処理になっているのではないかと思います。
最後に今回機能追加した拡張GAMEGAMEコンパイラ(GAME80用)も貼っておきます。
★追記 2023/01/09 {
Twitter に投稿した動画付きメッセージを貼っておきます。動画にすると描画のドットの色が薄くて全画面表示にしないと殆ど見えないですね ^^;;
}
★追記 2023/01/10 {
MSX に移植して MSXPen で実行した際に投稿した動画付きの Twitter コメントも貼っておきます。
グラフィックはオーバーヘッドが少なそうな Graphics7(256x192 in 256 colors)を使っています。
}
★追記 2023/04/20
MSX 用 3DHat の実行ファイルは下記からダウンロードできます。
★追記 2024/07/03
X(旧Twitter)に投稿した更に高速化した動画を貼っておきます。全体をアセンブリ言語化し、MSXturboRに搭載されているR800の符号無し16bit乗算命令を利用するように変更しています。
★追記 2024/01/30
MZ-2200 用の 3DHat 描画プログラム( MZT ファイル)は下記URLからダウンロードできます。
[History]
2023/02/03 Ver 2 若干高速化(描画時間は6MHzで約12秒)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
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
★追記 2024/01/29
MZ-2200 のエミュレータである EmyuZ-2200 を弄る機会があり関連資料を見ていたところ、MZ 系の CM ではお馴染みの3Dハットを表示中の画面の写真を見つけました。
本家の MZ のエミュで固定小数点+拡張 GAME コンパイラによる高速3Dハット描画を試したところ、CPU クロック 6MHz の設定で描画時間は約 20 秒でした。
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] [ 前へ ] 連載記事 [ 次へ ]
2023-01-08 21:53
nice!(0)
コメント(0)
コメント 0