なぜか仕事でZ80のアセンブラをレビューすることになったので、やってみた。
ステート数を見ながらチューニングできそうなところを探すというのが目的だったのだが、
というのを実感。Z80バイナリで遊んでた中学の頃はそれほど気にならなかったのだが、 こういうことは、目的がはっきりしていると見えてくるものだ。
があれば、いろいろチューニングのネタもありそうなのだが…
L84(8584) → VE46+X71(8121)
X52(8152) → DH01(5301)
SPの値を他のレジスタに代入する手段 <br> LD HL, 0000 : 21 00 00<br> ADD HL,SP : 39<br><br>各レジスタ個別に裏レジスタと交換する手段 <br> PUSH HL : E5<br> EXX : D9<br> PUSH HL : E5<br> EXX : D9<br> POP HL : E1<br> EXX : D9<br> POP HL : E1<br><br>これぢゃだめ?(コード効率悪すぎるか・・・)
ちと言葉足らずでしたね。「…があれば」の部分、もちろん、少ないステート数でできる、というのが条件です。<br>X案、まさに「コード効率悪すぎ」ですわ。<br><br>まずSPのほう。まず最初にそれ考えました。2ステップで少なく見えるけど、21ステートかかるので、チューニング(高速化)には使えません。<br>レジスタ交換のほうは、メモリアクセス(PUSH/POP)がはいる時点でNG。PUSHx2+POPx2+EXx3で54ステートかかります。
1) SPを操作する命令はろくなのがないんで多分これ以上短くなりまへん<br> だいいちロード命令だけで10ステートかかりまんがな<br><br> ということで、念力で LD HL,SPという命令を作り出してください(謎)<br><br>※ゲームボーイでつこてるZ80カスタムCPUには12ステートで LDHL SP,e とかいう使える命令があるけどねぇ。<br><br>2)EXXと無関係なレジスタってSPのほかにはインデックスレジスタ2本だけやし、PUSH/POP含めてメモリアクセスせんと無理ですがな・・・もちっと効率のよい方法はあるかもしれんが<br><br>つーことでおいらにはもうお手上げです
*Messages* の更新情報取得には、antenna.lirs もしくは index.rdfをご利用ください。 豪傑アンテナ の LIRSからも取得可能です。
SPの値を他のレジスタに代入する手段 <br> LD HL, 0000 : 21 00 00<br> ADD HL,SP : 39<br><br>各レジスタ個別に裏レジスタと交換する手段 <br> PUSH HL : E5<br> EXX : D9<br> PUSH HL : E5<br> EXX : D9<br> POP HL : E1<br> EXX : D9<br> POP HL : E1<br><br>これぢゃだめ?(コード効率悪すぎるか・・・)
ちと言葉足らずでしたね。「…があれば」の部分、もちろん、少ないステート数でできる、というのが条件です。<br>X案、まさに「コード効率悪すぎ」ですわ。<br><br>まずSPのほう。まず最初にそれ考えました。2ステップで少なく見えるけど、21ステートかかるので、チューニング(高速化)には使えません。<br>レジスタ交換のほうは、メモリアクセス(PUSH/POP)がはいる時点でNG。PUSHx2+POPx2+EXx3で54ステートかかります。
1) SPを操作する命令はろくなのがないんで多分これ以上短くなりまへん<br> だいいちロード命令だけで10ステートかかりまんがな<br><br> ということで、念力で LD HL,SPという命令を作り出してください(謎)<br><br>※ゲームボーイでつこてるZ80カスタムCPUには12ステートで LDHL SP,e とかいう使える命令があるけどねぇ。<br><br>2)EXXと無関係なレジスタってSPのほかにはインデックスレジスタ2本だけやし、PUSH/POP含めてメモリアクセスせんと無理ですがな・・・もちっと効率のよい方法はあるかもしれんが<br><br>つーことでおいらにはもうお手上げです