Astéroric — 機能詳細
Oric-1 48K 向け Asteroids 研究クローン · C + 6502 アセンブリ(cc65)· EUPL 1.2 ライセンス
このページは Astéroric の機能を、それぞれ何をどう行うかとともに一覧にしています。最新の参照は GitHub リポジトリ(README、ROADMAP、CHANGELOG)です。使い方はマニュアルをご覧ください。
目次
1. HIRES ベクター描画
Astéroric は自機、小惑星、円盤、魚雷、文字、数字のすべてを線分で描きます。ベクター画面のアーケード筐体と同じ発想ですが、Oric のビットマップ HIRES 画面上で行います。
モノクロ HIRES モード
240 × 200 ピクセル、PAPER 0 / INK 7。文字セットを $B400 から $9800 にコピーし、下部 3 行のテキスト行をクリアします。初期化時のビデオ属性は $1E(HIRES 50 Hz、PAL):$1C(60 Hz)では実機 Oric-1 で RGB2HDMI が信号にロックしませんでした。
XOR ブレゼンハム
各線分は XOR で描かれます。もう一度描けば消え、背景の保存は不要です。draw_line_xor ルーチン(src/asm/line.s)は自己書き換えアセンブリで、純粋な垂直線専用のパスと、水平軸でのバイト単位処理を備えています。線分間で共有される頂点は一度だけ描画(半開ブレゼンハム)。そうしないと XOR で打ち消されてしまいます。
プリレンダリング済みスプライト
回転しない形状(小惑星、円盤、数字)はプリレンダリングして XOR ブリットし、線分ごとの再描画を避けます。これがフェーズ 26 で、CPU の空き時間を 39.8 % に引き上げました。
ちらつき防止
各エンティティの消去と再描画をループ内で近接させ(エンティティごとに erase → tick → draw、前回位置を記憶)、オブジェクトが画面から消えている時間を短縮します。
サブピクセル移動
自機と小惑星は 8.8 固定小数点:240 × 200 のグリッドでも小数の速度と滑らかな軌道を実現。自機は事前計算テーブルで 32 方向(11.25°)に回転します。
2. アーケードへの忠実さ
ゲームロジックはアーケード ROM rev 4 の逆アセンブル(6502disassembly.com)から移植されています。Oric と同じ CPU であり、追跡可能性のため元の変数名を保持しています。
本物の小惑星
4 形状 × 3 サイズ、頂点は ROM から抽出(Nick Mikstas の研究)、形状あたり 11〜13 頂点で間引きなし。同時に最大 6 個(性能上の上限)。
ウェーブと破砕
アーケードの擬似乱数生成器から位置と速度を取った段階的なウェーブ出現。大きな小惑星に命中すると 3 つの破片が生まれ、親は縮小。プレイテストの結果、破片速度を調整(フェーズ 29)、全体速度を低減(フェーズ 37)。
円筒とトーラス
画面端の折り返しはインスタンス複製(端にまたがるオブジェクトを両側に描画)で実現し、衝突判定はトーラス位相で計算します。
自機、弾、ハイパースペース
アーケードに忠実な 5 セグメントの自機(コックピットバー、切り欠き)、推進炎、アーケード準拠の射程と折り返しを持つ 2 × 2 px の魚雷、SPACE 押しっぱなしで連射、25 % の死亡リスクを伴うハイパースペース。10,000 点ごとに残機追加、上限 60,000 点。残機アイコンの表示は最大 4 つ。
爆発
自機は 5 つの破片に分解(rev 4 の ShipExpVelTbl/ShipExpPtrTbl テーブル)、小惑星はアーケードそのままの破片パターンで短命の点に爆発します。
ゲームオーバーとスコア
3 段階のシーケンス(爆発 → GAME OVER → HIGH SCORES 表)、5 秒のロック、セッション中は上位 5 位のスコアを RAM に保持。
3. 円盤
大と小
アーケードから移植した射撃 AI を持つ 2 種の円盤:8 方向射撃または自機への照準、精度はスコア連動、35,000 点を超えると小型のみ。
ウェーブ終盤の圧力
ScrSpeedup:小惑星が残り少なくなると円盤の再登場が早まります。AstBreakTimer は小惑星命中直後の出現を抑止します。
4. AY-3-8912 サウンド
元のアーケードは離散アナログ発振器を使っていました。Astéroric の効果音は Oric の PSG 上での独自の再現です(Atari の音声データは一切再利用していません)。
割り込み駆動プレーヤー
サウンドは VIA の Timer 1 IRQ 下で 50 Hz(25 Hz で 2 回に 1 回更新)で再生され、メインループを解放します。PSG アクセスは保護されており(sei、専用スクラッチ)、IRQ 下の破損バグを 2 件発見・修正しました。
独立した 3 チャンネル
チャンネル A:効果音(発射、S/M/L の爆発、推進、ハイパースペース、残機追加)。チャンネル B:小惑星の数に応じて速まるドンドンという鼓動。チャンネル C:円盤の連続ビープ。自然な減衰のためのハードウェアエンベロープ(R11〜R13)。
タイトルジングル
タイトル画面に入ると「山の魔王の宮殿にて」(グリーグ、パブリックドメイン)がアッチェレランド、レガートで、チャンネル B のオクターブ重ねとともに流れます。
5. タイトル画面と表示
A〜Z ベクターフォント
フェーズ 40 以降、完全なベクターフォント(src/font.c)が汎用関数 text_draw を通じて「ASTERORIC」「GAME OVER」「PRESS SPACE」「HIGH SCORES」「WAVE」と CONTROLS 画面を描画します。
デモ画面
筐体と同じく、タイトルの背後を小惑星が漂います。「PRESS SPACE」が点滅し、ゲームは本当に SPACE を待ちます(時間経過での開始なし)。
HUD
7 セグメントのスコア数字、残機アイコン、2 桁のウェーブ番号。
6. キーボードとジョイスティック
キーボードの直接スキャン
キーボードは VIA と PSG のレジスタ 14 で列ごとに読み取り、ROM のキーボードバッファを使いません。ゲームは Atmos ROM の $0265 に依存しません。64 位置の完全なマトリクス(src/keys_tab.h)は ROM テーブルから文書化し、実機で検証済みです。
キー設定
タイトル画面で K を押すと CONTROLS が開きます。LEFT、RIGHT、THRUST、FIRE、HYPER を順番に入力し、重複や未知の位置は拒否、ESC でキャンセルして復元。割り当ては RAM に保持(再ロードで初期値)。
IJK ジョイスティック
IJK インターフェースはプリンタポート(VIA ポート A 直接、PB4 ストローブ)で存在ビットとともに読み取ります。インターフェースがなければ読み取りは無視されます。最初のプロトコル(PSG 経由の読み取り)は誤ったエミュレータモデルを再現していたため、物理インターフェースでのフィードバックを受けて修正しました。Phosphoric も並行して修正。再割り当て不可。
7. 性能
予算は 1 MHz の 6502 で 25 Hz、1 フレームあたり約 40,000 サイクルです。
固定ステップスケジューラ
フェーズ 28:VIA の Timer 1(20 ms)で刻む追いつき付き固定ステップ。60 ms のカクつきが消え、一定 25 Hz に。適応 50 Hz モードは試した上で却下。
測定
初期の描画は約 97 サイクル/ピクセル(フェーズ 2)。その後、自己書き換え、バイト単位一括処理、プリレンダリング済みスプライトで削減。プレイ中の CPU 空き時間は 17.9 % から 39.8 % に(フェーズ 24〜26)。make bench で 2,500 万サイクルをプロファイル。
ビデオ同期
実機 Oric-1 では CB1 ライン(VSync)が配線されていません。タイミングはフリーランの Timer 1 から取り、ビデオ信号には依存しません。
8. 仕様
| 項目 | 値 |
|---|---|
| 対象機 | Oric-1 48K、BASIC 1.0 ROM |
| 画面 | HIRES 240 × 200 モノクロ、50 Hz(属性 $1E) |
| フレームレート | 一定 25 Hz(VIA の Timer 1、20 ms) |
| サウンド | AY-3-8912、3 チャンネル、50 Hz の IRQ 駆動プレーヤー |
| 入力 | キーボード(VIA 直接スキャン、再割り当て可)、IJK ジョイスティック(プリンタポート) |
| ロード | オートランフラグ付き asteroric.tap(約 23 KB)、コードは $0500 |
| 言語 | C(cc65)+ 6502 アセンブリ(ca65) |
| ライセンス | EUPL 1.2(オリジナルコード)。Atari 由来の要素は対象外 |
9. ビルドとテスト
前提条件
cc65 2.19 以上(cc65、ca65、ld65)、テーブル生成器用の Python 3(ship_verts.s、shapes.s)、実行・キャプチャ・プロファイル用の Phosphoric(パスは Makefile で調整)。
make ターゲット
make は build/asteroric.tap を生成。make run / make run-joy は Phosphoric で起動(キーボード / エミュレート IJK)。make test はヘッドレスで画面をキャプチャ。make check はバージョン管理された参照キャプチャとビット単位で比較。make host-test は x86 ホストテストをビルド・実行。make bench は 2,500 万サイクルをプロファイル。
テスト
擬似乱数生成器と共有キーテーブルに対するポータブルなホストテスト(8 アサーション)、タイトル画面の参照キャプチャのビット単位比較、キーボード/ジョイスティックの非回帰のための Phosphoric 上のスクリプト化された射撃シナリオ(--type-keys)。
10. 既知の制限
Oric Atmos
.tap は Atmos ROM(BASIC 1.1)では Phosphoric でも Oricutron でも動作しません。名目上の対象は Oric-1 のままで、Atmos 互換は別スプリントです。
ハイスコアは保存されない
上位 5 位のスコアとキー割り当ては RAM 上にあり、再ロードで失われます。カセット/ディスク保存はロードマップにあります。
小惑星は最大 6 個
25 Hz を維持するための上限。アーケードはもっと多く表示します。
魚雷
実機では 2 × 2 px にしても高速時の魚雷が見えにくいままです。