Closed24

ファミコンの驚くべき発想力 メモ

bayamasabayamasa

ゲーム用のグラフィック機能は汎用型PCでは再現出来ない時代があった。
これにより、グラフィック用のハードウェアPPUを備えた家庭用ゲーム機とWindowsなどが入った汎用型PCは差別化が進んでいた。
それからNVIDIAなどが3Dグラフィック機能を備えたビデオカードなどを発売し、徐々にPCでもゲームをすることが可能になった。

bayamasabayamasa

スプライトの表示は制限が存在する。
ファミコンの場合は8×8のスプライトは、64個までしか表示出来なかった。
このように画面内のピクチャの表示に制限があったため、昔のシューティングゲームの弾は早かった。

bayamasabayamasa

ファミコンは色数を制限するためにパレットという方式を採用した。
一つのパレットにつき4色の色が指定できたが、1色は透明色。
また1スプライトには1パレットしか採用できないため、1キャラクターに対する使える色の数は実質3色だけだった。
なのでマリオというキャラクターは赤色、肌色、黄土色の3色で表現されている

bayamasabayamasa

ROM(Read Only Memory)
その名の通り、読み込みしかできないメモリ。
RAM(Random Access Memory)
読み書き可能なメモリ
電源を切ると消えてしまう、揮発性のメモリ

bayamasabayamasa

RAMのスタック領域はLIFO(Last In Farst Out)となっている。
つまり最後に呼び出したものが、最初に放出される。
これはサブルーチン、つまり関数呼び出しなどに有効である。
なぜなら、サブ関数は呼び出した後、その効力を終える。
つまり最後似呼び出した関数が終了したタイミングで、その関数は不要になる。

そして、呼び出し元の関数はサブ関数が処理を終了した後も、処理を進める。
これは最初に呼び出した関数のデータは保持されていなければならないということ。

bayamasabayamasa

セーブデータ関連の話
ファミコンはセーブデータを特殊な割当領域のRAMに保存していた。
それをバッテリーバックアップメモリと呼ぶ。

これは揮発性のRAMを常時稼働させるために、電池を用いてずっと動かしておくことでデータが飛ばないようにするというもの。
なので、各ソフトのカートリッジの中に電池が入っている。
ただ電池が切れるとRAMに書いてあるデータが飛んでしまう。

昔自分もポケモン金を久しぶりにやろうとしたら、セーブデータが飛んでしまっていて悲しくなったことがある。

bayamasabayamasa

ファミコンは、というか現在におけるほとんどのゲームにおいても画面描画の処理は、1/60秒の間に行われる。
この1/60秒の間とは、垂直帰線期間(VBlank)と呼ばれる時間である。
基本的に液晶、ブラウン管などは左上から右下に向かって一行ずつ画面描画を行っている。
一番右下に達した時点で左上に戻って再描画を行うのだが、この右下から左上に戻る期間をVBlankとよぶ。
この時間は1/60よりも短い期間であり、その時間に次に描画しなくては行けないアセットを組む。
そうすることで、描画自体を切り替えることができている。

なので、1/60秒の間にファミコンは次の描画するデータを持っておかないといけない。
もし1/60秒に間に合わずに、画面が更新されなかった場合処理落ちと呼び、画面の更新ができない

bayamasabayamasa

I/Oポートを監視するメモリ領域、PPUステータスレジスタというものがあり画面描画の状況を監視している、
これを確認することでVBlankを検知することが出来る。

bayamasabayamasa

I/Oポートを監視するメモリ領域、PPUステータスレジスタというものがあり画面描画の状況を監視している、
これを確認することでVBlankを検知することが出来る。

bayamasabayamasa

アセンブリ言語は「アセンブラ」を使って機械語に翻訳する。
アセンブラはISAを使ってCPUがわかる言語に翻訳する。

bayamasabayamasa

ちなみにインタプリタ言語のrubyやらpythonはCRuby, CPythonと呼ばれるC言語アセットにコードを流し、そこでコンパイルすることでアセンブリ→機械語に変換している。

bayamasabayamasa

6502アーキテクチャ(ファミコンで使われている命令形)は通常の命令形よりも命令数を絞って開発されている。

bayamasabayamasa

スタックポインタも8bitだった。
スタック領域はサブルーチン関数を呼ぶときに以下の用途で使用する。

  1. 呼び出し元の関数のアドレス
  2. 関数内で使用する変数

そのためサブルーチンの中でサブルーチンを使用するなどの入れ子構造になるようなプログラミングはさけなければならなかった。

bayamasabayamasa

PC(プログラムカウンタ)
インデックスレジスタがデータの指すのに対して、PCはプログラムの命令がどこを指すのかを示すレジスタ
PCは6502で唯一16bitであった

bayamasabayamasa

アキュムレータ: 演算結果などを蓄積する特別なメモリ

bayamasabayamasa

キャラクタROMは当時、8×8ピクセルを256パターンしか定義できなかった
そのため、マリオなどのキャラクターに対しては2パターンを組み合わせた、16ピクセルで定義することが一般的だった
そのようにするとピクセルの容量の256パターンを簡単に消費してしまう。
だからこそ節約できるところは節約していた。

例えば、クリボーは歩いているように見えるので、立っている状態のピクセルと歩いている状態のピクセルが存在するように思えるが、実際は一つのピクセルを反転させているに過ぎない。
そのために一つのピクセルしか使用せずに済んでいる。

bayamasabayamasa

当時のドラクエは20文字ほどのカタカナしか使用できなかった。
その20文字はよく使うからという理由で選出された。
そのため、各呪文の「ギラ」「ホイミ」などはそこから採用されている

bayamasabayamasa

ファミコンはセーブデータをROMに入っている電池を回すことで実現していた。
しかし、その方法だと電源がショートしてセーブデータが破壊されてしまうということもしばしばあった。

そのため、ドラクエはパスワード方式を採用した。
パスワードは20文字で表され、1文字が6bitの情報を持った値だった。
つまり120bit= 15byte分の情報しかセーブデータとして必要ではなかった。

具体例の一部は以下
主人公の名前 6文字 * 4 = 24bit
装備
アイテムの数・種類
物語の進行 7bit
復活の場所 3bit

このスクラップは2021/08/20にクローズされました