* DEMUプロジェクトの仕様と詳細 [#h8c5ec85]
このページは、DOSエミュレータ 「DEMU」の仕様や進行状況を更新するページです。~
最初から書き直す必要に迫られたので、改名とともにページ名を変更しました。~
とりあえずDOS互換だけ実装し、その後コツコツと仕上げていくつもり。だいぶ完成してきました~
大まかな骨組みは「基礎ライブラリ(グラフィックテキストボックス+ファイルアクセス/リスト+DOSメモリ管理)+CPU本体+APIシミュレータ」な予定。~

''(編集中)''

////////////////////////////////////////////////////////////////
* スクリーンショットとか [#ka4b52df]
** 最新 [#n26a4c3c]
|#ref(demu20061110b.png)|
|デバッグコンソールの動作風景です。|
|#ref(demu20061110a.png)|
|なりました(^^;。アクセスサイズ変更漏れでした。&br;これからデバッグウィンドウ実装へかかります(デバッグしやすくなります)。|
//|#ref(demu20061109a.png)|
//|デバッグウィンドウのためのマルチウィンドウ化に向けてライブラリ仕様変更の実装中。&br;なんとか実装したけど、なんか今までのと同じ表示画面にならない…orz|
//|#ref(demu20061025a.png)|
//|FM1312音色エディタを起動させてみたところ。&br;なぜか中央に表示できていないし、ずれているし、クレジットも表示されていない…orz&br;OSCまでの展示には間に合いそうにない。|
//|#ref(demu20061020b.png)|
//|ごたくどすのコンソール出力をリダイレクトして&br;そのファイルを表示してみたところ&br;(エスケープシーケンスの動作確認用)&br;COLOR(red){まだ動作する段階ではありません!}|
-コンソール出力ファイル(テキスト)
#ref(5dsout.txt)
-コンソール出力ファイル(実行形式)
#ref(5dsout.com)
--COM化したテキストファイルです。なお、WinXP(2k含む)上で動作させるにはCONFIG.NTにANSI.SYSを追加する必要があります。

//|#ref(demu20061021a.png)|
//|スクロールして!GUIDE!.TXTの最後部分の表示ができるようになった|
//|#ref(demu20061022b.png)|
//|command.comを試しに起動させてみたところ。&br;一応普通に実行は終了します(笑)&br;この画面の全角部分のフォントは[[出水ゴシック16 β5.2:http://www.geocities.jp/development_room/]]です。|
//|#ref(demu20061022a.png)|
//|CPUルーチンのコピー完了。&br;EXEやCOMファイルの処理を実装。&br;実行直後、DOSのバージョン取得で落ちる...|
//|#ref(demu20061020a.png)|
//|ファイル選択でテキストファイルを表示してみたところ。&br;ただし、まだフラッシュに未対応・・・w|
//|#ref(demu20061019b.png)|
//|1文字表示を使用して仮想バッファ分を&br;文字で埋め尽くしてみたところ。|
//|#ref(demu20061018a.png)|
//|起動直後|
//|#ref(demu20061014a.png)|
//|12ドットフォントチェック用(フォントC)|
~

** フォント適応補間リサイズ [#i0a0f664]
16x16のOSASK標準フォントを12x12や32x32へリサイズした例です。~
12x12はそれなりに使えると思いますが、~
32x32は使用用途が…(笑)。~
-テキスト80x30モードで32x32フォントを使用した場合:1280x960の解像度が必要(80x25では1280x800)。
-Windowsのコマンドプロンプトのように、はみ出したエリアをスクロールするようになれば、32x32や高解像度(128x50とか)も夢じゃない。
-テキスト80x25で12x12フォントなら640x400の解像度でも使用できる(上下にえせタスクバーがあっても)。
|#ref(demu20061012e.png)|
|フォントA (斜め規制ON)|
|#ref(demu20061012g.png)|
|フォントB (斜め規制OFF)|
//|#ref(demu20061012e.png)|#ref(demu20061012f.png)|
//|フォントA (斜め規制ONとの比較用)|フォントA 4x拡大|
//|#ref(demu20061012g.png)|#ref(demu20061012h.png)|
//|フォントB (斜め規制OFFとの比較用)|フォントB 2x拡大|
//|#ref(demu20061012a.png)|#ref(demu20061012b.png)|
//|フォントA,斜め規制OFF|フォントA,斜め規制ON|
//|#ref(demu20061012c.png)|#ref(demu20061012d.png)|
//|フォントB,斜め規制OFF|フォントB,斜め規制ON|
~

* 仕様とか [#oac31450]
** 内部資料(仮仕様) [#v1e6a122]
-グラフィックテキストボックス
--ヘッダ
	_grp_id		8byte	識別用ID
	_grp_prev	dword	未使用_
	_grp_next	dword	未使用_
	_grp_window	dword	配置先ウィンドウ_
	_grp_buffer	dword	未使用_
	_grp_left	dword	ウィンドウ内での座標_
	_grp_top	dword	
	_grp_scrnwidth	byte	描画先の領域のサイズ(pixel)
	_grp_scrnheight	byte
	_grp_fontwidth	byte	フォントのサイズ(pixel)
	_grp_fontheight	byte
	_grp_textwidth	byte	バッファのテキスト単位のサイズ_
	_grp_textheight	byte
	_grp_scaleleft	byte	描画開始位置(テキスト単位)
	_grp_scaletop	byte
	_grp_width	byte	描画先のテキストサイズ(テキスト単位)
	_grp_height	byte
	_grp_cursor_x	byte	コンソール出力用の座標(x,y)
	_grp_cursor_y	byte	
	_grp_color_fl	byte	文字色(16色)
	_grp_color_bg	byte	背景色(16色)
	_grp_cursor_sav	4bytes	カーソル位置待避用_
	_grp_escseqflag	byte	エスケープシーケンス継続フラグ_
	_grp_escseqcnt	byte	パラメータ保存数_
	_grp_escseqcmd	byte	エスケープシーケンスコマンドバイト_
	_grp_escseqval	byte	パラメータバッファ(1個1バイト)
	_grp_escseqsize	= 3	パラメータバッファのサイズ(定数)
	(残り)			未使用_
~
--内部バッファ~
以下の8byteが文字数分(80x25=半角2000文字分=16000byte)連続する。
	テキストコード(32bit)      4byte
	文字色			1byte
	背景色			1byte
	拡張用			2byte
テキストにしてはメモリを使用するなぁ。
~
-テキスト関係APIの実装状態(COLOR(red){未実装}/COLOR(green){実装作業中}/COLOR(blue){実装済み})
--COLOR(blue){グラフィックテキストボックスオープン}
	; in:	edx	ウィンドウ
	;	esi,edi	グラフィックボックスの位置
	;	cl,ch	テキストボックスの表示領域のサイズ
	;	al,ah	テキストボックスのバッファのサイズ
	;	ebx	グラフィックテキストボックス

--COLOR(red){%%グラフィックテキストボックスクローズ%%}(当面実装の予定なし)
--COLOR(blue){グラフィックテキストボックスフラッシュ}
	; in:	ebx	グラフィックテキストボックス
	;	cl,ch	バッファ左上位置
	;	al,ah	サイズ(どちらかが0で全体再描画)

--COLOR(blue){グラフィックテキストボックス1文字分書き込み}
	; in:	eax	32bit半角コード
	;	cl,ch	バッファ位置
	;	dl,dh	文字色,背景色
	;	ebx	グラフィックテキストボックス

--COLOR(blue){グラフィックテキストボックスコンソール出力}COLOR(blue){(エスケープシーケンス式)}
	; in:	ebx	グラフィックテキストボックス
	;	edx	文字列(終端\0)
	;	al	b1~0:文字列コード(=00:ASCIIZ,=01:SJISZ,=10:未定,=11:未定)
ただしエスケープシーケンスは0x1B,"["で始まり"ABCDHJfsum*"のいずれかで終わるものに限る。

--COLOR(red){%%グラフィックテキストボックスサイズ指定書き込み%%}(廃止)
--COLOR(blue){グラフィックテキストボックス1行下から上方向スクロール}
	; in:	ebx	グラフィックテキストボックス
	;	dl,dh	文字色,背景色

--COLOR(red){グラフィックテキストボックスフォント関連}
--COLOR(red){グラフィックテキストボックス色深度関連}
--COLOR(red){グラフィックテキストボックス解像度またはリサイズ関連}

-MCBのとは?~
DOS上でメモリを管理する仕組み。~
DOSはメモリをリサイズや開放などをするとき、メモリセグメントの1パラグラフ前にくっついているこのMCBを変更するというのが実体です(もちろんチェイン先にMCBを書かなくてはいけません)。~

-MCBの実装について~
現在はDOSアプリが最初のメモリブロックの位置を取得することはできません。~
DEMUがメモリブロックのリサイズや新規確保に対応するために実装します。~
--最初のMCBは0x0BFFくらい
--初期化で作成するMCBは空のメモリブロック(0x0C00~0x9FFE)と将来のUMB用(システムが使用中のマーク)(0xA000~0xFFFF)の2つ。
-MCBの内容
 ; Memory Control Block セグメント
 ; ofs	size	document
 ; 0h	byte	チェインID(4Dhか5Ah)
 ; 1h	word	オーナーID(0:空き,8:DOS/システム,その他:確保したプログラムのセグメント?)
 ; 3h	word	サイズ(パラグラフ)
 ; 5h	3bytes	reserved
 ; 8h	8bytes	プログラム名(終端:00hまたはスペースで埋める)

-内部変数領域のメモ
 ; 内部変数領域の割り当て
 ; ofs		size	document
 ; es:bx-12	word	共有リトライ回数(DOS 440Bh)
 ; es:bx-10	word	共有リトライデュレイ
 ; es:bx-8	dword	カレントディスクバッファへのポインタ
 ; es:bx-4	word	未読み込みCON入力のDOSコードセグメント内のポインタ
 ; es:bx-2	word	先頭のMCBのセグメントアドレス
 ; es:bx		dword	先頭のDPBへのポインタ
 ; es:bx+04h	dword	内部FCBのリストを指すポインタ
 ; es:bx+08h	dword	CLOCKデバイスドライバへのポインタ
 ; es:bx+0Ch	dword	CONデバイスドライバへのポインタ
 ; es:bx+10h	word	扱える最大のセクタのサイズ(byte/sector)(AT:512)
 ; es:bx+12h	dword	内部ディスクバッファの先頭アドレス
 ; es:bx+16h	dword	内部ドライブ情報の先頭アドレス
 ; es:bx+1Ah	dword	reserved
 ; es:bx+1Eh	word	FCBS=x,y の y
 ; es:bx+20h	byte	接続ドライブ数
 ; es:bx+21h	byte	LASTDRIVEドライブ数(LASTDRIVE=Zなら1Ah)
 ; es:bx+22h	18bytes	NULデバイスのデバイスヘッダ
 ; es:bx+34h	byte	JOINドライブ数
 ; es:bx+35h	word	reserved
 ; es:bx+37h	dword	reserved
 ; es:bx+3Bh	word	reserved
 ; es:bx+3Dh	word	reserved
 ; es:bx+3Fh	word	BUFFERS=x,y の x
 ; es:bx+41h	word	BUFFERS=x,y の y
 ; es:bx+43h	byte	ブートドライブ(1=A:,2=B:...)
 ; es:bx+44h	byte	=1:80386/486, =0:8086/286
 ; es:bx+45h	word	拡張メモリ(1Mバイト以降のプロテクトメモリ)のサイズ(KB)


-MCB関係のAPI
--COLOR(blue){MCB初期作成}
--COLOR(blue){MCBリサイズ}
	; in:	edx	メモリブロックのセグメント
	;	ecx	新しいサイズ(パラグラフ)

--COLOR(blue){MCB属性変更}
	; in:	edx	メモリブロックのDOSセグメント値
	;	eax	オーナーID
	;	ebx	プログラム名(ASCIIZ)へのポインタ

--COLOR(blue){MCB一番大きな空きメモリブロックの検索}
	; out:	edx	メモリブロックのセグメント(0なら無い)
	;	ecx	確保可能なサイズ

--COLOR(red){MCBリフレッシュ}(廃止)
--COLOR(blue){MCB指定サイズの確保}
		; in:	ecx	サイズ
		; out:	CF	エラー
		;	edx	メモリセグメント
		;	ecx	確保可能なサイズ(パラグラフ)

--COLOR(red){MCBの開放}

-ファイル関係の整理~
--ファイルハンドル→PSP内のローカルなハンドル→FCBの番号という変換は行わない。
--ファイルハンドル→16倍してOSASK側のスロットという直接な変換をする。
--ファイルへの追記はサポートする。そのときの挙動はOSに任せる(リサイズすると消えるかも知れない?でもRESIZER0.BINでは消えない)。
--DOSアプリ実行中のファイルアクセスは、OSASK側のモジュールをマッピングしてブロック転送するという方法を用いる。リサイズを伴う場合は先に一定のサイズを広げてからブロック転送する。そのとき、(リサイズでエラーが帰ってきたら書き込みエラーまたは書き込まれたサイズを小さくして正常終了する。
--(''編集中'')

-ファイル関係のAPI
--COLOR(red){ファイルオープン}
--COLOR(red){ファイルクローズ}
--COLOR(red){ファイルから読み込み}
--COLOR(red){ファイルへ書き込み}
--COLOR(red){ファイルポインタのシーク}
--COLOR(red){最初のファイル検索}
--COLOR(red){次のファイル検索}
--COLOR(red){ファイルの削除}

-DOSファンクションのエラーコードのリスト
|コード|意味|
|01h|無効なファンクションコード|
|02h|ファイルが見つからない|
|03h|パス名が見つからない|
|04h|これ以上ファイルをオープンできない|
|05h|アクセスできない|
|06h|無効なハンドル|
|07h|MemoryControlBlockが破損している|
|08h|メモリが足りない|
|09h|メモリブロックのアドレスが無効|
|0Ah|環境が無効|
|0Bh|書式が無効|
|0Ch|アクセスコードが無効|
|0Dh|データが無効|
|0Eh|予約|
|0Fh|ドライブ名が無効|
|10h|カレントディレクトリは削除できない|
|11h|同じデバイスではない|
|12h|これ以上ファイルはない|
|13h|ライトプロテクトされている|
|14h|ディスクユニットが不良|
|15h|ドライブが準備できていない|
|16h|ディスクコマンドが無効|
|17h|CRCエラー|
|18h|長さが無効|
|19h|シークエラー|
|1Ah|MS-DOSのディスクではない|
|1Bh|セクタが見つからない|
|1Ch|用紙がない|
|1Dh|書き込みエラー|
|1Eh|読み出しエラー|
|1Fh|一般的なエラー|
|20h|共有違反|
|21h|ロック違反|
|22h|ディスクが不正|
|23h|FCBは使用できません|
|32h|ネットワークリクエストが未サポート|
|33h|リモートPCが待ち受け状態ではない|
|34h|ネットワーク名が重複している|
|35h|ネットワーク名が見つからない|
|36h|ネットワークビジー|
|37h|ネットワークデバイスはこれ以上ない|
|38h|ネットワークBIOSの限界を超えた|
|39h|ネットワークアダプタのハードエラー|
|3Ah|ネットワークから不正な応答があった|
|3Bh|予期できないネットワークエラー|
|3Ch|リモートアダプタが不正|
|3Dh|プリント待ち行列が満杯|
|3Eh|待ち行列が満杯ではない|
|3Fh|プリントファイルのためのスペースが不足|
|40h|ネットワーク名はすでに削除されている|
|41h|アクセス不可能|
|42h|ネットワークデバイスのタイプが不正|
|43h|ネットワーク名が見つからない|
|44h|ネットワーク名の限界を超えた|
|45h|ネットワークBIOSセッションの限界を超えた|
|46h|一時休止|
|47h|ネットワークの要求が受け付けられない|
|48h|プリンタ/ディスクのリダイレクト禁止|
|50h|ファイルが存在する|
|52h|作成不可能|
|53h|割り込み24hのエラー|
|54h|ネットワーク構造が不正|
|55h|割り当て済み|
|56h|パスワードが無効|
|57h|パラメータが無効|
|58h|ネットワークへの書き込みエラー|
|5Ah|システム関連ファイルがロードされていない|


~

** 管理用メモ [#xd7a3807]
ここは、管理人が試行錯誤しながら変更していく内部用のメモがわりです。
#hr
-DEMU起動時に実行ファイルをオープン(関連付け起動対応)。
-メモリブロックの構造や環境変数などを内部(外部優先)ファイルを元に初期化
--しないかもしれない。
-DOS実行ファイルを(必要ならばリロケーションして)メモリに配置。
--実行可能なEXEファイルにはサイズ制限があります(実際のEXEファイルのサイズが560KB未満)。
-ファイルの読み込みや書き出しは必要な場合のみ、ディスクイメージをアクセスする。
--実行ファイルの位置はそのイメージ内にあるものとする。
---実際にディスクイメージ内に無い場合でも内部的には微妙。
--ハードディスクやCD-ROM等はアクセスできない。
-BIOSをエミュレーションしているわけではないのでBIOSレベルの操作は正常に動作しない。
-常駐するアプリは対応していない。というかコマンドラインが無いので正常終了と同じ扱い。
-タイマ割り込みをエミュレーションするかどうかは使っているアプリがどのくらいあるかによる。
-ゲストOS内の時間設定はとりあえず起動時に2006/11/13 17:30:00.00にセットしてみる。
-DOS Versionは5.0としようかな。
-画面はテキストのみ。以下の解像度で表示。いわゆるANSI対応。
|モード|解像度|フォント|表示解像度|言語|
|     3| 80x25|    6x12|  480x 300|  jp|
|     -| 80x30|    6x12|  480x 360|  jp|
|     3| 80x25|    6x12|  480x 300|  us|
|     -| 80x30|    6x12|  480x 360|  us|
|     -| 80x25|    8x16|  640x 400|  - |
|     -| 80x30|    8x16|  640x 480|  - |
|     -| 80x25|   12x24|  960x 600|  - |
|     -| 80x30|   12x24|  960x 720|  - |
|     -| 80x25|   16x32| 1280x 800|  - |
|     -| 80x30|   16x32| 1280x 960|  - |
-キーボード
--DOSファンクション経由のみ。多分同時押し検出不可能。
-マウスドライバ
--int 33hのエミュレーションをやればできそうだけど対応しているアプリが無さそうなので先送り。
-プリンタ
--未対応。
-ファイル
--ディスクイメージ起動ではないのでファイル検索は未対応。ファイル名を指定して開くことならできる。
--フロッピィディスクエミュレーションだけどネットワークドライブと考えれば(検索できないけど)イメージがあいそう。
-CPU/FPU
--8086シリーズ。80386DX相当。PM/PG/VM/FPU/SSE/MMX/SSE2/SSE3/3DNow!非対応。32bitレジスタ対応。インタプリタ型。
-サウンド
--BEEPすら出せない。
-メモリ配置
--起動するDOSアプリは0x00010000~0x0009FFEFを自由に使える。UMBやEMB、HMAは使えない(予定)。
-その他

''(編集中)''

* 進行状況欄 [#oe0c7cf5]
ここは管理人が書く場所です。
----
-ソースを書き直す段階になって、基礎ライブラリ再構築中。これのテスト中にテストゲームなどを作成するかもしれない。 -- [[nika]] SIZE(10){2006/09/28 (木) 06:23:43}
-とりあえず、当初の計画に戻って、DOS APIレベル(int 21hレベル)のエミュレーションでDLL(デバイスドライバ)を使用しない形式で作成しようと思います。 -- ''nika'' SIZE(10){2006/10/11 (水) 04:02:59}
-6x12ドットの内蔵ASCIIフォントを使用する。日本語はOSASKシステムフォントを縮小して使用するつもり。16x16を12x12に縮小するにはHighColorなら中間色補間ができるが、16色だとそれもできない。16x16→12x12(単純補間(間引き)または適応補間)しかできない。 -- ''nika'' SIZE(10){2006/10/12 (木) 04:05:44}
-ファイルアクセス関係実装中。 -- ''nika'' SIZE(10){2006/10/13 (金) 13:21:26}
-実行ファイルのリロケーションとかPSPの用意とか準備関係実装中。 -- ''nika'' SIZE(10){2006/10/14 (土) 18:14:13}
-この方式(DOSAPIレベル)だとディスクイメージってわけにはいかないよなぁ。やっぱりリストファイル(alias可能な)を参照してそれをDOSディスクにしよう。セクタ単位のアクセスまでサポートしなくても(あるいは、簡単なサポートだけで)動作するだろうし。 -- ''nika'' SIZE(10){2006/10/14 (土) 23:23:59}
-グラフィックボックスを使うのをやめて、独自のテキストVRAMみたいなものを使用する用に実装中。 -- ''nika'' SIZE(10){2006/10/17 (火) 16:59:20}
-独自のテキストボックス形式で疲れた。 -- ''nika'' SIZE(10){2006/10/18 (水) 19:50:59}
-テキストボックス関係の実装は一通り完了。これからCPU部の実装(といっても旧バージョンのコピーに近いが)とかだな。 -- ''nika'' SIZE(10){2006/10/21 (土) 03:24:25}
-CPUの実装の完了とEXEファイル関係、PSPや環境変数も完了(ほとんどの値は0ですが)。あとはDOSファンクションの実装、これだけ(OSASK側のファイルへのアクセスとか、そういう問題はある)。 -- ''nika'' SIZE(10){2006/10/22 (日) 08:36:14}
-MCB(Memory Chain Block)の実装中。 -- ''nika'' SIZE(10){2006/10/22 (日) 21:16:22}
-風邪っぽい症状でなんか実装がはかどらなかった。なんかなんか言葉にしにくい…。こういうときサプリメントとか効くんだろうか・・・ -- ''nika'' SIZE(10){2006/10/24 (火) 14:01:34}
-naskの最適化ルーチンにバグがあるようです。cmp [レジスタ + 定数], 値、のとき、定数が0だと不安定になるようです。 -- ''nika'' SIZE(10){2006/10/25 (水) 01:10:50}
-予定: カーソル位置を自作ライブラリメモリに確保してコンソール出力描画ルーチンをライブラリ化してマルチウィンドウでもコンソール出力が使えるようにする。そしてその別のグラフィックテキストボックスへゲストDOSアプリのレジスタのダンプとかデバッグメッセージなどを表示するようにする。 -- ''nika'' SIZE(10){2006/10/31 (火) 04:24:55}
-naskのバグをMLに流しました。 -- ''nika'' SIZE(10){2006/11/04 (土) 01:35:16}
-久しぶりにちょっとずつ更新再開。デバッグウィンドウ(デバッグコンソール?)実装に入ります。 -- ''nika'' SIZE(10){2006/11/10 (金) 05:57:24}
-キーボード入力の処理とシグナルハンドラを実装中。 -- ''nika'' SIZE(10){2006/11/10 (金) 15:47:11}
-カーソル点滅のための毎秒18.2回のタイマとキーボード入力を引き続き実装中。デバッグコンソールから1命令のトレースとかできるようにするのはCPUルーチンの改造が必要だなぁ…。 -- ''nika'' SIZE(10){2006/11/11 (土) 15:04:54}

#comment



* なにか書いていってください [#ne60eb42]
なんでもいいですよ。
----
-メモ: http://hp.vector.co.jp/authors/VA015412/colum/pe.htm -- ''nika'' SIZE(10){2006/10/15 (日) 16:08:06}
-ぉ、いきなり進みましたねwwいいだけ逃げていたのにwwすげーな。応援してもります。 -- ''通りすがりんこ'' SIZE(10){2006/10/17 (火) 21:28:22}
-応援ありがとうございます。OSCがあるのでそれまでには何とかアプリ実行できるまでにしたいです。 -- ''nika'' SIZE(10){2006/10/19 (木) 03:32:31}
-メモ: http://forum.nifty.com/fpcu/dosvcmd/ansi.htm -- ''nika'' SIZE(10){2006/10/19 (木) 20:18:28}
-メモ: http://www.imasy.or.jp/~i16/iroiro/dos_doc.htm -- ''nika'' SIZE(10){2006/10/22 (日) 08:37:56}
-そういえばMt.orzはDOS汎用ではないから、動作検証には使えないなぁ(ATのBIOSに依存している)。DOS汎用版は無いのかなぁ。 -- ''nika'' SIZE(10){2006/10/24 (火) 06:39:33}

#comment


[リロード]   [トップ] [一覧] [単語検索] [最終更新]   [最終更新のRSS]