†ただしリンクは機能しません。URLに"#"が付くだけです。このページは横幅がある程度必要で、縦方向にも長いのでSXGA(1280x960)以上の画面解像度を推奨します。Emulator(仮)は、DOSエミュレーションをハードウェアレベル(一部BIOSレベル)でエミュレーションするソフトウェアです。フルアセンブラによる動作で、そこそこ快適。KL-01でリリースが可能(添付物は含まない)。RAMの使い方が特殊。自前に対応するBIOSとVGABIOSを入手しなければならない。ハードディスク/CD-ROM/PCMCIAのエミュレーションが無いゲストOS(DOS)で見える周辺機器は別途ドライバを組み込んで追加する形式なので、ドライバを入れ替えるだけで認識されるハードウェアを変更可能。8514/A互換で、DOS上でも高解像度を利用可能(予定)。したらEMM386.EXEも利用可能になるかも?(不明)。CPUはi486相当のFPU非搭載の命令をサポート。(現在はPM/PG関連以外は大体サポート)DOS汎用アプリはもちろん、AT互換機依存アプリも一部動作(PC98用は動作しない。TOWNS用は不明)。12451atdsk.sar詳細は付属のドキュメントを参照して下さい。IDE関係の(と思われる)I/O空間を強制的に切り離しました。一応本来トラップしたI/Oアドレスを載せておきます。0x0168~0x016FBochsの挙動を見ると、マスタ/スレーブに何も繋がっていない場合はFFhじゃなくて00hを返せばいいのかも?タイトルバーを某エミュレータ名にして、行間と字間をあけてそれっぽくした場合(ネタです。)ちなみに本物のエミュレータの画面(こうならないといけない...)K-tanのVGABIOSをDOSEmulatorで走らせてみても、まだちゃんと動作しないんだよなぁ。そこが実行されているか意味不明...。ブート失敗が確認できるだけBIOSだけ配布することに意味がなくなったので、廃止しました。Emulator(仮)のディスクイメージ版を公開しました。アプリを実行できるレベルではありません。†ゲストOS側には1.44MBドライブと認識させるつもりですが、現在のOSASKはFDベース(CFやATAもFDのディスクイメージを利用する形式)のOSなので、1.44MBのベタファイルなんて到底FD内に置けません。そこで、どういう風に1.44MBドライブを実装するのか、意見を募集したいと思います。自分で考えてみたサンプルを3個提示してみたいと思います。この中のこれがいい!とかもこのコメント欄にお書き下さい。詳細は別のページとかを作ってそこにリンクさせてもいいと思います。不良セクタ形式:特殊なディスクイメージを使用し、後ろのセクタを不良セクタなどと認識させて、実質720KBな1.44MBフロッピーディスクとする。10:46:272DDブート:最初から2DD形式(片面のみ、720KB)として認識させ、ディスクイメージは720KBで済むようにする。これで問題があるのは、2DDからbootできるのか、DOS等のOSが2DDブートに対応しているのか。10:47:48随時作成形式:OSASKのファイルを直接FDのセクタに配置する形式。OSASK側でファイルリストを作成し、FDドライバ(エミュ本体)がリストを読み込み、内部にディスクイメージを作成する。ブートセクタのファイルもOSASK側に用意してファイルリストで定義する。FATやディレクトリエントリなどはその都度マッピングする。10:53:02もしくはこれらの形式をmenu等を使用して選択する...そんなことができるのかはさておき。01ヶ月立ちましたので勝手ながら締め切らせてもらいました。†とりあえず以下のOS/DOSアプリが動作すること。†とりあえずDOS互換ファンクションをホスト上のハードウェア相当のレベルで実装して、biosからそのハードウェアに指令を出す形式にする予定を立てました。それに伴って簡易的にスロットを扱えるサブルーチンを構築中。06:47:28アプリ動作するまであと少し!?、とりあえずOSASK側のファイルを読み込めるようになりました。13:31:57日本語はとりあえずおいといて、メモリ管理(MCB関係)を実装中。13:09:33ah=48h,ah=49h,ah=4ahの実装完了。04:30:38内部的に使用しているライブラリの整理中。進展できないようです...。04:36:18もしかしたら今後はbochsの様な独自ハードウェア(I/O)でBIOSレベル(DOSが動作するレベル)での互換を採用したAT互換機のエミュレータに発展させるかもしれません(期待はしないで下さい)。04:40:24IDEデバイスを無視したら動作しそうだったので、1個ずつ表にあるアドレスも無視するようにしてみました。18hが失敗してますが、bios実行は(irqやdma等を除き)成功してる模様です。05:40:33次はFDDをつないでBochsBIOSからFDブートしなければなりません。ことはFDの実装と本格的なIRQ/DMAの実装が必要になる...。01:40:41ディスクイメージ版を公開しました。QEMU用のosask4.8が入っているので、QEMU上で実行させてください。一連のファイルを実際のFD等にコピーできれば実機で動作させることも可能です。-v48aが効いているはずなのでv4.8以降専用です。03:16:54とりあえずFDドライバを実装中。ATAが実装されていないとFDCも同時に存在が検出されないようです。ATAハードウェアを実装して、かつ、ATAドライブが繋がっていない状況を作らないといけないようだ。CDROMドライブ/HDD/FDDはATA(IDEボード?)で提供されているんだろう。ATAが全く存在しなければ、どこからもブートできない環境になるってことか。11:43:59なので、rombios.cのソースをダウンロードして、Cのソースを見ながら(パッチせずに)動作できるようにFDD/ATAドライバを実装しなければならないだろう。C言語が得意じゃない私がソースを読んで仕様が分かるだろうか...(汗)。11:49:29rombios.cを解読中。0で返していたような気がする。これでFDドライブが無いと認識されている可能性も無くは無いかも。11:38:17やっぱりCMOS設定がよくなかったようだ。Bochs上のCMOSデータを返すようにしたら(64バイト)、FDDも試すようになりました(多分表示上だけではないはず)。13:38:39qemuとBochsなどは保存していないみたいだけど、本来はCMOS-RAMは保存されないと意味がないので、256バイトのcmos.datなどとして読み込み、保存をするようにしよう。BochsBIOSから自作BIOSになるときに必要になるかもしれないし(汗)。19:01:26とりあえずMt.orzのOS版が動作するように実装中。(FDDがちゃんと実装されるまで)の目標になります。07:01:34PM/PGの実装をしたらOSAkkieがちょうどいいかも。起動したら問答無用でカウントアップされていくし。ROM(OSが組み込まれたROM)のような形式にするかもしれません。こと独自OSでも作っちゃうかなぁ...。DOSアプリ実行時はDOS互換で。19:39:19今日、K-tanからアドバイスをもらいました。bochsでATAをdisableにした状態で起動してみて、もしその状態でFDイメージがブートできるならbochs上でどんな挙動をするのか確認したらいいかもしれない、など言われました。22:09:59たしかにそうだな、と思ったのでbochsの挙動を探ることにします(bochsでata0~3をenabled=0にしたが、FDCはアクセスされている。FDイメージ(DOS)が普通に起動する)。22:12:48Bochsの挙動をいくつか調べてみました。結果、すべてのATAが未実装な状態でも0x3F0~0x3F7のFDCレジスタは有効な様子です(0x3F2の書き込みでログに反応が出ていた)。FDのブートセクタ(IPL)の読み込みにFDCを使っていないらしく、0x3F0~0x3F7どころか、0x100~0xFFFFのすべてのI/Oレジスタを使っていない様子。Bochsは特殊な方法でIPLをロードしているようだ(それとも最初から...ってそれは無いか)。14:45:02でも、互換機で使われないI/Oアクセスはアクセスエラーを起こすようになっているので、特定のビットかメモリマップトI/Oを使っているってことかな...。Bochsは一筋縄じゃいかないなぁ。13hはちゃんと実行されているようですが、フロッピーディスクアクセスなのにint13_harddiskの呼び出しになっていて、それで失敗してフロッピーディスクのIPLの読み込みをしてくれないようです。Emulator(仮)をデバッグ用にシングルステップ処理で検証してみることにします。逆アセンブラとゲストOS(DOS)のレジスタダンプを比較しながら。02:09:05しかし、int13h_diskette_functionじゃなくint13h_harddiskに飛んでいるのは普通に考えたらおかしい。02:18:15原因が判明しました。CPUのエミュレーションで、オペコードがF6/F7のTEST命令(REGフィールドが000か001)の時、フラグをクリアして命令を実行させた後、更新されたフラグをゲストOSのフラグへ反映させていなかった(=常にZFがNZ(クリア)されていた)のが原因でした。これを修正したら無事0x3F2をリードするようになりました。14:11:49K-tanのvgabiosを再度実行させてみました。そんなところを実行しているのか...。14:47:08フロッピーディスクドライバを実装中です。FDCのI/Oアクセスの一部は既に実装済みですが、コマンド/パラメータを発行した時点でbreakする状態です。現在はFDC周辺の資料を整理しています。それぞれのフェーズの移行とかは知っていますが、パラメータの意味がまだちょっと分からないので、大体理解したら本格的に実装しようと思います。それまで少し時間がかかりそうなので、しばらくお待ち下さい。12:54:06整理中のFDCの資料をご覧になりたい方は、こちらの下の方にあります。3を戻したところ、command=07(RECALIBRATE)を実行しようとしました。17:59:37RECALIBRATEはE/Rフェーズが無く(実際にはEフェーズ中にヘッドが移動するんだけど)、即終了でいいでしょう。よって、コマンド書き込み終了後、すぐに割り込み信号をアサートさせればOK!なはず。18:01:48あぁ、外部割り込み関係は実装が不完全だったんだったOTL.....ここを直さないと次に進めない...。23:05:05割り込み関係は実装完了。FDCに関してのIRQは正常に来るようになりました。復帰まで行ってませんが...。STATUS(08h)を実装中です。21:11:12あと、CMOSメモリをイメージファイル"CMOS.DAT"から読み込むようにしました。21:12:16ちょっと、ドライバへの制御処理がおかしいのか変なところでハングする...。違うセグメントで実行しているときに割り込み(シグナルハンドラへの移行)があると何かが溜まっていっていつのまにか変な位置に移行(復帰?)してしまう感じ...?。13hのFDの時はドライバ側でエミュレーションしてしまおう。17:08:54...。17:11:24そういえば、デバッグ機能が弱い。コンソールとか別々にしてメモリ参照とかレジスタダンプとかブレイクポイントとか色々できるようにしないと何かあったとき原因を見つけるのが難しくなっていく気がする。IRRやDMARQの状態とかも見れるようにして、デバッグしやすい環境にしなくちゃいけないなぁ(課題)。17:19:03VGAのエミュレーションをどうしようかなぁ。現在はメモリ書き込み時に画面に反映するという手抜きだからなぁ。デバイスドライバで実装するにしても表示画面の大きさ変更とかVRAM書き換えの画面反映とかどうするかなぁ。テキストモードもデバイスドライバでやるならフォントの取得させてグラフィック描画するようにしたほうがいいのかなぁ。これちゃんとしないとグラフィック使うアプリは誤動作(=見えない)しちゃうから考えとかないと。01:45:36BGMライブラリを作り直したくなってきた。MIDI形式バッファを使用可能。効果音/BGMを独立に鳴らすことが可能。こんな感じでもBGMライブラリ使う人はいるかな。(BGMライブラリが完成すれば、どのアプリでも簡単にBGMが使えて便利になるけど、以前のソースは紛失しちゃったし、書き直すの(特にMIDI形式関係)めんどくさいんだよなぁ)。01:50:05↑単なるぼやきになってしまいました。13hによるフロッピーディスク#0のアクセスをフックして直接渡す方法を試してみました。現在はMt.orzのディスクイメージの先頭2セクタ分をROMに持ち、直接movsbでコピーしていますが、LBAセクタ1を800:100に読み込んだあとにデバイスドライバでハングしているようです。DEMU上でMt.orzの起動画面が見れるまでもう少しっぽい。07:52:33VGAドライバでハングしてました。アトリビュートデータ用RAMが足りなかったようです。そのバグをとったら無事起動しました。画面の肝心なところが表示されず。パレットかなにかだろうか。...と思ったらタイマをまだ実装してなかった(爆)。08:58:58DEMUの内部タイマの実装中。getsignal関数の中でbreakすることがある。DLL実行中にシグナル受信(=シグナルハンドラへの分岐)するとデータセグメント(DS)が分岐前のセグメントセレクタ値で、そのリミットを越えているのかも?もしそうだったらDLLのデータセグメントはDSじゃなくESにするべきかもだったけど、そうするとC言語とか不可能になるし、いちいちES:かCS:プリフィックスを付けなければならなくなるのはちょっといやだなぁ。タイマの精度は最大60Hzで、それ未満の場合は1/60秒分の時間がこの瞬間に一気に進む扱いになる。一応このタイマは将来VSYNCと兼用するつもり。オートフレームスキップを使用するためには最低でも2つ以上のタイマ(計6個以上のスロット)を使用しなければならない。07:16:33スクリーンショットは現在オリジナルのMt.orzを修正したものを使用しています(まだタイマを実装していないので、初期色(=0)の黒のままになって表示されているのか分からない為、初期値を7(白)に変更したのみ)。07:19:11シグナルハンドラ分岐時のブレイクは入り口でds=15にセットしたら無事動作するようになりました(多分)。タイマをオープンして周期的タイマとして動作させているだけの段階なのよね。フレームレート調整とかはまだ描画処理がフレーム単位じゃないから必要ないし。デバイスドライバ側のタイマ登録/変更APIは既に実装してあるので、あとはタイマ制御のみ。...めんどくさいなぁ。23:52:00VGAドライバからはグラフィックボックスのサイズ変更とかできないと、画面モード変えられないことになる。DOSが動作するようになってから考えよう。01:54:33えーと、DEMU内でタイマの周期敵割り込みの実装は完了(OSASKからタイマが来るだけの状態)。現在ドバイスドライバのタイマ割り込み処理ルーチンを実装中。03:07:24デバイスドライバへのタイマ割り込みの実装を完了。今度はデバイスドライバ側のタイマ処理(IRQピンを"H"にしたりCMOSの時間を進めたりする)の実装へ。デバイスドライバへのタイマ割り込みがちゃんと動作していれば、無事にゲストOSの時間が(やっと)進むようになる。04:24:55ちなみにDEMU→デバイスドライバへのタイマ割り込み処理を実装しただけの段階ではゲストOSに変化はありません。デバイスドライバ側のタイマ割り込み処理ルーチンでなにもしないでreturn;しているからです(=すでに登録されてはいます)。04:27:30やっぱり外部セグメントを実行中にシグナルで割り込みが起きるとDSを参照しようとして(多分)ハングするようです。ESを使えば問題は起きないようです(すべてのデバイスドライバをそうしなきゃいけないとなると面倒だなぁ)。いう問題があるのでとりあえず保留中。03:23:35この問題をMLに投げました。06:03:31デバイスドライバ側のデータバッファはDEMU本体のデータセグメントと共用、ドライバの呼び出し前にデータバッファのポインタをコードセグメントの一定の場所に他のパラメータと一緒の場所に書き込んで渡すことになりました。将来はデータセグメントを作成しようとするだけで強制終了されるようになるそうです。09:17:45しばらく↑の変更に費やされると思います。09:26:24ちなみに、現時点でOSAkkieを実行してみると、キーボードドライバで止まってしまいます(汗。これは未実装なコマンドが書き込まれるとハングする仕様だからです。09:41:36うぅ。デバイスドライバのファイル形式とかデータバッファの参照を相対参照にさせないといけないし...。23:29:54最初から作り直すのも面倒だし、でも最初から作り直すと速度とか速くなりったりなによりソースがサッパリできるけど...。うーむ、どうしたものか。23:32:49現在、BGMライブラリに脱線中(笑)。v0.2にハマってました。これからDEMUの仕様の作り直し、(時間があれば)TrueMAZEの更新など進ませたいです。v0.2が出ていたので少し修正しました。こちらのページの更新は停止しました。以後、DEMUの方で更新していきたいと思います。†なんとなくスクリーンショットにも使用している自作BIOSを公開してみる(同じファイル名でその都度更新する予定です)。09:42:37とりあえず、ハードウェア相当で日本語を表示できるようにしよう(グラフィックモードでは無く(英語)テキストモードで)。ファンクションキーで切り替える、とか。11:53:49ここにあった開発状況などは上記の進行状況へ移動させました。13:49:51内部資料用にOS-Wiki内のページをコピーしました。OS-Wikiでもページ名に統一性がないなぁ、と思った。adapterもなんとかなりそうな感じです。18hが出るのを確認できるだけですが)。01:40:41ディスクイメージ版を公開しました。やってみましたが、以下のメッセージが出て途中でDOSに戻ってしまいました....。12:49:43ダウンロードしてあったqemu-0.8.1-windows-3.zipで試してみました。なんと!普通に動作します。-std-vga付けないとqemuのコンソールから切り替わりませんでしたが...。DOS上のqemuでフルスクリーンとかできたし、Mt.orzやOSAkkieも動作しました。allなどをつけるとハングする)。BIOSを公開してみました。CONFIGは保存されない。専用自作VGABIOS専用自作ROMBIOSあまりメモリを食わないようにする何をしてもOSASKが落ちないようにするとりあえずまっとうなアプリケーションになるゲストOSでグラフィックアクセラレータが使用できるようにするデバイスドライバでOSASKAPIを呼べるようにするFDイメージの交換をできるようにするウィンドウの大きさを可変にして、テキストモード時はフォントを大きくできるようにするドライバ用のメモリが余ったらゲストOS(DOS)で使用できるメモリに回したいゲストOSでタイマを細かく制御できるようにする起動時にすぐにゲストOSを起動するかメニューを出すようにする初起動の時にベンチマークテストして自動で設定を更新したいTOWNSやPC9821でも動作するレベルを維持するメモリを動的に確保したり開放したりしたいステートセーブ(クイックセーブ?)/ロードができるようにしようかなwin32コンソールアプリを動作できるようにするもし、SB16等のハードウェアか勝手に操作して、OSASKが意図しないIRQとか来たらどうなるんだろう...って普通にマスクされてるか。