WebX68k とは

About WebX68k

URLを開くだけで動く、ブラウザの中のX68000。

WebX68k は、X68000 エミュレータ px68k-libretro の wasm ビルドをブラウザで動かす Webプレイヤーです。IPL-ROM と Human68k version 3.02 のシステムディスクを同梱しているため、 何も用意しなくてもブラウザで開くだけで Human68k が起動します。

An X68000 in your browser. Just open the URL.

WebX68k is a web player that runs a WebAssembly build of the X68000 emulator px68k-libretro directly in your browser. It bundles the IPL-ROM and the Human68k version 3.02 system disk, so Human68k boots up with nothing else to prepare — just open the page.

インストール不要・ブラウザ完結

X68000 エミュレータ px68k-libretro の wasm ビルドをそのまま使っているため、アプリのインストールもブラウザプラグインも 不要です。対応ブラウザで URL を開けば、その場で X68000 が起動します。読み込んだディスクも、 ゲーム内セーブなどゲストが書き込んだ内容も、ブラウザ内(IndexedDB)にのみ保存され、 サーバーへ送信されることはありません。ただしブラウザのストレージは Cookie と同じく サイトデータの削除等で消えるため、大事なディスクはダウンロードして保管してください。

No install — runs entirely in the browser

WebX68k runs a WebAssembly build of the X68000 emulator px68k-libretro as-is, so there's no app to install and no browser plugin needed. Open the URL in a supported browser and the X68000 starts right there. The disks you load — and whatever the guest writes to them, such as in-game saves — are stored only inside your browser (IndexedDB) and are never sent to a server. Browser storage is cleared along with cookies when site data is deleted, so download any disk you care about to keep a copy.

FDD0 / FDD1 / HDD の3ドライブ同時搭載

実機同様に FDD を2台とHDDを1台、同時に搭載できます。各ドライブ行には 「ディスク挿入中」ではなく実機同様のアクセスランプを表示し、 既定は消灯、実際に読み書きしたフレームだけ点灯します。

FDD はコアを再起動せずに挿入・取り出し(ホットマウント)ができ、起動中でも ディスクを差し替えられます。一方 HDD は実機でも活線挿抜する機器ではないため、 扱えるのは起動前だけです。起動前に HDD をセットすれば、ファイル転送から 中身を編集した上で起動できます。起動後は読み取り専用になり挿抜も禁止されるので、 HDD を入れ替えたいときはページを再読み込みして起動前の状態に戻してください。 HDD イメージを持っていなくても、「ブランクHDDを作成」ボタンで Human68k形式・ FAT16フォーマット済みの空HDD(40MB)をその場で作れます(IPLは持たないため、 FDD から起動した Human68k のデータドライブとして使います)。

Three drives at once: FDD0 / FDD1 / HDD

Just like real hardware, WebX68k can mount two FDDs and one HDD at the same time. Each drive row shows a real machine-style access lamp rather than a "disk inserted" indicator — it stays off by default and lights up only on the frames where the drive is actually read or written.

FDDs can be inserted and ejected without restarting the core (hot-swap), so you can switch floppies while the machine is running. The HDD, on the other hand, isn't something you'd hot-swap on real hardware either, so it can only be handled before boot: set one before starting and you can edit its contents from the file transfer dialog first. Once the machine has booted it becomes read-only and can no longer be swapped — reload the page to get back to the pre-boot state if you need to change the HDD. If you don't have a HDD image, the "Create blank HDD" button builds a Human68k-partitioned, FAT16-formatted 40MB image on the spot (it carries no IPL, so it's used as a data drive for Human68k booted from an FDD).

実機同様の4:3表示モード

既定はドット等倍(コアの実解像度をそのまま正方形ピクセルで描く)表示ですが、 実機の X68000 は画面モードによらず常に4:3のモニタいっぱいに表示されます。 ツールバーの「…」メニュー(表示グループ)にある「4:3表示」で、その見え方に いつでも切り替えられます(設定は保存されます)。補正は常に拡大方向のみで、 512x512系の画面は横に、768x512系の画面は縦に伸びます。縮小方向にしないのは、 テキスト画面のような1ドット幅の文字線が縮小で間引かれて読めなくなるためです。

