三、kernel.asm 内核(实现汉字的显示,鼠标的支持等)
[BITS 32]
[ORG 0x0000]
jmp main
;--------------------------------------------------------------------------------------------------------
;数据区
;-------------------------------------------------------------------------------------------------
SYSTB: EQU 0x10000
SYSVAR: EQU 0x13800
SYSSOUND: EQU 0x127ff
SYSMOUSEBUF: EQU 0x4000 ;鼠标指针双缓冲地址
VBE_FILP: EQU 0x100000 ;显示交换缓存
FontLibrary: EQU 0x20000 ;0x20000 ;字库地址+0*32是第一个汉字阿的地址
;------------------------------------------------------------------------------------------------
Delay:;利用clk2的gate2产生1.5us.6*1.5us=1毫秒
PUSH EBP
MOV EBP,ESP
MOV EAX,[ESP+8] ;得到延迟数
MOV ECX,6
MUL ECX ;6=1毫秒
MOV ECX,EAX
GETT:
IN AL,0x61
AND AL,0x10 ;是否是PB4发生的时钟
CMP AL,AH
JE GETT
MOV AH,AL
LOOP GETT
MOV ESP,EBP
POP EBP
ret
main:
MOV AX,0x10
MOV ES,AX
MOV GS,AX
MOV DS,AX
MOV FS,AX
MOV SS,AX
MOV ESP,0x3FFF
;在数据段开辟空间
MOV EBX,[DS:SYSVAR+0] ;VESA_ADDRESS
MOV [DS:SYSVAR+4],DWORD 0 ;NULL
MOV [DS:SYSVAR+8],WORD 800 ;SCREEN_WIDTH
MOV [DS:SYSVAR+0x0A],WORD 600 ;SCREEN_HEIGHT
;鼠标变量申明
MOV [DS:SYSVAR+0x0C],WORD 440 ;MouseXPOS
MOV [DS:SYSVAR+0x0E],WORD 330 ;MouseYPOS
MOV [DS:SYSVAR+0x10],BYTE 0x0 ;MouseEventCount
MOV [DS:SYSVAR+0x11],BYTE 0 ;MouseButton
MOV [DS:SYSVAR+0x12],WORD 0 ;TempPos
MOV [DS:SYSVAR+0x14],WORD 440 ;oldx
MOV [DS:SYSVAR+0x16],WORD 330 ;oldy
MOV [DS:SYSVAR+0x18],WORD 0 ;0
MOV [DS:SYSVAR+0x20],WORD 0xB1C7 ;鼻
MOV [DS:SYSVAR+0x22],WORD 0xCCE9 ;涕
MOV [DS:SYSVAR+0x24],WORD 0xD6D0 ;中
MOV [DS:SYSVAR+0x26],WORD 0xCEC4 ;文
MOV [DS:SYSVAR+0x28],WORD 0xB2D9 ;操
MOV [DS:SYSVAR+0x2A],WORD 0xD7F7 ;作
MOV [DS:SYSVAR+0x2C],WORD 0xCFB5 ;系
MOV [DS:SYSVAR+0x2E],WORD 0xCDB3 ;统
MOV [DS:SYSVAR+0x30],WORD 0xA3F6 ;v
MOV [DS:SYSVAR+0x32],WORD 0xA3B1 ;1
MOV [DS:SYSVAR+0x34],WORD 0xA3AE ;.
MOV [DS:SYSVAR+0x36],WORD 0xA3B0 ;0
CALL SetChip8259A ;初始化8259A芯片
CALL CreateIdtTable ;创建IDT表
PUSH WORD 0
PUSH WORD 180
PUSH WORD 255
CALL RGB
PUSH WORD 1 ;使用缓冲
PUSH WORD 0 ;starty
PUSH WORD 0 ;startx
PUSH WORD 600 ;endy
PUSH WORD 800 ;endx
PUSH AX
CALL DrawBox ;画出桌面背景
MOV ECX,12
MOV EBX,0x36
sh:
PUSH BX
PUSH CX
PUSH WORD [DS:SYSVAR+EBX] ;汉字编码0xB0A1开始
PUSH WORD 0;颜色
PUSH WORD 0;是否使用背景颜色0不使用1使用
PUSH WORD 0;背景颜色
PUSH WORD 0;1是与背景求反色0不求反色
PUSH WORD 0;y坐标
MOV AX,CX
MOV CX,20
MUL CX
SUB AX,20
PUSH AX ;x坐标
CALL DrawText
POP CX
POP BX
SUB BX,2
LOOP sh
CALL SetCursorColor ;初始化鼠标光标
CALL InitKeybeyboard ;初始化键盘驱动
;画出鼠标
PUSH DWORD SYSMOUSEBUF+0x80;鼠标像素所在位置
PUSH WORD 0x80
PUSH WORD 8
PUSH WORD 8
PUSH WORD [DS:SYSVAR+0x0E];y
PUSH WORD [DS:SYSVAR+0x0C];x
CALL DrawPixelBuf
CALL InitMouse ;初始化鼠标驱动
JMP $
%include "interrupt.inc" ;中断控制
%include "mouse.inc" ;鼠标驱动
%include "vesa.inc" ;显卡支持
%include "keyboard.inc" ;键盘驱动
TIMES 0x1000-($-$$) DB 0