z80 golf(2)

昨日の続き。メモリ空間はすべて0 (= NOP)で埋められている。*1 よって 8000Hを CALL したいなら、RST 38Hなどで代用できる。あるいは、プログラムが終端にあるなら、そのままfall throughさせてしまえば良い。


たとえば、echoなら以下のようになる。(id:hiro_suzuki:20071206)


0000: D5 PUSH DE
0001: CD 03 80 CALL $8003
0004: 30 01 JR NC,$0007
0006: 76 HALT


しかし、CALL 8000HをRST 38Hに置き換えただけでは21バイトにしか縮まない。トップ集団は20バイト。
fall through型に書き換える必要があるのかも知れないが、私には思いつかない。Hello, worldですらこれだけハイレベルなのには正直まいった。


少年時代にZ80のハンドアセンブラをがしがしやっていた人は是非挑戦してみるといいと思う。


Z80 機械語ニーモニック対応表
http://members.aol.com/njprog/z80_004.html

Z80 命令表
http://www.infonet.co.jp/ueyama/ip/software/z80_command.html

Z80 命令セット
http://systemax.jp/doc/Z80_inst.html

*1:実は 8000H〜FFFFHも0で埋められているようだ。PCが8000H,8003Hを指したときに特別な処理をしているのだと思う。場合によっては、8000Hにデータを書き込んでも構わない。また、8001Hに飛ばしても、8001H,8002HにNOPがあるので8003HにPCが移動してそこで8003Hのコードが実行される。あと、このように8000H,8003Hのサブルーチンは、特殊な処理をしているため、レジスタもスタックエリアも一切破壊されない。この性質が使える問題がありそう。