PC-DOS動いてるように見えます。23:46続・WASMでPCエミュレータ作った。Tweet広告を非表示にするもっと読むコメントを書く2019-06-18WASMでPCエミュレータ作った。現時点では自作のOSすら起動しません。使っているのが大きな特徴です。ブラウザーで動作するPCエミュレーターを探していて、いくつかあることはあるのですが、どれも不満がありました。エミュレーターを試作したことがありました。入出力だけブラウザ側が担当する実装でした。クライアントの処理が軽いので軽快に動作しましたが、動作するサーバーの問題があって公開前に開発中止になりました。利用したものがよくありますが、パフォーマンス的に満足できるものはひとつもありませんでした。環境も整ってきたので自作するかーということになりました。Atomics技術調査をしていて一点気になっていたことがありました。イベントを処理するためのスレッドがあります。イベントに素早く反応できずに操作性が悪くなります。イベントのために小刻みに動作を中断するとエミュレーターのパフォーマンスが非常に悪くなります。スレッドとは別のスレッドで処理するのが普通です。いう仕組みを使ってマルチスレッドを実現できます。イベントに、エミュレータスレッドはエミュレータ処理にそれぞれ専念することができます。一方で、エミュレーターは常に処理しているわけではありません。全力で処理したい時もあるけど、ユーザーの操作待ちなどで休んでる時もあります。使って待ち合わせを行うことができます。使ってエミュレータスレッドを起こすことができます。消費しないようになり、ぼくの要求するパフォーマンスを満たすことができるようになりました。以外のほとんどのブラウザーでは無効になっているという悲しいニュースがありました。これを解決するには別の手段を探す必要があるかもしれません。系の本格的なエミュレーターを作るのは初めてでした。呼ばれるエンコーディングが使われています。エミュレーターで一番面倒な場所だと思います。ここだけで1日くらい消費しました。デコーダーを実装して多くの命令が動作するようになりましたが、今度はフラグの動作にハマりました。実機と結果が異なるのです。これらのフラグは条件分岐でよく使われるフラグなので正しく実装しないとほとんどのプログラムが動作しません。エミュレーションするので真面目に実装する必要があります。00:07WASMでPCエミュレータ作った。Tweet広告を非表示にするもっと読むコメントを書く2019-05-05フォントエディタ作った。オリジナルフォーマットも考えてるけど実現可能性は未知数です。ほとんどの機能が利用できます。どこでもフォント編集できるぜ(?)ソースはこちらにあります。14:56フォントエディタ作った。megosまた更新間隔が空いてしまいました。フォントについてあえず現場を公開しておきます。呼び出すように分離しました。フォントを変更することにしました。ページング、PEローダー、ブートシーケンスこれらは密接な関係があります。設定したものをそのまま使っていました。その一方で、ページングは正しく構成すればメモリ保護とデバッグ性が向上するので早く独自テーブルに移行したいと考えていました。いうことで、まずは独自のページマネージャを実装しました。ローダーを実装する必要がありました。ローダーとカーネルが物理的に分離されました。起動できるようになりました。起動できなくなりました。作るという当初の目的から少し離れた気がします。サポートしない環境も存在します。使用率が正確に反映できませんでした。完全な代替は無理と判断しました。使用率測定がもともとオーバースペックだった気もしているので改修を考えています。起動ができるようになると期待していたのですが、黒い画面のまま進みませんでした。起動してみたら、画面が真っ黒のまま進みませんでした。ウィンドウシステムが起動する前は基本的に何も画面出力しないので何が起こっているのかさっぱりわかりません。いう時はどうしたらいいでしょうか?まずは適当な間隔で画面に進捗がわかるように何かを表示するデバッグコードを配置して実行します。進捗表示が途中で止まったり期待と違う表示がされたら、その付近に問題があることがわかります。最初は大雑把に配置し、怪しい関数がわかったらその中に更に配置し、その関数の更に奥に配置し...というのを繰り返してどこで問題が発生しているか突き止めます。初期化時に送信する割り込みに問題があるらしいところまで目星がつきました。初期化に問題があることは特定できました。側にデバッグコードを挿入します。リアルモードからアクセスできないアドレスにあるので何も表示することができません。受け取った直後に無限ループするコードを追加して起動してみます。ハンドラの初期化が終わって割り込みを受け取れるようになったコアにしかスレッドを分配しないので、シングルプロセッサ状態で起動しました。受け取って初期化する処理に問題があることがわかります。ハンドラ内の無限ループの位置をあちこち移動してみます。これを繰り返して起動しなくなった箇所に問題があることがわかります。命令の前後に問題があることがわかりました。変更しないとロングモードに遷移できません。命令自体に問題はないように思います。フラグもセットしています。ビットというのは、ページングに実行禁止属性をつけることで不正な実行を防いでセキュリティを向上させるための仕組みです。フラグをはずして起動してみると、見事に起動しました。情報が見れるプログラムを実行してみます。ビットをサポートしていないということですね。書き込もうとして例外が発生し、ロングモードに遷移前なので例外処理が実装されていなくてそのままトリプルフォルトでシステム停止したということですね。情報が見れるアプリケーションを実行してみます。