このページは、DOSエミュレータ 「DEMU」の仕様や進行状況を更新するページです。
最初から書き直す必要に迫られたので、改名とともにページ名を変更しました。
とりあえずDOS互換だけ実装し、その後コツコツと仕上げていくつもり。だいぶ完成してきました
大まかな骨組みは「基礎ライブラリ(グラフィックテキストボックス+ファイルアクセス/リスト+DOSメモリ管理)+CPU本体+APIシミュレータ」な予定。
(編集中)
実機のI/Oをアクセスするように変更しました。 FM音源音色エディタならファイルアクセスしなければ普通に動作します。 |
キーボード入力関係のファンクションを実装して、このDOSアプリは大体動くようになりました。 ただし、ファイル関係のファンクションを実装していないので実行しようとすると落ちる(汗)。 実機へのI/Oアクセスを実装したら音が出せそう。完成がやっと見えてきたかも? |
時間関係の実装も完了してやっとこの画面まで行った。 まだ実装していないDOSファンクションを実行しようとして(汗)停止しているところ。 この先はファイル関係ファンクションを本格的に実装しないと… |
16x16のOSASK標準フォントを12x12や32x32へリサイズした例です。
12x12はそれなりに使えると思いますが、
32x32は使用用途が…(笑)。
_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 パラメータバッファのサイズ(定数) (残り) 未使用_
テキストコード(32bit) 4byte 文字色 1byte 背景色 1byte 拡張用 2byteテキストにしてはメモリを使用するなぁ。
; in: edx ウィンドウ ; esi,edi グラフィックボックスの位置 ; cl,ch テキストボックスの表示領域のサイズ ; al,ah テキストボックスのバッファのサイズ ; ebx グラフィックテキストボックス
; in: ebx グラフィックテキストボックス ; cl,ch バッファ左上位置 ; al,ah サイズ(どちらかが0で全体再描画)
; in: eax 32bit半角コード ; cl,ch バッファ位置 ; dl,dh 文字色,背景色 ; ebx グラフィックテキストボックス
; in: ebx グラフィックテキストボックス ; edx 文字列(終端\0) ; al b1~0:文字列コード(=00:ASCIIZ,=01:SJISZ,=10:未定,=11:未定)ただしエスケープシーケンスは0x1B,"["で始まり"ABCDHJfsum*"のいずれかで終わるものに限る。
; in: ebx グラフィックテキストボックス ; dl,dh 文字色,背景色
; 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)
; in: edx メモリブロックのセグメント ; ecx 新しいサイズ(パラグラフ)
; in: edx メモリブロックのDOSセグメント値 ; eax オーナーID ; ebx プログラム名(ASCIIZ)へのポインタ
; out: edx メモリブロックのセグメント(0なら無い) ; ecx 確保可能なサイズ
; in: ecx サイズ ; out: CF エラー ; edx メモリセグメント ; ecx 確保可能なサイズ(パラグラフ)
コード | 意味 |
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 | システム関連ファイルがロードされていない |
sendkeysignal: ; キーシグナルをキャラクタコードとスキャンコードに変換して蓄える_ ; in: eax キーシグナル_
getkeysignal: ; キースキャンコードとキャラクタコードの取得_ ; out: al キャラクタコード(特殊キー入力時は0) ; ah キースキャンコード_
input: ; バッファドキーボード入力 ; in: edx バッファ ; +00 最大文字数 ; +01 入力された文字数 ; +02 入力された文字列 ; ebx グラフィックテキストボックス
inputchar: ; DOS式1バイトキーボード入力(エコーなし,ウェイトなし) ; out: al キャラクタコード ; ZF =ZR:入力なし,=NZ:入力あり ; ※eaxの上位バイトは破壊される
inputcharw: ; DOS式1バイトキーボード入力(エコーなし,ウェイトあり) ; out: al キャラクタコード ; ※eaxの上位バイトは破壊される
ここは、管理人が試行錯誤しながら変更していく内部用のメモがわりです。
モード | 解像度 | フォント | 表示解像度 | 言語 |
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 | - |
(編集中)
OS-Wikiにも見つからなかったので、メモ代わり。
アドレス | レジスタ | 機能 | 備考 |
00 | 秒カウンタ | 00h~3Bh(バイナリモード),00h~59h(BCDモード) | |
01 | アラーム時刻(秒) | ||
02 | 分カウンタ | 00h~3Bh(バイナリモード),00h~59h(BCDモード) | |
03 | アラーム時刻(分) | ||
04 | 時カウンタ | 24時間モード時 00h~17h(バイナリモード),00h~23h(BCDモード) 12時間モード時(午前) 01h~0Ch(バイナリモード),01h~12h(BCDモード) 12時間モード(午後) 81h~8Ch(バイナリモード),81h~92h(BCDモード) | PCでは24時間,バイナリモード |
05 | アラーム時刻(時) | ||
06 | 曜日 | 1~7(1:日曜日) | DOSは0~6(0:日曜日) |
07 | 日 | 01h~1Fh(バイナリモード),01h~31h(BCDモード) | |
08 | 月 | 01h~0Ch(バイナリモード),01h~12h(BCDモード) | |
09 | 年 | 00h~63h(バイナリモード),00h~99h(BCDモード) | 年の上位2桁は, 32hに格納 |
0A | レジスタA | ビット7:UIP(Update In Progress) 1:時刻更新サイクル中 0:時刻更新完了 ビット6~4:OSn:発振回路制御 11x:発振回路ON, 分周器OFF 010:RTC動作開始(発振回路ON, 分周器ON) ビット3~0:SQW信号出力 1111:500ms 1110:250ms 1101:125ms 1100:62.5ms 1011:31.25ms 1010:15.625ms 1001:7.8125ms 1000:3.9063ms 0111:1.9532ms 0110:0.97656ms 0101:0.48828ms 0100:0.24414ms 0011:0.12207ms 0010:7.8125ms 0001:3.9063ms 0000:無効 | ←通常は010の設定のままにすること ←PCではSQWは使用していない ←PCは通常は0110に設定 ←1001と同じ扱いになる ←1000と同じ扱いになる |
0B | レジスタB | ビット7:UTI 1:RTCバイトのユーザバッファへの転送/時刻更新割り込みクリア 0:転送許可 ビット6:PIE(Periodic Interrupt Enable) 1:SQW割り込み発生許可 0:SQW割り込み発生禁止 ビット5:AIE:アラーム割り込みイネーブル 1:許可 0:禁止 ビット4:UIE:アップデートサイクル割り込みイネーブル 1:許可 0:禁止 ビット3:SQW信号出力制御 1:出力許可 0:出力禁止(Lレベルに固定) ビット2:DF:データフォーマット 1:BCD 0:バイナリ ビット1:HF:24時間/12時間計選択 1:24時間計 0:12時間計 ビット0:DSE(Daylight Saving Enable) 1:夏時間補正を有効にする 0:夏時間補正なし | ←PCは通常は0に設定 ←SQWによる定周期割り込み ←アラーム時刻レジスタと時刻レジスタが すべて一致すると割り込みを発生する機能 ←時刻レジスタ更新が完了すると割り込み を発生する機能 PCでは使用していないため無意味 ←時刻データのフォーマット指定 ←0:BCDモード,1:バイナリの間違いかも知れない PCでは通常0に設定 ←PCは通常1に設定 ←夏時間設定時の動作 ・10月最後の日曜日の01:59:59の次が01:00:00になる ・4月最初の日曜日の01:59:59の次が03:00:00になる |
0C | レジスタC | ビット7:INTF:割り込みフラグ 1:割り込み発生 0:割り込み発生していない ビット6:PF(Periodic Event Flag) 1:SQW割り込み発生 0:通常動作 ビット5:AF(Alarm Event Flag) 1:アラーム割り込み発生 0:通常動作 ビット4:UF(Update Event Flag) 1:アップデートサイクル割り込み発生許可 0:通常動作 ビット3~0:未使用 | ←レジスタCのリードによってクリアされる ←要因はPIE,AIE,UIEで個別に許可/禁止可能 ←レジスタCのリードによってクリアされる ←レジスタCのリードによってクリアされる ←レジスタCのリードによってクリアされる |
0D | レジスタD | ビット7:VRT 1:RTCバックアップ電池有効 0:RTCバックアップ電池切れ(日付/時刻データ無効) ビット6~0:未使用 | ←ACPIではビット5~0にアラーム「日」設定を要求 |
0E | 汎用SRAM | 自己診断情報 ビット7:RTCバックアップ電池 1:電池切れ 0:電池有効 ビット6:チェックサムステータス 1:エラー 0:正常 ビット5:構成異常 ビット4:メモリサイズ異常 ビット3:HDDコントローラ/ドライブC初期化ステータス ビット2:時刻データ正当性 1:無効 0:有効 ビット1~0:未使用(予約済み) | |
2E | チェックサム(上位) | ||
2F | チェックサム(下位) | ||
32 | 世紀情報(年の上位2桁をBCDで格納) | 自動桁上がりはしない |
ここは管理人が書く場所です。
コメント | お名前 | NameLink | |
なんでもいいですよ。
コメント | お名前 | NameLink | |