
初代ポケモンにオセロゲーム。ゲーム内にゲームを仕込む 28
ストーリー by nagazou
すご 部門より
すご 部門より
route127 曰く、
マイクラ内でのFSB庁舎爆破未遂が話題となっていたが初代ポケモン内ではオセロゲーム(リバーシ)が実装されていたようだ。(AUTOMATON)
1996年に発売されたゲームボーイ用ソフトであるポケットモンスター内ではなかよしバッヂ(0xD983へのジャンプ)とポケモンのニックネームを利用した文字コードプログラミングによる任意コード実行(ACE:Arbitrary Code Execution)が知られていたがこの任意コード実行によりバイナリエディタを導入し(解説動画)そのバイナリエディタを使用してオセロゲームをZ80機械語で記述するものであるようだ。
バイナリエディタの作成はポケモンのニックネームを利用して行われるため、使用可能なバイト列に制約がある。(Z80ニモニックとニックネームの対応表)
また、終端文字の除去等も必要なため、ゲーム内アイテムの利用やパッチの当て方等については流儀があり、今なお改良が続けられているようだ。
バイナリエディタを用いたポケモン内ゲームは今回のオセロゲーム(1121Byte)以前にもテトリス(572Byte)、マインスイーパ(432Byte)等が実現されているとのことである。
スラド諸兄もZ80機械語プログラミングは昔取った杵柄と挑戦してみてはいかがだろうか。
関連ニュースか?
ドミノ倒しで論理演算に挑戦
プラレールで作った全加算器が公開される
スーパーマリオメーカーはチューリング完全
ゲームボーイで動作する独自OS「AMADO」のカートリッジ版が店頭販売中
タレコミタイトル (スコア:2)
「初代ポケモンでオセロゲーム」しか書いてなかったから、赤と緑のカートリッジを64個ずつ集めて並べたのかと思ってたよ
Re:タレコミタイトル (スコア:2)
それだと2型2色覚の方が遊べない。
Re:タレコミタイトル (スコア:2)
色覚障害があってもフシギバナとリザードンの識別 [c.yimg.jp]は可能では?
Re:タレコミタイトル (スコア:2)
なるほど、色ではなく形で判別ですね。
色で頭一杯で、そこまで頭が回りませんでした。
Re: (スコア:0)
初代ポケモンは青も黄色もあるから好きなの選べよ
Re: (スコア:0)
UNOにしようぜ
ネ木1 ネ木4 → (スコア:1)
関連ニュースか、と挙げられてるが全然関係ないものですね。
単にゲームなどの「正式な挙動」の範囲内でプログラミングを実現してるだけ。
今回のストーリーに関連しそうなのは、
任意コード実行ネタだと、近年注目される「任意コード実行を使ったゲームの高速クリア」 [developers.srad.jp]などとか、
利用可能な機械語コードが制限された状況でのプログラム作成については、Hello, world!はASCIIで書くべきだ [developers.srad.jp]とか。
あと、sradのストーリーになってませんが、任意コード実行で別のゲームを仕込むという話ならスーパーマリオワールドをクッパを倒さず謎のミニゲーム経由で爆速クリア [gigazine.net]なんかも。
Re: (スコア:0)
一行目からして、ロシアの事件からの任意コード実行の話ですからね。支離滅裂です。
ゲームボーイはZ80だったのか… (スコア:1)
6502だと勝手に思いこんでたよ。
ファミコンからの移植大変だったんじゃないのかなあ
Re: (スコア:0)
Z80というより8080に近かったようですが
液晶と抱合せでシャープのIP使ったのでしょうね
Re:ゲームボーイはZ80だったのか… (スコア:2, 参考になる)
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からあるが、それも削ったみたい。
ゲームボーイ専用ではないかと。ポケコン以下なので流用先もなさそう。
Re: (スコア:0)
スラドで「IP」と言ったらどの用法が多いのだろう?
インターネット・プロトコル?
集積回路?
知的財産権?
ITパスポート試験?
防沫等級?
Re: (スコア:0)
Instruction Pointer
IronPython
昔あった雑誌
Re: (スコア:0)
話題ごとに等しく多いでしょう。
偏りがみられるなら観測者に依るかと。
Re: (スコア:0)
集積回路はICじゃないの?
Re: (スコア:0)
ファミコンからの移植大変だったんじゃないのかなあ
完全移植というわけではないし、ハードウェアがさっぱり違うので
CPUが同じだったとしても省ける工数は多くはないんじゃないかなと。
Re: (スコア:0)
6502がリトルエンディアンだというのを今知った。
ビッグエンディアンだったら移植がもっと大変だっただろう。
ちなみに自分がマシン語を使ったのは6809が最初で次に68000だったけど
リトルエンディアンのことを知ったときは正気の沙汰ではないと感じた。
もうエンディアンの違いは意識することもない人生を送っているけれど、
なぜリトルエンディアンが主流になったのだろう?
ハード的にはそちらのほうが有利な点があったとか?
Re: (スコア:0)
たとえば2バイト長の加算は
リトルエンディアン:下位バイトフェッチ、下位加算、ポインタインクリメント、上位バイトフェッチ、上位加算、ポインタインクリメント
ビッグエンディアン:上位バイトフェッチ、バッファ、ポインタインクリメント、下位バイトフェッチ、下位加算、上位加算、ポインタインクリメント
となる。
ビッグエンディアンは見た目はわかりやすいが回路的にはオーバーヘッドにしかならない。たとえば IBM System 360はビッグエンディアン、DEC VAXはリトルエンディアン、PDP-11は非常に特殊なエンディアン。
https://ja.wikipedia.org/wiki/PDP-11 [wikipedia.org]
PDP-11のエンディアンは独特であった。16ビットワードはリトルエンディアンで格納される。すなわち下位バイトがアドレスの小さいほうに格納される。32ビットワードを構成する2個の16ビットワードは、ビッグエンディアンで格納
Re: (スコア:0)
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).
Re: (スコア:0)
ビッグエンディアンがオーバーヘッドになるのは加算機が8ビットだからって事だろうか
Re: (スコア:0)
エンディアン嘘つかない
うじゃうじゃ
任意コード実行の時点で (スコア:0)
任意コード実行の手段が出た時点でこの手の事は好きにできるからあんまり……
RTAイベントでお披露目されたマリオワールドの実機でスネークゲーム組む奴の時点で技術的な面では出尽くしてる感じ。
あれ以後はネットと連携させたり演出面で凝る方向に行ってる感じだったから、
任意コードでオセロ組みました言われても驚けないんだよなぁ……
いやま自力でコード組んでチャート組んでやりきってるのは素直に凄いとは思うよ?
でもニュースになるかてーと……
Re:任意コード実行の時点で (スコア:1)
でもDOOMが動いたらニュースにして欲しい
Re: (スコア:0)
GBでDOOM動いたら普通にニュースだわ
Re: (スコア:0)
タイトル見て隠しゲームが見つかったって話かと思ったらバグでバイナリ書き換えて実行する話なのね
Re: (スコア:0)
みんなCやC++を捨ててGCのある言語かRustを使おうぜ!というものすごく遠回しな意見広告かも
Re: (スコア:0)
ゲームキューブじゃなくてゲームボーイですってば。
昔youtubeで (スコア:0)
サウンドプレヤー?らしき物を実装していた動画を見かけたことがあるのでその界隈では割と知られていると思います
実はN64のゼルダ時のオカリナでも任意コード(ACE)が出来るのですが今のところRTAぐらいにしか活用されていません
N64のプログラムは非常に難しいらしいのですが、猛者の方時のオカリナでテトリス等を実装されてみて名を挙げてみては?
参考
https://gigazine.net/news/20200127-star-fox-unmodified-zelda-cartridge/ [gigazine.net]