最終更新: 2026-04-20
hsp3dx は HSP3 言語を DxLib ベースのランタイムで動かすクロスプラットフォーム実行環境。
Windows / iOS / Android の 3 プラットフォームで 同一の .ax バイト列 を実行できることを目指す。
| 項目 | 方針 |
|---|---|
| VM ベース | hsp3/ コア (Hsp3 クラス) を fork (Hsp3::Reset() が runtime で .ax を読み込み、HSPHED 解析まで自己完結。標準の hsp3cl.exe が採用している方式) |
| 描画 / 音声 / 入力 | hgio 層を DxLib バックエンドに差し替え (hgio_dx.cpp) |
| DxLib 全 API 公開 | dxlib_core プラグインを静的リンク (dx_* 命令として HSP 側に公開) |
.ax バイト列 | 3 プラットフォーム共通、すべて VM インタプリトで実行 |
.ax 配布経路 | Win = ファイル直読み / iOS = bundle 内バイト配列 / Android = assets 内バイト配列 |
| JIT | なし (インタプリト実行、iOS 禁止のため) |
| ポインタ幅 | 64bit 固定 (#bootopt hsp64 1 既定) |
| 文字コード | UTF-8 固定 (3 プラットフォーム共通) |
.ax が 3 プラットフォームで同じ VM で走る"hsp3cnv で .ax → C++ AOT 翻訳して native ビルドするため、Win (interpret) と mobile (AOT native) で実行コードパスが違う。hsp3dx は全プラットフォームで VM インタプリタ統一のため、挙動再現性が高い (Win で出たバグは mobile でも同じ VM で再現)。| 項目 | Route A (hsp3dish AOT 方式) | Route B (全 VM interpret) 採用 |
|---|---|---|
| Win 実行 | インタプリタ | インタプリタ |
| Mobile 実行 | hsp3cnv で AOT、native 実行 | VM がインタプリト |
| 挙動一致性 | 翻訳バグの可能性 | 完全一致 |
| Mobile 性能 | ★★★ (native) | ★★ (interpret) |
| 新命令追加コスト | 翻訳ルール + plugin 両方 | plugin のみ |
| 実装ベース | hsp3dish fork | hsp3/ コア fork (Hsp3 クラス、Hsp3::Reset() が runtime ロード担当) |
| hsp3dish との差別化 | 薄い | 明確 |
hgio = HSP Graphics I/O。HSP3Dish が導入した描画/音声/入力の抽象層で、VM からは統一 C++ 関数群 (hgio_init / hgio_render_start / hgio_gsel など) だけが見える。プラットフォーム別実装を差し替えることでマルチプラットフォーム化する設計。
hsp3dx では hgio_dx.cpp を新規に書いて hgio_init → DxLib_Init、hgio_render_start → ClearDrawScreen、のように DxLib API に転送する。VM 側 (hsp3embed) は一切触らない。
さらに DxLib の 2000 関数を dx_* 命令として HSP 側に公開する dxlib_core プラグイン を別途静的リンクする。これにより (a) 既存 HSP コード (mes など) の互換性 と (b) DxLib 全 API フルアクセス の両立。
| 分類 | コマンド |
|---|---|
| 制御 | if / else / repeat / loop / break / continue / foreach / return / gosub / goto / on / switch / case / default / swbreak / swend |
| 変数宣言 | dim / ddim / sdim / ldim / alloc / dimtype |
| 配列・メモリ | length / length2 / length3 / length4 / memcpy / memset / dup / dupptr / mref / vartype / varuse / varsize |
| 文字列 | strmid / instr / strf / split / getstr / strtrim / strrep / cnvstow / cnvwtos |
| 数学 (整数) | int / abs / limit / rnd / srand |
| 数学 (浮動小数) | double / sin / cos / tan / atan / sqrt / pow / exp / log / absf |
| 型変換 | str / int / double / char / cnvint / cnvwide |
| ファイル | exist / bsave / bload / fileopen / fileclose / fileread / filewrite |
| プロセス制御 | wait / await / stop / end / exgoto |
| デバッグ | mes (DxLib の DrawString にリダイレクト) / logmes / title (SetMainWindowText) / assert |
| 分類 | 除外コマンド | 理由 |
|---|---|---|
| GUI ウィジェット | button / mesbox / chkbox / combox / listbox / input / objprm / objsel / objmode / clrobj / objsize | Win32 Common Controls 前提 |
| HSP 標準描画 | color / palette / palcolor / palfade / pset / line / boxf / circle / pget / gcopy / gzoom / gmode / gsquare / grotate / celput / celload / celdiv / redraw / screen / bgscr / gsel / buffer / picload / bmpsave | DxLib に置換 |
| HSP 標準音声 | mmload / mmplay / mmstop / mmvol / mmpan / mci | DxLib に置換 |
| HSP 標準入力 | getkey / mousex / mousey / mousew / mouse / stick / onkey / onclick | DxLib に置換 |
| ダイアログ | dialog | DxLib で簡易代替 |
| COM | newcom / delcom / comobj / comres / comevent / comevarg / comevdisp / axobj | Win32 COM 前提 |
| レジストリ | regread / regwrite / regdel | Win 固有 |
| Win32 API 直叩き | #uselib (任意 DLL) / dllproc / dllfunc / dllctrl / winobj | iOS 禁止 / Android NDK 面倒 |
| イベント | onerror / oncmd | Win32 メッセージ依存 |
詳細は Phase 1 以降で 40 関数から順次拡張。分類は以下:
| 分類 | 命令 (一部) | Phase |
|---|---|---|
| 描画 | dx_drawgraph / dx_drawbox / dx_drawline / dx_drawcircle / dx_drawstring / dx_loadgraph / dx_screenflip / dx_cleardrawscreen | 1 |
| 音声 | dx_loadsoundmem / dx_playsoundmem / dx_stopsoundmem / dx_setvolumesoundmem | 1 |
| 入力 | dx_getmouseinput / dx_getmousepoint / dx_getjoypadinputstate / dx_checkhitkey / dx_getinputstring | 1 |
| ウィンドウ | dx_setwindowtext / dx_setgraphmode / dx_setwindowstyle / dx_changewindowmode | 1 |
| タイマ | dx_gettickcount / dx_getnowcount | 1 |
| 3D | dx_loadmodel / dx_drawmodel / dx_setcameraposeye | 4+ |
| 動画 | dx_playmovie / dx_pausemovie | 4+ |
| ネットワーク | dx_connectnetwork / dx_netsend / dx_netrecv | 4+ |
DxLib は float / 構造体 / 構造体配列 を多用するため、段階的に HSP の型システムを拡張する必要がある。本章で 段階的移植計画 を明記する。
| カテゴリ | 具体例 |
|---|---|
| float 引数 / 戻り値 | VECTOR = {float x,y,z;} / DrawCircle(x,y,r,color,fill,thickness) の半径 / 音量・ピッチ |
| 構造体 | VECTOR / VECTOR_D / VERTEX3D / MATRIX / RECT / COLOR_F / MV1_COLL_RESULT_POLY 他多数 |
| 構造体の出力 (pointer) | GetCameraPosition(&pos) で VECTOR を返す |
| 構造体配列 | 頂点バッファ、当たり判定ポリゴン群 |
| コールバック | SetMovieSurfaceCallback 等 (少数) |
ベースとする hsp3embed は HSP3 素の型セット (int / double / str / 配列) しか持たない。対して hsp3net には以下が実装済:
| 機能 | hsp3net | hsp3embed (fork 元) | 用途例 |
|---|---|---|---|
#cfunc (int 返し) | ○ | ○ | ハンドル / カウント |
#cfuncd (double 返し) | ○ | ✗ | 一般数値 |
#cfuncf (float 返し) | ○ | ✗ | DxLib float 戻り値 |
#cfuncst (struct 返し) | ○ | ✗ | VECTOR 取得など |
NSTRUCT (構造体型) | ○ | ✗ | pos.x で触れる |
#defcbcom (COM callback) | ○ | ✗ | DxLib では概ね不要 |
int / double / str のみdx_get_camera_position posx, posy, posz のように スカラ 3 引数に分解array double で返し、HSP 側でパース (iron_mlnet.hsp と同じ方式)HSPVAR_FLAG_FLOAT + #cfuncf を追加ddim pos, 3 : dx_get_camera_pos pos : mes pos.x のように struct 風に触れる| Phase | 型方針 | 理由 |
|---|---|---|
| Phase 1 (MVP 40 関数) | 方針 1 | スカラ分解で DrawGraph / DrawCircle / GetMousePoint など動かす |
| Phase 2-3 (cnv + mobile) | 方針 1 継続 | VM 側は触らず、安定化優先 |
| Phase 4-5 (API 40 → 500) | 方針 2 | #cfuncf 追加、float 精度必要な API が増える |
| Phase 6 (3D / 動画) | 方針 3 | NSTRUCT / cfuncst 移植、MATRIX / VERTEX3D を touch する段階 |
hsp3embed fork は不適と判明:
hsp3embed の Hsp3r クラスは __HspInit(Hsp3r*) を hsp3cnv が .ax ごとに自動生成 する前提hsp3cl.exe は hsp3/ コアの Hsp3 クラスを使い、Hsp3::Reset() で runtime .ax ロードhsp3/ コア (Hsp3 クラス)。hsp3embed は採用しない。
hsp3net の型拡張機構 (NSTRUCT / cfuncf / cfuncst) を hsp3/ コアに移植するかhsp3net を fork して DxLib プラグインだけ追加する方針に切り替えるかDxLib の 2000 関数を手書きで #deffunc / #cfunc 定義するのは非現実的 → DxLib.h をパースして機械生成するスクリプトを Phase 5 で整備予定。
DxLib には SetMovieSurfaceCallback / サウンドストリーム / ネットワーク受信 / MV1 当たり判定など C 関数ポインタを受ける API が 10〜20 個存在する。これを HSP 側から扱う方針。
| プラットフォーム | 動的コード生成 (JIT / trampoline 実行時生成) | 静的 C 関数ポインタ渡し |
|---|---|---|
| Windows | ○ 自由 | ○ |
| Android | △ NDK で mprotect 使えば可、ただし Android 10+ で制限強化 | ○ |
| iOS | ✗ 原則禁止 (W^X、executable page を write できない) | ○ |
| 技法 | 仕組み | iOS | Android | Win |
|---|---|---|---|---|
| (a) 静的スロット trampoline | ビルド時に N 個の C 関数 (cb_slot_0, cb_slot_1, …) を用意、スロット ID から HSP 側ハンドラへ dispatch | ✅ | ✅ | ✅ |
| (b) 動的 trampoline 生成 | 実行時に機械語を書き出して関数ポインタ化 (HSP3 classic の callback 命令、libffi closure) | ❌ | △ | ✅ |
| (c) .NET CLR thunk | CLR が JIT で生成 (hsp3net の #defcbcom) | ❌ (iOS Mono は AOT 必須、JIT 不可) | △ | ✅ |
callback / hsp3net の #defcbcom はそのままでは iOS 動作不可。
// ビルド時に signature family ごとに N 個事前生成 (DxLib.h パース時に自動)
static int g_hsp_label[256];
static void cb_slot_0(int arg0, int arg1) {
VM_CallHspLabel(g_hsp_label[0], arg0, arg1);
}
static void cb_slot_1(int arg0, int arg1) { ... }
/* ... cb_slot_255 まで ... */
static void (*trampolines[256])(int,int) = {
cb_slot_0, cb_slot_1, /* ... */, cb_slot_255
};
HSP 側:
dx_set_callback_xxx *my_handler ; プラグインが空きスロットを確保、ラベル ID を記録
...
*my_handler
; DxLib からコールバックされたときここに来る
return
void(int,int) と void(float*) はスロット共有不可) → DxLib のコールバック API は 10〜20 種、5〜10 種類のシグネチャで各 256 スロット事前生成で実用十分| Phase | コールバック対応 |
|---|---|
| Phase 1 (MVP 40 関数) | コールバック不使用、スキップ |
| Phase 5 (API 拡張) | 静的スロット trampoline 導入、5 シグネチャ × 256 スロット程度で初期実装 |
| Phase 6 (3D / 動画) | SetMovieSurfaceCallback など本命コールバック対応 |
#defcbcom 記述の補足#defcbcom は DxLib では概ね不要」と書いたが、これは CLR thunk 方式の #defcbcom そのものは mobile で動かないので流用できない 意味であり、コールバック機能自体が不要ではない。hsp3dx では代わりに #defcallback (仮称) + 静的スロット方式 を自前で用意する。
#uselib での任意 DLL ロードは禁止同梱プラグインは 事前承認制 (ランタイムビルド時に静的リンク) となる。
iron_math_ex.hsp — 数値計算拡張iron_json.hsp — JSON パーサiron_csv.hsp — CSV パーサiron_vector.hsp — ベクタ演算iron_matrix.hsp — 行列演算iron_curvefit.hsp / iron_curvefit_ex.hsp (pure HSP 部分)iron_knn.hsp / iron_kmeans_nd.hsp / iron_pca.hsp (機械学習 pure HSP)iron_scaler.hsp / iron_split.hsp / iron_metrics.hsp (前処理/評価)iron_*_net.hsp — .NET 依存hsp3net 系 — CLR ホスティング前提hspcv4 — OpenCV 依存、mobile ビルドが重いhspsockm — Win32 WinSock 依存 (→ dx_connectnetwork で代替)hspcomponent — COM 依存hspext — Win32 拡張hspda — DirectAudio 依存| 層 | エンコーディング |
|---|---|
.hsp ソースファイル | UTF-8 (BOM なし) 必須 |
hspcmp オプション | #cmpopt utf8 1 相当を既定 |
.ax 内文字列テーブル | UTF-8 バイト列 |
| ランタイム内部文字列 | UTF-8 |
| DxLib 呼び出し | SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8) を起動時固定 |
| ファイルパス | UTF-8 (Win は _wfopen 経由で UTF-16 変換、iOS/Android はネイティブ UTF-8) |
フォントファイル (.ttf / .otf) | バイナリなので非依存 |
SetUseCharCodeFormat で切り替え可SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8) を呼ぶ → 3 プラットフォームで統一表 (0x95 0x5C) などの文字がリテラル中に出ると 0x5C がエスケープ扱いされてリテラルが破壊される → UTF-8 化で自動解消sdim のサイズ指定: UTF-8 では 1 文字 1〜4 バイト。Shift-JIS で 2 バイトだった文字が UTF-8 で 3 バイトになる例が多数 → バッファサイズを 1.5 倍程度で見積もるstrlen は文字数ではなくバイト数 (既存 HSP と同じだが UTF-8 では差が顕著)poke / peek でバイト単位に触っている既存コード: 非互換、書き換え必須SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8) 呼び出し後は UTF-8 で渡せばよく、特別な変換は不要tools/hsp3dx_sjis2utf8/ に .hsp ソースを Shift-JIS → UTF-8 に一括変換するツールを同梱。
hsp3dx_sjis2utf8 --in path\to\src.hsp [--out path\to\dst.hsp]
hsp3dx_sjis2utf8 --dir path\to\project [--recursive]
hsp3dx_sjis2utf8 --dir path\to\project --dry-run
起動時にランタイムが [NSBundle pathForResource:@"start"] 経由で start.ax のパスを得て、通常の fopen で読み込んで VM にロード → interpret 実行。画像や音声と同じ扱いで bundle resource としてアクセスするシンプル構成。
ランタイムは AAssetManager_open() 経由で start.ax を読み込み、通常通り VM interpret。画像/音声も同じ AAssetManager 経由。
.ax も画像/音声も同じ土俵の通常ファイルとして扱う。
VM の .ax ローダと、プラグインのアセットローダ (picload / mmload) は
プラットフォーム抽象を挟んだ共通 I/O 経由で動作する。
Win 用の fopen、iOS 用の [NSBundle pathForResource:]、Android 用の
AAssetManager_open を hsp3dx_platform_fopen() みたいな薄いラッパで束ねる
設計 (Phase 3/4 で実装)。
.ax の C バイト配列化 (hsp3dx_cnv) は必須ではない (旧 Phase 2 見送り)。
どうしても .ax を隠蔽したい・ファイルにしたくないケース向けの
オプションツールとして Phase 6 以降に整備する位置づけ。
.ax 以外の素材 (画像 / 音声 / フォント) は hsp3dx_pack ツール (Phase 2) で仮想 FS に固める。ランタイムはプラットフォーム問わず同じ API で素材にアクセス可能。
| Phase | 内容 | 型方針 (§3) | 状態 |
|---|---|---|---|
| Phase 0 | 仕様書 + SJIS→UTF-8 移行ツール + ディレクトリ雛形 | — | 完了 (2026-04-20) |
| Phase 1 | Windows 版 hsp3dx.exe MVP (extcmd 27 + reffunc 8 + 7 サンプル) | 方針 1 | 完了 (2026-04-21) |
hsp3dx_cnv / hsp3dx_pack ツール | — | 見送り (下記参照) | |
| Phase 2 (新) | iOS/Android 向け platform abstraction I/O 層 (hsp3dx_platform_fopen 等) | 方針 1 | 未着手 |
| Phase 3 | iOS 版 libhsp3dx.a + Xcode テンプレ (.ax/アセットは bundle resource) | 方針 1 | 未着手 |
| Phase 4 | Android 版 libhsp3dx.so + Android Studio テンプレ (.ax/アセットは assets/) | 方針 1 | 未着手 |
| Phase 5 | DxLib API を 40 → 500 関数に拡張 + dx_* 命令群 | 方針 2 (float + #cfuncf) | 未着手 |
| Phase 6 | 3D / 動画 / ネットワーク機能追加 | 方針 3 (NSTRUCT / cfuncst 移植) | 未着手 |
.ax を const uint8_t[] の C ソースに変換して mobile アプリに
静的リンクする hsp3dx_cnv ツールを Phase 2 に置いていた。しかし:
.ax だけ別経路 (C 配列) で扱う必要がなく、一貫性がない.ax も画像/音声と同じく bundle / assets に通常ファイル配置。
ランタイムがプラットフォーム抽象 I/O で同一経路から読み込む。
hsp3dx_cnv は「.ax 隠蔽したい / ファイル出したくない」ケース向けの
オプションツールとして Phase 6 以降に譲る。
hsp3dx/
README.md このドキュメントへのリンク
samples/
sample_drawgraph.hsp Phase 1 検証用サンプル (雛形)
sample_sound.hsp Phase 1 検証用サンプル (雛形)
sample_mouse.hsp Phase 1 検証用サンプル (雛形)
win32/ Phase 1 で hsp3dx.exe のソース/vcxproj を配置
README.md
ios/ Phase 3 で Xcode プロジェクトを配置
README.md
ndk/ Phase 4 で Android Studio プロジェクトを配置
README.md
docs/
hsp3dx_spec.md Markdown 版仕様書
hsp3dx_spec.html 本ドキュメント
tools/
hsp3dx_sjis2utf8/ SJIS → UTF-8 一括変換ツール (.NET)
hsp3dx_sjis2utf8.csproj
Program.cs
README.md
hsp3net を fork するか hsp3dish を fork するかhsp3embed fork で合意
hsp3embed を forkhsp3/ コア (Hsp3 クラス) を fork で確定
hsp3embed の Hsp3r::Reset() は __HspInit(Hsp3r*)
(hsp3cnv が .ax ごとに自動生成) に依存しており、Route B (runtime .ax interpret) 方式と非互換。
hsp3/ の Hsp3::Reset(int mode) は runtime に .ax を読み込んで HSPHED
解析まで自己完結する。参考実装は hsp3/win32/hsp3cl.cpp
.gitignore 管理)sdim のバイト数自動調整をランタイム側で行うか (互換性のため)hsp3dx 独自の拡張命令 (dx_* prefix) を iron_dxlib.hsp に畳み込むか、ランタイム組み込みにするか
Markdown 版: hsp3dx_spec.md / リポジトリ: hsp3dx/