* DEMUプロジェクトの仕様と詳細 [#h8c5ec85] このページは、DOSエミュレータ 「DEMU」の仕様や進行状況を更新するページです。~ 最初から書き直す必要に迫られたので、改名とともにページ名を変更しました。~ とりあえずDOS互換だけ実装し、その後コツコツと仕上げていくつもり。だいぶ完成してきました~ 大まかな骨組みは「基礎ライブラリ(グラフィックテキストボックス+ファイルアクセス/リスト+DOSメモリ管理)+CPU本体+APIシミュレータ」な予定。~ ''(編集中)'' //////////////////////////////////////////////////////////////// * スクリーンショットとか [#ka4b52df] ** 最新 [#n26a4c3c] |#ref(demu20061025a.png)| |FM1312音色エディタを起動させてみたところ。&br;なぜか中央に表示できていないし、ずれているし、クレジットも表示されていない…orz&br;OSCまでの展示には間に合いそうにない。| |#ref(demu20061020b.png)| |ごたくどすのコンソール出力をリダイレクトして&br;そのファイルを表示してみたところ&br;(エスケープシーケンスの動作確認用)&br;COLOR(red){まだ動作する段階ではありません!}| #ref(5dsout.txt) //|#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色) (残り) 未使用_ ~ --内部バッファ~ 以下の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(green){ファイルオープン} --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} #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