パスワードを忘れた? アカウント作成
15569512 story
ゲーム

初代ポケモンにオセロゲーム。ゲーム内にゲームを仕込む 28

ストーリー by nagazou
すご 部門より
route127 曰く、

マイクラ内でのFSB庁舎爆破未遂が話題となっていたが初代ポケモン内ではオセロゲーム(リバーシ)が実装されていたようだ。(AUTOMATON)

1996年に発売されたゲームボーイ用ソフトであるポケットモンスター内ではなかよしバッヂ(0xD983へのジャンプ)とポケモンのニックネームを利用した文字コードプログラミングによる任意コード実行(ACE:Arbitrary Code Execution)が知られていたがこの任意コード実行によりバイナリエディタを導入し(解説動画)そのバイナリエディタを使用してオセロゲームをZ80機械語で記述するものであるようだ。
バイナリエディタの作成はポケモンのニックネームを利用して行われるため、使用可能なバイト列に制約がある。(Z80ニモニックとニックネームの対応表
また、終端文字の除去等も必要なため、ゲーム内アイテムの利用やパッチの当て方等については流儀があり、今なお改良が続けられているようだ。

バイナリエディタを用いたポケモン内ゲームは今回のオセロゲーム(1121Byte)以前にもテトリス(572Byte)、マインスイーパ(432Byte)等が実現されているとのことである。
スラド諸兄もZ80機械語プログラミングは昔取った杵柄と挑戦してみてはいかがだろうか。

関連ニュースか?
ドミノ倒しで論理演算に挑戦
プラレールで作った全加算器が公開される
スーパーマリオメーカーはチューリング完全
ゲームボーイで動作する独自OS「AMADO」のカートリッジ版が店頭販売中

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 「初代ポケモンでオセロゲーム」しか書いてなかったから、赤と緑のカートリッジを64個ずつ集めて並べたのかと思ってたよ

  • 関連ニュースか、と挙げられてるが全然関係ないものですね。
    単にゲームなどの「正式な挙動」の範囲内でプログラミングを実現してるだけ。

    今回のストーリーに関連しそうなのは、
    任意コード実行ネタだと、近年注目される「任意コード実行を使ったゲームの高速クリア」 [developers.srad.jp]などとか、
    利用可能な機械語コードが制限された状況でのプログラム作成については、Hello, world!はASCIIで書くべきだ [developers.srad.jp]とか。

    あと、sradのストーリーになってませんが、任意コード実行で別のゲームを仕込むという話ならスーパーマリオワールドをクッパを倒さず謎のミニゲーム経由で爆速クリア [gigazine.net]なんかも。

    • by Anonymous Coward

      一行目からして、ロシアの事件からの任意コード実行の話ですからね。支離滅裂です。

  • by Anonymous Coward on 2022年02月17日 20時59分 (#4202073)

    6502だと勝手に思いこんでたよ。
    ファミコンからの移植大変だったんじゃないのかなあ

    • by Anonymous Coward

      Z80というより8080に近かったようですが
      液晶と抱合せでシャープのIP使ったのでしょうね

      • by Anonymous Coward on 2022年02月17日 23時32分 (#4202153)

        Z80比
        http://marc.rawer.de/Gameboy/Docs/GBCPUman.pdf [rawer.de]

        The following are added instructions:
          ADD SP,nn ;nn = signed byte
          LDI (HL),A ;Write A to (HL) and increment HL
          LDD (HL),A ;Write A to (HL) and decrement HL
          LDI A,(HL) ;Write (HL) to A and increment HL
          LDD A,(HL) ;Write (HL) to A and decrement HL
          LD A,($FF00+nn)
          LD A,($FF00+C)
          LD ($FF00+nn),A
          LD ($FF00+C),A
          LD (nnnn),SP
          LD HL,SP+nn ;nn = signed byte
          STOP ;Stop processor & screen until
          button press
          SWAP r ;Swap high & low nibbles of r

          The following instructions have been removed:
          Any command that uses the IX or IY registers.
          All IN/OUT instructions.
          All exchange instructions.
          All commands prefixed by ED (except remapped RETI).
          All conditional jumps/calls/rets on parity/overflow
          and sign flag.

          The following instructions have different opcodes:
          LD A,[nnnn]
          LD [nnnn],A
          RETI

        EX DE,HL や EX HL,(SP) は8080からあるが、それも削ったみたい。
        ゲームボーイ専用ではないかと。ポケコン以下なので流用先もなさそう。

        親コメント
      • by Anonymous Coward

        スラドで「IP」と言ったらどの用法が多いのだろう?

        インターネット・プロトコル?
        集積回路?
        知的財産権?
        ITパスポート試験?
        防沫等級?

        • by Anonymous Coward

          Instruction Pointer
          IronPython
          昔あった雑誌

        • by Anonymous Coward

          話題ごとに等しく多いでしょう。
          偏りがみられるなら観測者に依るかと。

        • by Anonymous Coward

          集積回路はICじゃないの?

    • by Anonymous Coward

      ファミコンからの移植大変だったんじゃないのかなあ

      完全移植というわけではないし、ハードウェアがさっぱり違うので
      CPUが同じだったとしても省ける工数は多くはないんじゃないかなと。

    • by Anonymous Coward

      6502がリトルエンディアンだというのを今知った。
      ビッグエンディアンだったら移植がもっと大変だっただろう。

      ちなみに自分がマシン語を使ったのは6809が最初で次に68000だったけど
      リトルエンディアンのことを知ったときは正気の沙汰ではないと感じた。
      もうエンディアンの違いは意識することもない人生を送っているけれど、
      なぜリトルエンディアンが主流になったのだろう?
      ハード的にはそちらのほうが有利な点があったとか?

      • by Anonymous Coward

        たとえば2バイト長の加算は
        リトルエンディアン:下位バイトフェッチ、下位加算、ポインタインクリメント、上位バイトフェッチ、上位加算、ポインタインクリメント
        ビッグエンディアン:上位バイトフェッチ、バッファ、ポインタインクリメント、下位バイトフェッチ、下位加算、上位加算、ポインタインクリメント
        となる。
        ビッグエンディアンは見た目はわかりやすいが回路的にはオーバーヘッドにしかならない。たとえば IBM System 360はビッグエンディアン、DEC VAXはリトルエンディアン、PDP-11は非常に特殊なエンディアン。
        https://ja.wikipedia.org/wiki/PDP-11 [wikipedia.org]

        PDP-11のエンディアンは独特であった。16ビットワードはリトルエンディアンで格納される。すなわち下位バイトがアドレスの小さいほうに格納される。32ビットワードを構成する2個の16ビットワードは、ビッグエンディアンで格納

        • by Anonymous Coward

          32032は「命令はビッグエンディアン、データはリトルエンディアン」という変なやつ。
          https://en.wikipedia.org/wiki/NS32000 [wikipedia.org]

          Uniquely, the size of the displacement is encoded in its most significant bits: 0, 10 and 11 preceded 7-, 14- and 30-bit signed displacements. (Although the processors are otherwise consistently little-endian, displacements in the instruction stream are stored in big-endian order).

        • by Anonymous Coward

          ビッグエンディアンがオーバーヘッドになるのは加算機が8ビットだからって事だろうか

      • by Anonymous Coward

        エンディアン嘘つかない
        うじゃうじゃ

  • by Anonymous Coward on 2022年02月17日 20時47分 (#4202067)

    任意コード実行の手段が出た時点でこの手の事は好きにできるからあんまり……
    RTAイベントでお披露目されたマリオワールドの実機でスネークゲーム組む奴の時点で技術的な面では出尽くしてる感じ。
    あれ以後はネットと連携させたり演出面で凝る方向に行ってる感じだったから、
    任意コードでオセロ組みました言われても驚けないんだよなぁ……

    いやま自力でコード組んでチャート組んでやりきってるのは素直に凄いとは思うよ?
    でもニュースになるかてーと……

    • by Anonymous Coward on 2022年02月17日 22時55分 (#4202127)

      でもDOOMが動いたらニュースにして欲しい

      親コメント
      • by Anonymous Coward

        GBでDOOM動いたら普通にニュースだわ

    • by Anonymous Coward

      タイトル見て隠しゲームが見つかったって話かと思ったらバグでバイナリ書き換えて実行する話なのね

    • by Anonymous Coward

      みんなCやC++を捨ててGCのある言語かRustを使おうぜ!というものすごく遠回しな意見広告かも

      • by Anonymous Coward

        ゲームキューブじゃなくてゲームボーイですってば。

  • by Anonymous Coward on 2022年02月17日 23時00分 (#4202134)

    サウンドプレヤー?らしき物を実装していた動画を見かけたことがあるのでその界隈では割と知られていると思います
    実はN64のゼルダ時のオカリナでも任意コード(ACE)が出来るのですが今のところRTAぐらいにしか活用されていません
    N64のプログラムは非常に難しいらしいのですが、猛者の方時のオカリナでテトリス等を実装されてみて名を挙げてみては?

    参考
    https://gigazine.net/news/20200127-star-fox-unmodified-zelda-cartridge/ [gigazine.net]

typodupeerror

「毎々お世話になっております。仕様書を頂きたく。」「拝承」 -- ある会社の日常

読み込み中...