您的位置:首页 > 其它

《30天自制操作系统》读书笔记(4) 绘图

2014-08-06 21:45 411 查看
暑假果然是滋生懒散的温床. (╯‵□′)╯︵┻━┻

好久不动都忘记之前做到哪里了, 上次好像做到了C语言的引入, 这一节所做的东西都相当轻松, 将会绘制出操作系统的基本界面.

绘图的原理

  按照书中所说, 将值写入到显存中就能在屏幕上显示相应的像素, 在asmhead.nas 中有这一段:

CYLS    EQU    0x0ff0    ; 设定启动区
LEDS    EQU    0x0ff1
VMODE    EQU    0x0ff2    ; 关于颜色数目的信息,颜色的位数
SCRNX    EQU    0x0ff4    ; 分辨率 X(Screen X)
SCRNY    EQU    0x0ff6    ; 分辨率 Y(Screen Y)
VRAM    EQU    0x0ff8    ; 图像缓冲区的起始地址

ORG    0xc200

MOV    AL,0x13    ; VGA 显卡
MOV    AH,0x00
INT    0x10
MOV    BYTE [VMODE],8    ; 记录画面模式
MOV    WORD [SCRNX],320
MOV    WORD [SCRNY],200
MOV    DWORD [VRAM],0x000a0000


调用十号中断来指定显卡模式, 后面的几个MOV指令用来储存和显示有关的关键信息(为什么不直接用常量呢?), 在bootpack.c中有

struct BOOTINFO { /* 0x0ff0-0x0fff */
char cyls; /* 启动区读硬盘读到何处为止 */
char leds; /* 启动时LED的状态*/
char vmode; /* 显卡模式*/
char reserve;
short scrnx, scrny; /* 分辨率*/
char *vram;
};


这里就将结构体指针指向了这些信息, 可以知道VRAM的地址是0xa0000想指定地址写入数据, 当然是用指针, 将VRAM声明为一个数组即可.

作者顺便指出了数组的操作array[index] 仅是一个语法糖, a[i] 等价于*(a + i), 当然也等价于*(i + a), 所以很神奇的, a[i] 和 i[a] 在C语言里是等效的.

设定调色板

  作者替我们指定了300x200 8位的颜色模式, 如何将 0xffffff 的颜色值映射0~0xfff的空间里? 一一对应显然是不可能的, 事实上8位色彩模式中, 0到0xfff这255中颜色是由我们自己指定的, 譬如说0可以对应红色0xff0000, 这种对应关系显然被储存起来, 这就是调色板(palette),作者给出了16中颜色的对应关系, 其中14号色被我改了, 调色板的数据结构如下(就一个unsigned char数组):

static unsigned char table_rgb[16 * 3] =
{
0x00, 0x00, 0x00,    /*  0:黑色*/
0xff, 0x00, 0x00,    /*  1:亮红*/
0x00, 0xff, 0x00,    /*  2:亮绿*/
0xff, 0xff, 0x00,    /*  3:亮黄*/
0x00, 0x00, 0xff,    /*  4:亮蓝*/
0xff, 0x00, 0xff,    /*  5:亮紫*/
0x00, 0xff, 0xff,    /*  6:浅亮蓝*/
0xff, 0xff, 0xff,    /*  7:白色*/
0xc6, 0xc6, 0xc6,    /*  8:亮灰*/
0x84, 0x00, 0x00,    /*  9:暗红*/
0x00, 0x84, 0x00,    /* 10:暗绿*/
0x84, 0x84, 0x00,    /* 11:暗黄*/
0x00, 0x00, 0x84,    /* 12:暗青*/
0x84, 0x00, 0x84,    /* 13:暗紫*/
0x5b, 0x9b, 0xd5,    /* 14:浅灰蓝5B,9B,D5*/
0x84, 0x84, 0x84    /* 15:暗灰*/
};


如何让我们设置调色板生效? 作者给出了如下步骤:

OBJS_BOOTPACK = bootpack.obj naskfunc.obj hankaku.obj graphic.obj dsctbl.obj

TOOLPATH = ../z_tools/
INCPATH  = ../z_tools/haribote/

MAKE     = $(TOOLPATH)make.exe -r
NASK     = $(TOOLPATH)nask.exe
CC1      = $(TOOLPATH)cc1.exe -I$(INCPATH) -Os -Wall -quiet
GAS2NASK = $(TOOLPATH)gas2nask.exe -a
OBJ2BIM  = $(TOOLPATH)obj2bim.exe
MAKEFONT = $(TOOLPATH)makefont.exe
BIN2OBJ  = $(TOOLPATH)bin2obj.exe
BIM2HRB  = $(TOOLPATH)bim2hrb.exe
RULEFILE = $(TOOLPATH)haribote/haribote.rul
EDIMG    = $(TOOLPATH)edimg.exe
DEL      = del
SHORTCUT = "D:\Program Files\Oracle\VirtualBox\VirtualBox.exe" --comment "OS1" --startvm "a5c4b0e6-e142-4720-98ee-056911204b29"

default :
$(MAKE) install
$(MAKE) run
$(MAKE) clean

ipl10.bin : ipl10.nas Makefile
$(NASK) ipl10.nas ipl10.bin ipl10.lst

asmhead.bin : asmhead.nas Makefile
$(NASK) asmhead.nas asmhead.bin asmhead.lst

hankaku.bin : hankaku.txt Makefile
$(MAKEFONT) hankaku.txt hankaku.bin

hankaku.obj : hankaku.bin Makefile
$(BIN2OBJ) hankaku.bin hankaku.obj _hankaku

bootpack.bim : $(OBJS_BOOTPACK) Makefile
$(OBJ2BIM) @$(RULEFILE) out:bootpack.bim stack:3136k map:bootpack.map \
$(OBJS_BOOTPACK)
# 3MB+64KB=3136KB

bootpack.hrb : bootpack.bim Makefile
$(BIM2HRB) bootpack.bim bootpack.hrb 0

haribote.sys :asmhead.bin bootpack.hrb Makefile
copy /B asmhead.bin+bootpack.hrb haribote.sys

haribote.img : ipl10.bin haribote.sys Makefile
$(EDIMG)   imgin:../z_tools/fdimg0at.tek \
wbinimg src:ipl10.bin len:512 from:0 to:0 \
copy from:haribote.sys to:@: \
imgout:haribote.img

%.gas : %.c Makefile
$(CC1) -o $*.gas $*.c

%.nas : %.gas Makefile
$(GAS2NASK) $*.gas $*.nas

%.obj : %.nas Makefile
$(NASK) $*.nas $*.obj $*.lst

install:
$(MAKE) haribote.img

run :
echo Running...
$(SHORTCUT)
echo Finished

clean :
-$(DEL) *.bin
-$(DEL) *.lst
-$(DEL) *.gas
-$(DEL) *.obj
-$(DEL) bootpack.nas
-$(DEL) bootpack.map
-$(DEL) bootpack.bim
-$(DEL) bootpack.hrb
-$(DEL) haribote.sys
-$(DEL) *.*~
-$(DEL) *~
echo Cleaned.


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: