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