From 362a753c5183b2b42e11a46da6e2fed6fbf86bee Mon Sep 17 00:00:00 2001 From: Yourtion Date: Fri, 12 Sep 2014 16:29:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=A4=B4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 06_day/bootpack.c | 63 +++---------------------------------------- 06_day/bootpack.h | 69 +++++++++++++++++++++++++++++++++++++++++++++++ 06_day/dsctbl.c | 30 +++++---------------- 06_day/graphic.c | 33 +---------------------- 4 files changed, 80 insertions(+), 115 deletions(-) create mode 100644 06_day/bootpack.h diff --git a/06_day/bootpack.c b/06_day/bootpack.c index 056362a..c10411b 100644 --- a/06_day/bootpack.c +++ b/06_day/bootpack.c @@ -1,74 +1,17 @@ /* bootpack */ +#include "bootpack.h" #include -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 boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1); -void init_screen8(char *vram, int x, int y); -void putfont8(char *vram, int xsize, int x, int y, char c, char *font); -void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s); -void init_mouse_cursor8(char *mouse, char bc); -void putblock8_8(char *vram, int vxsize, int pxsize, - int pysize, int px0, int py0, char *buf, int bxsize); - -#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 - -struct BOOTINFO { - char cyls, leds, vmode, reserve; - short scrnx, scrny; - char *vram; -}; - -struct SEGMENT_DESCRIPTOR { - short limit_low, base_low; - char base_mid, access_right; - char limit_high, base_high; -}; - -struct GATE_DESCRIPTOR { - short offset_low, selector; - char dw_count, access_right; - short offset_high; -}; - -void init_gdtidt(void); -void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar); -void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar); -void load_gdtr(int limit, int addr); -void load_idtr(int limit, int addr); - void HariMain(void) { - struct BOOTINFO *binfo = (struct BOOTINFO *) 0x0ff0; + struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; char s[40], mcursor[256]; int mx, my; init_gdtidt(); init_palette(); init_screen8(binfo->vram, binfo->scrnx, binfo->scrny); - mx = (binfo->scrnx - 16) / 2; /* 计算画面的中心坐标*/ my = (binfo->scrny - 28 - 16) / 2; init_mouse_cursor8(mcursor, COL8_008484); @@ -79,4 +22,4 @@ void HariMain(void) for (;;) { io_hlt(); } -} \ No newline at end of file +} diff --git a/06_day/bootpack.h b/06_day/bootpack.h new file mode 100644 index 0000000..7880d5a --- /dev/null +++ b/06_day/bootpack.h @@ -0,0 +1,69 @@ +/* asmhead.nas */ +struct BOOTINFO { /* 0x0ff0-0x0fff */ + char cyls; /* 启动区读磁盘读到此为止 */ + char leds; /* 启动时键盘的LED的状态 */ + char vmode; /* 显卡模式为多少位彩色 */ + char reserve; + short scrnx, scrny; /* 画面分辨率 */ + char *vram; +}; +#define ADR_BOOTINFO 0x00000ff0 + +/* naskfunc.nas */ +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 load_gdtr(int limit, int addr); +void load_idtr(int limit, int addr); + +/* graphic.c */ +void init_palette(void); +void set_palette(int start, int end, unsigned char *rgb); +void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1); +void init_screen8(char *vram, int x, int y); +void putfont8(char *vram, int xsize, int x, int y, char c, char *font); +void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s); +void init_mouse_cursor8(char *mouse, char bc); +void putblock8_8(char *vram, int vxsize, int pxsize, + int pysize, int px0, int py0, char *buf, int bxsize); +#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 + +/* dsctbl.c */ +struct SEGMENT_DESCRIPTOR { + short limit_low, base_low; + char base_mid, access_right; + char limit_high, base_high; +}; +struct GATE_DESCRIPTOR { + short offset_low, selector; + char dw_count, access_right; + short offset_high; +}; +void init_gdtidt(void); +void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar); +void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar); +#define ADR_IDT 0x0026f800 +#define LIMIT_IDT 0x000007ff +#define ADR_GDT 0x00270000 +#define LIMIT_GDT 0x0000ffff +#define ADR_BOTPAK 0x00280000 +#define LIMIT_BOTPAK 0x0007ffff +#define AR_DATA32_RW 0x4092 +#define AR_CODE32_ER 0x409a diff --git a/06_day/dsctbl.c b/06_day/dsctbl.c index 8d053c9..8e6796f 100644 --- a/06_day/dsctbl.c +++ b/06_day/dsctbl.c @@ -1,42 +1,26 @@ /* GDT、IDT、descriptor table 关系处理 */ -struct SEGMENT_DESCRIPTOR { - short limit_low, base_low; - char base_mid, access_right; - char limit_high, base_high; -}; - -struct GATE_DESCRIPTOR { - short offset_low, selector; - char dw_count, access_right; - short offset_high; -}; - -void init_gdtidt(void); -void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar); -void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar); -void load_gdtr(int limit, int addr); -void load_idtr(int limit, int addr); +#include "bootpack.h" void init_gdtidt(void) { - struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) 0x00270000; - struct GATE_DESCRIPTOR *idt = (struct GATE_DESCRIPTOR *) 0x0026f800; + struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT; + struct GATE_DESCRIPTOR *idt = (struct GATE_DESCRIPTOR *) ADR_IDT; int i; /* GDT初始化 */ for (i = 0; i < 8192; i++) { set_segmdesc(gdt + i, 0, 0, 0); } - set_segmdesc(gdt + 1, 0xffffffff, 0x00000000, 0x4092); - set_segmdesc(gdt + 2, 0x0007ffff, 0x00280000, 0x409a); - load_gdtr(0xffff, 0x00270000); + set_segmdesc(gdt + 1, 0xffffffff, 0x00000000, AR_DATA32_RW); + set_segmdesc(gdt + 2, LIMIT_BOTPAK, ADR_BOTPAK, AR_CODE32_ER); + load_gdtr(LIMIT_GDT, ADR_GDT); /* IDT初始化 */ for (i = 0; i < 256; i++) { set_gatedesc(idt + i, 0, 0, 0); } - load_idtr(0x7ff, 0x0026f800); + load_idtr(LIMIT_IDT, ADR_IDT); return; } diff --git a/06_day/graphic.c b/06_day/graphic.c index f4b0abf..f2df123 100644 --- a/06_day/graphic.c +++ b/06_day/graphic.c @@ -1,37 +1,6 @@ /* 关于绘图部分的处理 */ -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 boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1); -void init_screen8(char *vram, int x, int y); -void putfont8(char *vram, int xsize, int x, int y, char c, char *font); -void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s); -void init_mouse_cursor8(char *mouse, char bc); -void putblock8_8(char *vram, int vxsize, int pxsize, - int pysize, int px0, int py0, char *buf, int bxsize); - -#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 +#include "bootpack.h" void init_palette(void) {