第7天 FIFO與滑鼠控制

2021-10-04 17:25:15 字數 4305 閱讀 6760

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