はじめに
💡 この記事は、すでに FM-7 / FM77AV の互換エミュレータを起動でき、ゲームで遊んだり BASIC プログラムを入力したりといったことができている方が、今度は“作る”側に回るための入口として書いています。ゴールは「自作の D77 ディスクイメージをエミュレータで動かす」ことです。
1982年に登場した富士通の8ビットパソコン FM-7、そして上位の FM77AV シリーズ。
CPUに Motorola 6809 を載せたこの名機向けのプログラムを、いまどきのPC(Windows WSL2 / macOS / Linux)の上で、C言語と6809アセンブラを併用しながら開発できるベーステンプレートを GitHub に公開しました。
- リポジトリ: https://github.com/7032/FM7BaseCode
- ライセンス: MIT
make ひとつで、自前のスタートアップから直接起動するD77ディスクイメージが出来上がります。エミュレータのドライブ0にセットして電源を入れるだけで、内蔵ブートROM → IPL → 本体プログラム の順に自動起動します。
この記事では、このテンプレートが「何をしてくれるのか」「どんな構成なのか」をざっと紹介します。
どんなものか — 30秒で
普通、レトロPCのプログラム開発は、当時の環境やアセンブラの制約で一苦労です。本テンプレートは、
- C言語で大半のゲームロジックを書ける(6809向けCコンパイラ CMOC を使用)
- 速度や低レベル制御が要る部分だけ6809アセンブラ(LWASM / LWLINK)で書ける
make一発で、エミュレータで起動できるディスクイメージ(D77)まで通しで生成
という「現代的なクロス開発フロー」を、最初から組み上げた状態で提供します。
ビルドの設定で普段いじるのは config.mk の数行だけ、という手軽さを目指しています。
NAME = hello
ORG = 0x0400
同梱サンプルが動かすもの
クローンして make するだけで、次のように動くサンプルがそのまま走ります。
-
assets/backimage.png(64×64 モノクロ)をタイル状に敷きつめた背景を描画 -
assets/character.pngから取り込んだ 32×32 のキャラクター(赤/シアン/白)を表示 - 画面上部にシアンの 「SCORE 0000」 表示
- テンキー 8/2/4/6 で上下左右に連続移動(押した方向にずっと進み、別方向キーで向き転換、それ以外で停止)
- 歩くと足が動くアニメーション、キャラの透明部分には背景が透けて見える
- BREAK キーで向いている方向へシアンのボールを発射(最大3連射)
- PSGサウンドで単音BGMが流れ、発射時はノイズの発射音、歩くと足音が鳴る
- 画面端ではちゃんと止まる
ポイントは、これらの描画を サブシステムROMの標準PRINT機能経由ではなく、自前のサブプログラムをサブCPU側のRAMに転送し、VRAMへ直書きして実現しているところです。FM-7系の「メイン6809/サブ6809」というデュアルCPU構成を踏まえた、実用的な描画の足場が一通り入っています。
構成のざっくり地図
FM7BaseCode/
├── config.mk # 普段いじるのはここだけ(プログラム名・配置アドレス)
├── Makefile # C/ASM → BIN → D77 までを一気通貫でビルド
├── src/
│ ├── c_main.c # ゲーム本体のロジック(メインループ)
│ ├── c_subprog.c/.h # サブCPU側へ転送する描画サブプログラム
│ ├── c_subsys.c/.h # サブシステム呼び出しヘルパ
│ ├── c_sound.c/.h # PSGサウンド(発射音・歩行音・単音BGM)
│ ├── asm_ipl.s # ディスクの先頭から本体を読み込むIPL
│ ├── asm_crt0.s # Cランタイムのスタートアップ
│ ├── asm_subprog.s # サブCPU側の描画ルーチン(スプライト等)
│ ├── asm_subsys.s # サブシステム連携
│ ├── asm_kbd.s # キー入力(IRQ駆動)
│ ├── asm_timer.s # フレームペーシング(メインタイマIRQ)
│ ├── asm_bootrom.s # 自前ブートROM(任意)
│ └── asm_runtime.s / asm_test.s
├── assets/ # 背景・キャラ・フォントの元画像
├── scripts/ # PNG→ASM 変換、BIN→D77 変換などのPythonツール
└── docs/ # 入門マニュアルと各種リファレンス
scripts/ には、画像(PNG)をスプライト/背景タイル/フォントのアセンブラデータへ変換する Python スクリプトや、バイナリをD77ディスクイメージへ固めるスクリプトがそろっており、これらは make の中から自動的に呼ばれます。アセットを差し替えれば、自分のキャラや背景がそのままビルドに反映されます。
技術的な見どころ
レトロPCに馴染みのない方にも、逆に「6809なら一家言ある」方にも面白がってもらえるよう、内部の作りを少し掘り下げておきます。
メイン6809/サブ6809 のデュアルCPU構成
FM-7系の特徴は、メインCPUとは別に、画面表示を専任する「サブシステム」側にもう一つ6809が載っている点です。VRAMはサブ側にぶら下がっており、メインから画面を触るには両CPU間でのやり取りが要ります。
本テンプレートは、サブシステムROMの標準PRINTを経由する代わりに、自前の描画ルーチン(サブプログラム)をサブ側のRAMへ転送し、サブ6809にVRAMを直書きさせる方式を採っています。これにより、PRINTの制約を離れて 32×32 スプライトの透過合成・背景タイル敷き・任意座標へのテキスト描画が自前で行えます。仕組みの全体像は docs/SUBPROGRAM.md、サブ側アセンブラの内訳は docs/GAMESUB.md にまとめてあります。
起動シーケンス(ROMに依存しない自前ブート)
ディスクから本体が立ち上がるまでの流れはこうです。
IPL(asm_ipl.s)は BASICモード(sector 1 を $0100 にロード)/DOSモード($0300)のどちらで呼ばれても起動できるように作ってあり、本体プログラムは両方のロード域を避けて $0400 に配置しています。config.mk の ORG を変えると、Makefile がリンクスクリプトと IPL の BODY_LOAD の両方へ自動反映するため、アドレスを動かしてもソースを書き換える必要はありません。さらに内蔵ブートROMを代替する自前ブートROM(asm_bootrom.s、512byte)も同梱しています。
アセット → アセンブラデータの変換パイプライン
画像やフォントは、ビルド時に scripts/ の Python ツールが6809アセンブラのデータ列へ変換してから組み込まれます。
| スクリプト | 変換 |
|---|---|
sprite_to_asm.py |
キャラPNG → 32×32 スプライト(前景 R/G の2プレーン=赤/シアン/白) |
bgtile_to_asm.py |
背景PNG → 64×64 タイル |
font_to_asm.py / make_font_png.py
|
8×8 フォントの生成・変換 |
bin2d77.py / bin2asm.py / pad_bootrom.py
|
バイナリ → D77 ディスクイメージ化ほか |
スプライトは前景 R/G の2プレーン構成で、透明部分には背景が透けます。アセットを差し替えて make し直すだけで、自分のキャラ・背景・配色がそのままビルドへ反映されます。データ形式の詳細は docs/SPRITE.md / docs/TILEMAP.md を参照してください。
C と 6809 アセンブラの分担
ゲームのメインループ(c_main.c)やサブシステム連携(c_subsys.c)は C で書き、Cランタイムのスタートアップ(asm_crt0.s)・キー入力(asm_kbd.s)・VRAM直書きの描画コア(asm_subprog.s)といった速度や低レベル制御が要る部分だけアセンブラに落とす、という分担です。CMOC が C をいったん LWASM 用アセンブラソースへ変換するため、両者は同じツールチェインの中で素直に混在できます。
サウンド(PSG)とフレーム同期
効果音とBGMは PSG(AY-3-8910) で鳴らします。3チャンネルを「発射音(ノイズ)/歩行音/単音BGM」に割り当て、PSGはメインCPU側のI/Oなので、描画を担うサブシステムとは独立に鳴らせます(docs/SOUND.md)。
地味に厄介なのがフレーム速度の安定化です。初代FM-7はメインCPUからVSYNC(垂直帰線)を検出できないため、処理の重い/軽いでループ周期がばらつき、BGMを載せるとテンポの揺れとして耳に付きます。本テンプレートは メインCPUの周期タイマ割り込み(約2ms)を数える経過時間カウンタ を用意し、「フレーム先頭でリセット → 一定時間が経つまで待つ」という deadline 方式で1フレームの実時間を揃えています。割り込みはタイマ(IRQ要因)を使うので、FIRQ要因の BREAK キーと干渉しません。キー入力も同じ割り込みで受け取ります(docs/TIMER.md)。
ツールチェイン
| ツール | 役割 |
|---|---|
| CMOC | 6809向けC言語コンパイラ。出力はLWASM用のアセンブラソース |
| LWASM / LWLINK | LWTOOLS の 6809 アセンブラ/リンカ |
| Python3 + Pillow | アセット変換・D77生成スクリプト用 |
どれもソースから導入できるオープンソースで、Windows(WSL2)/macOS/Linux のいずれでも同じ手順で開発環境が整います。導入手順はリポジトリの README.md に OS 別でまとめてあります。
# Debian / Ubuntu(WSL2含む)の例
sudo apt install -y build-essential libboost-all-dev bison flex \
texinfo git wget curl make autoconf automake python3 python3-pil
ビルドして動かすまで
環境さえ整えば、あとは驚くほど単純です。
git clone https://github.com/7032/FM7BaseCode.git
cd FM7BaseCode
make
build/<NAME>.d77(既定では build/hello.d77)が生成されます。これは 2D フロッピーのディスクイメージなので、普段ゲームのディスクイメージをドライブ0にマウントしているのと同じ要領でこの D77 をドライブ0にセットして電源ON/リセットすれば、内蔵ブートROM → IPL → 本体 の順で自動起動します(マウント操作の詳細はお使いのエミュレータのマニュアルを参照)。タイル背景の上でキャラがテンキーで動かせれば成功です。
IPL は BASIC モード/DOS モードのどちらのロード先でも起動できるように作ってあり、本体プログラムは両方のロード域を避けて $0400 に配置しています。FM-7 と FM77AV(AV40 / AV40EX 含む)で動作を確認しています。
ドキュメントが手厚い(と思います)
「テンプレートだけ置いて終わり」にしないよう、ドキュメントを充実させました。
| ファイル | 内容 |
|---|---|
| docs/TUTORIAL.md | ★入門マニュアル。「FM-7とは?」からテンプレ改造でゲームを作るところまで |
| docs/DETAIL.md | プロジェクト構成・起動シーケンス・Makefileの中身・ハマりどころ |
| docs/GAMEMAIN.md |
c_main.c のゲームロジック解説 |
| docs/GAMESUB.md | アセンブラ各部(IPL / crt0 / runtime / subprog / kbd / font / sprite 等)の概要 |
| docs/SUBPROGRAM.md | 自前サブプログラムによる独自描画の全貌 |
| docs/SPRITE.md | スプライトのデータ形式と変換スクリプト |
| docs/TIMER.md | フレーム同期(メインタイマ割り込みによる deadline ペーシング)の仕組み |
| docs/SOUND.md | PSG(AY-3-8910)サウンド(発射音・歩行音・単音BGM)の仕組み |
| docs/TILEMAP.md | タイルマップ背景の設計メモ |
| docs/FONT.md | 同梱8×8フォント(Press Start 2P, OFL-1.1)のライセンス・生成パイプライン |
まずは docs/TUTORIAL.md を通読すれば、アーキテクチャの理解からテンプレ改造のハンズオンまで一気に進めます。
こんな人におすすめ
- 6809 や FM-7/FM77AV で何か動かしてみたいけれど、環境構築でいつも挫折していた人
- アセンブラ全部はつらいので、ゲームロジックはCで書きたい人
- スプライト・背景タイル・キー入力・自前ブートまわりの動く土台が欲しい人
- レトロPCのデュアルCPU構成や起動シーケンスの実例を読み物として知りたい人
おわりに
FM-7/FM77AV は、当時としても凝ったデュアルCPU構成を持つ面白いマシンです。本テンプレートが、その上で「自分のゲームを動かしてみる」最初の一歩を、ぐっと短くできれば嬉しいです。
質問・改善提案などあれば Issue / コメントでお気軽にどうぞ。
参考リンク
- CMOC 公式: http://sarrazip.com/dev/cmoc.html
- LWTOOLS 公式: http://www.lwtools.ca/
- Motorola 6809 命令セットリファレンス(各種)
更新履歴
-
2026-06-08: CMOC の配布元 URL を修正しました。記事公開時に案内していた旧 URL(
perso.b2b2c.ca)が現在はアクセスできなくなっていたため、作者ご本人の恒久 URL(permalink)であるhttp://sarrazip.com/dev/cmoc.htmlに差し替えました。この URL は現在のホスティング先へ自動的に転送されるため、今後ホスティングが移転しても追従できます(HTTP のみ・HTTPS 非対応の点にご注意ください)。あわせてインストール手順のバージョンを最新の 0.1.98 に更新しました。旧 URL でアクセスできない旨をコメントでご報告くださった方、ありがとうございました。
