2026年07月01日

Z80での全メモリクリアプログラム


1.はじめに
 X(旧Twitter)で"Z80"の検索結果を眺めていたところ、興味深いお題を発見しました。
 このブログでも以前「Z80での全メモリ同一値設定処理」の記事で似たような問題をXで出したことがありますが、今回発見したお題は「0000Hから始まる最短の全メモリクリアプログラムを考えよ」という条件が付いています。



2.お題の解答例
 このお題の最短の解答が下記の7バイトのものです。PUSH HL と JP (HL) を使ったループでうまくメモリをクリアしていますね。2バイトずつ消していきますが、最後に LD L,H が残らないように工夫されています。



3.別な回答
 このお題はプログラムが長くてもいいのであれば割合簡単なのですが、上記の例のように7バイト以下にしようと思うと中々難問です。散歩中に思い付いたのが下記のプログラムです。ネット上でも殆ど見かけない Z80 のマシン語コードの特徴を利用したかなりトリッキーなものです。もう一つの効果として PUSH 命令を AND 命令化することでキャリーがクリアされるので2バイトで HL レジスタをクリアしています。※説明追記 2026/07/05
 今のところ6バイト以下のものは思い付いていません。

       
Z80メモリクリアプログラム(アセンブラ)  
                        ;+++++++++++++++++++++++++++++++++
                        ; Fill all memory with zeros.
                        ;  Ver 0.01 20260701 skyriver
                        ;+++++++++++++++++++++++++++++++++
                        
[0000] :                	ORG	0000H
                        
[0000] : E6 E9          Start:	AND	0E9H
[0002] : ED 62          	SBC	HL,HL
[0004] : F9             	LD	SP,HL
[0005] : 35             	DEC	(HL)
[0006] : E9             	JP	(HL)
                        
                        	END



posted by skyriver at 22:49| Comment(2) | Z80 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
もしかして自作TTL CPU RETROF16の、がたろうさんでしょうか。
RETROF16のWEBサイトは証明書が古いままのためか、今では見るのにひと手間必要のようです。

自己書き換えコードで最後にプログラム自身を完全に塗りつぶす必要があるのが課題ですね。参考のコードは8080でもOKなところがナイスです。
リロケータブルなコードにするとか、任意の値で塗りつぶすとか、派生課題も面白そうです。

Posted by enaka at 2026年07月02日 10:46
 あのがたろうさんです。サイトはhttpでなら閲覧できますね。
 メモリクリアのお題は昔からあって、私もシーソースイッチ(トグルは高かった)でパチパチしながらもう少し長いコードを入れた記憶があります。

 追記2026/07/02
 マシン語なのでお題にあるサイズの次に気になるのは速度かなぁ、今回の場合は奇想天外な手法程面白いですね
Posted by skyriver at 2026年07月02日 12:53
コメントを書く
コチラをクリックしてください