1.はじめに
X(旧Twitter)で"Z80"の検索結果を眺めていたところ、興味深いお題を発見しました。このブログでも以前「Z80での全メモリ同一値設定処理」の記事で似たような問題をXで出したことがありますが、今回発見したお題は「0000Hから始まる最短の全メモリクリアプログラムを考えよ」という条件が付いています。
【歴史上最も素敵だったプログラミング問題】
— がたろう TTLでCPUを作る爺(コンパイラやOSも手作りです) (@duo6750) October 14, 2016
「0000H番地から始まるZ80の機械語プログラムで、それを実行するとその命令語領域を含め、全領域を00Hにするコードを作成せよ」
実際に書けた人は上級者。問題の難点が解るだけでも中級者。
最もバイト数が短い者が優勝。
\^o^/
2.お題の解答例
このお題の最短の解答が下記の7バイトのものです。PUSH HL と JP (HL) を使ったループでうまくメモリをクリアしていますね。2バイトずつ消していきますが、最後に LD L,H が残らないように工夫されています。0000 21 04 00 LD HL,4
— fujita nozomu (@fujitanozomu) October 15, 2016
0003 F9 LD SP,HL
0004 6C LD L,H
0005 E5 PUSH HL
0006 E9 JP (HL)
度々ですみません。1バイト減りました。@duo6750
3.別な回答
このお題はプログラムが長くてもいいのであれば割合簡単なのですが、上記の例のように7バイト以下にしようと思うと中々難問です。散歩中に思い付いたのが下記のプログラムです。ネット上でも殆ど見かけない Z80 のマシン語コードの特徴を利用したかなりトリッキーなものです。もう一つの効果として PUSH 命令を AND 命令化することでキャリーがクリアされるので2バイトで HL レジスタをクリアしています。※説明追記 2026/07/05今のところ6バイト以下のものは思い付いていません。
| ||


RETROF16のWEBサイトは証明書が古いままのためか、今では見るのにひと手間必要のようです。
自己書き換えコードで最後にプログラム自身を完全に塗りつぶす必要があるのが課題ですね。参考のコードは8080でもOKなところがナイスです。
リロケータブルなコードにするとか、任意の値で塗りつぶすとか、派生課題も面白そうです。
メモリクリアのお題は昔からあって、私もシーソースイッチ(トグルは高かった)でパチパチしながらもう少し長いコードを入れた記憶があります。
追記2026/07/02
マシン語なのでお題にあるサイズの次に気になるのは速度かなぁ、今回の場合は奇想天外な手法程面白いですね