Tachibana

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.sshapes.s)、実行・キャプチャ・プロファイル用の Phosphoric(パスは Makefile で調整)。

make ターゲット

makebuild/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 にしても高速時の魚雷が見えにくいままです。

← Astéroric · マニュアル →