// the main function void HariMain(void) { char *vram; int xsize; int ysize; unsigned int memtotal; struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR ; struct BOOTINFO *binfo; struct SHTCTL *shtctl; struct SHEET *sht_back, *sht_mouse, *sht_win,*sht_cons; unsigned char *buf_back, buf_mouse[256],*buf_win; int i; int fifobuf[128]; char s[40]; struct FIFO fifo; fifo_init(&fifo,128,fifobuf,0); static char keytable0[0x80] = { 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 0, 0, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', 0, 0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', ':', 0, 0, ']', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.', '/', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x5c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x5c, 0, 0 }; static char keytable1[0x80] = { 0, 0, '!', 0x22, '#', '$', '%', '&', 0x27, '(', ')', '~', '=', '~', 0, 0, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '`', '{', 0, 0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', '+', '*', 0, 0, '}', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '_', 0, 0, 0, 0, 0, 0, 0, 0, 0, '|', 0, 0 }; init_gdtidt(); init_pic(); io_sti(); init_pit(); // timer io_out8(PIC0_IMR, 0xf8); /* PIC1 (11111000) irq0 */ io_out8(PIC1_IMR, 0xef); //11101111 , allow irq12 struct TIMER *timer; timer = timer_alloc(); timer_set(timer,50,&fifo,1); init_keyboard(&fifo,256); // memory test memtotal = memtest(0x00400000, 0xbfffffff); // available maxmium address memman_init(memman); memman_free(memman,0x00001000,0x0009e000); memman_free(memman,0x00400000,memtotal-0x00400000); init_palette(); binfo = (struct BOOTINFO *) 0x0ff0; xsize = binfo->scrnx; ysize = binfo->scrny; vram = binfo->vram; // sheet setting shtctl = shtctl_init(memman, binfo->vram, binfo->scrnx, binfo->scrny); sht_back = sheet_alloc(shtctl); sht_mouse = sheet_alloc(shtctl); sht_win = sheet_alloc(shtctl); buf_back = (unsigned char *) memman_alloc_4k(memman, binfo->scrnx * binfo->scrny); buf_win = (unsigned char *) memman_alloc_4k(memman,160 * 52); // window sheet buffer sheet_setbuf(sht_back, buf_back, binfo->scrnx, binfo->scrny, -1); sheet_setbuf(sht_mouse, buf_mouse, 16, 16, 99); // col_inv 99 sheet_setbuf(sht_win, buf_win,144,52,-1); /* initlize OS background */ init_screen(buf_back,xsize,ysize); int mx,my; // mouse position // mouse cursor struct MOUSE_DEC mdec; enable_mouse(&fifo,512,&mdec); init_mouse_cursor8(buf_mouse,99); // window a setting make_window8(buf_win,144,52,"task a",1); int cursor_x,cursor_c; // cursor color make_textbox8(sht_win, 8,28,128,16,COL8_FFFFFF); // heigth is 16 cursor_x = 8; cursor_c = COL8_FFFFFF; mx = (binfo->scrnx - 16) / 2; my = (binfo->scrny - 28 - 16) / 2; // task block struct TASK *curr,*console; curr = task_init(memman); fifo.task = curr; taskrun(curr,1,0); // set to level 1 // sheet console unsigned char *buf_cons; sht_cons = sheet_alloc(shtctl); buf_cons = (unsigned char *) memman_alloc_4k(memman, 256*165); sheet_setbuf(sht_cons,buf_cons,256,165,-1); make_shell(buf_cons,256,165,"console",0); //make_textbox8(sht_cons, 8,28,240,128,COL8_000084); console = task_alloc(); console->tss.esp = memman_alloc_4k(memman,64*1024) + 64 * 1024 -8; console->tss.eip = (int) &task_console; console->tss.es = 1*8; console->tss.cs = 2*8; console->tss.ss = 1*8; console->tss.ds = 1*8; console->tss.fs = 1*8; console->tss.gs = 1*8; *((int *) (console->tss.esp + 4)) = (int) sht_cons; // memory share taskrun(console,2,2); // level2,different priorities sheet_move(sht_back,0,0);// move background sheet sheet_move(sht_mouse,mx,my); sheet_move(sht_win,8,56); sheet_move(sht_cons,100,200); sheet_updown(sht_back,0); // height 0, at the bottom sheet_updown(sht_cons,1); sheet_updown(sht_win,2); sheet_updown(sht_mouse,3); sprintf(s,"%3d %3d",mx,my); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, s); sprintf(s, "memory %dMB free %dkb", memtotal/(1024*1024), memman_total(memman)/1024); putfonts8_asc(buf_back, binfo->scrnx, 0, 32, COL8_FFFFFF, s); sheet_refresh(sht_back,0,0,binfo->scrnx,48); // tab key int key_to=0; int key_shift = 0; int key_leds = ((binfo->leds) >> 4) & 7; // caps,numlock,scrolllock for(;;) { io_cli(); // forbid all interrupts if(fifo_status(&fifo) == 0) {task_sleep(curr); io_sti(); } else { i=fifo_get(&fifo); io_sti(); // open interrupts if(255 < i && i < 512) {sprintf(s, "%02X", i-256); boxfill8(buf_back, binfo->scrnx, COL8_008400, 0, 16, 15, 31); putfonts8_asc(buf_back, binfo->scrnx, 0, 16, COL8_FFFFFF, s); sheet_refresh(sht_back,0,16,16,32); if(i<256 +0x80) { if(key_shift == 0) s[0]= keytable0[i-256]; else s[0]= keytable1[i-256]; } else s[0] =0; if(s[0] >= 'A' && s[0]<= 'Z') { if(((key_leds & 4) == 0 && key_shift == 0) || ((key_leds & 4) == 1 && key_shift != 0)) s[0]+=0x20; } if (s[0] != 0) { // common character if (key_to == 0) { /* ^XNAÖ */ if (cursor_x < 128) { s[1] = 0; bps(sht_win, cursor_x, 28, COL8_FFFFFF, COL8_000000, s, 1); cursor_x += 8; } } else// send to console fifo_put(&console->fifo, s[0] + 256); } if(i == 256 + 0x0e && cursor_x > 8) // backspace key { if(key_to == 0) { bps(sht_win,cursor_x,28,COL8_FFFFFF,COL8_000000," ",1); cursor_x -=8; } else { fifo_put(&console->fifo,8+256); } } if(i == 256 + 0x0f) // Tab key { if(key_to == 0) { key_to =1; make_wtitle8(buf_win, sht_win->bxsize,"task a",0); shell_title(buf_cons, sht_cons->bxsize,"console",1); } else { key_to =0; make_wtitle8(buf_win, sht_win->bxsize,"task a",1); shell_title(buf_cons, sht_cons->bxsize,"console",0); } sheet_refresh(sht_win,0,0,sht_win->bxsize,21); sheet_refresh(sht_cons,0,0,sht_cons->bxsize,21); } if (i == 256 + 0x2a) key_shift |= 1; if (i == 256 + 0x36) key_shift |= 2; if (i == 256 + 0xaa) key_shift &= ~1; if (i == 256 + 0xb6) key_shift &= ~2; if (i == 256 + 0x3a) // CapsLock key_leds ^= 4; if (i == 256 + 0x45) // NumLock key_leds ^= 2; if (i == 256 + 0x46) // ScrollLock key_leds ^= 1; boxfill8(sht_win ->buf, sht_win->bxsize, cursor_c,cursor_x,28,cursor_x+7,43); sheet_refresh(sht_win,cursor_x,28,cursor_x+8,44); } else if(511 < i && i < 768) { if(mouse_decode(&mdec,i-512) != 0) { 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, 16, 32+15*8-1, 31); // after filling,show ok putfonts8_asc(buf_back, binfo->scrnx, 32, 16, COL8_FFFFFF, s); sheet_refresh(sht_back,32,16,32+15*8,32); // the move of mouse mx +=mdec.x; my +=mdec.y; if(mx <0) mx = 0; if(my <0) my = 0; if(mx > binfo->scrnx -1 ) mx = binfo->scrnx -1; if(my > binfo->scrny -1 ) my = binfo->scrny -1; // control the mouse move area sprintf(s, "(%3d,%3d)", mx,my); boxfill8(buf_back, binfo->scrnx, COL8_008484, 0, 0,79, 15); putfonts8_asc(buf_back, binfo->scrnx, 0, 0, COL8_FFFFFF, s); sheet_refresh(sht_back,0,0,80,16); sheet_move(sht_mouse,mx,my); // move the window, vram -> sht -> move if((mdec.btn & 0x01) != 0) sheet_move(sht_win,mx-80,my-8); } } else if(i == 1) { timer_set(timer,50,&fifo,0); boxfill8(sht_win->buf,sht_win->bxsize, COL8_000000, cursor_x, 28,cursor_x+7, 43); sheet_refresh(sht_win,cursor_x,28,cursor_x + 8, 44); } else if(i==0) { timer_set(timer,50,&fifo,1); // keep the data boxfill8(sht_win->buf,sht_win->bxsize, COL8_FFFFFF,cursor_x, 28,cursor_x + 7, 43); sheet_refresh(sht_win,cursor_x,28,cursor_x + 8, 44); } } } }
void HariMain(void) { char *vram; int xsize; int ysize; unsigned int memtotal; struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR ; struct BOOTINFO *binfo; struct SHTCTL *shtctl; struct SHEET *sht_back, *sht_mouse, *sht_win; unsigned char *buf_back, buf_mouse[256],*buf_win; int i; int fifobuf[128]; char s[40]; struct FIFO fifo; fifo_init(&fifo,128,fifobuf); static char keytable[0x54] = { 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 0, 0, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', 0, 0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', ':', 0, 0, ']', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.', '/', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.' }; init_gdtidt(); init_pic(); io_sti(); init_pit(); // timer io_out8(PIC0_IMR, 0xf8); /* PIC1 (11111001) irq0 */ io_out8(PIC1_IMR, 0xef); //11101111 , allow irq12 struct TIMER *timer,*timer2,*timer3; timer = timer_alloc(); timer2 = timer_alloc(); timer3 = timer_alloc(); timer_set(timer,1000,&fifo,10); timer_set(timer2,300,&fifo,3); timer_set(timer3,50,&fifo,1); init_keyboard(&fifo,256); // memory test memtotal = memtest(0x00400000, 0xbfffffff); // available maxmium address memman_init(memman); memman_free(memman,0x00001000,0x0009e000); memman_free(memman,0x00400000,memtotal-0x00400000); init_palette(); binfo = (struct BOOTINFO *) 0x0ff0; xsize = binfo->scrnx; ysize = binfo->scrny; vram = binfo->vram; // sheet setting shtctl = shtctl_init(memman, binfo->vram, binfo->scrnx, binfo->scrny); sht_back = sheet_alloc(shtctl); sht_mouse = sheet_alloc(shtctl); sht_win = sheet_alloc(shtctl); buf_back = (unsigned char *) memman_alloc_4k(memman, binfo->scrnx * binfo->scrny); buf_win = (unsigned char *) memman_alloc_4k(memman,160 * 52); // window sheet buffer sheet_setbuf(sht_back, buf_back, binfo->scrnx, binfo->scrny, -1); sheet_setbuf(sht_mouse, buf_mouse, 16, 16, 99); // col_inv 99 sheet_setbuf(sht_win, buf_win,160,52,-1); /* initlize OS background */ init_screen(buf_back,xsize,ysize); int mx,my; // mouse position // mouse cursor struct MOUSE_DEC mdec; enable_mouse(&fifo,512,&mdec); init_mouse_cursor8(buf_mouse,99); make_window8(buf_win,160,52,"window"); mx = (binfo->scrnx - 16) / 2; my = (binfo->scrny - 28 - 16) / 2; sheet_move(sht_back,0,0);// move background sheet sheet_move(sht_mouse,mx,my); sheet_move(sht_win,80,72); sheet_updown(sht_back,0); // height 0, at the bottom sheet_updown(sht_win,1); sheet_updown(sht_mouse,2); // height 2,on the top sprintf(s,"%3d %3d",mx,my); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, s); sprintf(s, "memory %dMB free %dkb", memtotal/(1024*1024), memman_total(memman)/1024); putfonts8_asc(buf_back, binfo->scrnx, 0, 32, COL8_FFFFFF, s); sheet_refresh(sht_back,0,0,binfo->scrnx,48); int cursor_x,cursor_c; // cursor color make_textbox8(sht_win, 8,28,144,16,COL8_FFFFFF); // heigth is 16 cursor_x = 8; cursor_c = COL8_FFFFFF; for(;;) { //sprintf(s,"%010d",timerctl.count); //bps(sht_win,40,28, COL8_C6C6C6,COL8_000000,s,10); io_cli(); // forbid all interrupts if(fifo_status(&fifo) == 0) io_stihlt(); // read data until it's empty else { i=fifo_get(&fifo); io_sti(); // open interrupts if(255 < i && i < 512) {sprintf(s, "%02X", i-256); boxfill8(buf_back, binfo->scrnx, COL8_008400, 0, 16, 15, 31); putfonts8_asc(buf_back, binfo->scrnx, 0, 16, COL8_FFFFFF, s); sheet_refresh(sht_back,0,16,16,32); if(i<256 +0x54) { if(keytable[i-256] != 0 && cursor_x < 144) { s[0]= keytable[i-256]; s[1]= '\0'; bps(sht_win,cursor_x,28, COL8_FFFFFF,COL8_000000,s,1); // 4th parm is background color cursor_x +=8; // cursor move forward } } if(i == 256 + 0x0e && cursor_x > 8) { bps(sht_win,cursor_x,28,COL8_FFFFFF,COL8_000000," ",1); cursor_x -=8; } boxfill8(sht_win ->buf, sht_win->bxsize, cursor_c,cursor_x,28,cursor_x+7,43); sheet_refresh(sht_win,cursor_x,28,cursor_x+8,44); } else if(511 < i && i < 768) { if(mouse_decode(&mdec,i-512) != 0) { 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, 16, 32+15*8-1, 31); // after filling,show ok putfonts8_asc(buf_back, binfo->scrnx, 32, 16, COL8_FFFFFF, s); sheet_refresh(sht_back,32,16,32+15*8,32); // the move of mouse mx +=mdec.x; my +=mdec.y; if(mx <0) mx = 0; if(my <0) my = 0; if(mx > binfo->scrnx -1 ) mx = binfo->scrnx -1; if(my > binfo->scrny -1 ) my = binfo->scrny -1; // control the mouse move area sprintf(s, "(%3d,%3d)", mx,my); boxfill8(buf_back, binfo->scrnx, COL8_008484, 0, 0,79, 15); putfonts8_asc(buf_back, binfo->scrnx, 0, 0, COL8_FFFFFF, s); sheet_refresh(sht_back,0,0,80,16); sheet_move(sht_mouse,mx,my); // move the window, vram -> sht -> move if(mdec.btn & 0x01 != 0) sheet_move(sht_win,mx-80,my-8); } } else if(i==10) {putfonts8_asc(buf_back, binfo->scrnx,0,64, COL8_FFFFFF,"10"); sheet_refresh(sht_back,0,0,100,100); } else if(i ==3) {putfonts8_asc(buf_back, binfo->scrnx,0,80, COL8_FFFFFF,"3s"); sheet_refresh(sht_back,0,0,100,100); } else if(i == 1) { timer_set(timer3,50,&fifo,0); boxfill8(sht_win->buf,sht_win->bxsize, COL8_000000, cursor_x, 28,cursor_x+7, 43); sheet_refresh(sht_win,cursor_x,28,cursor_x + 8, 44); } else if(i==0) { timer_set(timer3,50,&fifo,1); // keep the data boxfill8(sht_win->buf,sht_win->bxsize, COL8_FFFFFF,cursor_x, 28,cursor_x + 7, 43); sheet_refresh(sht_win,cursor_x,28,cursor_x + 8, 44); } } } }
void bootmain(void) { /*进入30os的部分*/ struct boot_info *bootp=(struct boot_info *)ADDR_BOOT; init_screen((struct boot_info * )bootp); init_palette(); //color table from 0 to 15 //clear_screen(8); //red //draw_window(); int mx,my;//mouse position //display mouse logo char mousepic[16*16]; //mouse logo buffer //display_mouse(bootp->vram,bootp->xsize,16,16,mx,my,mousepic,16); cli(); //set gdt idt init_gdtidt(); //remap irq 0-15 //函数中: irq 1(keyboard)对应设置中断号int0x21, irq 12(mouse)对应的中断号是int0x2c 要写中断服务程序了。 init_pic(); //设置完了gdt,idt后再enable cpu interrupt才是安全的 unsigned char s[40]; //sprintf buffer unsigned char keybuf[32]; //keyfifo unsigned char mousebuf[128]; //mousefifo unsigned char data; //temp variable to get fifo data int count=0; fifo8_init(&keyfifo ,32,keybuf);//keyfifo是一个global data defined in int.c fifo8_init(&mousefifo,128,mousebuf); //enable timer ,keyboard and mouse //1111 1000 后面的三个0代表 accept interrupt request, irq0=timer interrupt outb(PIC0_IMR, 0xf8);//1111 1000 irq 1 2打开 因为keyboard是irq 1,irq2 enable 8259B 芯片发生的中断请求 // enable pic slave and keyboard interrupt //enable mouse interrupt 1110 1111 irq 12 打开 mouse是irq 12 所以要把pic 1 pic 2的芯片中断响应位打开。 outb(PIC1_IMR, 0xef); //初始化 鼠标按键控制电路 init_keyboard(); //enable cpu interrupt unsigned int memtotal; //get the total memory memtotal=memtest(0x400000,0xffffffff); //mem=mem>>20; //convert to MBytes //sprintf(s,"memory:%dMbytes",mem); //puts8((char *)bootp->vram ,bootp->xsize,0,100,0,s); Memman * memman=(Memman *)0x3c0000; memman_init(memman); //memman_free(memman,0x1000,0x9e000); memman_free(memman,0x400000,memtotal-0x400000); //memman_free(memman,0x600000,0x400000); //memman_free(memman,0xb00000,0x400000); char *desktop=(unsigned char*)memman_alloc(memman,320*200); printdebug(desktop,0); //while(1); char *win_buf=(unsigned char*)memman_alloc_4K(memman,160*65); TIMERCTL *timerctl=(TIMERCTL *)memman_alloc_4K(memman,sizeof(TIMERCTL)); gtimerctl=timerctl; init_pit(timerctl);//init timerctl draw_win_buf(desktop); make_window8(win_buf,160,68,"timer"); init_mouse(mousepic,99); //99 means background color sprintf(s,"memory:%dMB,free:%dMB,%d",memtotal>>20 ,memman_avail(memman)>>20,memman->cellnum); puts8(desktop ,bootp->xsize,0,150,0,s); SHTCTL *shtctl; shtctl=shtctl_init(memman,bootp->vram,bootp->xsize,bootp->ysize); SHEET *sht_back,*sht_mouse,*sht_win; //allocate a sheet space from shtctl sht_back=sheet_alloc(shtctl); sht_mouse=sheet_alloc(shtctl); sht_win=sheet_alloc(shtctl); //write something inside the window //puts8(win_buf ,160,24,28,0,"hello ,easy os"); //puts8(win_buf ,160,24,44,0,"second line");//y=28+16=44 //hoop the buffer with sheet sheet_setbuf(sht_back,desktop,320,200,-1); sheet_setbuf(sht_mouse,mousepic,16,16,99); sheet_setbuf(sht_win,win_buf,160,65,-1); mx=0;my=0;//set mouse initial position sheet_move(sht_back,0,0); sheet_move(sht_mouse,mx,my); sheet_move(sht_win,80,72); //set sht_back to layer0 ;set sht_mouse to layer1 sheet_updown(sht_back,0); sheet_updown(sht_win,1); sheet_updown(sht_mouse,2); //refresh a specific rectangle sheet_refresh(sht_back,0,0,bootp->xsize,bootp->ysize); struct FIFO8 timerfifo,timerfifo2,timerfifo3; char timerbuf[8],timerbuf2[8],timerbuf3[8]; TIMER *timer,*timer2,*timer3; fifo8_init(&timerfifo,8,timerbuf); fifo8_init(&timerfifo2,8,timerbuf2); fifo8_init(&timerfifo3,8,timerbuf3); timer=timer_alloc(timerctl,0); timer2=timer_alloc(timerctl,1); timer3=timer_alloc(timerctl,2); timer_init(timer,&timerfifo,1); timer_init(timer2,&timerfifo2,1); timer_init(timer3,&timerfifo3,1); //while(1); timer_settime(timer,1000,timerctl); timer_settime(timer2,100,timerctl); timer_settime(timer3,30,timerctl); sti(); struct MOUSE_DEC mdec; enable_mouse(&mdec); //这里会产生一个mouse interrupt while(1) { sprintf(s,"%d",timerctl->count); boxfill8(win_buf,160,8,20,44,140,60); puts8(win_buf ,160,20,44,0,s);//y=28+16=44 sheet_refresh(sht_win,20,28,140,60); sti(); if(fifo8_status(&keyfifo) + fifo8_status(&mousefifo) + fifo8_status(&timerfifo) + fifo8_status(&timerfifo2) + fifo8_status(&timerfifo3) == 0)//no data in keyfifo and mousefifo { //sti(); //hlt();//wait for interrupt } else { if(fifo8_status(&keyfifo) != 0) { data=fifo8_read(&keyfifo); sti(); }//end of keyboard decoder else if(fifo8_status(&mousefifo) != 0)//we have mouse interrupt data to process { data=fifo8_read(&mousefifo); sti(); if(mouse_decode(&mdec,data)) { //3个字节都得到了 switch (mdec.button) { case 1:s[1]='L';break; case 2:s[3]='R';break; case 4:s[2]='M';break; } sprintf(s,"[lmr:%d %d]",mdec.x,mdec.y); boxfill8(desktop,320,0,32,16,32+15*8-1,33);//一个黑色的小box puts8(desktop,bootp->xsize,32,16,7,s); //display e0 sheet_refresh(sht_back,32,16,32+20*8-1,31); #define white 7 //because we use sheet layer ,so we do not need this any more //boxfill8(p,320,white,mx,my,mx+15,my+15);//用背景色把鼠标原来的color填充,这样不会看到鼠标移动的path mx +=mdec.x;//mx=mx+dx my +=mdec.y;//my=my+dy if(mx<0) { mx=0; } if(my<0) { my=0; } if(mx>bootp->xsize-1) { mx=bootp->xsize-1; } if(my>bootp->ysize-1) { my=bootp->ysize-1; } sprintf(s,"(%d, %d)",mx,my); boxfill8(desktop,320,0,0,0,79,15);//坐标的背景色 puts8(desktop ,bootp->xsize,0,0,7,s);//显示坐标 sheet_refresh(sht_back,0,0,bootp->xsize,15); sheet_move(sht_mouse,mx,my); } }//end of mouse decoder else if(fifo8_status(&timerfifo)!=0) { data=fifo8_read(&timerfifo); sti(); puts8(desktop ,bootp->xsize,0,64,0,"10[sec]");//显示坐标 sheet_refresh(sht_back,0,64,bootp->xsize,80); //printdebug(99,80); }//end of timer else if(fifo8_status(&timerfifo2)!=0) { data=fifo8_read(&timerfifo2); sti(); puts8(desktop ,bootp->xsize,0,80,0,"3[sec]");//显示坐标 sheet_refresh(sht_back,0,80,bootp->xsize,96); // printdebug(16,150); // while(1); }//end of timer2 else if(fifo8_status(&timerfifo3)!=0)//cursor blink { data=fifo8_read(&timerfifo3); sti(); //static unsigned a=0;a++;//因为你没有把里面的数据读走,所以一直会进来 //printdebug(a,0); if(data!=0) { timer_init(timer3,&timerfifo3,0); boxfill8(desktop,bootp->xsize,7,8,96,15,111); } else { timer_init(timer3,&timerfifo3,1); boxfill8(desktop,bootp->xsize,0,8,96,15,111); } timer_settime(timer3,50,timerctl); sheet_refresh(sht_back,8,96,15,111); sheet_refresh(sht_back,250,100,320,108); }//end of timer3 } } }