コモドール64のスペックの解説

Giana Sistersの事書いたついでに、前々から書こう書こうと思っていたホームコンピュータ「Commodore 64」についてこの機会に知っている限りで書くことにした。
日本ではこのGreat Giana SistersのプラットフォームでもあったCommodore 64(以下C64)の詳細についてあまり知られておらず、日本語で詳しく解説しているサイトもほとんど見つけられなかったので、今回は当blogで大まかなスペックや機能などを解説する。ただし、自分も海外サイトを見ただけでまとめたので細かい所は間違えている可能性があり、その時はコメント欄なりでツッコミを。


C64は1982年にアメリカのコモドール社から発売されたホームコンピュータ。名前にある64とはメインRAMが当時としては大容量の64KB搭載されていたことに由来する。同じ64KB搭載したAppleIIIBM PCが$1,200〜$1,400で売られていた時代に、圧倒的なグラフィックとサウンド機能と64KBのメインRAMを搭載して半額以下の$600で発売されたために全世界で1,700万台という爆発的なヒットを飛ばした名機。
以下はそのスペック

  • CPU

AppleIIファミコン(カスタム品)でも使われた6502に8ビットのI/Oポート(メモリアドレス$01)を追加した6510という物を使用。動作周波数はNTSC地域で1.024MHz・PAL地域で0.985MHz。AppleIIと同じ1.024MHzではあるけど、ファミコンの1.79MHzには負ける。
6510で追加されたI/OポートだがC64では64KBあるメインRAMにすべてアクセスするためにROM・I/Oとバンク切り替えに使用したり、テープレコーダのデータ読込・モータ制御に使用している。
8ビットのうち6ビット分のみ使用していて、最初の#0-#2ビットの3ビット分にデータを書き込むとメモリアドレス$A000-$BFFF・$D000-$DFFF・$E000-$FFFFの3つの領域がRAM・ROM・I/Oのいずれかに切り替わる。
%x00書き込み時:全てのメモリアドレスをRAM領域にセット
%x01書き込み時:メモリアドレス$A000-$BFFF・$E000-$FFFFをRAM領域にセット
%x10書き込み時:メモリアドレス$A000-$BFFFがRAM、$E000-$FFFFをカーネルROM領域にセット。
%x11書き込み時:メモリアドレス$A000-$BFFFがBASIC ROM、$E000-$FFFFをカーネルROM領域にセット。
%0xx書き込み時:メモリアドレス$D000-$DFFFにキャラクターROMをセット。(%000書き込み時は無視される)
%1xx書き込み時:メモリアドレス$D000-$DFFFにI/Oをセット。(%000書き込み時は無視される)
※ビット書き込み時のxは任意のビット


I/Oポート残りの各1ビットづつで、読み込んだテープのデータ信号、テープレコーダのボタンが押されているか読込、モータのオンオフを実装している。

  • RAM、ROM

先ほど書いた通り64KBのRAMを搭載しているが、CPUだけでなくグラフィックチップ側のVIC-IIからもVRAM代わりに読み込みが発生する。基本的には交互にアクセスするサイクルスチールのような形となるが、VIC-II側でキャラクターポイントアクセス時に40クロック、スプライトデータアクセス時にスプライト毎に2クロックの追加クロックが発生し、その間はCPU側が停止することとなる。
またメインRAMの他にカラーRAMというキャラクター(文字)の色を決めたりマルチカラービットマップモード時に使用するRAMがI/Oアドレス上に1KB(40×25×16色・4ビットで512バイトだが上位4ビットは無視される)配置されている
ROMはカーネル・BASIC・キャラクターと分かれており、カーネルに基本的なルーチン、BASICはプログラミング言語、キャラクターに文字のフォントが書き込まれている。キャラクターROMは使用しなくてもRAM上にキャラクターを置いておいてVIC-IIの読み込みアドレスを変更すれば任意のキャラクターに変更することが可能。

  • VIC-II(グラフィックチップ)

C64の象徴の一つと言うべきチップ。
VICはVideo Interface Chipの略称で、コモドール社の前世代機「VIC-20」に積まれていたチップの後継となっている(ただしほぼ別物)。
メインRAM64KBのうち16KBがVIC-II側で読み込めるメモリ空間で、スクリーン・キャラクター・ビットマップと用途に合わせておおまかに3つの領域に分けられバンク切り替えのような形でメモリアドレスが変更できる。
スクリーンでは配置するキャラクターの種類やビットマップモード時のドットの色、キャラクターではフォントのグラフィック(もちろんキャラクターROMを使用することが出来る)、ビットマップではドットの情報を格納する。
1982年に登場したグラフィックチップとしては非常に高性能で、320×200ドット16色、スムーズスクロールやマルチカラースプライト、更にはラスター書き込み位置やスプライト衝突を検出してCPU割り込みを発生させることが出来る。


