5年越しのハローワールド - 文字列表示ルーチンを探る

プログラム書いてるくせに5年間ハローワールドもやってない奴がいたらしい

原理

00:3C79 には文字列表示用サブルーチンがあります。(初期緑で確認、後期は違うらしい)
レジスタ HL に表示したい文字列を与えて call 3C79 するとメッセージボックスが出ます。
ただし、この表示システムはステートマシンのようになっており、
単なる文字列ではなくコマンドも一緒に与える必要があります。
・・・と、言葉で言っても難しいのでコードを見た方が早いと思います。

コマンドモードでの制御文字(わかる範囲で)

00以降の文字を 0x50 が出現するまで表示
01後ろの2バイトで指定されたアドレスの文字列を 0x50 が出現するまで表示
06入力を待つ
08以降を機械語として実行する。ret する前に HL に「文字列処理をどこから再開するか」を入れること。

文字列表示中の制御文字(わかる範囲で)

4F改行(入力待ちをしない)
50コマンドモードに戻る
55スクロール
57メッセージボックスを閉じる(コマンドモードには戻らないで ret するに等しい)

実験

その1
21 6b de; ld hl, de6b
cd 79 3c; call 3c79
c9; ret
00; 表示モードに入って 0x50 が出てくるまで表示する
da de 30 c8 df c4 7f b6 b2 be b7 3c 50; 文字列 "れんだねっと かいせきぶ" を表示
06; 入力待ち
00; 表示モードに入って
57; メッセージボックスを閉じる
その2 (改行の実験)
21 6b de cd 79 3c c9; 表示部分はその1と同じ
00 41 85 90 AE 82 7F 85 81 D8 AE E3 4F
A2 13 A5 AB 7F 41 0B AF AB 55
89 0F AC 87 7F 89 A5 AC 8F 55
0C 19 AC 93 7F 06 AD A8 AC 42 50
06 00 57
その3 (コード実行の実験)
21 6b de cd 79 3c c9
08 C5 D5 E5 F5 01 08 00 11 68 CD 21 1A 41 3E 04 CD A3 01 F1 E1 01 1B 00 09 D1 C1 C9
01 68 CD 00 7F 50
08 C5 D5 E5 F5 01 08 00 11 68 CD 21 B4 43 3E 04 CD A3 01 F1 E1 01 1B 00 09 D1 C1 C9
01 68 CD 00 7F 50
08 C5 D5 E5 F5 01 08 00 11 68 CD 21 7A 40 3E 04 CD A3 01 F1 E1 01 1B 00 09 D1 C1 C9
01 68 CD 00 4F 50
08 C5 D5 E5 F5 01 08 00 11 68 CD 21 F9 43 3E 04 CD A3 01 F1 E1 01 1B 00 09 D1 C1 C9
01 68 CD 00 7F 50
08 C5 D5 E5 F5 01 08 00 11 68 CD 21 1C 40 3E 04 CD A3 01 F1 E1 01 1B 00 09 D1 C1 C9
01 68 CD 00 7F 55 50
06 00 57
(技名読み出しテンプレ部分。即興で書いたのでもっと最適化しましょう・・・)
C5; push bc
D5; push de
E5; push hl
F5; push af
01 08 00; ld bc, 0008 技の名前は高々7文字+終端
11 68 CD; ld de, CD68 Dst はみんなよく使ってる CD68
21 1A 41; ld hl, 411a Src は技の名前を手で探してきてべた書きする・・・
3E 04; ld a, 04 技の名前はROMバンク04にある
CD A3 01; call 01A3 ROMバンクを切り替えながら memcopy 的なことをしてくれるサブルーチン
F1; pop af
E1; pop hl
01 1B 00; ld bc, 001B pop した HL は 08 の直後を指しているのでコード長を足して次の文字列へのポインタにする
09; add hl, bc
D1; pop de
C1; pop bc
c9; ret

評価

任意コード実行ができるので理論上はなんでもできるはずですが、
メッセージなどを真面目にゲーム内で書こうとするととても大変なのでお遊び程度に。


戻る
connecting: rikako.2rnd.msmrrenda.net