图形模式
图形模式可以为我们显示的图片,显示汉字,为我们带来色彩艳丽、内容丰富的界面。
首先介绍设置显卡模式中断:int 10h
查看文档找到下面资料:
Int 10/AX=4F02h - VESA SuperVGA BIOS - SET SuperVGA VIDEO MODE
这时是设置为SuperVGA模式
AX = 4F02h
BX = new video mode
我们设置成800*600模式 16位色
Int 10/AX=4F01h - VESA SuperVGA BIOS - GET SuperVGA MODE INFORMATION
这时是读取SuperVGA模式参数
AX = 4F01h
CX = SuperVGA video mode
ES:DI指向预先保留的256字节空间,这里将保存int 10h传来的参数,其中第40个字节开始存有显存地址的32位值。
在kernelloader.asm中又将此地址存入指定的0x10050处(值e0000000)
显示原理很简单,向显存地址填入一个16位值,代表颜色,就可以在800X600的框架里显示一个点。
下面看程序实现:
修改kernelloader.asm,源码如下:
[BITS16]
jmp main
gdt_entriesequ3;共有三个段描述符:null,os code32,os data32
peequ1;bit PE in CR0
nullequ0h
os_code32_selequ8h;1,gdt,rpl=00
os_data32_selequ10h;2,gdt,rpl=00
VESA:times256db0;分配一块区域存放 vesa 返回的信息,大小256,我们只需要其中的一个32位值
pdescrtimes6db0
gdt_tabletimes(gdt_entries*8)db0
set_video_mode:;设置显卡模式
pushes
;设置显卡模式
movax,0x4f02
movbx,0x4114;800 * 600 ( 5:6:5 ) 16位色彩
int0x10
;取得该模式下显存线性地址
movbx,0x1000
moves,bx
movdi, VESA ;es:di指向256空间,int 10h将在此填写数据
movax,0x4f01
movcx,0x114
int0x10
;第40个字节开始存有显存地址0xe0000000,将此地址再存入指定的地址0x10050
moveax,[es:VESA+40]
;将此地址再存入指定的地址0x10050,
mov[es:0x50],