まずは背景面の画面モード解説
・標準キャラクターモード
横40×縦25で縦横8ドットのキャラクターを表示(解像度320×200ドット)していくモード。
スクリーンRAM領域から配置するキャラクター情報(256種)を読み込み、カラーRAM読み込んだ文字の色を各キャラクター毎に16色中1色で色づけしていく。
背景の色はVIC-II側のレジスタに書き込んだ16色中1色ですべてのキャラクターで共通の色が使用される。


・マルチカラーキャラクターモード
横40×縦25で横4縦8ドットのキャラクターを表示(解像度160×200ドット)していくモード。
横方向の解像度が半分になるのと、追加される色は全てのキャラクターで共通ではあるものの、キャラクター毎に指定できる16色中1色の他にVIC-II側のレジスタに書き込んだ2色で指定色1色 + 共通色2色の計3色(+背景色1色)でキャラクターに色づけしていく。


・標準ビットマップモード
解像度320×200ドットの解像度に自由にドットを打ち込めるが、縦横8ドット毎に指定した16色中2色のみ使用可能というモード。
ビットマップRAM領域を読み込み、0ビットだったらスクリーンRAMの上位4ビット(16色)の色、1ビットだったらスクリーンRAMの下位4ビット(16色)の色で色付けしていく。


・マルチカラービットマップモード
解像度160×200ドットとやはり横解像度は低下するものの横4ドット縦8ドット毎に指定した16色中3色 + 共通色1色の計4色でドットを打ち込めるモード。
ビットマップRAM領域を2ビット毎に読み込み、00ビットならVIC-II側レジスタで指定した共通色、01ビットならスクリーンRAMの下位4ビットの色、10ビットならスクリーンRAMの上位4ビットの色、11ビットならカラーRAM上の色で色付けしていく。



続いてはスプライト面の解説
横24ドット×縦21ドットの指定色1色の単色スプライトか、
横12ドット×縦21ドットの指定色1色 + 全てのスプライトで共通の2色のマルチカラースプライトを合計8個まで設定することが出来る。
8個って少なすぎるだろ、って思う人も多いと思うがC64にはラスター検出による割込み機能があるのでスプライトダブラー(スプライトを再定義して表示数を増やすテクニック)を使用することが出来る。


32個のスプライトを表示させているデモ


プレイヤーキャラの解像度を稼ぐために黒・白・黄・茶の単色スプライトを4枚重ね、その他のキャラクターは低解像度のマルチカラースプライトで表示しているC64ニュージーランドストーリー


また、このスプライトは縦横で別々に2倍表示に指定させることが可能だったり、他のスプライトや背景面と衝突を検出して割込みが発生する(と同時にスプライト8個、8ビット分あるレジスタの値が変わる)、デカキャラを表示させたり当たり判定の作成が楽になる機能を備えている。

  • SID音源(サウンド)

C64のもう一つの象徴。
短形波・三角波・のこぎり波・ノイズの計4波形を3音同時に出力できる。
ADSR(エンベロープ・ジェネレータ)も3音個別に指定させることが可能で、ハイパス・ローパス・バンドパス等のフィルタ通して鳴らすことが可能で、一般的なPSG音源やファミコンの音とは違う音色を奏でることが出来る。
日本語で詳しい解説はこちらのサイトが参考になると思う。


サンプリング音源まで使用して演奏されるC64版ターボアウトランBGM

  • デモ

デモといえばAMIGAで動くデモが有名だが、C64も1MHzと64KBという制約の中で信じられない動きを見せつけてくれるデモが数多く存在し、驚愕とさせられる。
拡大縮小表示や簡単な3D表示はもちろん、果ては動画再生(流石にデータの格納にはフラッシュメモリを使用しているようだが)まで実現させるのであるから海外のデモ製作者は恐ろしい。



  • 参考資料

C64 Wiki
Commodore 64 memory map
Commodore 64 display modes
The MOS 6567/6569 video controller (VIC-II) and its application in the Commodore 64


25c3: The Ultimate Commodore 64 Talk