zoukankan      html  css  js  c++  java
  • 30天自制操作系统笔记(九十)——源码

    这里为了节省篇幅和csdn服务器的空间偷笑,我们只给出在七八之上改动的或者新建的源码文件的内容:

    运行效果地址http://blog.csdn.net/ucan23/article/details/17066837点击打开链接

    sheet.c

    /* filename:    sheet.c
     * description: 对图层的管理
     * author:      Howard
     * date:        2013-12-01
     * version:     v1.0
     */
     
    #include "bootpack.h"
     
    struct SHTCTL *shtctl_init(struct MEMMAN *memman, unsigned char *vram, int xsize, int ysize)
    {
    	struct SHTCTL *ctl;
    	int i;
    	ctl = (struct SHTCTL *) memman_alloc_4k(memman, sizeof (struct SHTCTL));
    	if (0==ctl){
    		goto err;
    	}
    	ctl->vram = vram;
    	ctl->xsize = xsize;
    	ctl->ysize = ysize;
    	ctl->top = -1; /*一个sheet也没有*/
    	for (i=0; i<MAX_SHEETS; i++){
    		ctl->sheets0[i].flags = 0; /*标记为未使用*/
    	}
    err:
    	return ctl;
    }
    
    struct SHEET *sheet_alloc(struct SHTCTL *ctl)
    {
    	struct SHEET *sht;
    	int i;
    	for (i=0; i<MAX_SHEETS; i++){
    		if (0==ctl->sheets0[i].flags){
    			sht = &ctl->sheets0[i];
    			sht->flags = SHEET_USE;
    			sht->height = -1;
    			return sht;
    		}
    	}
    	return 0;
    }
    
    void sheet_setbuf(struct SHEET *sht, unsigned char *buf, int xsize, int ysize, int col_inv)
    {
    	sht->buf = buf;
    	sht->bxsize = xsize;
    	sht->bysize = ysize;
    	sht->col_inv = col_inv;
    	return;
    }
    
    void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1)
    {
    	int h, bx, by, vx, vy,bx0, by0, bx1, by1;
    	unsigned char *buf, c, *vram = ctl->vram;
    	struct SHEET *sht;
    	for (h = 0; h <= ctl->top; h++) {
    		sht = ctl->sheets[h];
    		buf = sht->buf;
    		bx0 = vx0 - sht->vx0;
    		by0 = vy0 - sht->vy0;
    		bx1 = vx1 - sht->vx0;
    		by1 = vy1 - sht->vy0;
    		if (bx0<0){
    			bx0 = 0;
    		}
    		if (by0<0){
    			by0 = 0;
    		}
    		if (bx1>sht->bxsize){
    			bx1 = sht->bxsize;
    		}
    		if (by1>sht->bysize){
    			by1 = sht->bysize;
    		}
    		for (by = by0; by < by1; by++) {
    			vy = sht->vy0 + by;
    			for (bx = bx0; bx < bx1; bx++) {
    				vx = sht->vx0 + bx;
    					c = buf[by * sht->bxsize + bx];
    					if (c != sht->col_inv) {
    						vram[vy * ctl->xsize + vx] = c;
    					}
    			}
    		}
    	}
    	return;
    }
    
    void sheet_updown(struct SHTCTL *ctl, struct SHEET *sht, int height)
    {
    	int h, old = sht->height;		/*存储设置前的高度信息*/
    	/*如果指定的高度过低则进行修正*/
    	if (height>ctl->top+1){
    		height = ctl->top + 1;
    	}
    	if (height<-1){
    		height = -1;
    	}
    	sht->height = height; 	/*设置高度*/
    	
    	/*sheets[]的重新排列*/
    	if (old>height){
    		if (height>=0){
    			for (h = old; h>height;h--){
    				ctl->sheets[h] = ctl->sheets[h-1];
    				ctl->sheets[h]->height = h;
    			}
    			ctl->sheets[height] = sht;
    		} else {
    			if (ctl->top>old){
    				for (h=old; h<ctl->top; h++){
    					ctl->sheets[h] = ctl->sheets[h+1];
    					ctl->sheets[h]->height = h;
    				}
    			}
    			ctl->top --;
    		}
    		//sheet_refresh(ctl);
    		sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize);
    	} else if (old<height){
    		if (old>=0){
    			for (h=old; h<height; h++){
    				ctl->sheets[h] = ctl->sheets[h+1];
    				ctl->sheets[h]->height = h;
    			}
    			ctl->sheets[height] = sht;
    		} else {
    			for (h=ctl->top; h>=height; h--){
    				ctl->sheets[h+1] = ctl->sheets[h];
    				ctl->sheets[h+1]->height = h + 1;
    			}
    			ctl->sheets[height] = sht;
    			ctl->top ++;
    		}
    		//sheet_refresh(ctl);
    		sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize);
    	}
    	return;
    }
    
    void sheet_refresh(struct SHTCTL *ctl, struct SHEET *sht, int bx0, int by0, int bx1, int by1)
    {
    	if (sht->height >= 0) { 
    		sheet_refreshsub(ctl, sht->vx0 + bx0, sht->vy0 + by0, sht->vx0 + bx1, sht->vy0 + by1);
    	}
    	return;
    }
    /*
    void sheet_refresh(struct SHTCTL *ctl)
    {
    	int h, bx, by, vx, vy;
    	unsigned char *buf, c, *vram = ctl->vram;
    	struct SHEET *sht;
    	for (h=0; h<=ctl->top; h++){
    		sht = ctl->sheets[h];
    		buf = sht->buf;
    		for (by=0; by<sht->bysize; by++){
    			vy = sht->vy0 + by;
    			for (bx=0; bx<sht->bxsize; bx++){
    				vx = sht->vx0 +bx;
    				c = buf[by*sht->bxsize + bx];
    				if (c!=sht->col_inv){
    					vram[vy*ctl->xsize+vx] = c;
    				}
    			}
    		}
    	}
    	return;
    }
    */
    
    void sheet_slide(struct SHTCTL *ctl, struct SHEET *sht, int vx0, int vy0)
    {
    	int old_vx0 = sht->vx0, old_vy0 = sht->vy0;
    	sht->vx0 = vx0;
    	sht->vy0 = vy0;
    	if (sht->height>=0){
    		//sheet_refresh(ctl);
    		sheet_refreshsub(ctl, old_vx0, old_vy0, old_vx0 + sht->bxsize, old_vy0 + sht->bysize);
    		sheet_refreshsub(ctl, vx0, vy0, vx0 + sht->bxsize, vy0 + sht->bysize);
    	}
    	return;
    }
    void sheet_free(struct SHTCTL *ctl, struct SHEET *sht)
    {
    	if (sht->height>=0){
    		sheet_updown(ctl, sht, -1);
    	}
    	sht->flags = 0;
    	return;
    }

    memory.c

    /* filename:    memory.c
     * description: 包含了有内存操作的相关函数
     * author:      Howard
     * date:        2013-12-01
     * version:     v1.0
     */
    
    #include "bootpack.h"
    
    unsigned int memtest(unsigned int start, unsigned int end)
    {
    	char flg486 = 0;
    	unsigned int eflg, cr0, i;
    	eflg = io_load_eflags();
    	eflg |= EFLAGS_AC_BIT;
    	io_store_eflags(eflg);
    	eflg = io_load_eflags();
    	if (0!=(eflg & EFLAGS_AC_BIT)){
    		flg486 = 1;
    	}
    	eflg &= -EFLAGS_AC_BIT;
    	io_store_eflags(eflg);
    	
    	if (0!=flg486){
    		cr0 = load_cr0();
    		cr0 |= CR0_CACHE_DISABLE;
    		store_cr0(cr0);
    	}
    	
    	i = memtest_sub(start, end);
    	
    	if (0!=flg486){
    		cr0 = load_cr0();
    		cr0 &= ~CR0_CACHE_DISABLE;
    		store_cr0(cr0);
    	}
    	
    	return i;
    }
    /*unsigned int memtest_sub(unsigned int start, unsigned int end)
    {
    	unsigned int i, *p, old, pat0 = 0xaa55aa55, pat1 = 0x55aa55aa;
    	for (i=start; i<=end; i+=0x1000){
    		p = (unsigned int *) (i+0xffc);
    		old = *p;
    		*p = pat0;
    		*p ^= 0xffffffff;
    		if (*p != pat1){
    not_memory:
    			*p = old;
    			break;
    		}
    		*p ^= 0xffffffff;
    		if (*p != pat0){
    			goto not_memory;
    		}
    		*p = old;
    	}
    	return i;
    }*/
    
    void memman_init(struct MEMMAN *man)
    {
    	man->frees = 0;
    	man->maxfrees = 0;
    	man->lostsize = 0;
    	man->losts = 0;
    	return;
    }
    unsigned int memman_total(struct MEMMAN *man){
    	unsigned int i, t = 0;
    	for (i=0; i<man->frees; i++){
    		t += man->free[i].size;
    	}
    	return t;
    }
    unsigned int memman_alloc(struct MEMMAN *man, unsigned int size)
    {
    	unsigned int i, a;
    	for (i=0; i<man->frees; i++){
    		if (man->free[i].size>=size){
    			/*找到了足够大的内存*/
    			a = man->free[i].addr;
    			man->free[i].addr += size;
    			man->free[i].size -= size;
    			if (0==man->free[i].size){
    				man->frees--;
    				for (; i<man->frees; i++){
    					man->free[i] = man->free[i+1];
    				}
    			}
    			return a;
    		}
    	}
    	return 0; /*没有可用的内存空间(内存分配失败)*/
    }
    
    int memman_free(struct MEMMAN *man, unsigned int addr, unsigned int size)
    {
    	int i,j;
    	/*为便于归纳内存,将free[]按照addr的顺序排列*/
    	/*所以先决定放在哪里*/
    	for (i=0; i<man->frees; i++){
    		if (man->free[i].addr > addr){
    			break;
    		}
    	}
    	/* free[i-1].addr<addr< free[i].addr*/
    	if (i>0){
    		if (man->free[i-1].addr + man->free[i-1].size == addr){
    			man->free[i-1].size += size;
    			if (i<man->frees){
    				if (addr+size == man->free[i+1].addr){
    					man->free[i-1].size += man->free[i].size;
    					man->frees--;
    					for (; i<man->frees; i++){
    						man->free[i] = man->free[i+1];
    					}
    				}
    			}
    			return 0;
    		}
    	}
    	/*不能与前面的可用内存归结在一起*/
    	if (i<man->frees){
    		if (addr+size == man->free[i].addr){
    			/*可以与后面的合并在一起*/
    			man->free[i].addr = addr;
    			man->free[i].size += size;
    			return 0;
    		}
    	}
    	/*既不能跟前面的合并在一起也不能跟后面的合并在一起*/
    	if (man->frees<MEMMAN_FREES){
    		for (j=man->frees; j>i; j--){
    			man->free[j] = man->free[j-1];
    		}
    		man->frees ++;
    		if (man->maxfrees < man->frees){
    			man->maxfrees = man->frees;
    		}
    		man->free[i].addr = addr;
    		man->free[i].size = size;
    		return 0;
    	}
    	man->losts ++;
    	man->lostsize += size;
    	return -1;
    }
    
    unsigned int memman_alloc_4k(struct MEMMAN *man, unsigned int size)
    {
    	unsigned int a;
    	size = (size + 0xfff) & (0xfffff000);
    	a = memman_alloc(man, size);
    	return a;
    }
    
    int memman_free_4k(struct MEMMAN *man, unsigned int addr, unsigned int size)
    {
    	int i;
    	size = (size + 0xfff) & (0xfffff000);
    	i = memman_free(man, addr, size);
    	return i;
    }
    

    bootpack.h

    /* filename:    bootpack.h
     * description: 函数的声明与变量的定义
     * author:      Howard
     * date:        2013-11-28
     * version:     v1.0
     */
    
    
    /*ucan23.nas*/
    struct BOOTINFO{
    	char cyls;
    	char leds;
    	char vmode;
    	char reserve;
    	short scrnx;
    	short scrny;
    	char *vram;
    };
    #define ADR_BOOTINFO 	 0x00000ff0
    
    /*naskfunc.nas*/
    /*告诉C编译器,有函数在别的文件里*/
    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 write_mem8(int addr, int data);
    void asm_inthandler21(void);
    void asm_inthandler27(void);
    void asm_inthandler2c(void);
    void init_screen(char *vram, int xsize, int ysize);
    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 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 putblock8_8(char *vram, int vxsize, int pxsize,
    	int pysize, int px0, int py0, char *buf, int bxsize);
    void init_mouse_cursor8(char *mouse, char bc);
    unsigned int memtest_sub(unsigned int start, unsigned int end);
    
    #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 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);
    #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_INTGATE32	0x008e
    
    /*int.c*/
    
    void init_pic(void);
    void inthandler21(int *esp);
    void inthandler2c(int *esp);
    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
    #define PORT_KEYDAT				0x0060
    #define PORT_KEYSTA				0x0064
    #define PORT_KEYCMD				0x0064
    #define KEYSTA_SEND_NOTREADY	0x02
    #define KEYCMD_WRITE_MODE		0x60
    #define KBC_MODE				0x47
    
    struct MOUSE_DEC {
    	unsigned char buf[3], phase;
    	int x, y, btn;
    };/*存放鼠标解码数据的结构体*/
    
    void wait_KBC_sendready(void);
    void init_keyboard(void);
    #define KEYCMD_SENDTO_MOUSE 	0xd4
    #define MOUSECMD_ENABLE			0xf4
    void enable_mouse(struct MOUSE_DEC *mdec);
    int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat);
    /*struct KEYBUF{
    	unsigned char data[32];
    	int next_r, next_w, len;
    };
    */
    /*fifo.c*/
    
    struct FIFO8{
    	unsigned char *buf;
    	int p, q, size, free, flags;
    };
    
    void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf);
    int fifo8_put(struct FIFO8 *fifo, unsigned char data);
    int fifo8_get(struct FIFO8 *fifo);
    int fifo8_status(struct FIFO8 *fifo);
    
    /*memory.c*/
    #define EFLAGS_AC_BIT		0x00040000
    #define CR0_CACHE_DISABLE	0x60000000
    #define MEMMAN_FREES		4090		/*大约是32K*/
    #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
    #define SHEET_USE		1
    struct SHEET {
    	unsigned char *buf;
    	int bxsize, bysize, vx0, vy0, col_inv, height, flags;
    };
    
    struct SHTCTL{
    	unsigned char *vram;
    	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 SHTCTL *ctl, struct SHEET *sht, int height);
    void sheet_refresh(struct SHTCTL *ctl, struct SHEET *sht, int bx0, int by0, int bx1, int by1);
    void sheet_slide(struct SHTCTL *ctl, struct SHEET *sht, int vx0, int vy0);
    void sheet_free(struct SHTCTL *ctl, struct SHEET *sht);
    void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1);


    Makefile只需修改下面的内容即可:

    OBJS_BOOTPACK = bootpack.obj naskfunc.obj yezfont.obj graphic.obj dsctbl.obj 
    				int.obj fifo.obj keyboard.obj mouse.obj memory.obj sheet.obj


    naskfunc.nas

    ; naskfunc
    ; TAB=4
    
    [FORMAT "WCOFF"]				 
    [INSTRSET "i486p"]				 
    [BITS 32]						 
    [FILE "naskfunc.nas"]			 
    
    		GLOBAL	_io_hlt,_write_mem8
    		GLOBAL	_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
    		GLOBAL	_load_gdtr, _load_idtr
    		GLOBAL  _load_cr0, _store_cr0
    		GLOBAL	_asm_inthandler21, _asm_inthandler27, _asm_inthandler2c
    		GLOBAL	_memtest_sub
    		EXTERN	_inthandler21, _inthandler2c, _inthandler27
    
    [SECTION .text]
    
    _io_hlt:	; void io_hlt(void);
    		HLT
    		RET
    
    _write_mem8:	; void write_mem8(int addr, int data);
    		MOV		ECX,[ESP+4]		;  
    		MOV		AL,[ESP+8]		;  
    		MOV		[ECX],AL
    		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]
    		MOV		EAX, 0
    		IN		AX, DX
    		RET
    		
    _io_in32:		;io_in32(int port);
    		MOV		EDX, [ESP+4]
    		IN		EAX, DX
    		RET
    		
    _io_out8:		;io_out8(int port, int data);
    		MOV		EDX, [ESP+4] 	;PORT
    		MOV		AL, [ESP+8]		;DATA
    		OUT		DX, AL
    		RET
    		
    _io_out16:		;io_out16(int port, int data);
    		MOV		EDX, [ESP+4]
    		MOV		EAX, [ESP+8]
    		OUT		DX, AX
    		
    _io_out32:		;io_out32(int port, int data);
    		MOV		EDX, [ESP+4]
    		MOV		EAX, [ESP+8]
    		OUT		DX, EAX
    		RET
    
    _io_load_eflags:	;io_load_eflags(int eflags);
    		PUSHFD
    		POP		EAX
    		RET
    		
    _io_store_eflags:	;io_store_eflags(int eflags);
    		MOV		EAX, [ESP+4]
    		PUSH	EAX
    		POPFD
    		RET
    		
    _load_gdtr:		;void load_gdtr(int limit, int addr);
    		MOV		AX,[ESP+4]		;limit
    		MOV 	[ESP+6], AX
    		LGDT	[ESP+6]
    		RET
    		
    _load_idtr:		;void load_idtr(int limit, int addr);
    		MOV		AX, [ESP+4]
    		MOV		[ESP+6], AX
    		LIDT	[ESP+6]
    		RET
    		
    _load_cr0:		;int load_cr0(void)
    		MOV		EAX, CR0
    		RET
    		
    _store_cr0:		;void load_cr0(int cr0)
    		MOV		EAX, [ESP+4]
    		MOV		CR0, EAX
    		RET
    		
    _asm_inthandler21:
    		PUSH	ES
    		PUSH	DS
    		PUSHAD
    		MOV		EAX, ESP
    		PUSH 	EAX
    		MOV		AX, SS
    		MOV		DS, AX
    		MOV		ES,	AX
    		CALL	_inthandler21
    		POP		EAX
    		POPAD
    		POP		DS
    		POP		ES
    		IRETD
    		
    _asm_inthandler27:
    		PUSH	ES
    		PUSH	DS
    		PUSHAD
    		MOV		EAX, ESP	
    		PUSH	EAX
    		MOV		AX, SS
    		MOV		DS, AX
    		MOV		ES, AX
    		CALL	_inthandler27
    		POP		EAX
    		POPAD
    		POP		DS
    		POP		ES
    		IRETD
    		
    _asm_inthandler2c:
    		PUSH	ES
    		PUSH	DS
    		PUSHAD
    		MOV		EAX, ESP
    		PUSH	EAX
    		MOV		AX, SS
    		MOV		DS, AX
    		MOV		ES, AX
    		CALL	_inthandler2c
    		POP		EAX
    		POPAD
    		POP		DS
    		POP		ES
    		IRETD
    		
    _memtest_sub:		; unsigned int memtest_sub(unsigned int start, unsigned int end);
    		PUSH	EDI
    		PUSH	ESI
    		PUSH	EBX
    		MOV		ESI, 0xaa55aa55
    		MOV		EDI, 0x55aa55aa
    		MOV		EAX, [ESP+12+4]
    mts_loop:
    		MOV		EBX, EAX
    		ADD		EBX, 0xffc
    		MOV		EDX, [EBX]
    		MOV		[EBX], ESI
    		XOR		DWORD [EBX], 0xffffffff
    		CMP		EDI, [EBX]
    		JNE		mts_fin
    		XOR		DWORD [EBX], 0xffffffff
    		CMP		ESI, [EBX]
    		JNE		mts_fin
    		MOV		[EBX], EDX
    		ADD		EAX, 0x1000
    		CMP		EAX, [ESP+12+8]
    		JBE		mts_loop
    		POP		EBX
    		POP		ESI
    		POP		EDI
    		RET
    mts_fin:
    		MOV		[EBX], EDX
    		POP		EBX
    		POP		ESI
    		POP		EDI
    		RET


    最后是我们的主函数所在的源文件:

    /* filename:    bootpack.c
     * description: the UcanMain()file
     * author:      Howard
     * date:        2013-11-28
     * version:     v1.0
     */
    
    
    #include <stdio.h>
    #include "bootpack.h"
    
    
    extern struct FIFO8 keyfifo, mousefifo;
    
    void UcanMain(void)
    {
    	
    	char *vram;
    	char s[50], mcursor[256], keybuf[32], mousebuf[128];
    	int mx, my;//鼠标的(x,y)
    	int xsize, ysize;
    	int i;
    	unsigned int memtotal;
    	struct MOUSE_DEC mdec; /*鼠标解码缩放的数据*/
    	struct SHTCTL *shtctl;
    	struct SHEET *sht_back, *sht_mouse;
    	unsigned char *buf_back, buf_mouse[256];
    	struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
    	
    	struct BOOTINFO *binfo = (struct BOOTINFO *) 0x0ff0;
    			 
    	init_gdtidt();
    	init_pic();
    	io_sti();
    	
    	fifo8_init(&keyfifo, 32, keybuf);
    	fifo8_init(&mousefifo, 128, mousebuf);
    	io_out8(PIC0_IMR, 0xf9);
    	io_out8(PIC1_IMR, 0xef);
    	
    	init_keyboard();
    	enable_mouse(&mdec);
    	
    	memtotal = memtest(0x00400000, 0xbfffffff);
    	memman_init(memman);
    	memman_free(memman, 0x00001000, 0x0009e000);
    	memman_free(memman, 0x00400000, memtotal - 0x00400000);
    	
    	init_palette();
    	
    	shtctl = shtctl_init(memman, binfo->vram, binfo->scrnx, binfo->scrny);
    	sht_back = sheet_alloc(shtctl);
    	sht_mouse = sheet_alloc(shtctl);
    	buf_back = (unsigned char *)memman_alloc_4k(memman, binfo->scrnx*binfo->scrny);
    	sheet_setbuf(sht_back, buf_back, binfo->scrnx, binfo->scrny, -1);
    	sheet_setbuf(sht_mouse, buf_mouse, 16, 16, 99);
    	
    	//init_screen(binfo->vram, binfo->scrnx, binfo->scrny);
    	init_screen(buf_back, binfo->scrnx, binfo->scrny);
    	init_mouse_cursor8(buf_mouse, 99);
    	sheet_slide(shtctl, sht_back, 0, 0);
    	//init_mouse_cursor8(mcursor, 99);
    	xsize = (*binfo).scrnx;
    	ysize = (*binfo).scrny;
    	vram = (*binfo).vram;
    	
    	
    	mx = (binfo->scrnx-16) / 2;
    	my = (binfo->scrny-28-16) /2;
    	sheet_slide(shtctl, sht_mouse, mx, my);
    	sheet_updown(shtctl, sht_back,  0);
    	sheet_updown(shtctl, sht_mouse, 1);
    	//putblock8_8(buf_back, binfo->scrnx, 16, 16, mx, my, buf_mouse, 16);
    	putfonts8_asc(buf_back, binfo->scrnx, 8, 8, COL8_FFFFFF, "Hello, world!");
    	putfonts8_asc(buf_back, binfo->scrnx, 31, 31, COL8_000000, "Ucan23-OS");
    	putfonts8_asc(buf_back, binfo->scrnx, 30, 30, COL8_FFFFFF, "Ucan23-OS");
    	
    	sprintf(s, "scrnx = %d", binfo->scrnx);
    	putfonts8_asc(buf_back, binfo->scrnx, 16, 64, COL8_FFFFFF, s);
    	
    	sprintf(s, "(%d, %d)", mx, my);
    	putfonts8_asc(buf_back, binfo->scrnx, mx+16, my+16, COL8_FFFFFF, s);
    	
    	//io_out8(PIC0_IMR, 0xf9);
    	//io_out8(PIC1_IMR, 0xef);
    	
    	
    	sprintf(s, "Memory %dMB  free: %dKB", memtotal/(1024*1024), memman_total(memman)/1024);
    	putfonts8_asc(buf_back, binfo->scrnx, 0, 136, COL8_FFFFFF, s);
    	
    	sheet_refresh(shtctl, sht_back, 0, 0, binfo->scrnx, binfo->scrny);
    	
    	for (;;){
    		io_cli();    /*执行nashfunc.nas里的_io_hlt*/
    		if (0==(fifo8_status(&keyfifo)+fifo8_status(&mousefifo))){
    			io_stihlt();
    		} else {
    			if (0!=fifo8_status(&keyfifo)){
    				i = fifo8_get(&keyfifo);
    				io_sti();
    				sprintf(s, "%02X", i);
    				boxfill8(buf_back, binfo->scrnx, COL8_000000, 0, 120, 15, 135);
    				putfonts8_asc(buf_back, binfo->scrnx, 0, 120, COL8_FFFFFF, s);
    				sheet_refresh(shtctl,sht_back, 0, 120, 15*8, 136);
    			} else if (0!=fifo8_status(&mousefifo))
    			{
    				i = fifo8_get(&mousefifo);
    				io_sti();
    				if (0 != mouse_decode(&mdec, i)){					
    					sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);
    					if ((mdec.btn & 0x01)!=0){
    						s[1] = 'L';
    					}
    					if ((mdec.btn & 0x02)!=0){
    						s[3] = 'R';
    					}
    					if ((mdec.btn & 0x04)!=0){
    						s[2] = 'C';
    					}
    					boxfill8(buf_back, binfo->scrnx, COL8_008484, 32, 120, 32+15*8-1,135);
    					putfonts8_asc(buf_back, binfo->scrnx, 32, 120, COL8_FFFFFF, s);
    					sheet_refresh(shtctl, sht_back, 32, 120, 32+15*8, 136);
    					/*鼠标指针的移动*/
    					//boxfill8(buf_back, binfo->scrnx, COL8_008484, mx, my, mx+15, my+15);/*隐藏鼠标*/
    					mx += mdec.x;
    					my += mdec.y;
    					if (mx<0){
    						mx = 0;
    					}
    					if (my<0){
    						my = 0;
    					}
    					if (mx>binfo->scrnx-16){
    						mx = binfo->scrnx-16;
    					}
    					if (my>binfo->scrny-16){
    						my = binfo->scrny-16;
    					}
    					sprintf(s, "(%3d, %3d)", mx, my);
    					boxfill8(buf_back, binfo->scrnx, COL8_008484,binfo->scrnx-100,120,binfo->scrnx , 136);
    					putfonts8_asc(buf_back, binfo->scrnx, binfo->scrnx-100, 120, COL8_FFFFFF,s);
    					sheet_refresh(shtctl, sht_back, binfo->scrnx-100, 120, binfo->scrnx, 136);
    					//putblock8_8(binfo->vram,binfo->scrnx, 16, 16, mx, my, mcursor, 16);
    					sheet_slide(shtctl, sht_mouse, mx, my);
    				}
    			}		
    		}
    	}
    }
    




  • 相关阅读:
    解决:Eclipse调试的时候报错'Launching XXX' has encountered a problem. Cannot connect to VM.
    struts-tiles学习笔记
    配置taglib的uri的2种方法
    根据二叉树中序序列画出二叉树
    不要把<a href="">当作按钮用
    由于没有正确使用Connection.setAutoCommit(false)而导致SQL语句没有被提交
    由于没有发现潜在的递归导致MySQL链接数溢出:MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connec
    解决:eclipse配置Database Connections报错Communications link failure Last packet sent to the server was 0 ms ago
    eclipse配置代码自动补全auto-completion
    oracle 创建表空间用户
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3453956.html
Copyright © 2011-2022 走看看