5年越しのハローワールド - 文字列表示ルーチンを探る
プログラム書いてるくせに5年間ハローワールドもやってない奴がいたらしい原理
00:3C79 には文字列表示用サブルーチンがあります。(初期緑で確認、後期は違うらしい)
レジスタ HL に表示したい文字列を与えて call 3C79 するとメッセージボックスが出ます。
ただし、この表示システムはステートマシンのようになっており、
単なる文字列ではなくコマンドも一緒に与える必要があります。
・・・と、言葉で言っても難しいのでコードを見た方が早いと思います。
コマンドモードでの制御文字(わかる範囲で)
00 | 以降の文字を 0x50 が出現するまで表示 |
---|---|
01 | 後ろの2バイトで指定されたアドレスの文字列を 0x50 が出現するまで表示 |
06 | 入力を待つ |
08 | 以降を機械語として実行する。ret する前に HL に「文字列処理をどこから再開するか」を入れること。 |
文字列表示中の制御文字(わかる範囲で)
4F | 改行(入力待ちをしない) |
---|---|
50 | コマンドモードに戻る |
55 | スクロール |
57 | メッセージボックスを閉じる(コマンドモードには戻らないで ret するに等しい) |
実験
その121 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