官术网_书友最值得收藏!

  • 30天自制操作系統
  • (日)川合秀實
  • 674字
  • 2020-03-11 14:01:54

4 移動鼠標指針(harib05d)

鼠標的解讀部分已經完成了,我們再改一改圖形顯示部分,讓鼠標指針在屏幕上動起來。

HariMain節選

} else if (fifo8_status(&mousefifo) ! = 0) {
    i = fifo8_get(&mousefifo);
    io_sti();
    if (mouse_decode(&mdec, i) ! = 0) {
        /* 數據的3個字節都齊了,顯示出來  */
        sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);
        if ((mdec.btn & 0x01) ! = 0) {
            s[1] = 'L';
        }
        if ((mdec.btn & 0x02) ! = 0) {
            s[3] = 'R';
        }
        if ((mdec.btn & 0x04) ! = 0) {
            s[2] = 'C';
        }
        boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 15 * 8-1, 31);
        putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
        /* 鼠標指針的移動 */
        boxfill8(binfo->vram, binfo->scrnx, COL8_008484, mx, my, mx + 15, my + 15); /* 隱藏鼠標 */
        mx += mdec.x;
        my += mdec.y;
        if (mx < 0) {
            mx = 0;
        }
        if (my < 0) {
            my = 0;
        }
        if (mx > binfo->scrnx -16) {
            mx = binfo->scrnx -16;
        }
        if (my > binfo->scrny -16) {
            my = binfo->scrny -16;
        }
        sprintf(s, "(%3d, %3d)", mx, my);
        boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 0, 79, 15); /* 隱藏坐標  */
        putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, s); /* 顯示坐標 */
        putblock8_8(binfo->vram, binfo->scrnx, 16, 16, mx, my, mcursor, 16); /* 描畫鼠標 */
    }
 }

這次修改的程序,到/* 鼠標指針的移動 */之前為止,與以前相同,不再解釋大家應該也明白。

■■■■■

至于其以后的部分,則是先隱藏掉鼠標指針,然后在鼠標指針的坐標上,加上解讀得到的位移量。“mx += mdec.x; ”是“mx = mx + mdec.x; ”的省略形式。因為不能讓鼠標指針跑到屏幕外面去,所以進行了調整,調整后重新顯示鼠標坐標,鼠標指針也會重新描畫。

好了,我們來測試一下,運行“make run”。然后晃一晃鼠標,結果如下:

鼠標指針總算動起來了!經過長期的艱苦奮戰,終于勝利了。為了讓鼠標指針能動起來,我們從第5天的下午就開始準備,到第8天下午才完成。

但也正是因為經過這番苦戰,我們既完成了GDT/IDT/PIC的初始化,又學會了自由使用棧和FIFO緩沖區,還學會了處理鍵盤中斷。接下來就會輕松很多。

心里實在很高興,于是多動了幾下鼠標。嗯?

只要鼠標一接觸到裝飾在屏幕下部的任務欄,就會變成下頁圖那樣。這是因為我們沒有考慮到疊加處理,所以畫面就出問題了。這個話題留到以后再說,今天剩下的時間,筆者想解說一下asmhead.nas。

主站蜘蛛池模板: 商城县| 佛冈县| 昌图县| 内黄县| 佛冈县| 通州市| 吴旗县| 张家川| 武城县| 进贤县| 米泉市| 仙桃市| 军事| 林周县| 达拉特旗| 壤塘县| 乾安县| 尚义县| 柞水县| 黄大仙区| 黎川县| 原平市| 卢龙县| 阳高县| 长乐市| 三门峡市| 海原县| 额济纳旗| 无为县| 和林格尔县| 淄博市| 广南县| 丹东市| 谢通门县| 东台市| 团风县| 遵化市| 花垣县| 淳化县| 仁化县| 海阳市|