《30天自制操作系统》读书笔记(4) 绘图
2014-08-06 21:45
411 查看
暑假果然是滋生懒散的温床. (╯‵□′)╯︵┻━┻
好久不动都忘记之前做到哪里了, 上次好像做到了C语言的引入, 这一节所做的东西都相当轻松, 将会绘制出操作系统的基本界面.
绘图的原理
按照书中所说, 将值写入到显存中就能在屏幕上显示相应的像素, 在asmhead.nas 中有这一段:
调用十号中断来指定显卡模式, 后面的几个MOV指令用来储存和显示有关的关键信息(为什么不直接用常量呢?), 在bootpack.c中有
这里就将结构体指针指向了这些信息, 可以知道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数组):
如何让我们设置调色板生效? 作者给出了如下步骤:
View Code
好久不动都忘记之前做到哪里了, 上次好像做到了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
相关文章推荐
- 读书笔记《30天自制操作系统》day14
- 读书笔记《30天自制操作系统》day03
- 读书笔记《30天自制操作系统》day01
- 单字节的FIFO缓存(30天自制操作系统--读书笔记)
- 《30天自制操作系统》读书笔记Day15
- 读书笔记《30天自制操作系统》day02
- 《30天自制操作系统》读书笔记Day6
- 读书笔记《30天自制操作系统》day03
- 《30天自制操作系统》读书笔记(5) GDT&IDT
- 多定时器处理2(30天自制操作系统 -- 读书笔记)
- 读书笔记《30天自制操作系统》day04
- 《30天自制操作系统》读书笔记Day4
- 多定时器处理3(30天自制操作系统 -- 读书笔记)
- 读书笔记《30天自制操作系统》day06
- 《30天自制操作系统》读书笔记Day16
- 读书笔记《30天自制操作系统》day05
- 《30天自制操作系统》读书笔记Day9
- 读书笔记《30天自制操作系统》day04
- 读书笔记《30天自制操作系统》day11
- 读书笔记《30天自制操作系统》day06