2021年3月7日日曜日

Fairy Computer(新しいレトロゲーム機)

Fairy Computer System 80 (FCS80) という新しいレトロ(?)ゲーム機を開発中。

VGSとは別枠です。

VGSが目指した所は、純粋なエミュレーションではなく、アプリケーション・フレームワークによるプラットフォーム共通化でした。規模が全然違いますがUnityみたいなものです。FCS80はVGSと違う純粋なハードウェアエミュレーションによる「仮想ゲーム機」です。

https://github.com/suzukiplan/fcs80

CPUはZ80A互換。

8bit CPUの中で最も拡張性が高いZ80A互換CPUを採用しました。

動作速度はドーピングできなくもないですが、実機Z80Aと同じ(3579545Hz)にしておきましたので、仮に実機を開発する場合でもCPU調達については容易に可能です。

また、音源チップもAY-3-8910互換APUです。

こちらも(Z80Aよりは少し難しいかもしれませんが)一応簡単に調達できると思います。

ただし、PPU(VDP)に関しては既製品ではなく、オリジナルチップ(FCS80-VIDEO)なので、実機を作る場合はFPGA等でエミュレーション?(そっち方面は詳しくないです...)する必要があるかもしれません。

PPUもお手軽に調達できるように既製品を使うことを考えて、最有力候補はTMS9918Aだったのですが、それだとMSXやSG-1000と大差無くなってしまうのでツマラナイ。

ただし、TMS9918Aというと8bit時代のゲーム機のVDP代表格ですが、実のところ8bitでのプログラミングがしやすいかというと微妙です。(そもそもTMS9918Aを最初に搭載したTI-99/4Aは16bit機ですし)

ファミコンのPPUは6502でのプログラミングに特化したものですが、Z80Aのプログラミングに特化したVDPというのは実は存在しないような気がしたので、それならばZ80Aととことん相性の良いVDPを設計してみよう...というのがFCS80を作り始めたキッカケです。

TMS9918A系譜のVDPの何処がダメなのかというと、主にVRAMアドレスの管理が面倒です。TMS9918AのVRAMは16KB($0000〜$3FFF = 14bit)ですが、アドレスアクセスポートは1系統のみなので「2回連続してOUT」という野暮ったい実装が必要な点がイケてない。(実はこの点はファミコンのPPUでも同じです)

そこで、CPUメモリからVRAMをmemory mapする方式を採用しました。つまり、LD系の命令だけで簡単にVRAMを更新したり、読み取ったりすることが可能です。どちらかというとパソコン的なアプローチですね。

(CPU memory map)

AddressMap
$0000 ~ $1FFFPRG0: ROM Bank #0 (Program)
$2000 ~ $3FFFPRG1: ROM Bank #1 (Program or Data)
$4000 ~ $5FFFPRG2: ROM Bank #2 (Program or Data)
$6000 ~ $7FFFPRG3: ROM Bank #3 (Program or Data)
$8000 ~ $BFFFVRAM (16KB)
$C000 ~ $FFFFRAM (16KB)

VRAMがたったの16KBしかありませんが、そのたった16KBで2画面(BG + FG)、スムーススクロール、IRQによるラスタースクロール可能、256スプライト、256色同時発色というファミコンを遥かに凌駕するスペックを実現しています。(実のところまだ2KBぐらい空き領域 = Reserved Area がある)

(VRAM memory map)

CPU addressVRAM addressMap
$8000 ~ $83FF$0000 ~ $03FFBG Name Table (32 x 32)
$8400 ~ $87FF$0400 ~ $07FFBG Attribute Table (32 x 32)
$8800 ~ $8BFF$0800 ~ $0BFFFG Name Table (32 x 32)
$8C00 ~ $8FFF$0C00 ~ $0FFFFG Attribute Table (32 x 32)
$9000 ~ $93FF$1000 ~ $13FFOAM; Object Attribute Memory (4 x 256)
$9400 ~ $95FF$1400 ~ $15FFPalette Table (2 x 16 x 16)
$9600$1600Register #0: Scanline vertical counter (read only)
$9601$1601Register #1: Scanline horizontal counter (read only)
$9602$1602Register #2: BG Scroll X
$9603$1603Register #3: BG Scroll Y
$9604$1604Register #4: FG Scroll X
$9605$1605Register #5: FG Scroll Y
$9606$1606Register #6: IRQ scanline position (NOTE: 0 is disable)
$9607 ~ $9FFF$1607 ~ $1FFFReserved area
$A000 ~ $BFFF$2000 ~ $3FFFCharacter Pattern Table (32 x 256)

グラフィック以外の特徴的な点としては、バンクコントローラがカセット搭載ではなく本体搭載という点です。MSXのメガロムでいうところのASC8方式なので、1セグメント8KBで最大256バンク(つまり、最大2MB = 16メガビット)のROM空間を持つことができます。

あとは、RAMサイズは16KBです。

パソコンだったら多少物足りないサイズ感ですが、ゲーム専用機としてはかなりゴージャスなので、恐らくC言語でも割と普通にプログラミングできるかもしれません。(ちなみにSG-1000やファミコンは標準で2KB)

ただ、飽くまでも「Z80アセンブリ言語でのプログラミングがしやすい」という所を目指していきます。

基礎設計はだいたい出来上がっているのですが、example実装で何本かゲームを作りながら、適宜大幅な仕様変更を交えつつ作っていく予定なので、完成までにはまだまだ時間が掛かりそうです。

合理的ではないものを作りたい

ここ最近、実機版の東方VGSの開発が忙しくて、東方VGSの曲追加が滞っています。 東方VGS(実機版)のデザインを作りながら検討中。基本レトロUIベースですがシークバーはモダンに倣おうかな…とか pic.twitter.com/YOYprlDsYD — SUZUKI PLAN (...