[WEB App] SEGA SG-1000 Emulator — ブラウザで動くSG-1000エミュレーター (Z80コア・VDP・SN76489音源 実装)

[WEB App] SEGA SG-1000 Emulator — ブラウザで動くSG-1000エミュレーター (Z80コア・VDP・SN76489音源 実装)

SEGA SG-1000 Emulator

Z80 CPUコアのエミュレーションをベースに、TMS9918 VDP、SN76489 PSG音源(DCSG)、1P/2P コントローラーI/O、NMI割り込みを利用したPAUSEボタンまでをブラウザ完結で実装したSEGA SG-1000エミュレーター。

カートリッジROM(.sg / .bin)のドラッグ&ドロップまたはファイル選択により、環境構築なしでブラウザ上で即座に実行可能。音声を司る SN76489 (DCSG) の合成には Web Audio API の AudioWorklet を採用し、メインスレッドの描画負荷の影響を受けない低遅延サウンド再生を実現している。

SG-1000 EMULATOR

Z80 EMULATOR PROJECT

トップページのスタートメニューからも起動できます。(WINODW)

SG-1000

スクリーンショット

Palikat // helmha

smspowerさんのサイトより、helmha様作「Palikat」をお借りしています。


Arno Dash // under4mhz

smspowerさんのサイトより、under4mhz様作「Arno Dash」をお借りしています。

動画(GIF)

特徴

  • シンプルなバス分離設計による高レスポンスエミュレーション:
    Z80 CPUコアのメモリ/IO読み書きを独立したコールバック関数として分離。SG-1000固有のメモリマップ(ROM 0x0000-0x7FFF / RAM 0xC000-0xC3FF ミラーリング)や部分デコード(port & 0xC1)を正確に処理。

  • SN76489 (DCSG) PSG 音源のリアルタイム合成:
    3チャンネルのトーン(矩形波)と1チャンネルのノイズ(15bit LFSR)の音量・周波数レジスタ制御に対応。2dBステップの対数減衰テーブルを用いた忠実な音量合成を実施。

  • AudioWorklet による独立スレッド音声制御:
    Web Audio API の AudioWorkletProcessor を利用し、メインスレッド(描画・入力処理)から分離された高優先度オーディオスレッドで波形を生成・出力。

  • TMS9918 VDP 描画メカニズムの実装:
    Screen 1/2 の各描画モード、16KB VRAM制御、スプライトアトリビュートテーブルの 0xD0 (208) 打ち切り挙動を完全エミュレート。

  • PAUSE ボタン(NMI 割り込み)対応:
    実機本体に備え付けられた PAUSE ボタンを再現。キー割り当てにより Z80 の NMI(ノンマスカブル割り込み:ベクタ 0x0066)を直接発火可能。

  • 2P マルチプレイ・レスポンシブ & フルスクリーン対応:
    キーボード操作による 1P / 2P コントローラー入力に対応。4:3 アスペクト比を維持した拡大(Fit)および倍率指定(2x / 3x / 4x)、全画面表示をサポート。

モジュール構成

モジュール名主要機能
Z80 CPU COREZ80A命令セット(全未定義命令・レジスタ・INT/NMI割り込み・遅延EI)
VDP (TMS9918)Screen 1/2 プレーン描画、スプライト 0xD0 打ち切り、16KB VRAM アクセス制御
SYSTEM BUS & I/OROM/RAMマッピング、I/Oポート部分デコード(port & 0xC1)、JOYPORT 1/2 読取
SN76489 PSG AUDIO3ch 矩形波 + 1ch ノイズ (LFSR) 合成、減衰テーブル処理
AUDIO WORKLETメインスレッドとの MessagePort 通信、独立スレッドサウンドレンダリング
DISPLAY CANVASImageData ピクセルバッファ描画、4:3 レスポンシブ・倍率・フルスクリーン制御

使い方

1. アプリの起動

ページを開くと SG-1000 エミュレーターの画面が起動します(ROM未読み込み状態では待機画面が表示されます)。

2. ROM ファイルの読み込み

下部UIの「Load ROM」ボタンをクリックしてファイルを選択するか、画面上へ直接 SG-1000 の ROM ファイル(.sg または .bin)をドラッグ&ドロップします。

3. PAUSE ボタンの利用

ゲーム中に PAUSE キー(Pキー)を押すと、実機の PAUSE ボタンを押したのと同様に Z80 へ NMI 割り込みが送信され、ゲームが一時停止 / 再開します。

4. 画面サイズ・フルスクリーンの変更

中央下のドロップダウンより「Fit」(画面幅最適化)または「2x / 3x / 4x」(ピクセル等倍指定)を選択できます。「Full Screen」ボタンで全画面表示に移行します。

キーボード操作

1P コントローラー

SG-1000 1PPC キーボード
方向キー (Up/Down/Left/Right)カーソルキー (↑↓←→\uparrow \downarrow \leftarrow \rightarrow) / WASD
ボタン 1 (Trigger 1)Zキー / スペースキー (Space)
ボタン 2 (Trigger 2)Xキー / 左Shift

2P コントローラー

SG-1000 2PPC キーボード
方向キー (Up/Down/Left/Right)I / K / J / L
ボタン 1 (Trigger 1)Vキー
ボタン 2 (Trigger 2)Bキー

システム操作

SG-1000 機能PC キーボード
PAUSE (NMI 割り込み)Pキー

技術スタック

  • JavaScript (ES6+ / Modules) — エミュレーターコア・ロジック
  • Web Audio API (AudioWorklet) — SN76489 リアルタイム波形合成
  • HTML5 Canvas (2D Context / ImageData) — 60fps ピクセル描画
  • Astro — Webアプリケーション基盤

更新履歴

  • [2026-09-16]: v1.0 初回公開。
    • Z80 CPU / TMS9918 VDP / SN76489 PSG 音源コアの実装
    • SG-1000 独自メモリマップおよび I/O ポート部分デコード対応
    • NMI 発火による本体 PAUSE ボタンのエミュレーション
    • Web Audio API / AudioWorklet による SN76489 リアルタイム音源合成
    • 1P / 2P キーボード入力マッピングおよび 4:3 表示・フルスクリーン対応

技術記事