这里为了节省篇幅和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); } } } } }