書還不錯,下載下來看了下,能看個一知半解,索性決定讀完一次試試,原書的代碼註釋是日文版的,有個羣252617052,羣主已經將日文翻譯過來了,配合着書看看,也挺好的。
涉及到彙編的很多東西,看了又忘了,用筆記記一下吧。
第4天。
CLI(clear interrupt flag)將中斷標誌置0
STI(set interrupt flag)將中斷標誌置1
當cpu遇到中斷請求時,立即處理中斷請求(中斷標記爲1),還是忽略中斷(標記爲0)
ELFAGS寄存器,存儲的是進位標誌和中斷標誌
在畫矩形的時候,自作聰明的重寫了fillbox函數,結果不小心把x,y弄反了,導致畫出來的圖形總是顛倒的,弄了半天才發現問題。
第5天,涉及到中斷操作
GDT和IDT
GDT是global segmentdescriptor table全局段號記錄表。將這些數據整齊的排列在內存的某個地方,然後將內存的起始地址和有效設定個數放在cpu內被稱爲GDTR的特殊寄存器中就可以了。
IDT是中斷記錄表。
第六天
init_gdtidt();/* 初始化GDT, IDT */
init_pic();
/* 初始化PIC */
io_sti();
/* 打開所有可屏蔽中斷 */
這三句代碼寫反了,結果。。。
這三句沒有注意,哎,調試了一個晚上,不停地對照,各種問題
第七天
在輸出鍵盤相應信息時,應該這樣調用:
boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31);
putfonts8_asc(binfo->vram,binfo->scrnx,0,16,COL8_FFFFFF,s);
結果自作聰明的省去了boxfill8這個函數,直接輸出了putfonts_anc,因爲沒有重新繪製背景,所以所有的字符全部重疊在一起,笨死了。
同樣在最後的代碼中,添加鼠標響應之後,
if((fifo8_status(&keyinfo)+ fifo8_status(&mouseinfo))==0)
有這麼一句,本意是當鼠標和鍵盤的緩衝區中都沒有數據時,此時無事可做,只能先開中斷,在hlt。但是我又傻傻的根據做acm的經驗,把+寫成了||,然後很悲劇的沒有得到鼠標的信息。
在主函數中,因爲複製的關係,多寫了一次
init_keyboard();
enable_mouse();
結果發現第一字節的數據跑到第二字節上了。。。鬱悶了半天.
第十天
前幾天的內容基本上每次手動修改都會多多少少出現些問題,不過有了之前幾次很蛋碎的經驗之後,也就比較速度的解決了。
第一次看提高疊加處理速度(2)中關於sheet_refreshsub這個函數的最終版本有點鬱悶,沒怎麼倒騰清楚,但是感覺即使是最初的版本,跟最終的版本都是效果沒什麼差別。
或許機子性能差點的話可能就明顯了。
說一下這個函數中那幾個if語句的理解:
bx0 = vx0 - sht->vx0;
by0 = vy0 - sht->vy0;
bx1 = vx1 - sht->vx0;
by1 = vy1 - sht->vy0;
if (bx0 < 0) { bx0 = 0; } /* 左上角座標調整 */
if (by0 < 0) { by0 = 0; }
if (bx1 > sht->bxsize) { bx1 = sht->bxsize; } /* 右下角座標調整 */
if (by1 > sht->bysize) { by1 = sht->bysize; }
//用?:代替if語句
bx0=bx0<0?0:bx0; by0=by0<0?0:by0;
bx1=bx1>sht->bxsize?sht->bxsize:bx1;
by1=by1>sht->bysize?sht->bysize:by1;
那四個if是原作者的,不過我喜歡用?:這樣看起來簡潔一些。
解釋:
最初的版本是對於所有的vx 和vy判斷是否處於 (vx0,vx1)~(vx1,vy1)【這四個是由參數傳進來的】之間,處於之間的像素才進行重繪,
其中 vx=sht->vx0+bx(bx的範圍是 0 ~ sht->bxsize)
vy=sht->vy0+by(by的範圍是 0 ~ sht->bysize)
sht->vx0是當前圖層所在屏幕的座標,【同理sht->vy0】
那麼我們僅僅需要重繪的範圍應該是(vx0,vx1)~(vx1,vy1)中的,也就是有這樣的不等式:
vx0<= sht->vx0+bx< vx1 vy0<= sht->vy0+by< vy1
按照作者的說法,爲了在for語句中不進行判斷,就必須將bx和by的大小分別限定在vx0-sht->vx0~vx1-sht->vx0 和vy0-sht->vy0~vy1-sht->vy0之間,這樣確保在for語句中都是賦值語句,也就是上邊代碼前4行的賦值語句的含義,後邊的4個if是爲了判斷不至於產生負數,說的直白一些就是處理一下邊界情況(重繪區域在左上角和右下角的情況)
其實試驗之後發現改不改效果沒啥區別。。。。