4:3 display mode, just like real hardware

WebX68k defaults to dot-for-dot (the core's native resolution at square pixels), but real X68000 hardware always fills a 4:3 monitor regardless of the active video mode. The "4:3 display" toggle in the toolbar's "..." menu (Display group) switches to that look at any time (the choice is saved). The correction is always applied by enlarging — 512x512-family modes stretch horizontally, 768x512-family modes stretch vertically. It's never done by shrinking, since that would drop the 1px-wide strokes of text-mode characters and make them unreadable.

ディスクライブラリとファイル転送

これまでに読み込んだ FD/HDD イメージは「ディスクライブラリ」から一覧・起動・削除でき、 次回同じイメージを開いたときに続きから再開できます。ドロップ/選択/URLパラメータの いずれかでZIP・LZHアーカイブを読み込んだ場合、中に複数枚のディスクが入っていれば 自動では装填せず、ライブラリへフォルダとしてまとめて登録して選んでもらいます。

ツールバーの「…」メニュー(ディスクグループ)にある「ファイル転送」からは、FTPクライアント風の2ペインUIでホスト(ブラウザ)⇔ ディスクイメージ間のファイル出し入れができます。Human68k のファイル名は Shift_JIS の 長いファイル名に対応しており、日本語ファイル名も正しく表示されます。取り込んだ ZIP/LZH アーカイブはその場で展開できます(書き込みは ASCII の 8.3 形式のみ対応)。

Disk library and file transfer

Every FD/HDD image you've loaded is listed in the Disk Library, where you can boot, or delete it. Opening the same image again resumes right where you left off. When a dropped/selected/URL-loaded ZIP or LZH archive contains multiple disk images, none of them are auto-inserted — they're registered as a folder in the library for you to choose from.

The toolbar's "..." menu (Disk group) has a "File Transfer" tool that gives you an FTP-client-style two-pane UI for moving files between the host (your browser) and a disk image. Human68k's long, Shift_JIS file names are supported and display correctly, including Japanese names. ZIP/LZH archives you bring in can be extracted on the spot (writing back is limited to ASCII 8.3-format names).

ステートセーブ / ロード

ツールバーの「…」メニュー(ステートグループ)の2項目で、実行中の状態をまるごとブラウザ内(IndexedDB)へ保存・復元 できます。保存データは gzip 圧縮されます。

保存されるのは本体側(CPU・メモリ・各コントローラ)の状態だけで、ディスクイメージの 中身は含まれません。そのため復元しても、ドライブのディスクが入れ替わったり、中身が 保存時点へ戻ったりすることはなく、そのとき挿さっているディスクがそのまま使われます。 保存したときと違うディスクを挿した状態で復元するとゲストが正しく動かないため、 ロード時に保存時のドライブ構成と現在の構成を照合し、食い違う場合は確認ダイアログを 表示してから復元する安全策を取っています。

Save state / load state

Two entries in the toolbar's "..." menu (State group) let you save and restore the entire running state to your browser (IndexedDB). Saved data is gzip-compressed.

What gets saved is the machine state only — CPU, memory and the various controllers — not the contents of the disk images. Restoring therefore never swaps the disks in the drives or rewinds their contents to how they were at save time: whatever is inserted at that moment keeps being used. Restoring with a different disk inserted than when you saved could make the guest misbehave, so on load WebX68k compares the drive configuration at save time against the current one and shows a confirmation dialog before restoring if they don't match.

マウス対応

canvas をクリック(または右ダブルクリック)すると Pointer Lock でマウスをキャプチャし、 ホストのマウス移動をそのままゲストへ送れます。X68000 のマウスは実機の仕様上、 相対移動量しか送れずカーソル位置はゲスト側が管理するため、ブラウザの絶対座標を 直接渡すことはできません。そこで WebX68k は IOCS のワークエリアを毎フレーム読んで ゲストカーソルの現在位置を把握し、目標との差分だけを送る閉ループで絶対位置に 追従させています。キャプチャの解除は Esc キーのみです(キャプチャ中はカーソルが ゲスト側に奪われるため、ツールバーの「…」メニューを開くこともできません)。

Mouse support

Clicking the canvas (or right-double-clicking it) captures the mouse via Pointer Lock, so your host mouse movement is forwarded straight to the guest. Because of how the X68000's mouse hardware works, it can only send relative movement — the guest itself keeps track of cursor position — so the browser's absolute pointer coordinates can't be handed over directly. To work around that, WebX68k reads the IOCS work area every frame to learn the guest cursor's current position and sends only the difference from the target, forming a closed loop that tracks absolute position. The only way to release the capture is the Esc key (while captured, the cursor belongs to the guest, so the toolbar's "..." menu can't even be opened).

仮想キーボード

px68k-libretro 本体にはソフトキーボードが無いため、タッチ環境でも X68000 を 操作できるよう独自に実装したものです。PC幅ではキー右下に実機キーキャップ風の かな刻印を常時併記し、スマホ幅では副刻印を隠す代わりに、かなロック中だけ 主刻印(英数)がかな刻印に入れ替わります。かなロック中に SHIFT をラッチすると、 さらに副刻印(ぁ ぃ っ 、 。 「 」 など)に切り替わります。 修飾キーはワンショット(SHIFT / CTRL / OPT.1 / OPT.2)とロック(CAPS / かな / ローマ字 / コード入力 / ひらがな / 全角)の2種類で複数同時ラッチでき、 XF1〜XF5 は常設、テンキーは「テンキー」キーでクラスタごとトグル表示します。

Virtual keyboard

px68k-libretro itself ships no on-screen keyboard, so WebX68k built its own so the X68000 can be operated on touch devices too. At PC widths, a small kana engraving is always shown in the corner of each key, like a real keycap. At phone widths there's no room for that, so it's hidden instead — the primary (alphanumeric) engraving swaps for the kana one only while kana lock is active. Latching SHIFT while kana lock is active swaps it again to the secondary engraving (ぁ ぃ っ 、 。 「 」 etc.). Modifier keys come in two flavors — one-shot (SHIFT / CTRL / OPT.1 / OPT.2) and lock (CAPS / Kana / Romaji / Code Input / Hiragana / Zenkaku) — and multiple can be latched at once. XF1–XF5 are always present, and the "Ten-key" key toggles the numeric pad cluster on and off.

ジョイスティック(ゲームパッド)対応

Gamepad API準拠のゲームパッドを繋ぐだけで、最大2台までポート1/2として使えます。方向入力は D-padと左スティックの両方に対応し(デッドゾーン調整可)、ツールバーの「…」メニュー(入力グループ) にある「ジョイスティック設定」から開くダイアログでは、接続中パッドの一覧・物理入力とX68000側入力の両方のライブ表示・ 割当編集(検出/コンボ/削除/XInput標準へのリセット)ができます。パッド種別は標準(2ボタン)・ CPSF-MD(8ボタン)・CPSF-SFC(8ボタン)から選べ(変更は次回起動時反映)、パッドのボタンに X68000キーボードのキーを割り当てることも可能です。設定はパッドごとにブラウザへ保存されます。

Joystick (gamepad) support

Plug in a Gamepad API-compliant controller and it works right away, up to two at once as Port 1/2. Directional input supports both the D-pad and the left stick (with adjustable deadzone). The "Joystick Settings" dialog, in the toolbar's "..." menu (Input group), shows the list of connected pads, a live display of both physical input and what's reaching the X68000 side, and full binding editing (detect, combo add, remove, reset to XInput defaults). Pad type can be Default (2 buttons), CPSF-MD (8 buttons), or CPSF-SFC (8 buttons) — a change takes effect on the next boot — and pad buttons can also be mapped to X68000 keyboard keys. Settings are saved to the browser per pad.

バーチャルパッド(スマホでゲームを遊ぶ)

ツールバーの「入力パネル」ボタンで、仮想キーボードの代わりにタッチ操作のバーチャル パッドを表示できます(排他)。方向入力はアナログスティック風(固定ベース+ノブ、 8方向スナップ)で、円の端をちょんと押すだけで方向が出ます。組み込みプロファイルは ジョイスティック(2ボタン)/カーソルキー+スペース/テンキー/ジョイスティック(6ボタン、 メガドライブ配列)の4種類で、🎮のメニュー末尾「割当を編集…」から自分好みに 作り直すこともできます。表示位置は実測した余白から自動で選ばれ、縦持ちなら画面下の 「パネル」、横持ちなら左右の余白へ「左右」配置、余白が無ければ画面へ半透明で 「重ねる」の3種類です。

ゲームパッドを持っていない PC ユーザー向けには、物理キーボードをジョイスティック 入力へ割り当てる機能もあります(「…」メニューの「入力」グループ「キーボード割当」、 既定は無効)。矢印キーをジョイスティックへ、またはテンキーへ割り当てる組み込み プロファイルから選べるほか、「キーを追加」から自分で入力元を増やして割り当てを 作ることもできます。

Virtual pad (playing on a phone)

The toolbar's "Input Panel" button can show a touch virtual pad instead of the virtual keyboard (mutually exclusive). Directional input is analog-stick-style (a fixed base with a knob, snapping to 8 directions) — a light tap near the edge of the circle is enough to get a direction out. Four built-in profiles are included — Joystick (2 Buttons) / Cursor Keys + Space / Tenkey / Joystick (6 Buttons, Mega Drive layout) — and "Edit assignments…" at the end of the 🎮 menu lets you build your own. The on-screen position is chosen automatically from measured available space: a docked "Panel" below the screen in portrait, "Sides" placement in the left/right margins in landscape, or a semi-transparent "Overlay" on the screen when neither margin is big enough.

For PC users without a gamepad, a physical keyboard can also be mapped to joystick input ("Keyboard Assignment" in the "..." menu's Input group, disabled by default), picking from built-in profiles that map the arrow keys to a joystick or to the numeric keypad — or building your own by pressing "Add Key" to register new input sources.

ホーム画面に追加(iPhoneでURLバーを消す)

iPhoneはWebページからブラウザのURLバーを消す手段が無いため、WebX68kをホーム画面に 追加して起動するとURLバーの無い状態で遊べます(Androidはフルスクリーンボタンの ネイティブ全画面で既に消せます)。

確定: ホーム画面アプリと通常のブラウザ(Safari/Chrome)とでは、 保存済みディスク・ステート・BIOS(IndexedDB)が共有されません(iOSではホーム画面 アプリ・Safari・Chromeがそれぞれ独立したストレージを持つため。実機で確認済み)。 どちらか一方に決めて使うのが無難です。ホーム画面版で遊ぶ場合は、ディスクの登録も ホーム画面版から行う必要があります。これは iOS 側の仕様であり、アプリ側では回避 できません。

Add to Home Screen (hides the URL bar on iPhone)

iPhone has no way for a web page to hide the browser's URL bar, so adding WebX68k to the Home Screen and launching it from there runs it without one (Android already hides it via the Fullscreen button's native fullscreen).

Confirmed: saved disks, state, and BIOS (IndexedDB) are not shared between the Home Screen app and a regular browser (Safari/Chrome) — on iOS, the Home Screen app, Safari, and Chrome each have their own independent storage (confirmed on a real device). It's best to pick one and stick with it; if you play from the Home Screen app, you also need to register disks from that same app. This is an iOS platform limitation that cannot be worked around from the app side.

AIがX68000を直接操作できるMCP対応

ローカルで動かす MCP サーバー(webx68k-mcp)経由で、Claude Code などの AI エージェントから WebX68k を直接操作できます。MCP サーバーはあなたのマシン上で動き、 画面内容やディスクイメージが外部サーバーへ送信されることはありません。

ブラウザで WebX68k を ?bridge=1 パラメータ付きで開くと、ページがローカルの MCP サーバーへ接続します。主なツールは以下のとおりです。

ツール名概要
status起動状態・画面サイズ・各ドライブの中身・マウスキャプチャの有無を取得します。
screenshot画面のPNGスクリーンショットを取得します。
type_text / key_sequenceASCII文字列やキーコードをキーボード入力として送信します。
mouse_move / mouse_clickマウスの相対移動・クリックを送信します。
save_state / load_state実行状態のスナップショット保存/復元を行います。
list_disks / insert_disk / eject_disk各ドライブへのディスク挿入/排出を行います。

X68000 のコンソールはグラフィック描画のため、画面をテキストとして読む手段はありません。 画面の確認は screenshot で行います。セットアップ手順の詳細は mcp/README.md を参照してください。すべてローカル動作です。

AI agents can operate the X68000 directlyMCP support

Through a local MCP server (webx68k-mcp), AI agents such as Claude Code can drive WebX68k directly. The MCP server always runs on your own machine, and screen contents or disk images are never sent to an external server.

Open WebX68k with the ?bridge=1 parameter to have the page connect to your local MCP server. Some of the main tools:

ToolDescription
statusGets boot state, screen size, each drive's contents, and mouse capture status.
screenshotCaptures a PNG screenshot of the screen.
type_text / key_sequenceSends ASCII strings or key codes as keyboard input.
mouse_move / mouse_clickSends relative mouse movement and clicks.
save_state / load_stateSaves/restores a snapshot of the running state.
list_disks / insert_disk / eject_diskInserts/ejects a disk from each drive.

Since the X68000's console is graphics-drawn, there's no way to read the screen as text — use screenshot to check it. See mcp/README.md for full setup instructions. Everything runs locally.

本物の ROM も使える

実機から吸い出した本物の IPL-ROM / CGROM(フォントROM)を持っている場合、画面の 「BIOS 設定」パネルから読み込めます。読み込んだファイルはブラウザの IndexedDB に 保存され、次回以降は自動で読み込まれ、同梱品より優先されます。

ファイル内容
iplrom.datX68000 IPL-ROM v1.0。無償公開されたものを許諾条件下で同梱。
human302.xdfHuman68k version 3.02 システムディスク。同上。
cgrom.dat実機の CGROM は再配布の対象外なので同梱できません。代わりにパブリックドメインの東雲フォントから生成した自作品で、字形は実機と異なります。

Bring your own ROM dumps

If you have real IPL-ROM / CGROM (font ROM) dumps from actual hardware, you can load them from the "BIOS Settings" panel. Loaded files are saved to your browser's IndexedDB, are loaded automatically from then on, and take priority over the bundled versions.

FileContents
iplrom.datX68000 IPL-ROM v1.0, bundled under the terms of its free public release.
human302.xdfHuman68k version 3.02 system disk, bundled under the same terms.
cgrom.datThe real CGROM isn't cleared for redistribution, so it can't be bundled. Instead, a custom one generated from the public-domain Shinonome font is included; its glyph shapes differ from the real hardware.

プライバシーとライセンス

本リポジトリは GPLv2 です。同梱の IPL-ROM / Human68k システムディスクは GPLv2 では なく、許諾条件.txt の条件(無改変・無償での再頒布)に従います。同許諾条件で添付が必須とされている この文書は、ディスクイメージと同じ system/ 内に同梱しています。 市販ソフトウェアのディスクイメージは一切同梱していません。

利用者が自分で用意して読み込んだディスクイメージ・ROM は、あなたのブラウザ内 (IndexedDB)にのみ保存され、サーバーへ送信されることはありません。それらのイメージの 取り扱い・権利関係については利用者自身の責任となります。

Privacy and licensing

This repository is licensed under GPLv2. The bundled IPL-ROM and Human68k system disk are not GPLv2 — they're distributed under the terms of 許諾条件.txt (redistribution unmodified and free of charge). Those terms require the document to accompany any redistribution, so it ships alongside the disk image in system/. No commercial software disk images are bundled.

Any disk image or ROM you supply and load yourself is stored only inside your own browser (IndexedDB) and is never sent to a server. You're responsible for the rights and handling of any such images you choose to load.