とりあえず命令セットを見ていく。
0: jr nc,$+2 7: scf 8: jr c,$+2
ゴミ。
2: ld (00000h),a
使えそうに見える、が、 A レジスタを変更する手段が無い。
6: ld (hl),000h
オペランドも結局数値限定なのでイマイチ。
1: ld sp,00000h 3; inc sp 4: inc (hl) 5: dec (hl) 9: add hl,sp
残るのはこのへんかなと思う。方針は当然自己書き換えで Hello, world! を出力するコードを生成する。
1 はレジスタに任意の値を入れられる魔法の命令だけど一回使ったらもう SP はアホみたいな回数 INC する以外では戻らなくなるので最終手段。よって基本的にコードは 0 番地付近に埋める。よって INC SP で SP を 1 にして、 ADD HL, SP を INC HL として使ってポインタを進めつつ INC/DEC (HL) でメモリ操作。後戻りできない Brainf*ck 。
でまぁせっかく埋めたコードに戻る手段が無い (0x8000 まで行ったら putchar が呼ばれてしまう) ので最終手段気味な LD SP, 03030H で SP 増やして ADD HL, SP で HL も増やしてそのへんに適当に 0 番地に戻るコード埋めて終わり。