30天自制操作系統第14天

操作系統實驗日誌14

第14天:高分辨率以及鍵盤輸入

一、實驗主要內容

1、 內容1:繼續測試性能

因爲在對前一天的程序進行性能檢測時,效果並沒有達到想要的結果,於是就想再重新檢測看下程序的運行結果。

發現沒有什麼不同之後,於是考慮到,在前一個程序的改進的地方是消除了移位處理,要想看到程序上的速度有明顯變化,應該是進行了大量的移位操作之後,而一直只使用了三個定時器,所以並沒有什麼不同。因此增加定時器的個數,增加到490個,也就是增加移位的操作,再次測試程序的性能。

在這裏插入圖片描述

測試結果:

在這裏插入圖片描述

測試結果分析:

①通過(1),追加定時器的情況下,取消移位、設置哨兵都會令程序更快。

②通過(2),定時器較少時,取消移位反而會令程序變慢,可能是因爲if語句變多了,加上哨兵後和原來移位速度差不多。

③在有哨兵、沒有移位的情況下,無論定時器的數量多少,對性能影響不大。

④(3)的情況和②描述的現象差不多,但是(3)更快。原因在這是因爲C編譯器的問題,因爲跳轉目標地址不同,CPU的JMP指令執行的時鐘週期數也不一樣。在程序中,循環執行count++的for循環雖然最終會被編譯爲JMP指令,但是前面還有個set490指令,會使得指令的地址都相應的錯開幾個字節,導致了JMP指令的地址也會變化,因此執行時間也就出現了延遲,結果變差了3%。這個問題的解決方法就是用nask來編寫HariMain,但因爲這個太麻煩了,就暫時不做了。

2、 內容2:提高分辨率1

要利用高分辨率,就要考慮到顯卡的因素,首先只考慮QEMU模擬器的顯卡,等到這個可以用了,再去考慮其他的顯卡。在畫面切換中,需要使用BIOS,因此改寫asmhead.nas的畫面模式設定。

在這裏插入圖片描述

當給AX賦值0x4f02,給BX賦值畫面模式號碼時,就可以切換到高分辨率畫面模式。在使用320x200的分辨率時,採用的是AH=0,AL=畫面模式號碼的方式,當切換到新畫面時,就可以使用AX=0x4f02。以前的方式是不使用VBE的畫面模式,切換到使用VBE的畫面模式時,就要使用AX=0x4f02,BX=畫面模式號碼。

VBE的畫面模式號碼:(實際指定時,需要將上述的畫面模式號碼值加上0x4000,再複製到BX中去,不這樣的話就不能順利運行)

在這裏插入圖片描述

還可以將畫面變得更大:

在這裏插入圖片描述

3、 內容3:提高分辨率2

之前的高分辨率只能在模擬器中運行,而要在真機上運行的話,首先需要檢測真機上的顯卡能否使用VBE,如果不能的話,只能退回到原處,繼續使用320x200的分辨率。

檢測VBE:

在這裏插入圖片描述

這裏將ES賦值爲0x9000,將DI賦值爲0,將AX賦值爲0x4f00,再執行INT 0x10,將AX與0x004f進行比較;如果有VBE的話,AX將會變成0x004f,如果沒有變化,則表示沒有VBE,因此便無法切換畫面模式。

對ES和DI進行賦值的原因是,顯卡能利用的VBE信息是要寫入到內存中以ES:DI開始的512字節中,賦值是爲了指定寫入地址。

在我們的系統中,要判斷VBE的版本是否是2.0以上,如果不是的話,就不能使用高分辨率。

在這裏插入圖片描述

接下來要檢測都哪些畫面模式可以使用:

在這裏插入圖片描述

如果AX是0x004f以外的值,則表示所指定的畫面模式不能使用。此次取得的畫面模式的信息也會被寫入內存中,從ES:DI開始的256字節中。因爲ES和DI都保持之前的值不變,所以畫面模式信息便會覆蓋VBE版本的信息而導致其消失。

在這裏插入圖片描述

所以要確認以上3項信息:

在這裏插入圖片描述

當信息已經完成確認之後,就可以使用指定的VBE畫面模式了,便可以將分辨率及VRAM的地址等信息賦值到BOOTINFO中。

在這裏插入圖片描述

4、 內容4:鍵盤輸入1

以前我們按下鍵盤,顯示的是其中斷髮生時的鍵碼,現在我們想按下什麼顯示什麼,就要根據其鍵碼輸出對應的符號。

對照表如下:

在這裏插入圖片描述
在這裏插入圖片描述

想要輸出對應的符號,在入口函數中加入幾個判斷就可以了:

在這裏插入圖片描述

這樣按下A就可以顯示A了,其他字符同理:

在這裏插入圖片描述

5、 內容5:鍵盤輸入2

如果用上面的方法,我們就要寫很多個if語句來判斷,會讓我們的程序變慢,考慮到大多數按鍵的鍵碼都是連續的,所以我們以鍵碼的順序,從0開始,將字符都寫入到一個數組中,這樣i是幾,對應的字符就是數組中的第幾個。

在這裏插入圖片描述

這裏面的0表示的就是待分配的鍵碼。

在這裏插入圖片描述

作者使用的是日式鍵盤,所以有的和我們不一樣這很正常。

6、 內容6:追記內容1

現在我們修改程序使得能夠輸入並顯示出多個字符,並且按下BackSpace能夠實現刪除的功能。

只需要修改入口函數:

在這裏插入圖片描述

其中cursor_x是用來記住光標顯示位置的變量,當輸入一個字符後,這個變量就遞增8,因爲一個字符的長度就是8。Cursor_c變量則表示光標的顏色,每0.5秒變化一次。Make_textb0x8函數是用來描繪文字輸入背景的函數:

在這裏插入圖片描述

7、 內容7:追記內容2

這部分實現窗口的移動,鼠標點擊屏幕的一個位置,窗口就出現在哪裏,同時爲了讓窗口可以「飛出」屏幕,窗口移動到的位置不是鼠標的座標,而是mx-80,my-8。
在這裏插入圖片描述

運行效果:

在這裏插入圖片描述

二、程序設計創新點

1、描述創新點1: 設計一個五子棋遊戲,可以實現人機對戰

在這裏插入圖片描述

三、實驗心得體會

這一天做的事情就是實現了簡略的文本編輯器,首先實現了打印鍵盤上的字母以及字符,然後利用定時器模擬了光標,今天比較簡單,但是通過今天的學習我學會了使用定時器。

(附本次代碼,開機密碼是123456,鼠標雙擊左上角圖標可進入遊戲頁面,點擊遊戲頁面的右下角的開始後,就可以遊戲啦)