2020.4.1
1. 獲取按鍵編碼(harib04a)
注意,從編號0x0060的裝置輸入的8位資訊是按鍵編碼。編號0x0060的裝置是鍵盤。
make run
後按下鍵盤按鍵a:
2. 加快中斷處理(harib04b)
修改bootpack.c的harimain函式(節選):
extern struct keybuf keybuf; /*keybuf在其他原始檔中*/
……for (;;) else
}
make run
,按下ctrl顯示1d
,鬆開顯示9d
。
因此,需要修改程式。讓它大一點兒。
3. 製作fifo緩衝區(harib04c)
修改harimain函式**(節選):
extern struct keybuf keybuf; /*keybuf在其他原始檔中*/
……for (;;) else /*向前移動*/
io_sti();
sprintf(s, "%02x", i);
boxfill8(binfo->vram, binfo->scrnx, col8_008484, 0, 16, 15, 31);
putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, col8_ffffff, s);}}
4. 改善fifo緩衝區(harib04d)
bootpack.h中keybuf的定義:
struct keybuf ;
int.c中inthandler21函式:
void inthandler21(int *esp)
}return;
}
harimain函式**(節選):
for (;;) else
io_sti();
sprintf(s, "%02x", i);
boxfill8(binfo->vram, binfo->scrnx, col8_008484, 0, 16, 15, 31);
putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, col8_ffffff, s);
}}
這樣,沒有使用任何資料移送操作(for迴圈),同時緩衝區又可以記錄大量資料,執行速度又快。
make run
正常執行。
5. 整理fifo緩衝區(harib04e)
fifo.c的fifo8_init函式:
void fifo8_init(struct fifo8 *fifo, int size, unsigned char *buf)
/* 初始化fifo緩衝區 */
fifo.c的fifo8_put函式:
#define flags_overrun 0x0001
int fifo8_put(struct fifo8 *fifo, unsigned char data)
/* 向fifo傳送資料並儲存 */
fifo->buf[fifo->p] = data;
fifo->p++;
if (fifo->p == fifo->size)
fifo->free--; /*空餘位置-1*/
return 0;
}
fifo.c的fifo8_get函式:
int fifo8_get(struct fifo8 *fifo)
/* 從fifo取出乙個資料 */
data = fifo->buf[fifo->q];
fifo->q++;
if (fifo->q == fifo->size)
fifo->free++; /*空餘位置+1*/
return data;
}
fifo.c的fifo8_status函式:
int fifo8_status(struct fifo8 *fifo)
/* 返回緩衝區儲存的位元組數(len) */
int.c中的inthandler21函式:
struct fifo8 keyfifo;
void inthandler21(int *esp)
bootpack.c中harimain函式節選:
extern struct fifo8 keyfifo;
……char s[40], mcursor[256], keybuf[32];
……fifo8_init(&keyfifo, 32, keybuf);
……for (;;) else
}
char s[40], mcursor[256], keybuf[32];
可以看出我們整理fifo以後,**顯得整潔好看。
make run
,順利執行。
6. 總算講到滑鼠了(harib04f)
因此,我麼想讓滑鼠動起來,必須發布指令,讓兩個裝置有效:1.滑鼠控制電路;2.滑鼠本身。
顯然,我們先要讓滑鼠控制電路有效,再讓滑鼠本身有效。
滑鼠控制電路設定:
bootpack.c中的wait_kbc_sendready函式和init_keyboard函式:
#define port_keydat 0x0060
#define port_keysta 0x0064
#define port_keycmd 0x0064
#define keysta_send_notready 0x02
#define keycmd_write_mode 0x60
#define kbc_mode 0x47
void wait_kbc_sendready(void)
}return;
}void init_keyboard(void)
函式init_keyboard的作用是:等待控制鍵盤(滑鼠)電路準備完成,然後傳送模式設定指令。指令中包含著設定為何種模式。
然後在bootpack.c的harimain函式中呼叫:
init_keyboard();
就可以完成滑鼠控制電路的準備了。
傳送啟用滑鼠的指令
bootpack.c中的enable_mouse函式:
#define keycmd_sendto_mouse 0xd4
#define mousecmd_enable 0xf4
void enable_mouse(void)
再再bootpack.c中掉用滑鼠啟用函式enable_mouse,這樣滑鼠就啟用了。
完成滑鼠控制電路設定和傳送啟用滑鼠的指令後,這樣我們就可以產生滑鼠中斷了。make run
一下:
千呼萬喚始出來,滑鼠中斷終於出來了!
7. 從滑鼠接受資料(harib04g)
取得滑鼠資料:
bootpack.c中**節選:
fifo8_init(&mousefifo, 128, mousebuf);
……for (;;) else else if (fifo8_status(&mousefifo) != 0)
}}
make run
:
下一步就是讓滑鼠指標跟著動起來,這個工作還是留給第8天吧。
8. 重新開始一周感想
從上周五重新開始畢業設計的工作。不知不覺中已經過去了乙個周了。
先說一下進度:143/710=20.1%.五分之一了?還不錯嘛!
這一周以來,看了大概有100頁(45-143),從第3天到第7天。雖然第3天很久很久之前也看過(但是沒有寫markdown文件)。
今天,輔導員在大群裡發了一張校園櫻花的**,可是開學還沒有音信,看來是要錯過花期了。
7 FIFO與滑鼠控制
獲取按鍵編碼 修改int.c中的inthandle21 define port keydat 0x0060 從編號為0x0060裝置輸入的8位資訊是按鍵編碼 來自 ps 2 鍵盤的中斷 void inthandler21 int esp 將接收到的按鍵編碼顯示在畫面上 按下鍵後可以顯示按鍵編碼 加快...
30天自製作業系統 第7天 FIFO與滑鼠控制
今天前半部分講的都是鍵盤輸出與緩衝區的問題,後半部分才是滑鼠移動問題。緩衝區fifo實現 在按鍵盤上乙個鍵時,鍵盤會以中斷形式傳送給cpu資料。在現階段的設計中,一次只傳送一位元組,但是在按一些鍵時,會傳送兩位位元組,此時另一位元組如果不暫存,就丟失了 在有些情況,會碰到鍵盤中斷傳送的資料不能馬上被...
第44天 滑鼠移動放大效果
1 滑鼠移動放大效果 1 doctype html 2 html lang en 3 head 4 meta charset utf 8 5 title 滑鼠移動放大效果 大盒子裡的 68small.onmouseover function 72 small.onmouseout function ...