滑鼠控制與32位模式切換

2021-07-17 03:25:56 字數 4800 閱讀 7687

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