[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
SEGA SG-1000 Emulator — ブラウザで動くSG-1000エミュレーター (Z80コア・VDP・SN76489音源 実装)
SN76489音源合成・AudioWorklet対応・NMI PAUSEサポートのWebブラウザSG-1000エミュレーター。
lain-lab.comZ80 EMULATOR PROJECT
Z80 EMULATOR PROJECT
フルスクラッチ JavaScript Z80 コアと、その上に構築されたレトロシステムエミュレーター群
lain-lab.comトップページのスタートメニューからも起動できます。(WINODW)
SG-1000
スクリーンショット
Palikat // helmha
smspowerさんのサイトより、helmha様作「Palikat」をお借りしています。
Palikat - Homebrew - SMS Power!
Homebrew Sega Master System / Mark III / Game Gear SG-1000 / SC-3000 / SF-7000 / OMV / AI
www.smspower.orgArno Dash // under4mhz
smspowerさんのサイトより、under4mhz様作「Arno Dash」をお借りしています。
Arno Dash - Homebrew - SMS Power!
THE GAME: There are 16 CAVES, each compromised of several scrolling screens. Each CAVE has 5 Difficulty levels. To select a different CAVE, press the arrow keys (or move the joystick) left or right when you are in the menu screen. To select a different DIFFICULTY level, go to the menu screen and press arrow keys (or move the joystick up or down). The greater the difficulty level, the less time and the more jewels you have to collect. You may choose CAVE 1,5,9, or 13 on difficulty levels 1-3. On difficulty levels 4 and 5, you must start with cave 1.
www.smspower.org動画(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 CORE | Z80A命令セット(全未定義命令・レジスタ・INT/NMI割り込み・遅延EI) |
| VDP (TMS9918) | Screen 1/2 プレーン描画、スプライト 0xD0 打ち切り、16KB VRAM アクセス制御 |
| SYSTEM BUS & I/O | ROM/RAMマッピング、I/Oポート部分デコード(port & 0xC1)、JOYPORT 1/2 読取 |
| SN76489 PSG AUDIO | 3ch 矩形波 + 1ch ノイズ (LFSR) 合成、減衰テーブル処理 |
| AUDIO WORKLET | メインスレッドとの MessagePort 通信、独立スレッドサウンドレンダリング |
| DISPLAY CANVAS | ImageData ピクセルバッファ描画、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 1P | PC キーボード |
|---|---|
| 方向キー (Up/Down/Left/Right) | カーソルキー () / WASD |
| ボタン 1 (Trigger 1) | Zキー / スペースキー (Space) |
| ボタン 2 (Trigger 2) | Xキー / 左Shift |
2P コントローラー
| SG-1000 2P | PC キーボード |
|---|---|
| 方向キー (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 表示・フルスクリーン対応
技術記事
[JavaScript] SEGA SG-1000エミュレーターを作る。Z80・TMS9918・SN76489(DCSG)音源とバス分離設計
MSXエミュレーターのZ80 CPUコアを再利用し、SEGA SG-1000エミュレーターをわずか約400行の追加コードで構築。部分デコード処理、SN76489 PSG音源のAudioWorklet合成、NMIによるPAUSEボタン実装までを解説。
lain-lab.com
[JavaScript] MSXエミュレーターを完成させる。MegaROMマッパー・PSG/SCC音源・AudioWorkletでのサウンド合成
MegaROMマッパー(Konami / SCC / ASCII)の実装、PSGおよびSCC音源のAudioWorkletによるリアルタイム合成、スプライト打ち切り挙動の修正までを解説。
lain-lab.com
Z80エミュレーター開発記 第4回:ハードウェアバスとエミュレーションの勘所 // PROTOCOL.LAIN
Z80エミュレーター開発記の最終回。M1サイクルの4 T-state構成、メモリリード/ライト、コールバック方式によるCPUコアとシステムの分離設計、zexdoc/zexallによる検証戦略を解説する。
lain-lab.com