1 Star 0 Fork 0

lwsh.95/system

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
bootpack.h 7.54 KB
一键复制 编辑 原始数据 按行查看 历史
liwensheng 提交于 2021-03-31 10:11 . 13.3 benchamrk
/* asmhead.nas */
//struct把一串变量声明集中起来。最初是1字节的变量cyls,接着是1字节的变量leds,最后是vram。这一串变量一共是12字节
struct BOOTINFO{
char cyls,leds,vmode,reserve;
short scrnx,scrny;
char *vram;
};
#define ADR_BOOTINFO 0x00000ff0
/* 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);//根据C语言的规约,执行RET语句时,EAX中的值就被看作是函数的返回值
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 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);
/* fifo.c */
/* 中断类型
0-1 光标闪烁定时器
3 3秒定时器
10 10秒定时器
256-511 键盘输入(键盘控制器读入值加512
512-767 鼠标输入(键盘控制器读入值加512
*/
struct FIFO32 {
int *buf;
int p, q, size, free, flags;
};
void fifo32_init(struct FIFO32 *fifo, int size, int *buf);
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 /* 0:黑 */
#define COL8_FF0000 1 /* 1:亮红 */
#define COL8_00FF00 2 /* 2:亮绿 */
#define COL8_FFFF00 3 /* 3:亮黄 */
#define COL8_0000FF 4 /* 4:亮蓝 */
#define COL8_FF00FF 5 /* 5:亮紫 */
#define COL8_00FFFF 6 /* 6:浅亮蓝 */
#define COL8_FFFFFF 7 /* 7:白 */
#define COL8_C6C6C6 8 /* 8:亮灰 */
#define COL8_840000 9 /* 9:暗红 */
#define COL8_008400 10 /* 10:暗绿 */
#define COL8_848400 11 /* 11:暗黄 */
#define COL8_000084 12 /* 12:暗青 */
#define COL8_840084 13 /* 13:暗紫 */
#define COL8_008484 14 /* 14:浅暗蓝 */
#define COL8_848484 15 /* 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 //255
#define ADR_GDT 0x00270000
#define LIMIT_GDT 0x0000ffff //8191
#define ADR_BOTPAK 0x00280000
#define LIMIT_BOTPAK 0x0007ffff
#define AR_DATA32_RW 0x4092
#define AR_CODE32_ER 0x409a
#define AR_INTGATE32 0x008e
/* int.c */
struct KEYBUF{
unsigned char data[32];
int next_r,next_w,len;
};
void init_pic(void);
void inthandler21(int *esp);
void inthandler27(int *esp);
void inthandler2c(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
/* pootpack.c */
/* keyboard.c */
void inthandler21(int *esp);
void wait_KBC_sendready(void);
void init_keyboard(struct FIFO32 *fifo, int data0);
extern struct FIFO8 keyfifo;
#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 //创建了4000组,管理内存大约32KB
/*
memman需要32KB,暂时决定使用自0x003c0000开始的32KB(0x00300000号地址以后,今后的程序即使有所增加,预计也不会到达0x003c0000),
然后计算内存总量memtotal,将现在不用的内存以0x1000个字节为单位注册到memman里。最后,显示出合计可用内存容量。
在QEMU上执行时,有时会注册成632KB和28MB。632+28672=29304,所以屏幕上会显示出29304KB。
*/
#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
/*
显示图层
buf是用来记录图层上所描画内容的地址,图层的整体大小,用bxsize*bysize表示。
vx0和vy0是表示图层在画面上位置的坐标,v是VRAM的略语。
col_inv表示透明色色号,它是color(颜色)和invisible(透明)的组合略语。
height表示图层高度。Flags用于存放有关图层的各种设定信息。
*/
struct SHEET {
unsigned char *buf;
int bxsize, bysize, vx0, vy0, col_inv, height, flags;
struct SHTCLT *ctl;
};
/*
管理多重图层信息的结构。
MAX_SHEETS是能够管理的最大图层数,这个值设为256
变量vram、xsize、ysize代表VRAM的地址和画面的大小,在这里预先对它们进行赋值操作。
top代表最上面图层的高度。sheets0这个结构体用于存放我们准备的256个图层的信息。
sheets是记忆地址变量,由于sheets0中的图层顺序混乱,所以按照高度进行升序排列,然后将其地址写入sheets中
*/
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 {
unsigned int timeout, flags; // 记录离超时还有多长时间,到达0就往fifo缓冲区发送数据
struct FIFO32 *fifo;
int data;
};
struct TIMERCTL {
unsigned int count, next, using;
struct TIMER *timers[MAX_TIMER];
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);
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/lwsh95/system.git
[email protected]:lwsh95/system.git
lwsh95
system
system
master

搜索帮助