标签:
harib01a:
P65 用C语言实现内存写入 实现一个往黑画面上写入东西的函数
修改了naskfunc.nas中的内容
在bootpack.c中 用write_mem8()函数将VRMA中全部写入了15
显示的全部像素的颜色为第15种颜色(白色)可以试着修改
;naskfunc.nas中添加的内容
_write_mem8: ; void write_mem8(int addr, int data); MOV ECX,[ESP+4] ; [ESP+4]中存放的是地址,将其读入ECX MOV AL,[ESP+8] ; [ESP+8]中存放的是数据,将其读入AL MOV [ECX],AL RET
//bootpack.c
void io_hlt(void); void write_mem8(int addr, int data); void HariMain(void) { int i; /* 定义i位32位的整形数据*/ for (i = 0xa0000; i <= 0xaffff; i++) { write_mem8(i, 15); /* MOV BYTE [i],15 */ } for (;;) { io_hlt(); } }
harib01b:
P67 显示条纹图案
原理还是一样的,修改bootpack.c中的write_mem8()调用的内容即可
原理是用i&0xff 可以试试其他的运算(比如或运算)
书本在这里还将了一点位运算的内容(真是写到那讲到哪啊!我服了)
for (i = 0xa0000; i <= 0xaffff; i++) { write_mem8(i, i & 0x0f); }
harib01c:
P69 指针进来咯!!!!
书本首先介绍了用于内存地址的不同长度变量的指针定义:
char *p; 用于BYTE类型 | short *p; 用于WORD类型 | int *p; 用于DWORD类型
//bootpack.c void io_hlt(void); void HariMain(void) { int i; /* 变量声明。i是32位的整数 */ char *p; /* 变量P,用于BYTE型的地址 */ for (i = 0xa0000; i <= 0xaffff; i++) { p = i; /* 带入地址 */ *p = i & 0x0f; /* 相当于 write_mem8(i, i & 0x0f) */ } for (;;) { io_hlt(); } }
harib01d:
P74 指针的应用(原理和上面的一样,只是为了说明C语言其他的写法)
p = (char *) 0xa0000; /* 给指针变量赋值 */ for (i = 0; i <= 0xffff; i++) { *(p + i) = i & 0x0f; }
harib01e:
P74 指针的应用(原理和上面的一样,只是为了说明C语言其他的写法)
p = (char *) 0xa0000; /* 这次赋值的是地址 */ for (i = 0; i <= 0xffff; i++) { p[i] = i & 0x0f; }
harib01f:
P75 色号的设定
文中介绍了制作SOAKA中需要的16中颜色的值;编号为0-15
其中给bootpack.c添加了颜色的相关的代码
void init_palette(void);初始化调色板15中颜色
set_palette(0, 15, table_rgb);设置调色板
//bootpack.c void io_hlt(void); void io_cli(void); void io_out8(int port, int data); int io_load_eflags(void); void io_store_eflags(int eflags); /* 函数声明 */ void init_palette(void); void set_palette(int start, int end, unsigned char *rgb); void HariMain(void) { int i; /* i,32位整数 */ char *p; /* P,BYTE型 */ init_palette(); /* 初始化调色板 */ p = (char *) 0xa0000; /* 指定位置 */ for (i = 0; i <= 0xffff; i++) { p[i] = i & 0x0f; } for (;;) { io_hlt(); } } void init_palette(void) { 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:暗紫色 */ 0x00, 0x84, 0x84, /* 14:浅暗蓝 */ 0x84, 0x84, 0x84 /* 15:暗灰色 */ }; set_palette(0, 15, table_rgb); return; /* C语言中的static char只能用于数据,相当于汇编语言中的DB的用法 */ } void set_palette(int start, int end, unsigned char *rgb) { int i, eflags; eflags = io_load_eflags(); /* 记录中断号 */ io_cli(); /* 中断号置0,禁止中断 */ io_out8(0x03c8, start); for (i = start; i <= end; i++) { io_out8(0x03c9, rgb[0] / 4); io_out8(0x03c9, rgb[1] / 4); io_out8(0x03c9, rgb[2] / 4); rgb += 3; } io_store_eflags(eflags); /* 中断复原 */ return; }
; naskfunc.nas ; TAB=4 [FORMAT "WCOFF"] ; 制作目标文件的模式 [INSTRSET "i486p"] ; 使用486为止的指令 [BITS 32] ; 制作32位模式用的机器语言 [FILE "naskfunc.nas"] ; 源文件名 GLOBAL _io_hlt, _io_cli, _io_sti, _io_stihlt GLOBAL _io_in8, _io_in16, _io_in32 GLOBAL _io_out8, _io_out16, _io_out32 GLOBAL _io_load_eflags, _io_store_eflags [SECTION .text] _io_hlt: ; void io_hlt(void); HLT RET _io_cli: ; void io_cli(void); CLI RET _io_sti: ; void io_sti(void); STI RET _io_stihlt: ; void io_stihlt(void); STI HLT RET _io_in8: ; int io_in8(int port); MOV EDX,[ESP+4] ; port MOV EAX,0 IN AL,DX RET _io_in16: ; int io_in16(int port); MOV EDX,[ESP+4] ; port MOV EAX,0 IN AX,DX RET _io_in32: ; int io_in32(int port); MOV EDX,[ESP+4] ; port IN EAX,DX RET _io_out8: ; void io_out8(int port, int data); MOV EDX,[ESP+4] ; port MOV AL,[ESP+8] ; data OUT DX,AL RET _io_out16: ; void io_out16(int port, int data); MOV EDX,[ESP+4] ; port MOV EAX,[ESP+8] ; data OUT DX,AX RET _io_out32: ; void io_out32(int port, int data); MOV EDX,[ESP+4] ; port MOV EAX,[ESP+8] ; data OUT DX,EAX RET _io_load_eflags: ; int io_load_eflags(void); PUSHFD ; PUSH EFLAGS POP EAX RET _io_store_eflags: ; void io_store_eflags(int eflags); MOV EAX,[ESP+4] PUSH EAX POPFD ; POP EFLAGS RET
harib01g:
P84 绘制矩形
运用坐标的关系,改变像素的颜色,在VRAM中绘制矩形
编写的函数为boxfill8 绘制相关的矩形
#define COL8_000000 0 #define COL8_FF0000 1 #define COL8_00FF00 2 #define COL8_FFFF00 3 #define COL8_0000FF 4 #define COL8_FF00FF 5 #define COL8_00FFFF 6 #define COL8_FFFFFF 7 #define COL8_C6C6C6 8 #define COL8_840000 9 #define COL8_008400 10 #define COL8_848400 11 #define COL8_000084 12 #define COL8_840084 13 #define COL8_008484 14 #define COL8_848484 15 void HariMain(void) { char *p; /* P BYTE */ init_palette(); /* 初始化调色板 */ p = (char *) 0xa0000; /* 地址赋值 */ boxfill8(p, 320, COL8_FF0000, 20, 20, 120, 120); //画3个矩形 boxfill8(p, 320, COL8_00FF00, 70, 50, 170, 150); boxfill8(p, 320, COL8_0000FF, 120, 80, 220, 180); for (;;) { io_hlt(); } } ................. void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1) { int x, y; for (y = y0; y <= y1; y++) { for (x = x0; x <= x1; x++) vram[y * xsize + x] = c; } return; }
harib01h:
P86 介绍了任务条(task bar)的显示方法,
修改HariMain 方法
void HariMain(void) { char *vram; int xsize, ysize; init_palette(); vram = (char *) 0xa0000; xsize = 320; ysize = 200; boxfill8(vram, xsize, COL8_008484, 0, 0, xsize - 1, ysize - 29); boxfill8(vram, xsize, COL8_C6C6C6, 0, ysize - 28, xsize - 1, ysize - 28); boxfill8(vram, xsize, COL8_FFFFFF, 0, ysize - 27, xsize - 1, ysize - 27); boxfill8(vram, xsize, COL8_C6C6C6, 0, ysize - 26, xsize - 1, ysize - 1); boxfill8(vram, xsize, COL8_FFFFFF, 3, ysize - 24, 59, ysize - 24); boxfill8(vram, xsize, COL8_FFFFFF, 2, ysize - 24, 2, ysize - 4); boxfill8(vram, xsize, COL8_848484, 3, ysize - 4, 59, ysize - 4); boxfill8(vram, xsize, COL8_848484, 59, ysize - 23, 59, ysize - 5); boxfill8(vram, xsize, COL8_000000, 2, ysize - 3, 59, ysize - 3); boxfill8(vram, xsize, COL8_000000, 60, ysize - 24, 60, ysize - 3); boxfill8(vram, xsize, COL8_848484, xsize - 47, ysize - 24, xsize - 4, ysize - 24); boxfill8(vram, xsize, COL8_848484, xsize - 47, ysize - 23, xsize - 47, ysize - 4); boxfill8(vram, xsize, COL8_FFFFFF, xsize - 47, ysize - 3, xsize - 4, ysize - 3); boxfill8(vram, xsize, COL8_FFFFFF, xsize - 3, ysize - 24, xsize - 3, ysize - 3); for (;;) { io_hlt(); } }
标签:
原文地址:http://www.cnblogs.com/pengfeiz/p/5781712.html