- 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。

推薦閱讀
- 樂學Windows操作系統
- Linux網絡操作系統與實訓(第三版)
- 無蘋果不生活 OS X Mountain Lion隨身寶典
- SOA實踐者說
- 混沌工程實戰:手把手教你實現系統穩定性
- Instant Optimizing Embedded Systems using Busybox
- 巧學活用Windows 7
- AWS Development Essentials
- Kali Linux 2018:Windows Penetration Testing
- INSTANT Migration from Windows Server 2008 and 2008 R2 to 2012 How-to
- 分布式系統設計實踐
- Kali Linux高級滲透測試(原書第3版)
- bash shell腳本編程經典實例(第2版)
- Zabbix監控系統之深度解析和實踐
- Java EE 8 High Performance