現代の量子力学

主に精進の様子を記録する日記帳です

8日目 マウス制御と32ビットモード切り替え

1. マウスの解読 (1) 
    マウスから得たデータを解読して、それに合わせてマウスカーソルを動かすぞ。
    マウスからのデータは3バイトずつ。あと、最初に0xfaが送られてくる。
    0xfaは読み捨てるのと、3バイトずつのデータを1バイトずつ入手して、3バイト溜まるごとに出力。
    ・マウスからのデータは3バイト
 
2. ちょっと整理
    構造体やら関数を作って整理。
    ・整理した
 
3. マウスの解読 (2)
    マウスから送られてくるデータは…
        ・下位3ビットがボタンの状態(右クリックした?左クリックした?)
        ・真ん中1バイトがx座標、上位1バイトがy座標(y座標は反転してくるので逆にすること)
        ・下位1バイトのうち、0x10がx座標が移動したかのフラグ、0x20がy座標が移動したかのフラグ
    まずは、クリックに応じて表示を変える部分を作成〜。
    ・マウスからのデータはクリック情報と座標情報
 
4. 動けマウス
    得られた座標データを用いて、マウスの表示を動かす。
    境界だけちょっと気をつければ
    
    動いた〜
    ・動いた
 
5. 32ビットモードへの道
    asmhead.nas の説明をようやくする。
はじめに
    割り込み禁止する。
    キーボードコントローラのおまけ出力ポートに0xdf というデータを出力。これによってA20GATE信号線というものがONになる。
    これは、古いOS(16ビット)との互換性のために、メモリが1 MBまでしか使えないようになっているが、それを解除するもの。
 
    プロテクトモードに移行。
プロテクトモード
    本当は「protected virtual address mode」。今までのモードはリアルモードといい、「real address mode」。
    これは、メモリアドレスを指定する時に、セグメントレジスタの値で直接アドレスを指定するか、GDTを使ってセグメント番号で仮想的に指定するかの違いである。プロテクトモードに入るとアプリケーションが勝手にセグメントの設定を変えられなくなるので、プロテクト。
 
メモリをコピー
    ブートセクタ(0x7c00からの512バイト)を1MB以降のメモリ(0x100000)にコピー。
    0x8200からのディスクの中身を0x100200にコピー。
    これで、メモリの0x100000からディスクの中身が揃ったことになる。
    bootpackの置いてあるアドレスから512KBを0x280000以降にコピー。
    bootpackを実行するために必要なデータをコピー。よくわからん。
    
メモリマップ
    ここで自作OSのメモリマップをまとめる
    0x00000000 - 0x000fffff       起動中に色々使うけどそのあとは空き(1MB)
    0x00100000 - 0x00267fff     フロッピーディスクの内容記憶用(1440KB)
    0x00268000 - 0x0026f7ff     あき(30KB)
    0x0026f800 - 0x0026ffff       IDT(2KB)
    0x00270000 - 0x0027ffff      GDT(64KB)
    0x00280000 - 0x002fffff       bootpack.hrb(512KB)
    0x00300000 - 0x003fffff       スタックなど(1MB)
    0x00400000 -                        あき
    こういうメモリマップを最初に作ってからOSを作り始めるのが筋
 
GDT
    あとはGDTとかの設定。よくわかってない。
 
    ・いろいろしてたけど、メモリのしかるべき場所に作ったものを割り振っているという感じ?