Skip to content

Instantly share code, notes, and snippets.

@lpproj
Last active February 25, 2021 05:49
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lpproj/4ac479989a15214da52c6890a331e047 to your computer and use it in GitHub Desktop.
Save lpproj/4ac479989a15214da52c6890a331e047 to your computer and use it in GitHub Desktop.
FreeDOS(98) kernel におけるNEC版MS-DOS固有機能のサポート状況について
Support Status on FreeDOS(98): NEC PC-98x1 specific features
============================================================
reference
---------
undoc1: Undocumented PC-9801/9821 volume 1 (BIOS)
undoc2: Undocumented PC-9801/9821 volume 2 (Memory & IOports)
dos33cref: NEC MS-DOS 3.3C programmers' reference volume 1 and 2
dos5ref: NEC MS-DOS 5.0 programmers' reference volume 1 and 2
対応状況(int DCh)
-------------------
「対応」について:
○ : 実装済
△ : 部分的に実装
― : スタブ(呼び出してもシステムはハングアップしないが、ほぼ何もしない)
空白 : 未実装
※ 未実装機能を呼び出すと "unimplemented internal dos function INTDC"、および呼び出し時のレジスタ内容を表示したのち、システムがハングアップします。内容をご連絡いただければ、未対応機能を実装するかもしれません(確約はできませんが…)。
「公開」について:
3 : dos33cref に記述あり
5 : dos5ref に記述あり
U : undoc1 に「Undocumented」と記載
※ 3,5 と U が共にある場合、その拡張機能中にDOSリファレンス内に記述のない非公開機能が存在することになる。たとえばCL=0Ahはdosrefだと「ハイレゾモード専用」となっているが、undoc1にはノーマルモード時の動作に関する記述がある(ハイレゾモードと用法が異なる)
※ CL=0Fh, AX=8000hはdos33cref、dos5refに記述がないが、undoc1にも「Undocumented」の記載がない(記載漏れ?)
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| 対応 | Func(CL) | Subfunc | 公開 | Desctiprtion | 備考 |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| ○ | 09h | AX=0000h | U | SCSIデバイスタイプ取得 | IO.SYSワークエリア未実装 |
| | 09h | AX=0001h | U | MOドライブ初期設定? | |
| | 09h | AX=0010h | U | MOドライブロック | |
| | 09h | AX=0011h | U | MOドライヴアンロック | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| | 0Ah | | 35U | シリアルポート初期化 | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| ○ | 0Ch | AX=0000~00FFh | 35U | プログラマブルキー設定取得 | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| △ | 0Ch | AX=0100h | 35 | データキー割り当てバッファ内容取得 | 空データを返すのみ |
| | 0Ch | AX=0101h | 35 | データキー割り当てバッファ残量取得 | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| ○ | 0Dh | AX=0000~00FFh | 35U | プログラマブルキー設定 | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| ― | 0Dh | AX=0100h | 35 | データキー割り当てバッファ内容設定 | 何もせず戻る |
| | 0Dh | AX=0101h | 35 | データキー割り当てバッファ設定追加 | |
| | 0Dh | AX=0102h | U | データキー割り当てバッファ初期化 | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| ― | 0Eh | DL=x0h | 35 | シリアルポート受信データ長取得 | 0を返す |
| ― | 0Eh | DL=x1h | 35 | シリアルポート設定(拡張ポート対応) | IO.SYSワークエリア設定のみ |
| △ | 0Eh | DL=x6h | U | シリアルポート設定取得 | IO.SYS設定値を返すのみ |
| | 0Eh | DL=07h | U | 拡張シリアルボード確認 | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| ― | 0Fh | AX=0000h | 35 | CTRL+Fn ソフトウェアキー化 | 何もせず戻る |
| ― | 0Fh | AX=0001h | 35 | CTRL+Fn ソフトウェアキー解除 | 何もせず戻る |
| ― | 0Fh | AX=0002h | U | CTRL+XFER/NFER ソフトウェアキー化 | 何もせず戻る |
| ― | 0Fh | AX=0003h | U | CTRL+XFER/NFER ソフトウェアキー解除 | 何もせず戻る |
| △ | 0Fh | AX=8000h | ? | CTRL+Fn ソフトウェアキー化設定取得 | IO.SYS設定値を返すのみ |
| △ | 0Fh | AX=8002h | U | CTRL+XFER/NFER ソフトウェアキー化設定取得 | IO.SYS設定値を返すのみ |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| ○ | 10h | AH=00h | 35 | 1文字表示 | |
| ○ | 10h | AH=01h | 35 | 文字列表示 | |
| ○ | 10h | AH=02h | 35 | 文字属性設定 | |
| ○ | 10h | AH=03h | 35 | カーソル位置設定(ESC=xy) | |
| ○ | 10h | AH=04h | 35 | カーソル1行下移動(cursor next line: ESCD) | |
| ○ | 10h | AH=05h | 35 | カーソル1行上移動(cursor previous line: ESCE) | |
| ○ | 10h | AH=06h | 35 | カーソル上移動(cursor up: ESC[nA) | |
| ○ | 10h | AH=07h | 35 | カーソル下移動(cursor down: ESC[nB) | |
| ○ | 10h | AH=08h | 35 | カーソル右移動(cursor forward: ESC[nC) | |
| ○ | 10h | AH=09h | 35 | カーソル左移動(cursor back: ESC[nD) | |
| ○ | 10h | AH=0Ah | 35 | 画面消去(erase in display: ESC[nJ) | |
| ○ | 10h | AH=0Bh | 35 | 行消去(erase in line: ESC[nK) | |
| ○ | 10h | AH=0Ch | 35 | 行挿入とスクロールダウン(insert lines: esc[nL) | |
| ○ | 10h | AH=0Dh | 35 | 行消去とスクロールアップ(erase lines: ESC[nM) | |
| ○ | 10h | AH=0Eh | 35 | 漢字/グラフモード切り替え(ESC)0,ESC)3) | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| | 11h | AX=0000,0001h | 35 | プリンタモード設定―漢字:ANK比率 | |
| | 11h | AX=0010,0011h | U | プリンタモード設定―漢字縦書・横書 | |
| ― | 11h | AX=0020,0021h | 35 | プリンタモード設定―CTRL+P/N押下時プリンタへの改行出力 | 何もせず戻る |
| | 11h | AX=8000h | U | プリンタモード取得―漢字:ANK比率 | |
| | 11h | AX=8010h | U | プリンタモード取得―漢字縦書・横書 | |
| | 11h | AX=8020h | U | プリンタモード取得―CTRL+P/N押下時プリンタへの改行出力 | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| ○ | 12h | | U | MS-DOS製品番号・機種情報取得 | FAT16版はNEC製MS-DOS6.2相当、FAT32版はWindows98SE相当の値を返す |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| △ | 13h | | U | ドライブ文字―DA/UAリスト取得 | MO未対応 |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| | 14h | AX=0000,0001h | U | 拡張アトリビュートモード設定(ESC[?5h,ESC[?5l) | |
| | 14h | AX=0010,0011h | U | 拡張テキストモード設定(ESC[?3h,ESC[?3l) | |
| | 14h | AX=8000h | U | 拡張アトリビュートモード取得 | |
| | 14h | AX=8010h | U | 拡張テキストモード取得 | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| | 15h | AX=0000h | U | 内部リビジョン番号取得 | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| | 80h | AX=0000h | U | ディスクドライブ・領域情報取得 | |
| | 80h | AX=0001h | U | IO.SYS内部情報取得 | |
| | 80h | AX=8000h | U | BRANCH 4670仮想ドライブ確認(0060:19FB) | |
| | 80h | AX=8001h | U | 不明状況確認(0060:27D2) | |
| | 80h | AX=8002h | U | NEC製FEP?導入確認(0060:1E50) | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| ○ | 81h | AX=0000h | U | 拡張メモリ(1M超~16M)容量取得 | |
| ○ | 81h | AX!=0000h | U | 拡張メモリ(1M超~16M)確保 | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| ○ | 82h | AX=0000h | U | 利用可能な拡張メモリ(1M超~16M)容量と範囲取得 | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
| | E0~FDh | | 35 | 日本語入力拡張機能 | |
+------+----------+---------------+------+--------------------------------------------------------+-----------------------------------------------------------------+
対応状況(IO.SYS内部領域 0060:xxxxH)
-------------------------------------
基本的にはundoc2のmemdos.txtを元にし、対応済・対応予定部分・個人的にメモしておきたい部分のみ表に記している。
※ コンソールドライバ内部キーバッファに関して http://bauxite.sakura.ne.jp/wiki/mypad.cgi?p=PC-98x1%2Fmisc%2Fmemo
+------------+---------+-------------------------------------------------------+------------------------------------------------------------------------------------------------------+
| アドレス | サイズ | 説明 | 備考
+------------+---------+-------------------------------------------------------+------------------------------------------------------------------------------------------------------+
| 0060:0020h | WORD | MS-DOS製品番号 | int DCh CL=12h
| 0060:0022h | BYTE | 内部リビジョン番号 | int DCh CL=15h AX=0000h
| 0060:0031h | BYTE | 拡張メモリ容量 | int DCh CL=81h
| 0060:0032h | WORD | テキスト領域セグメント | なぜかundoc2未記載。EPSON版4.01は未対応(0000h)
| 0060:0052h | WORD | ADDDRV.EXE常駐セグメント | FreeDOS(98)では特に考慮していないが、空けておく
| 0060:0068h | BYTE | メモリスイッチ1 | 起動時にA000:3FE2hの内容がコピーされる(RS-232初期設定)
| 0060:0069h | BYTE | メモリスイッチ2 | undoc2未記載。起動時にA000:3FE6hの内容がコピーされる(RS-232初期設定)
| 0060:006Ah | BYTE | メモリスイッチ3 | undoc2未記載。起動時にA000:3FEAhの内容がコピーされる(メモリサイズ、FPU、RS-232初期設定、CRT色設定)
| 0060:006Bh | BYTE | メモリスイッチ4 | undoc2未記載。起動時にA000:3FEEhの内容がコピーされる(拡張ボードROM)
| 0060:006Ch | 16BYTEs | ドライブ→DA/UA対応テーブル | A: から P: まで
| 0060:008Ah | BYTE | 漢字/グラフモード |
| 0060:008Bh | BYTE | グラフモードインジケータ文字 |
| 0060:008Ch | BYTE | ファンクションキー領域シフトインジケータ文字 |
| 0060:008Dh | BYTE | メモリスイッチ5 | undoc2未記載。起動時にA000:3FF2hの内容がコピーされる(画面ハードコピー、立ち上げ装置)
| 0060:008Eh | BYTE | メモリスイッチ6 | undoc2未記載。起動時にA000:3FF6hの内容がコピーされる(拡張画面ハードコピー、電話制御)
| 0060:00A4h | BYTE | STOPキー処理中フラグ |
| 0060:00B4h | BYTE | int DCh処理中フラグ | 未対応
| 0060:00C0h | 48BYTEs?| コンソールドライバ内部キーバッファ | undoc2未記載
| 0060:0103h | BYTE | コンソールドライバ内部キーバッファ文字数 | undoc2未記載
| 0060:0103h | BYTE | コンソールドライバ内部キーバッファ先頭ポインタ | undoc2未記載
| 0060:0107h | BYTE | Ctrl+P/Nフラグ | 未対応
| 0060:010Ch | BYTE | Ctrl+XFER/NFERフラグ | 値の読み出し(int DCh CL=0Fh AX=800xh)のみ対応
| 0060:0110h | BYTE | カーソルY座標 | CURSOR_Y (int29dc.c)
| 0060:0111h | BYTE | ファンクションキー領域表示フラグ | FUNCTION_FLAG (int29dc.c)
| 0060:0112h | BYTE | 画面行数(スクロール範囲下限行) | SCROLL_BOTTOM (int29dc.c)
| 0060:0113h | BYTE | 画面行数(画面モード) |
| 0060:0114h | BYTE | 消去文字属性 | CLEAR_ATTR (int29dc.c) 3.3C以上のNEC製DOSはこの部分を変えても文字属性は変化しない
| 0060:0115h | BYTE | 漢字2バイト目待ちフラグ | KANJI2_WAIT (int29dc.c)
| 0060:0116h | BYTE | 漢字1バイト目保存 | KANJI1_CODE (int29dc.c)
| 0060:0117h | BYTE | 行折り返しフラグ | 未対応
| 0060:0118h | BYTE | スクロール速度フラグ | 未対応
| 0060:0119h | BYTE | 消去文字 | CLEAR_CHAR (int29dc.c)
| 0060:011Bh | BYTE | カーソル表示状態 | CURSOR_VIEW (int29dc.c)
| 0060:011Ch | BYTE | カーソルX座標 | CURSOR_X (int29dc.c)
| 0060:011Dh | BYTE | 表示文字属性 | PUT_ATTR (int29dc.c) 3.3C以上のNEC製DOSはこの部分を変えても文字属性は変化しない
| 0060:011Eh | BYTE | スクロール範囲開始(上限)行 | 未対応
| 0060:011Fh | WORD | スクロール時ウェイト値 | 未対応
| 0060:0126h | BYTE | セーブカーソルY座標 | ESC[s
| 0060:0127h | BYTE | セーブカーソルX座標 | ESC[s
| 0060:012Bh | BYTE | セーブカーソル属性 | ESC[s
| 0060:012Ch | 8BYTES | コンソールドライバ内部キーバッファ(ESC[yy;xxR 専用) | undoc2未記載
| 0060:0136h | BYTE | 最後にアクセスしたドライブユニット番号 |
| 0060:013Bh | BYTE | FD論理ドライブ割り当てフラグ | 未対応
| 0060:013Ch | WORD | 表示文字属性 (NEC DOS3.3C以降) | 未対応
| 0060:013Eh | WORD | 消去文字属性 (NEC DOS3.3C以降) | 未対応
| 0060:2C86h | 52BYTEs | ドライブ→DA/UA対応テーブル | A: から Z: まで (26WORDs)。MO未対応
+------------+---------+-------------------------------------------------------+------------------------------------------------------------------------------------------------------+
FreeDOS(98)独自使用領域
あくまで「現状ではこの場所に配置している」という暫定的なもの。今後の互換性は一切保証されない。
システム共通域
+------------+---------+-------------------------------------------------------+------------------------------------------------------------------------------------------------------+
| 0000:03FEh | WORD | 起動領域インデックス値 | int FFh割り込みベクタのセグメント部。
| | | | FreeDOS(98)のブートローダーは、ブートローダに渡されたSIレジスタの内容をここに格納する。
| | | | HDからの起動時、FreeDOS(98)のカーネルはこの値を参照して起動ドライブを認識する。
| | | | DOS起動後、割り込みベクタFFhの内容は「未使用ベクタ」に書き換えられる。
+------------+---------+-------------------------------------------------------+------------------------------------------------------------------------------------------------------+
IO.SYS領域
+------------+---------+-------------------------------------------------------+------------------------------------------------------------------------------------------------------+
| 0060:0FFFh | BYTE | HDリトラクト処理用フラグ | STOPキーが押されるとセットされる。
| | | | 実際のリトラクト処理は int 28h ハンドラ内で行う(ほぼ間違いなくMS-DOSとは違った処理)
+------------+---------+-------------------------------------------------------+------------------------------------------------------------------------------------------------------+
| 0060:1000h | | プログラマブルキー設定領域 | int DCh CL=0C/0Dhで設定・取得できる内容
| | | | 内部構造はMS-DOSと非互換
+------------+---------+-------------------------------------------------------+------------------------------------------------------------------------------------------------------+
| 0060:2400h | | ダミーCON,PRNデバイスドライバ | ATOK6が0060:xxxxh内にCONドライバが存在することを前提としているため用意している。
| | | | DOSのデバイスチェーンには含まれない。
| | | | ちなみに3.3以上のMS-DOSでは実際のドライバが0060:3400hに存在する。
+------------+---------+-------------------------------------------------------+------------------------------------------------------------------------------------------------------+
| 0060:xxxxh | | int 29h用プライベートスタック | 256バイト
| | | | ダミーPRNドライバの直後
+------------+---------+-------------------------------------------------------+------------------------------------------------------------------------------------------------------+
| 0060:xxxxh | | int DCh用プライベートスタック | 256バイト
| | | |
+------------+---------+-------------------------------------------------------+------------------------------------------------------------------------------------------------------+
| 0060:xxxxh | | 未使用割り込みベクタ用ハンドラ | int29hスタックの直後
| | | | ハンドラがIO.SYS領域内に存在することを要求するアプリやドライバが存在するため
| | | | (IBMPCの場合、未使用ベクタは設定されず0000:0000のまま)
+------------+---------+-------------------------------------------------------+------------------------------------------------------------------------------------------------------+
@lpproj
Copy link
Author

lpproj commented Jun 27, 2019

fdkernelのdocs内に入れたら消すかも

@lpproj
Copy link
Author

lpproj commented Jun 28, 2019

(2019-06-28)すこし直して、IO.SYS内情報も追加した

@lpproj
Copy link
Author

lpproj commented Jul 7, 2019

(2019-07-07) システム共通域スクラッチパッド

@lpproj
Copy link
Author

lpproj commented Feb 13, 2020

(2020-02-13) int DCh CL=0C/0Dh AX=003Ah、CL=13h、int DChスタック、0060:0136

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment