/* asmhead.nas */ struct BOOTINFO { /* 0x0ff0-0x0fff */ char cyls; /* 启动区读磁盘读到此为止 */ char leds; /* 启动时键盘的LED的状态 */ char vmode; /* 显卡模式为多少位彩色 */ char reserve; short scrnx, scrny; /* 画面分辨率 */ char *vram; }; #define ADR_BOOTINFO 0x00000ff0 #define ADR_DISKIMG 0x00100000 /* naskfunc.nas */ void io_hlt(void); void io_cli(void); void io_sti(void); void io_stihlt(void); int io_in8(int port); 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); int load_cr0(void); void store_cr0(int cr0); void load_tr(int tr); void asm_inthandler0c(void); void asm_inthandler0d(void); void asm_inthandler20(void); void asm_inthandler21(void); void asm_inthandler27(void); void asm_inthandler2c(void); unsigned int memtest_sub(unsigned int start, unsigned int end); void farjmp(int eip, int cs); void farcall(int eip, int cs); void asm_hrb_api(void); void start_app(int eip, int cs, int esp, int ds, int *tss_esp0); void asm_end_app(void); /* fifo.c */ struct FIFO32 { int *buf; int p, q, size, free, flags; struct TASK *task; }; void fifo32_init(struct FIFO32 *fifo, int size, int *buf, struct TASK *task); int fifo32_put(struct FIFO32 *fifo, int data); int fifo32_get(struct FIFO32 *fifo); int fifo32_status(struct FIFO32 *fifo); /* 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 #define AR_TSS32 0x0089 #define AR_INTGATE32 0x008e /* int.c */ void init_pic(void); void inthandler27(int *esp); #define PIC0_ICW1 0x0020 #define PIC0_OCW2 0x0020 #define PIC0_IMR 0x0021 #define PIC0_ICW2 0x0021 #define PIC0_ICW3 0x0021 #define PIC0_ICW4 0x0021 #define PIC1_ICW1 0x00a0 #define PIC1_OCW2 0x00a0 #define PIC1_IMR 0x00a1 #define PIC1_ICW2 0x00a1 #define PIC1_ICW3 0x00a1 #define PIC1_ICW4 0x00a1 /* keyboard.c */ void inthandler21(int *esp); void wait_KBC_sendready(void); void init_keyboard(struct FIFO32 *fifo, int data0); #define PORT_KEYDAT 0x0060 #define PORT_KEYCMD 0x0064 /* mouse.c */ struct MOUSE_DEC { unsigned char buf[3], phase; int x, y, btn; }; void inthandler2c(int *esp); void enable_mouse(struct FIFO32 *fifo, int data0, struct MOUSE_DEC *mdec); int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat); /* memory.c */ #define MEMMAN_FREES 4090 /* 大约是32KB*/ #define MEMMAN_ADDR 0x003c0000 struct FREEINFO { /* 可用信息 */ unsigned int addr, size; }; struct MEMMAN { /* 内存管理 */ int frees, maxfrees, lostsize, losts; struct FREEINFO free[MEMMAN_FREES]; }; unsigned int memtest(unsigned int start, unsigned int end); void memman_init(struct MEMMAN *man); unsigned int memman_total(struct MEMMAN *man); unsigned int memman_alloc(struct MEMMAN *man, unsigned int size); int memman_free(struct MEMMAN *man, unsigned int addr, unsigned int size); unsigned int memman_alloc_4k(struct MEMMAN *man, unsigned int size); int memman_free_4k(struct MEMMAN *man, unsigned int addr, unsigned int size); /* sheet.c */ #define MAX_SHEETS 256 struct SHEET { unsigned char *buf; int bxsize, bysize, vx0, vy0, col_inv, height, flags; struct SHTCTL *ctl; struct TASK *task; }; struct SHTCTL { unsigned char *vram, *map; int xsize, ysize, top; struct SHEET *sheets[MAX_SHEETS]; struct SHEET sheets0[MAX_SHEETS]; }; struct SHTCTL *shtctl_init(struct MEMMAN *memman, unsigned char *vram, int xsize, int ysize); struct SHEET *sheet_alloc(struct SHTCTL *ctl); void sheet_setbuf(struct SHEET *sht, unsigned char *buf, int xsize, int ysize, int col_inv); void sheet_updown(struct SHEET *sht, int height); void sheet_refresh(struct SHEET *sht, int bx0, int by0, int bx1, int by1); void sheet_slide(struct SHEET *sht, int vx0, int vy0); void sheet_free(struct SHEET *sht); /* timer.c */ #define MAX_TIMER 500 struct TIMER { struct TIMER *next; unsigned int timeout, flags; struct FIFO32 *fifo; int data; }; struct TIMERCTL { unsigned int count, next; struct TIMER *t0; struct TIMER timers0[MAX_TIMER]; }; extern struct TIMERCTL timerctl; void init_pit(void); struct TIMER *timer_alloc(void); void timer_free(struct TIMER *timer); void timer_init(struct TIMER *timer, struct FIFO32 *fifo, int data); void timer_settime(struct TIMER *timer, unsigned int timeout); void inthandler20(int *esp); /* mtask.c */ #define MAX_TASKS 1000 /*最大任务数量*/ #define TASK_GDT0 3 /*定义从GDT的几号开始分配给TSS */ #define MAX_TASKS_LV 100 #define MAX_TASKLEVELS 10 struct TSS32 { int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3; int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi; int es, cs, ss, ds, fs, gs; int ldtr, iomap; }; struct TASK { int sel, flags; /* sel用来存放GDT的编号*/ int level, priority; /* 优先级 */ struct FIFO32 fifo; struct TSS32 tss; }; struct TASKLEVEL { int running; /*正在运行的任务数量*/ int now; /*这个变量用来记录当前正在运行的是哪个任务*/ struct TASK *tasks[MAX_TASKS_LV]; }; struct TASKCTL { int now_lv; /*现在活动中的LEVEL */ char lv_change; /*在下次任务切换时是否需要改变LEVEL */ struct TASKLEVEL level[MAX_TASKLEVELS]; struct TASK tasks0[MAX_TASKS]; }; extern struct TIMER *task_timer; struct TASK *task_init(struct MEMMAN *memman); struct TASK *task_alloc(void); void task_run(struct TASK *task, int level, int priority); void task_switch(void); void task_sleep(struct TASK *task); /* window.c */ void make_window8(unsigned char *buf, int xsize, int ysize, char *title, char act); void putfonts8_asc_sht(struct SHEET *sht, int x, int y, int c, int b, char *s, int l); void make_textbox8(struct SHEET *sht, int x0, int y0, int sx, int sy, int c); void make_wtitle8(unsigned char *buf, int xsize, char *title, char act); /* console.c */ struct CONSOLE { struct SHEET *sht; int cur_x, cur_y, cur_c; struct TIMER *timer; }; void console_task(struct SHEET *sheet, unsigned int memtotal); void cons_putchar(struct CONSOLE *cons, int chr, char move); void cons_newline(struct CONSOLE *cons); void cons_putstr0(struct CONSOLE *cons, char *s); void cons_putstr1(struct CONSOLE *cons, char *s, int l); void cons_runcmd(char *cmdline, struct CONSOLE *cons, int *fat, unsigned int memtotal); void cmd_mem(struct CONSOLE *cons, unsigned int memtotal); void cmd_cls(struct CONSOLE *cons); void cmd_dir(struct CONSOLE *cons); void cmd_type(struct CONSOLE *cons, int *fat, char *cmdline); int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline); int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax); int *inthandler0c(int *esp); int *inthandler0d(int *esp); /* file.c */ struct FILEINFO { unsigned char name[8], ext[3], type; char reserve[10]; unsigned short time, date, clustno; unsigned int size; }; void file_readfat(int *fat, unsigned char *img); void file_loadfile(int clustno, int size, char *buf, int *fat, char *img); struct FILEINFO *file_search(char *name, struct FILEINFO *finfo, int max);