day8 滑鼠控制與32位模式切換
對harimain中的資料進行修改
enable_mouse();
mouse_phase = 0; /* 進入到等待滑鼠的0xfa的狀態 */
for (;;) else else
if (fifo8_status(&mousefifo) != 0)
} else
if (mouse_phase == 1) else
if (mouse_phase == 2) else
if (mouse_phase == 3) }}
}
2.稍事整理
struct mouse_dec ;
用乙個結構體把滑鼠所需要的變數都放在這裡。另外將滑鼠的解讀處理放到了mouse_decode函式中。
3.滑鼠解讀(2)
int mouse_decode(struct mouse_dec *mdec, unsigned char dat)
return 0;
}if (mdec->phase == 1)
return 0;
}if (mdec->phase == 2)
if (mdec->phase == 3)
if ((mdec->buf[0] & 0x20) != 0)
mdec->y = - mdec->y; /* 滑鼠y方向與畫面符號方向相反 */
return 1;
}return -1; /*應該不會到這兒來 */
}else
if (fifo8_status(&mousefifo) != 0)
if ((mdec.btn & 0x02) != 0)
if ((mdec.btn & 0x04) != 0)
//滑鼠鍵被按下的時候大寫,否則小寫
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);
4.移動滑鼠指標
else
if (fifo8_status(&mousefifo) != 0)
if ((mdec.btn & 0x02) != 0)
if ((mdec.btn & 0x04) != 0)
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)
if (my
< 0)
if (mx > binfo->scrnx - 16)
if (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); /* 描畫滑鼠 */
}
5.通往32位模式之路
; pic關閉一切中斷
;根據at相容機的規則,如果要初始化pic必須在cli之前執行。否則有時會掛起。
;隨後進行pic的初始化
mov al,0xff
out0x21,al
nop; 如果連續執行out指令,有些機種會無法執行
out0xa1,al
cli; 禁止cpu級別的中斷
這段程式用來禁止中斷
;為了讓cpu能夠訪問1mb以上的記憶體空間,設定a20gate
call waitkbdout
mov al,0xd1
out 0x64,al
call waitkbdout
mov al,0xdf ; enable a20
out 0x60,al
call waitkbdout
;切換到保護模式
[instrset "i486p"] ;想要使用484指令的敘述
lgdt [gdtr0] ; 設定臨時gdt
mov eax,cr0
and eax,0x7fffffff
; 設bit31為0(為了禁止)
or eax,0x00000001
;設bit0為1(為了切換到保護模式)
mov cr0,eax
jmp pipelineflush
pipelineflush:
mov ax,1*8
; 可讀寫的段32bit
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
; bootpack的轉送
mov esi,bootpack ; 轉送元
mov edi,botpak ; 轉送目的地
mov ecx,512*1024/4
call memcpy
; 磁碟資料最終轉送到他本來的位置去
; 首先從啟動盤開始
mov esi,0x7c00
; 轉送元
mov edi,dskcac ; 轉送元
mov ecx,512/4
call memcpy
; 所有剩下的
mov esi,dskcac0+512
; 轉送元
mov edi,dskcac+512
; 轉送元
mov ecx,0
mov cl,byte [cyls]
imul ecx,512*18*2/4
; 從柱面數變換為位元組數/4
sub ecx,512/4
; 減去ipl
call memcpy
//以上15行函式只是在呼叫memset函式。
memset**送源位址,轉送目的位址,轉送資料大小)
;必須由asmhead完成的工作完畢,之後就有bootpack完成
; bootpack的啟動
mov ebx,botpak
mov ecx,[ebx+16]
add ecx,3
; ecx += 3;
shr ecx,2
; ecx /= 4;
jz skip ; 轉送元
mov esi,[ebx+20] ; 轉送元
add esi,ebx
mov edi,[ebx+12] ; 轉送元
call memcpy
skip:
mov esp,[ebx+12] ; 棧初始值
jmp dword 2*8:0x0000001b
waitkbdout:
in al,0x64
and al,0x02
;空讀 jnz waitkbdout ; and的結果如果不是0就跳轉到waitkbdout
ret
memcpy:
mov eax,[esi]
add esi,4
mov [edi],eax
add edi,4
sub ecx,1
jnz memcpy ; 減法運算的結果如果不是0就跳轉到memcpy
ret alignb 16
gdt0:
resb 8
; null selector
dw 0xffff,0x0000,0x9200,0x00cf
;可以讀寫的段32位
dw 0xffff,0x0000,0x9a28,0x0047
; 可以執行的段32位
dw 0
gdtr0:
dw 8*3-1
dd gdt0
alignb 16
bootpack: IIS32位和64位切換
iis32位和64位切換 2011年12月22日 x64上是不支援oledb連線access資料庫的,為了解決該問題,必須把iis切換到x86才能順利讀寫access 解決辦法,原文 在 64 位版本的 windows 上,如何在 32 位版本的 asp.net 1.1 和 64 位版本的 asp....
IIS32位和64位切換
iis32位和64位切換 2011年12月22日 x64上是不支援oledb連線access資料庫的,為了解決該問題,必須把iis切換到x86才能順利讀寫access 解決辦法,原文 在 64 位版本的 windows 上,如何在 32 位版本的 asp.net 1.1 和 64 位版本的 asp....
IIS32位和64位切換
iis32位和64位切換 2011年12月22日 x64上是不支援oledb連線access資料庫的,為了解決該問題,必須把iis切換到x86才能順利讀寫access 解決辦法,原文 在 64 位版本的 windows 上,如何在 32 位版本的 asp.net 1.1 和 64 位版本的 asp....