ブートローダーを作成しており
定期的に画面上に現在のレジスタの値を表示させる機能を実装したいと思っています。
タイマー割り込みハンドラに現在のレジスタを表示させる関数を呼び出させることで実現します。
タイマー割り込み設定に関して
参考にしました
パルスの周波数 = CLKの入力クロック周波数 / カウンタの値
私はカウンタに0x08を設定しました よって
パルスの周波数 = 1193181 ÷ 8 = 149147
これは一秒間に149147回のタイマー割り込みが発生する・・・のはず(・・・?)
[実験1]
まずは、現在のレジスタを表示させる関数が正しく機能していることを証明します。
LOOP: MOV AX,0x0001 MOV AX,0x0010 MOV AX,0x0100 MOV AX,0x1000 JMP LOOP
このループ処理中にタイマー割り込みを起こさせれば
AXレジスタの値がどんどん更新されるはずです。
結果
[申し訳ありませんが動画をダウンロードして見てください・・・]
動画を見る限り成功しているように見えます。
[実験2]
XOR AX,AX XOR BX,BX XOR CX,CX XOR DX,DX JMP $
各レジスタを0にした後無限ループさせています。
この時点でキーボード割り込み(タイマー割り込みはコマンドで許可できるようにしている)
が有効になっており、
何かしらキーを押せば 画面上のレジスタの値が更新されるはず
ということでやってみました。
結果
"ENABLE PIT"コマンドでタイマー割り込みを有効にした後
"ABCDEFG"を入力
そのあと、ENTERキーを連続で押しています。
(ちなみにAキーやZキーを押す時より、ENTERキーを押したときの処理のほうが多いです。
入力された文字がコマンドと一致しているか?など)
"ABCDEFG"を押したときは何も反応がありませんでしたが
ENTERキーを押したときはちょっとレジスタが更新されました。
これって割り込み頻度が少ないからなのか 更新されるのが早すぎて目に見えないからなのか・・・
カウンタの値を1に設定したパターンも試しましたが
処理が重くなっただけでした。
レジスターの表示から更新が早すぎて見えなくなっているのでは?と思い、
レジスターの値を表示される関数のすぐ後にNOP命令をつけまくったりもしましたが
結果は一切変わりませんでした。
どうやったら[実験2]を[実験1]のように表示させられるのか
わかる方教えてください・・・
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/01 09:48 編集
2020/11/01 09:58
2020/11/01 10:13
2020/11/01 11:43
2020/11/01 23:23
2020/11/02 00:24
2020/11/02 00:42