
2026/05/16 4:23
WinCE64 - N64용 Windows CE 2.11
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
このテキストは、EverDrive-64 X7 リーダーを実際の Nintendo 64 ハードウェアに Microsoft Windows CE 2.11 を成功裏に移植したという重要な技術的達成を文書化しています。エミュレーションとは異なり、この構成は Microsoft のコア
nk.lib ライブラリを変更することなく、完全なデスクトップ機能—including ウィンドウ管理、N64 AI ハードウェアを用いたオーディオ出力、サードパーティ製 EXEの実行—を提供します。プロジェクトでは、元の CE 2.11 SDK にこれらの要素が含まれていなかったため、外部資源(例:libdragon ライブラリ)を用いてデスクトップシェル(Explorer、タスクバーなど)全体を从头再構築する必要がありました。主要な技術的作業には、RDP アクセラレーション付きの VI フレームバッファ用のカスタムドライバ、Joybus 経由での N64 コントローラ入力デコーディング、インタラプトマスク問題を解決するためのポーリングモードオーディオ処理が含まれます。公式エミュレーションは深いパッチが必要であるため未対応ですが、この概念実証(PoC)により、独自ドライバの実装を通じてレガシーソフトウェアをヴィンテージハードウェア上で動作させる方法が示されました。ただし、プロジェクトソースコードが MIT ライセンス下にあるにもかかわらず、結果生成されたバイナリは制限的な Microsoft SDK ライセンシングのために再配布できません。本文
Nintendo 64 における Windows CE 2.11
本項目は、実機の Nintendo 64 に標準的な Microsoft Windows CE 2.11 を動作させるものです。カスタム作成された HAL(ハードウェア抽象層)が、未改変の
nk.lib カーネルを VR4300 プロセッサにロードし、Windows CE 2.11 の GWES デスクトップおよびシェルを起動します。さらに、EverDrive-64 X7 内の SD カードを \SDCard ルート下としてマウントし、N64 コントローラーをマウスとして扱います。標準的な CE ワープロ(wave stack)経由で N64 AI ホールウェアからサウンドを発振させ、また SD カードに格納されたサードパーティ製 CE 2.11 EXE を直接実行可能にします。
これは趣味のためのリバースエンジニアリングプロジェクトです。マイクロソフトによる公式の「N64 向け Windows CE 2.11 ポート」は存在しません。「未改変の nk.lib」以下(HAL、OAL ディスプレイドライバー、FSD ファイルシステム、キーボード/マウス PDD、wave PDD、RDP アクセラレーション付き GDI フルフィルメント、ed64-X7 ドライバー)に至る全てが、本リポジトリに含まれています。
YouTube での紹介映像:https://www.youtube.com/watch?v=eGS9su_inBY
ステータス
実機の Nintendo 64 と EverDrive-64 X7 を使用して完全起動可能です。以下の機能が正常に動作しています:
- デスクトップ、タスクバー、ファイルブラウザ;ウィンドウのドラッグ操作、「X」マークによるクローズ、モーダルダイアログ
- N64 コントローラーがカーソルを駆動(A ボタン=左クリック、B ボタン=右クリック)
- FatFS を経由した X7 カートリッジ上の SD カードから
をマウント\SDCard\*
またはsndPlaySoundW
を通じた Wave オーディオ出力(N64 AI ホールウェアへ)waveOutOpen- SD カードからサードパーティ製 CE 2.11 EXE の起動可能(例:BeziersCE)
- RDP アクセラレーションによる 3D デモ(
)が、RDP を介してフラットシェーディングされた三角形を直接レンダリングcube3d.exe
アーキテクチャ
未改変の
nk.lib が中核(トランク)であり、PSLディスパッチャー、スケジューリング、TLB を管理しています。これを中心に、標準的な Windows CE 2.11 のユーザーモードモジュール(coredll.dll、gwes.exe、filesys.exe、device.exe、shell.exe)が ROM イメージからそのまま読み込まれます。カスタム開発部分は以下の通りです:
- HAL / OAL (
) — 起動処理、例外ベクター、MIPS 初期化、タイマー、USB デバッグ用、さらに 2 つの LE モードにおける RDRAM パartial-word クイック workaround を実装。bsp/hal/ - ディスプレイドライバー (
) — VI フレームバッファーと RDP フルフィルメントアクセラレーションに加え、オーバーレイ非対応ハードウェアにおいて Windows CE 2.11 の分割されたbsp/drivers/display/
/CURSOR.LIB
で残された隙間を埋えるソフトウェアカーソルコンポジターを備える。MCURSOR.LIB - マウス/キーボード PDD (
) — SI ジョイバスポーリングにより、N64 コントローラーと公式 N64 マウスの双方をデコード。bsp/drivers/kbdmouse/ - SD ファイルシステム (
) — FatFS に基づく FSD でbsp/drivers/sdfsd/
ルート下に登録。実ハードウェア特有の「書込後のリード」クイックを回避するため、libdragon の\SDCard
を置き換え、PI-DMA 基盤の EverDrive-X7 ドライバー(libcart
)を採用。edx_x7.c - Wave PDD (
) — MI_INTR_MASK_AI が実ハードウェア上で SysAD バスを停止させるため、インテラプトではなくポーリング方式を採用した AI 用ドライバーを、標準のbsp/drivers/wavedev/
の上に構築。waveapi.dll - commctrl.dll (
) — Windows CE 2.11 のbsp/drivers/commctrl/
に含まれるはずだったcommctrl.lib
を含む小型実体;これによりスプリナーコントロール(DllMain
クラスなど)が正常に登録される。msctls_updown32 - シェル (
) — Win9x 風のデスクトップ、タスクバー、ファイルブラウザを実装。bsp/shell/ - RDP 3D ライブラリ (
) — ユーザー製 EXE が使用する最小限の三角形レンダライザー(bsp/lib/rdp3d/
で利用)。bsp/apps/cube3d/
長時間にわたるデバッグ史(キャッシュクイック、TLB ウォーク、GWES 起動、CE サイド Wave スタックの特殊性など)については、各ドライバーのソースコードレベルにあるコメントを参照してください。
必要なもの
本リポジトリは、マイクロソフトまたは任天堂が保有するプロプライエタリなファイルを意図的に含まれていません。外部ツリーはご自身で入手し、このディレクトリの隣(またはシンボルリンク)に配置する必要があります:
| パス | 内容 | 入手先 |
|---|---|---|
| Microsoft Windows CE 2.11 Platform Builder / Embedded Toolkit | すでに絶版ですが、オンライン上で入手可能です。 |
| N64 ホームブリューツールチェーン(mips64-elf-gcc, n64.mk)と FatFS ソース | https://github.com/DragonMinded/libdragon — クローン後、インストールスクリプトを実行し をツールチェーンに指させる。 |
| EverDrive-64 X7 | 実機動作用カートリッジ | https://krikzz.com。SD カードには公式 EverDrive フームウェアの複製を格納する必要があります。 |
ホスト側の開発環境:
- Wine — SDK 内の
、CLMIPS.EXE
、LINK.EXE
、RC.EXE
はすべて Wine 上で動作します。Linux でテスト済みです。ROMIMAGE.EXE - Python 3 と Pillow
- libdragon ツールチェーンから取得した mips64-elf-gcc(ブートローダー ROM の作成用)
- EverDrive-X7 への USB 経由アップロードを行う場合や
をビルドする場合は、libftdi1 のインストールが必要です。diag/ed64_upload
ビルド手順
wince211_sdk/ と libdragon/ をこのディレクトリの隣に配置した後:
このスクリプトは HAL および全てのドライバー DLL をコンパイルし、Wine 上で
LINK.EXE と ROMIMAGE.EXE を実行することで bsp/build/nk.bin(標準的な CE ROM イメージ)を生成します。その後、ブートローダーの Makefile と連鎖して、これを libdragon IPL3 トランポリンでラップし、出力を bootloader/n64ce.z64(約 3.5 MB、X7 で直接読み込める形式)に導きます。
通常のクリーンビルドは現代のハードウェアであれば約 30 秒で完了します。支配的なコストは Wine のコールドスタートですが、ビルドスクリプトでは一時的な wineserver プロセスを維持することでこれを相殺しています。
実行方法
実機の Nintendo 64 + EverDrive-64 X7 で動作させる場合
USB アップローダーを一度ビルドしてください:
cd diag && make ed64_upload
その後、アップロードして起動:
diag/ed64_upload bootloader/n64ce.z64 # 書き込み+起動 diag/ed64_upload --listen bootloader/n64ce.z64 # USB デバッグ出力もストリーム配信
注記:
--listen オプションは、アップロード後も FTDI ハンドルを開放するため、デバッグ出力の喪失を防ぎます。
エミュレーター上で動作させる場合
初期の開発では、LE モードにおける RDRAM パartial-word クイックへの対応のための小さなローカルパッチを適用した Ares を使用していましたが、やがてこれは「Ares の改善プロジェクト」へと変化してしまい、実機ハードウェアでのテストのみという方針から逸脱する結果となりました。Ares 上で動作させることはより深い穴に突入することとなり、現状ではこの領域は取り組んでおりません。他のエミュレーターでの動作検証も行っていません。
リポジトリの構成
- bsp/ — N64 向け BSP:HAL、OAL、ドライバー、シェル、アプリ、ROM イメージを内包
— 標準 nk.lib 上のカスタム HALhal/
— ディスプレイ、kbd/mouse、sdfsd(FatFS)、wavedev、commctrldrivers/
— ユーザー製アプリで使用される三角形レンダライザーlib/rdp3d/
— cube3d、paint、notez(ROM 中にリンク)apps/
— デスクトップ、タスクバー、ファイルブラウザ、アイコンshell/
— ビルド全体を制御するスクリプトbuild.sh
— ROMIMAGE ビルド情報ファイル(メモリマップ+モジュールリスト)ce.bib
- bootloader/ — カートリッジから nk.bin をロードするための libdragon IPL3 トランポリン
- diag/ — 裸金属用の診断用 ROM(LE モードクイックテスト、オーディオテスト、USB アップローダー、ed64 リブートなど)
- docs/ — アーキテクチャ図、ハードウェアデバッグノート、N64 クイックのドキュメント
(このリポジトリに含まれない外部依存)
→ DragonMinded/libdragon のクローンlibdragon/
→ MS Embedded Toolkit からの CE 2.11 SDKwince211_sdk/
→ krikzz/ed64-x-pub(参照用;ビルド対象外)ed64-x-pub/
FAQ
なぜこれを開発しましたか? 非常に良い質問です!アイデアは IBM Workpad Z50 に着想を得ました。これは N64(VR4300)と非常に類似した MIPS CPU(VR4121)を使用しています。N64 で Windows を動かすための実用的な理由はまったくないため、プログラミング上のチャレンジとして捉えて開発を進めました。
事前ビルド済みの ROM は入手できますか? 残念ながらありません。一つも存在せず、今後発行する予定もございません。
bash bsp/build.sh を実行してご自身で構築してください。生成される n64ce.z64 は SDK の静的ライブラリから Microsoft CE 2.11 のバイナリ(nk.exe、coredll.dll、gwes.exe、filesys.exe、ddi.dll の MGDI/GPE ライブラリなど)をリンクしています。完成した ROM を配布すると、これらのバイナリも再頒布することになり、私はそれを許可するライセンスを持っておりません。本リポジトリ内のソースファイルは MIT ライセンスですが、ビルド結果ではありません。
SDK を購入することはできますか? いいえ、約 20 年間購入することはできません。Microsoft Windows CE 2.11 Platform Builder(Visual C++ 6.0 Embedded Toolkit の一部として出荷)は 2000 年代初頭に販売され、2004〜2005 年頃には静かに廃止されました。マイクロソフトはこれを再頒布する事も、オープンソース化する事もなく、ダウンロードサイトからも削除されています。当初付属していた EULA は個々の開発者向けの開発ライセンスであり、埋め込みソフトウェアを構築しそのバイナリを埋め込みデバイス内に収めることは可能でしたが、SDK 自体や静的ライブラリだけを再頒布することは許可されていません。Toolkit のアーカイブ ISO がインターネット上に流れていますが、これらを特定する作業は各自にお任せします。
エミュレーター上で動作しますか? おそらくでしょうが、前述の「実行→エミュレーター」項を参照してください。実機ハードウェアがテストベッドであり、エミュレーター経路の維持は行っておりません。
自作の CE 2.11 MIPS EXE を動かすことはできますか? はい可能です。SD カードにドロップしてファイルブラウザから起動してください。BeziersCE は完全なエンドツーエンドでの動作が確認されており、commctrl スプリナーダイアログも正常に機能します。ただし N64 で公開されていないハードウェア CE 機能(ネットワークスタック、実キーボード、GAPI など)を必要とするアプリは失敗します。
なぜアイコンの見た目が奇妙でしょうか? 2 つの理由があります:
- CE 2.11 SDK にはアイコンが含まれていません(一部の EXE アイコンを除く)。
- 法的な理由により、このリポジトリにクラシックな Win9x アイコンを追加することができません。
bsp/shell/icons 下にある醜いアイコンをより本格的なものに取り替えると、問題なく動作します。
どの部分がカスタム開発でしょうか? かなりの部分です。CE 2.11 SDK / Platform Builder が提供するのはカーネル(nk.lib)、coredll.dll、gwes.exe、filesys.exe、device.exe、共通コントロール、MGDI/GPE ディスプレイ抽象化、Win32 API 表面です。しかし配送されないのはデスクトップシェルであり、すなわち Explorer、タスクバー、スタートボタン、デスクトップウィンドウ、ファイルブラウザです。OEM は GWES ウィンドウ管理APIの上位に独自のシェルを構築することが期待されていました。マイクロソフトは H/PC Pro デバイスにプリビルトされたシェルを搭載して販売しましたが、プラットフォームビルダー内に参照シェルソースが登場したのは CE 3.0 より後(IESAMPLE / EXPLORER サンプル)です。2.11 ではご自身でお作りいただく必要があります。
したがって
bsp/shell/ — Win9x 風デスクトップ、時計+スタートボタン付きタスクバー、FindFirstFileW を経由して \SDCard\ を探索するファイルブラウザ、commctrl スプリナーが正常動作するモーダルダイアログ — はすべて、標準的な CE 2.11 GWES API に対する独自コードです。GWES 以下の部分も同様です:CE 2.11 はインターフェースを配送し、OEM がデバイス固有のドライバーをその下に記述することを期待するため、HAL/OAL、ディスプレイドライバー、kbd/mouse PDD、SD FSD、wave PDD、RDP フルフィルメントコード、ed64-X7 カートリッジドライバー、commctrl DllMain はいずれも N64 向けのカスタム実装です。
ライセンス
MIT ライセンス(LICENSE ファイル参照)。MIT のスコープは本リポジトリ内のソースファイルのみです。ビルドでリンクする Microsoft Windows CE 2.11 SDK / Platform Builder バイナリは別途ライセンス条項があり、合法的に入手する必要があります。