PC-8801モードでシルフィードが動作するようになりました。
PC-9801モードでマウスが動かなかった問題も解決しています。
結構色々と動くようになってきましたね。
今くらいが一番いけいけどんどんな感じで楽しいです。
それとは別に、余り目に見えない、イベントマネージャの更新が今回のメインです。
仮想マシン内時間はCPUのクロックが基準ですが、これを64bitで管理するようにしました。
従来は32bitで、8MHzだと9分くらいで溢れてしまうため、各イベントの時間管理は、
現在時間から発火するまでの残り時間で表現していて、仮想マシン内時間が経過するごとに、
いちいち全部のイベントの時間をデクリメントしていました。
64bitだと、起動時からの絶対時間として発火時期を表現できるようになるため、単純に
現在時間との比較だけすれば済むようになりました。
また、従来の実装だと、イベント発火時に、次に発火するイベントをいちいち検索する必要が
ありましたが、今回の実装では、イベントを登録する時点で発火する順番に並べておくことで、
常に先頭のイベントだけ、現在時間を比較する形になってます。
これは、各イベントに、前後に発火するイベントへのポインタを持たせて、イベントを
数珠繋ぎに出来るデータ構造に拡張することで実現しました。
このデータ構造だと、任意の順番にイベントを挿入したり、任意のイベントを削除したり、
といったことも簡単に表現できます。
こんな感じで、イベントの発火タイミングの判定にかかるコストが減りましたので、
その分、CPUで1命令実行するごとに、イベントの発火を判定するようにしています。
従来の、次のイベントまで一気にCPUを進める形式だと、その間に、すぐ発火するような
短時間のイベントを登録した場合の時間精度に問題がありましたが、それも解決です。
これを、他のデバイスを極力修正しないで済むように、イベントマネージャの外部仕様を
変更せずに実現するのが結構大変でしたが、我ながらいい仕事をしたと自画自賛してます。



