メモリ上で実際に動くプログラム(その3) [Z80]
メモリ上で実際に動き(移動し)通過した後にはNOP命令のみを残してひたすらメモリ上を駆け回る自走プログラムで新たな案を思い付いたので記録しておきたいと思います。
前回の記事で書いた PUSH によるコード生成方式は自走プログラムの移動量が究極の1バイトであり、自走プログラムの移動量という点ではこれ以上小さくするのは不可能ということになります(プログラムの仕掛けという観点でも素晴らしいと思う)。
本連載の初回記事「メモリ上で実際に動くプログラム」に PUSH を使わずブロック転送のみを使用した自走プログラムを追記しましたが、同様にブロック転送のみの場合でも移動量をもっと小さくできないか考えてみました。
インクリメント方式のブロック転送である LDIR 命令では次のブロック転送のために16ビットの減算をする必要があり、キャリーのクリア等が必要になることを考えるとデクリメント方式の LDDR を使いたいものです。ブロック転送を利用した場合の最小移動量は2バイトになりそうですが、ブロック転送命令(LDDR=EDH,B8H)を二つ並べてブロック転送命令をブロック転送命令で上書きすることでブロック転送を中断しないようにするとブロック転送終了直後にコピーしたブロック転送を実行してしまうのでうまくいきません・・・
しかし、巧妙な仕掛けを思い付きました^^
方式のアイディアさえ固まれば、ブロック転送を利用した自走プログラムには慣れてきたのでほぼ机上コーディングのみで完成しました。完成したソースが下記で移動量は2バイトです。このソースを見て今回のアイディアの仕掛けが判りますか?
★追記 2024/02/09
X(Twitter)に投稿した自走状況を可視化した動画を貼っておきます。
★追記 2024/02/10
X での書込みメッセージに対して返信を頂きました。LDIR を使用し、移動量が1バイトというものです。コピー後の LDIR を再利用する部分とキャリーによる条件ジャンプの部分が味わい深いですね。LDIR で検討してみました(下記)が DI を除けば同じサイズになりました。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
前回の記事で書いた PUSH によるコード生成方式は自走プログラムの移動量が究極の1バイトであり、自走プログラムの移動量という点ではこれ以上小さくするのは不可能ということになります(プログラムの仕掛けという観点でも素晴らしいと思う)。
本連載の初回記事「メモリ上で実際に動くプログラム」に PUSH を使わずブロック転送のみを使用した自走プログラムを追記しましたが、同様にブロック転送のみの場合でも移動量をもっと小さくできないか考えてみました。
インクリメント方式のブロック転送である LDIR 命令では次のブロック転送のために16ビットの減算をする必要があり、キャリーのクリア等が必要になることを考えるとデクリメント方式の LDDR を使いたいものです。ブロック転送を利用した場合の最小移動量は2バイトになりそうですが、ブロック転送命令(LDDR=EDH,B8H)を二つ並べてブロック転送命令をブロック転送命令で上書きすることでブロック転送を中断しないようにするとブロック転送終了直後にコピーしたブロック転送を実行してしまうのでうまくいきません・・・
しかし、巧妙な仕掛けを思い付きました^^
方式のアイディアさえ固まれば、ブロック転送を利用した自走プログラムには慣れてきたのでほぼ机上コーディングのみで完成しました。完成したソースが下記で移動量は2バイトです。このソースを見て今回のアイディアの仕掛けが判りますか?
ブロック転送での自走プログラム例(Z80 アセンブラ) |
|
★追記 2024/02/09
X(Twitter)に投稿した自走状況を可視化した動画を貼っておきます。
メモリ上で実際に動き(移動し)通過した後にはNOP命令のみを残してメモリ上を駆け回る自走プログラムでブロック転送方式で移動量が2byteのものができました
— skyriver (@wcinp) February 9, 2024
動画はEmyuZ-2200で自走の様子を可視化したものですhttps://t.co/ZtFauNTAdM#Z80 #自走プログラム pic.twitter.com/kXaYLmE6Q9
★追記 2024/02/10
X での書込みメッセージに対して返信を頂きました。LDIR を使用し、移動量が1バイトというものです。コピー後の LDIR を再利用する部分とキャリーによる条件ジャンプの部分が味わい深いですね。LDIR で検討してみました(下記)が DI を除けば同じサイズになりました。
LDIR による1バイト移動の自走プログラム例(Z80 アセンブラ) |
|
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]