SSブログ
English Version

メモリ上で実際に動くプログラム(その3) [Z80]

 メモリ上で実際に動き(移動し)通過した後にはNOP命令のみを残してひたすらメモリ上を駆け回る自走プログラムで新たな案を思い付いたので記録しておきたいと思います。

 前回の記事で書いた PUSH によるコード生成方式は自走プログラムの移動量が究極の1バイトであり、自走プログラムの移動量という点ではこれ以上小さくするのは不可能ということになります(プログラムの仕掛けという観点でも素晴らしいと思う)。
 本連載の初回記事「メモリ上で実際に動くプログラム」に PUSH を使わずブロック転送のみを使用した自走プログラムを追記しましたが、同様にブロック転送のみの場合でも移動量をもっと小さくできないか考えてみました。

 インクリメント方式のブロック転送である LDIR 命令では次のブロック転送のために16ビットの減算をする必要があり、キャリーのクリア等が必要になることを考えるとデクリメント方式の LDDR を使いたいものです。ブロック転送を利用した場合の最小移動量は2バイトになりそうですが、ブロック転送命令(LDDR=EDH,B8H)を二つ並べてブロック転送命令をブロック転送命令で上書きすることでブロック転送を中断しないようにするとブロック転送終了直後にコピーしたブロック転送を実行してしまうのでうまくいきません・・・

 しかし、巧妙な仕掛けを思い付きました^^ 
 方式のアイディアさえ固まれば、ブロック転送を利用した自走プログラムには慣れてきたのでほぼ机上コーディングのみで完成しました。完成したソースが下記で移動量は2バイトです。このソースを見て今回のアイディアの仕掛けが判りますか?

ブロック転送での自走プログラム例(Z80 アセンブラ)
;+++++++++++++++++++++++++++++++++++++ ; runner code on memory ; Ver 0.02 2024/01/18 by skyriver ; Ver 0.02a 2024/01/28 by skyriver ; Ver 0.02b 2024/01/29 by skyriver ; Ver 0.02c 2024/02/09 by skyriver ;+++++++++++++++++++++++++++++++++++++ 0000' ASEG ORG 0100H 0100 21 011A START: LD HL,CEND 0103 11 011C LD DE,CEND + 2 0106 06 00 LD B,0 0108 3E 10 LD A,CNEXT - CSTART + 2 010A F3 DI 010B 18 0A JR SETC 010D 00 00 CSTART: DB 0,0 010F 47 LD B,A ; ED 47 = LD I,A   0110 ED B8 CLDR: LDDR 0112 4F LD C,A 0113 09 ADD HL,BC 0114 EB EX DE,HL 0115 09 ADD HL,BC 0116 EB EX DE,HL 0117 0E 0E SETC: LD C,CNEXT - CSTART 0119 18 F5 JR CLDR 011A CEND EQU $ - 1 011B CNEXT EQU $ END


★追記 2024/02/09
 X(Twitter)に投稿した自走状況を可視化した動画を貼っておきます。


★追記 2024/02/10
 X での書込みメッセージに対して返信を頂きました。LDIR を使用し、移動量が1バイトというものです。コピー後の LDIR を再利用する部分とキャリーによる条件ジャンプの部分が味わい深いですね。LDIR で検討してみました(下記)が DI を除けば同じサイズになりました。

LDIR による1バイト移動の自走プログラム例(Z80 アセンブラ)
;+++++++++++++++++++++++++++++++++++++   ; runner code on memory ; Ver 0.02 2024/01/18 by skyriver ; Ver 0.02a 2024/01/28 by skyriver ; Ver 0.02b 2024/01/29 by skyriver ; Ver 0.02c 2024/02/09 by skyriver ; Ver 0.02d 2024/02/09 by skyriver ;+++++++++++++++++++++++++++++++++++++ 000E CSIZE EQU CEND - CSTART 0000' ASEG ORG 0100H 0100 11 0117 START: LD DE,CSTART + CSIZE 0103 06 00 LD B,0 0105 3E 0E LD A,CSIZE 0107 F3 DI 0108 2E DB 2EH ; LD L,xx 0109 ED B0 CSTART: LDIR 010B EB EX DE,HL 010C 4F LD C,A 010D ED 42 SBC HL,BC 010F 5D LD E,L 0110 54 LD D,H 0111 1B DEC DE 0112 ED B0 LDIR 0114 18 F2 JR CSTART - 1 0116 00 NOP 0117 CEND EQU $ END



[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー