Example #1
0
/*
============
Init_All
============
*/
void CInput::Init_All (void)
{
	Assert( !m_pCommands );
	m_pCommands = new CUserCmd[ MULTIPLAYER_BACKUP ];
	m_pVerifiedCommands = new CVerifiedUserCmd[ MULTIPLAYER_BACKUP ];

	m_fMouseInitialized	= false;
	m_fRestoreSPI		= false;
	m_fMouseActive		= false;
	Q_memset( m_rgOrigMouseParms, 0, sizeof( m_rgOrigMouseParms ) );
	Q_memset( m_rgNewMouseParms, 0, sizeof( m_rgNewMouseParms ) );
	Q_memset( m_rgCheckMouseParam, 0, sizeof( m_rgCheckMouseParam ) );

	m_rgNewMouseParms[ MOUSE_ACCEL_THRESHHOLD1 ] = 0;	// no 2x
	m_rgNewMouseParms[ MOUSE_ACCEL_THRESHHOLD2 ] = 0;	// no 4x
	m_rgNewMouseParms[ MOUSE_SPEED_FACTOR ] = 1;		// 0 = disabled, 1 = threshold 1 enabled, 2 = threshold 2 enabled

	m_fMouseParmsValid	= false;
	m_fJoystickAdvancedInit = false;
	m_fHadJoysticks = false;
	m_flLastForwardMove = 0.0;

	// Initialize inputs
	if ( IsPC() )
	{
		Init_Mouse ();
		Init_Keyboard();
	}
		
	// Initialize third person camera controls.
	Init_Camera();
}
Example #2
0
/*
 * Kernel C code entry point.
 * Initializes kernel subsystems, mounts filesystems,
 * and spawns init process.
 */
void Main(struct Boot_Info* bootInfo)
{
    Init_BSS();
    Init_Screen();
    Init_Mem(bootInfo);
    Init_CRC32();
    Init_TSS();
    Init_Interrupts();
    Init_Scheduler();
    Init_Traps();
    Init_Timer();
    Init_Keyboard();


    Set_Current_Attr(ATTRIB(BLACK, GREEN|BRIGHT));
    Print("Welcome to GeekOS!\n");
    Set_Current_Attr(ATTRIB(BLACK, GRAY));
	


/*    TODO("Start a kernel thread to echo pressed keys and print counts");*/
	Start_Kernel_Thread(&funct_eigen, 0, PRIORITY_NORMAL, false);


    /* Now this thread is done. */
    Exit(0);
}
Example #3
0
/*
 * Kernel C code entry point.
 * Initializes kernel subsystems, mounts filesystems,
 * and spawns init process.
 */
void Main(struct Boot_Info* bootInfo)
{
    Init_BSS();
    Init_Screen();
    Init_Mem(bootInfo);
    Init_CRC32();
    Init_TSS();
    Init_Interrupts();
    Init_Scheduler();
    Init_Traps();
    Init_Timer();
    Init_Keyboard();
    Init_DMA();
    Init_Floppy();
    Init_IDE();
    Init_PFAT();

    Mount_Root_Filesystem();

    Set_Current_Attr(ATTRIB(BLACK, GREEN|BRIGHT));
    Print("Welcome to GeekOS!\n");
    Set_Current_Attr(ATTRIB(BLACK, GRAY));




    Spawn_Init_Process();

    /* Now this thread is done. */
    Exit(0);
}
Example #4
0
/*
============
Init_All
============
*/
void CInput::Init_All (void)
{
	Assert( !m_pCommands );
	m_pCommands = new CUserCmd[ MULTIPLAYER_BACKUP ];
	m_pVerifiedCommands = new CVerifiedUserCmd[ MULTIPLAYER_BACKUP ];

	m_fMouseInitialized	= false;
	m_fRestoreSPI		= false;
	m_fMouseActive		= false;
	m_fCameraInterceptingMouse = false;
	Q_memset( m_rgOrigMouseParms, 0, sizeof( m_rgOrigMouseParms ) );
	Q_memset( m_rgNewMouseParms, 0, sizeof( m_rgNewMouseParms ) );
	Q_memset( m_rgCheckMouseParam, 0, sizeof( m_rgCheckMouseParam ) );

	m_rgNewMouseParms[ MOUSE_ACCEL_THRESHHOLD1 ] = 0; // no 2x
	m_rgNewMouseParms[ MOUSE_ACCEL_THRESHHOLD2 ] = 0; // no 4x
	m_rgNewMouseParms[ MOUSE_SPEED_FACTOR ] = 1; // slowest (10 default, 20 max)

	m_fMouseParmsValid	= false;
	m_fJoystickAdvancedInit = false;
	m_flLastForwardMove = 0.0;

	// Initialize inputs
	if ( IsPC() )
	{
		Init_Mouse ();
		Init_Keyboard();
	}
}
Example #5
0
File: start.c Project: caisan/mytos
void cinit()
{
	ticks=0;
	position=800;
	startposition=0;
	mouse_x=0;
	mouse_y=0;
	mouse_state=0;
	NR_user=0;
	NR_task=0;
	Disp_Machine_Info();
//	Init_Paging();
	Init_Mem();
	disp_str("Initializing Memory........\n");
	Init_IRQ();	
	disp_str("Enable IRQ........\n");
	Init_Prot();
	disp_str("Enable protection........\n");
	Init_Mouse();
	Init_Keyboard();
	disp_str("Enable Keyboard........\n");
	Init_Process();
	disp_str("Initializing Process........\n");
	Init_Clock();
	disp_str("Enable PIT........\n");
	Init_x87_FPU();
	Update_Cursor(position);
	Init_VM8086();
//	Init_Ne2k();

}
Example #6
0
void Main(struct Boot_Info *bootInfo) {
    Init_BSS();
    Init_Screen();
    Init_Mem(bootInfo);
    Init_CRC32();
    Init_TSS();

    lockKernel();
    Init_Interrupts(0);
    Init_SMP();
    TODO_P(PROJECT_VIRTUAL_MEMORY_A,
           "initialize virtual memory page tables.");
    Init_Scheduler(0, (void *)KERN_STACK);
    Init_Traps();
    Init_Local_APIC(0);
    Init_Timer();

    Init_Keyboard();
    Init_DMA();
    /* Init_Floppy(); *//* floppy initialization hangs on virtualbox */
    Init_IDE();
    Init_PFAT();
    Init_GFS2();
    Init_GOSFS();
    Init_CFS();
    Init_Alarm();

    Release_SMP();

    /* Initialize Networking */
    Init_Network_Devices();
    Init_ARP_Protocol();
    Init_IP();
    Init_Routing();
    Init_Sockets();
    Init_RIP();
    /* End networking subsystem init */

    /* Initialize Sound */
    Init_Sound_Devices();
    /* End sound init */

    Mount_Root_Filesystem();

    TODO_P(PROJECT_VIRTUAL_MEMORY_A, "initialize page file.");

    Set_Current_Attr(ATTRIB(BLACK, GREEN | BRIGHT));
    Print("Welcome to GeekOS!\n");
    Set_Current_Attr(ATTRIB(BLACK, GRAY));

    TODO_P(PROJECT_SOUND, "play startup sound");

    Spawn_Init_Process();

    /* it's time to shutdown the system */
    Hardware_Shutdown();

    /* we should not get here */
}
Example #7
0
/*
 * Kernel C code entry point.
 * Initializes kernel subsystems, mounts filesystems,
 * and spawns init process.
 */
void Main(struct Boot_Info *bootInfo) {



    Init_BSS();
    Init_Screen();
    Init_Mem(bootInfo);
    Init_CRC32();
    Init_TSS();
    Init_Interrupts();
    Init_Scheduler();
    Init_Traps();
    Init_Timer();
    Init_Keyboard();
    Init_DMA();
    Init_Floppy();
    Init_IDE();
    Init_PFAT();
    Init_GFS2();
    Init_GOSFS();
    Init_Alarm();

    /* Initialize Networking */
    Init_Network_Devices();
    Init_ARP_Protocol();
    Init_IP();
    Init_Routing();
    Init_Sockets();
    Init_RIP();
    /* End networking subsystem init */

    Mount_Root_Filesystem();

    Set_Current_Attr(ATTRIB(BLACK, GREEN | BRIGHT));
    Print("Welcome to GeekOS!\n");
    Set_Current_Attr(ATTRIB(BLACK, GRAY));

    Spawn_Init_Process();

    /* Now this thread is done. */
    Exit(0);
}
Example #8
0
/*
 * Kernel C code entry point.
 * Initializes kernel subsystems, mounts filesystems,
 * and spawns init process.
 */
void Main(struct Boot_Info* bootInfo)
{
    Init_BSS();
    Init_Screen();
    Init_Mem(bootInfo);
    Init_CRC32();
    Init_TSS();
    Init_Interrupts();
    Init_Scheduler();
    Init_Traps();
    Init_Timer();
    Init_Keyboard();

    Set_Current_Attr(ATTRIB(BLACK, GREEN|BRIGHT));
    Print("Welcome to GeekOS!\n");
    Set_Current_Attr(ATTRIB(BLACK, GRAY));
    Start_Kernel_Thread(Print_Key_Pressed, 0, PRIORITY_NORMAL, false);

    /* Now this thread is done. */
    Exit(0);
}
Example #9
0
void Main(struct Boot_Info *bootInfo) {
    Init_BSS();
    Init_Screen();
    Init_Mem(bootInfo);
    Init_CRC32();
    TODO_P(PROJECT_PERCPU, "Initialize PERCPU");
    Init_TSS();

    /* by modifying begin_int_atomic to autolock if not locked when interrupts are disabled, 
       this lockKernel() became duplicative */
    /* lockKernel(); */
    Init_Interrupts(0);
    Print("Init_SMP\n");
    Init_SMP();
    Print("/Init_SMP\n");
    TODO_P(PROJECT_VIRTUAL_MEMORY_A,
           "initialize virtual memory page tables.");
    Init_Scheduler(0, (void *)KERN_STACK);
    Init_Traps();
    Init_Local_APIC(0);
    Init_Timer();

    Init_Keyboard();
    Init_DMA();
    /* Init_Floppy(); *//* floppy initialization hangs on virtualbox */
    Init_IDE();
    Init_PFAT();
    if(Init_GFS2)
        Init_GFS2();
    if(Init_GFS3)
        Init_GFS3();
    Init_GOSFS();
    Init_CFS();
    Init_Alarm();
    Init_Serial();

    Print("the global lock is %sheld.\n",
          Kernel_Is_Locked()? "" : "not ");

    Release_SMP();

    /* Initialize Networking */
    /* 
       Init_Network_Devices();
       Init_ARP_Protocol();
       Init_IP();
       Init_Routing();
       Init_Sockets();
       Init_RIP();
     */
    /* End networking subsystem init */

    /* Initialize Sound */
    Init_Sound_Devices();
    /* End sound init */

    Mount_Root_Filesystem();

    TODO_P(PROJECT_VIRTUAL_MEMORY_A, "initialize page file.");

    Set_Current_Attr(ATTRIB(BLACK, GREEN | BRIGHT));
    Print("Welcome to GeekOS!\n");
    Set_Current_Attr(ATTRIB(BLACK, GRAY));

    TODO_P(PROJECT_SOUND, "play startup sound");

    TODO_P(PROJECT_SERIAL,
           "Initialize the serial console and start the shell.");

    Spawn_Init_Process();

    /* it's time to shutdown the system because Init exited. */
    Hardware_Shutdown();

    /* we should not get here */
}
Example #10
0
void HariMain(void)
{

/*-----相关变量定义----*/	
	struct BOOTINFO *stBootInfo= (struct BOOTINFO *) 0x0ff0;//获取启动时候保存的信息
	char s[100];//输出缓冲区
	char szTemp[40]; //KeyBuf[32], MouseBuf[128];
	int SysBuf[256];
	struct MOUSE_DEC mdec;
	
	/* 	定义一个MEMMAN结构指针(内存管理), 指向MEMMAN_ADDR也就是0x3c0000*/
	struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;	
	
	struct SHTCTL *shtctl;		/* 图层管理结构指针 */
	struct SHEET *Sht_Back, *Sht_Mouse, *Sht_Win,*Sht_TaskWin[2];	/* 背景以及鼠标的图层指针 */
	unsigned char *Buf_Back, Buf_Mouse[256],*Buf_Win,*Buf_TaskWin[2];
	struct TIMER *timer;

	struct TASK *task_a, *task_b[3];
	//struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;	/* 申请一个段描述符 */
	
	//窗体移动相关变量
	//
	int mmx=-1,mmy=-1;
	struct SHEET *sht=0;
	
	/* 没有按shift */
	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
	};
	/* 按下shift后 */
	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
	};
	int key_shift = 0;
	int key_leds = (stBootInfo->leds >> 4) & 7;
	int key_wait = -1;
	
/*-----系统初始化操作----*/
	unsigned char *vram=stBootInfo->vram;
	int nXSize=stBootInfo->scrnx;
	int nYSize=stBootInfo->scrny;
	init_palette();		/* 初始化调色板 */
	init_gdtidt();		//初始化GDT, IDT 表
	
	Init_PIC();			/* 初始化PIC */
	io_sti();			/* 打开所有可屏蔽中断 */
	init_pit();			/*初始化 时钟中断*/
	
	io_out8(PIC0_IMR, 0xf8); /* PIC0(11111000) (打开IRQ0时钟中断、IRQ1键盘中断和连接从PIC的IRQ2)*/
	io_out8(PIC1_IMR, 0xef); /* PIC1(11101111) (打开PS2鼠标中断 即IRQ12)*/
	
/*----初始化鼠标键盘操作----*/
	nKeyData0=256;
	nMouseData0=512;
	//	io_out8(PIC0_IMR, 0xf9); /* 这个bug调我N久,注视下留个纪念。。*/

	//io_out8(PIC1_IMR, 0xef); /* PIC1(11101111) (打开PS2鼠标中断 即IRQ12)*/	
	Init_Keyboard();/*初始化键盘控制电路*/	
	Enable_Mouse(&mdec);		/* 激活鼠标 */

/*----内存操作----*/
	/* 检测4M~3G-1的内存,4M之前被占用,不能检测 */
	unsigned int nMemMaxSize=memtest(0x00400000, 0xbfffffff);	
	memman_init(memman);	/* 初始化内存管理结构 */
	
	/* 这段内存是4K~636K-1,这段内存是4K~636K-1,映像刚开始载入内存的内容,包括引导程序那部分*/
	memman_free(memman, 0x00001000, 0x0009e000); 	/* 0x00001000 - 0x0009efff */
	memman_free(memman, 0x00400000, nMemMaxSize - 0x00400000);	/* 4M~内存实际大小,4M之前用于保存相关数据,预留了很多空间备用 */


	
/*----图形操作----*/
	shtctl = shtctl_init(memman,vram,nXSize,nYSize);	/* 初始化图层管理结构 */
	Sht_Back  = sheet_alloc(shtctl);		/* 创建背景图层 */
	Sht_Mouse = sheet_alloc(shtctl);		/* 创建鼠标图层 */
	Sht_Win   = sheet_alloc(shtctl);		/* 创建窗口图层 */
	Sht_TaskWin[0]	= sheet_alloc(shtctl);		/* 创建任务1图层 */
	Sht_TaskWin[1]	= sheet_alloc(shtctl);		/* 创建任务2图层 */
	
	Buf_Back  = (unsigned char *) memman_alloc_4k(memman, nXSize * nYSize);	/* 分配内存空间 用于绘制背景*/
	Buf_Win   = (unsigned char *) memman_alloc_4k(memman, 450 * 300);	/* 分配内存空间 用于绘制"窗口 */
	Buf_TaskWin[0] = (unsigned char *) memman_alloc_4k(memman, 170 * 75);
	Buf_TaskWin[1] = (unsigned char *) memman_alloc_4k(memman, 170 * 75);
	
	sheet_setbuf(Sht_Back, Buf_Back, nXSize,nYSize, -1); 			/* 设置背景图层信息 */
	sheet_setbuf(Sht_Mouse, Buf_Mouse, 16, 16, COL_BACK_BLUE);		/* 设置鼠标图层信息 */
	sheet_setbuf(Sht_Win, Buf_Win, 450, 300, -1);					/* 设置窗口图层信息 */
	sheet_setbuf(Sht_TaskWin[0], Buf_TaskWin[0], 170, 75, -1);
	sheet_setbuf(Sht_TaskWin[1], Buf_TaskWin[1], 170, 75, -1);
	
	Init_MouseCur(Buf_Mouse, COL_BACK_BLUE);		/* 初始化鼠标图形 */
	DrawBack(Buf_Back, nXSize, nYSize);	/* 绘制背景 */
	make_window8(Buf_Win, 450, 300, "NoteWindow");	/* 绘制窗口图形 */
	make_window_edit(Buf_Win, 450, 300);	/* 绘制窗口图形 */
	make_window8(Buf_TaskWin[0], 170, 75, "Task1");	/* 绘制窗口图形 */
	make_window8(Buf_TaskWin[1], 170, 75, "Task2");	/* 绘制窗口图形 */
	
	sheet_slide(Sht_Back, 0, 0);	/* 设置背景图层的位置 */
	sheet_slide(Sht_Win,  85, 160);				/* 设置窗口图层的位置 */
	sheet_slide(Sht_TaskWin[0], nYSize - 20, 60);				/* 设置窗口图层的位置 */
	sheet_slide(Sht_TaskWin[1], nYSize - 20, 140);				/* 设置窗口图层的位置 */
	
	int mx = (nXSize- 16) / 2; /* 计算鼠标图形在屏幕上的位置 它在整个桌面的中心位置 */
	int my = (nYSize - 28 - 16) / 2;	
	sheet_slide(Sht_Mouse, mx, my);	/* 设置鼠标图层的位置 */
	
	sheet_updown(Sht_Back,  0);		/* 调整背景图层和鼠标图层的高度 */
	
	sheet_updown(Sht_TaskWin[0],   1);	
	sheet_updown(Sht_TaskWin[1],   2);	
	sheet_updown(Sht_Win,   -1);		/* 调整默认窗口 */
	sheet_updown(Sht_Mouse, 4);		/* 并且会显示背景与鼠标图层 */
	
/*---任务切换相关---*/
	int i;
	/* 任务切换初始化(*/
	task_a = task_init(memman);//task_a 是内核任务
	fifo32_init(&SysFifo, 256, SysBuf,task_a);

	task_run(task_a, -1, 2);		/* 设置任务a的level和优先级 */
	
	for(i=0;i<3;i++)
	{
		task_b[i]=task_alloc();//分配一个任务
	
		task_b[i]->tss.esp = memman_alloc_4k(memman, 64 * 1024) + 64 * 1024 - 8;	/* 创建任务B的堆栈,64K */;
		
		task_b[i]->tss.es = 1 * 8;
		task_b[i]->tss.cs = 2 * 8;
		task_b[i]->tss.ss = 1 * 8;
		task_b[i]->tss.ds = 1 * 8;
		task_b[i]->tss.fs = 1 * 8;
		task_b[i]->tss.gs = 1 * 8;
	}
	
	task_b[0]->tss.eip = (int) &task_b_main;		/* 设置任务B的寄存器 */
	task_b[1]->tss.eip = (int) &task_b_main1;		/* 设置任务B的寄存器 */
	task_b[2]->tss.eip = (int) &task_win_main;		/* 设置任务Window的寄存器 */

	/* 先将task_b_esp + 4转换成int类型的指针  即(int *) (task_b_esp + 4) */
	/* 再将(int) sht_back赋值到该地址处*((int *) (task_b_esp + 4)) */
	*((int *) (task_b[0]->tss.esp + 4)) = (int) Sht_TaskWin[0];
	*((int *) (task_b[1]->tss.esp + 4)) = (int) Sht_TaskWin[1];
	*((int *) (task_b[2]->tss.esp + 4)) = (int) Sht_Win;
	
	//task_run(task_a, 10);//分配给内核最高优先级
	
	//task_run(task_b[0], 1);			
	//task_run(task_b[1], 2);	
	//task_run(task_b[2], 2);
	
	
/*----显示系统信息----*/
	//sprintf(s, "(%3d, %3d)", mx, my);
	sprintf(szTemp, " Screen:(%d, %d)", nXSize, nYSize);
	putfonts8_asc_sht(Sht_Back, 0, 0,COL_RED,COL_WHITE, szTemp, 20);//在图层上显示文字
	
	sprintf(szTemp, "MemMaxSize:%d MB", nMemMaxSize/(1024*1024));	 
	putfonts8_asc_sht(Sht_Back, 0, 57,COL_BLACK,COL_GREEN, szTemp, 17);//在图层上显示文字
	
	sprintf(szTemp, "MemFree:%d KB", memman_total(memman) /1024);	
	putfonts8_asc_sht(Sht_Back, 0, 76,COL_BLACK,COL_GREEN, szTemp, 17);//在图层上显示文字


/*----定时器设置----*/	
	timer = timer_alloc();					/* 创建定时器 */
	timer_init(timer, &SysFifo, 100);		/* 定时器初始化 */
	timer_settime(timer, 100);				/* 定时器设置 */	
	
	unsigned char cTemp=0x25;//颜色测试语句
/*---内核循环---*/	
	for (;;) 
	{
		io_cli();		/* 关闭所有可屏蔽中断 */
		
		/* 系统缓冲区没有数据 */
		if(fifo32_status(&SysFifo)== 0) 
		{	
			//io_stihlt();	/* 开中断并待机 直到下一次中断来临 */
			task_sleep(task_a);//休眠内核任务,在fifo有数据的时候才被重新激活
			io_sti();
		} 
		else 
		{	
			i = fifo32_get(&SysFifo);
			io_sti();//打开中断
		
			if(nKeyData0<=i && i<=nKeyData0+0xFF)/*键盘缓冲区有数据 */
			{		
				i-=nKeyData0;		
				sprintf(s, "%02X", i);	
				putfonts8_asc_sht(Sht_Back, 0, 20,COL_BLACK,COL_GREEN, s, 2);//在图层上显示文字
			//----------------------------------------------------------------------------------------
				if (i < 0x80) 
				{ 
					if (key_shift == 0)/* 如果shift没有被按下 */ 
					{	
						s[0] = keytable0[i];		/* 将键值转换成字符的ASCII码 */
					} 
					else/* 如果shift被按下了 */ 
					{				
						s[0] = keytable1[i];		/* 将键值转换成字符的ASCII码 */
					}
				} 
				else 
				{	
					s[0] = 0;
				}
				
				if ('A' <= s[0] && s[0] <= 'Z')/* 如果输入的是英文字母 */ 
				{	
					/* CapsLock为OFF并且Shift为OFF 或者 CapsLock为ON并且Shift为ON */
					if (((key_leds & 4) == 0 && key_shift == 0) ||((key_leds & 4) != 0 && key_shift != 0)) 
					{
						s[0] += 0x20;	/* 将大写字母转换成小写字母 */
										/* 同一个字母的大小写ASCII码相差0x20 */
					}
				}
				
				if (i == 0x0e)/* 退格键 */ 
				{	
					if(task_b[2]->fifo)//如果fifo存在
					{
						fifo32_put(task_b[2]->fifo, 8 + 256);
					}
				}
				else if (i == 0x1c)/* 换行键 */ 
				{	
					if(task_b[2]->fifo)//如果fifo存在
					{
						fifo32_put(task_b[2]->fifo, 7 + 256);
					}
				}
				else if (s[0] != 0)  /* 一般字符 */
				{
					if(task_b[2]->fifo)//如果fifo存在
					{
						fifo32_put(task_b[2]->fifo, s[0] + 256);
					}
				}	
			
				/* key_shift变量的bit0和bit1分别标识了左shift和右shift的开启与关闭状态 */
				if (i == 0x2a)/* 左shift ON */ 
				{	
					key_shift |= 1;
				}
				if (i == 0x36)/* 右shift ON */
				{	
					key_shift |= 2;
				}
				if (i == 0xaa)/* 左shift OFF */ 
				{	
					key_shift &= ~1;
				}
				if (i == 0xb6)/* 右shift OFF */ 
				{	
					key_shift &= ~2;
				}
				
				// 0xfa是ACK信息
				if (i == 0xfa) // 键盘成功接收到数据 
				{	
					key_wait = -1;	//等于-1表示可以发送指令 
					putfonts8_asc_sht(Sht_Back, 20, 18,COL_BLACK,COL_RED, s, 2);//在图层上显示文字
				}
				if (i == 0xfe)// 键盘没有成功接收到数据 
				{	
					wait_KBC_sendready();
					io_out8(PORT_KEYDAT, key_wait);	// 重新发送上次的指令 
					putfonts8_asc_sht(Sht_Back, 20, 16,COL_BLACK,COL_YELLOW, s, 2);//在图层上显示文字
				}
				
			//----------------------------------------------------------------------------------------
				
			} 
			else if (nMouseData0<=i && i<=nMouseData0+0xFF) /* 鼠标缓冲区有数据 */				
			{	

				i-=nMouseData0;
				if (Mouse_Decode(&mdec, i) != 0) 
				{	/* 接收鼠标发送的数据 */
					sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);	
					if ((mdec.btn & 0x01) != 0) /* 如果左键被按下 */
					{	
						s[1] = 'L';
						//----移动窗体到最顶层-------------------------------------------
						int j,x,y;
						if(mmx<0)//普通模式(mmx负数)
						{
							//遍历图层
							for (j = shtctl->top - 1; j > 0; j--) 
							{
								sht = shtctl->p_sheets[j];
								//vx0, vy0图层左上角的坐标
								x = mx - sht->vx0;//鼠标与窗口左上角长度距离
								y = my - sht->vy0;//鼠标与窗口左上角高度距离
								//在图层的大小范围内
								if (0 <= x && x < sht->bxsize && 0 <= y && y < sht->bysize) 
								{
									//按中 关闭按钮,隐藏窗体
									if(x > sht->bxsize-25 && x < sht->bxsize-5 && y > 4 && y < 17)
									{
										sheet_updown(sht, -1);
										break;
									}
									//不是透明色
									if (sht->buf[y * sht->bxsize + x] != sht->col_inv)
									{
										sheet_updown(sht, shtctl->top - 1);
					
										if(y<22)//在标题栏中,则进入拖动模式
										{
											mmx=mx;
											mmy=my;
										}
										break;
									}
										
								}
							}
						}
						else//进入拖动模式
						{
							x=mx-mmx;//计算鼠标移动距离
							y=my-mmy;//这里mmx,mmx是上一次鼠标位置
							//移动船体
							sheet_slide(sht, sht->vx0+x, sht->vy0+y);
							mmx=mx;
							mmy=my;
						}
						
					}
					else
					{
						mmx=-1;//返回通常模式(左键放开时)
					}
					//-----------------------------------------------------------------
					
					if ((mdec.btn & 0x02) != 0) /* 如果右键被按下 */
					{	
						s[3] = 'R';
					}
					if ((mdec.btn & 0x04) != 0) /* 如果滚轮被按下 */
					{	
						s[2] = 'C';
					}

					putfonts8_asc_sht(Sht_Back, 32, 20,COL_BLACK,COL_GREEN, s, 16);//在图层上显示文字
					
					mx += mdec.x;					/* 更新新的鼠标位置 */
					my += mdec.y;
					
					if (mx < 0) /* 鼠标的位置不能小于0,即不能超出屏幕位置 */
					{	
						mx = 0;		
					}
					if (my < 0) 
					{
						my = 0;
					}
					
					if (mx > nXSize - 1) /* 范围控制 ,防止超出屏幕*/
					{	
						mx = nXSize - 1;
					}
					if (my > nYSize-1 ) 
					{
						my = nYSize-1;
					}
					
					sheet_slide(Sht_Mouse, mx, my);	/* 更新鼠标图层的位置并显示新的鼠标图层 */
					sprintf(s, "MousePos:(%3d, %3d)", mx, my);
					putfonts8_asc_sht(Sht_Back, 0, 39,COL_BLACK,COL_GREEN, s, 20);//在图层上显示文字
					
					
				
				}
			}
			else if (i == 100) /* 定时器数据 ,100是设置的写入data*/
			{	//-----------任务栏秒数显示----------------------------------
				sprintf(s, "%03d Sec", timerctl.count/100);
				putfonts8_asc_sht(Sht_Back, nXSize-60, nYSize-23,COL_WHITE,COL_BLACK, s, 9);//在图层上显示文字
				
				if(timerctl.count/100==2)//2秒时候开始
				{
					//根据预处理命令判断是否在测试中
					#if TEST_ING
						sheet_updown(Sht_Win,shtctl->top-1);	//弹出笔记本窗口 
						task_run(task_b[2],2,2);
					#else
						task_run(task_b[0], 2,1);			
						task_run(task_b[1], 2,2);
					#endif 
					
				}
				else if(timerctl.count/100==7)//7秒时候停止
				{
					//根据预处理命令判断是否在测试中
					#if TEST_ING
					#else
						task_sleep(task_b[0]);
						task_sleep(task_b[1]);
					#endif 
				}
				else if(timerctl.count/100==8)
				{
					#if TEST_ING
					#else
				
						sheet_updown(Sht_Win,shtctl->top-1);		//弹出笔记本窗口  
						task_run(task_b[2],2,2);
					#endif 
				}
				/*颜色测试语句
				sprintf(s, "%X", cTemp);
				
				RectFill(vram,nXSize,cTemp,0,0,nXSize,nYSize);
				PutFont_Asc(vram, nXSize, 100, 250, COL_WHITE, s);
				cTemp++;*/
				
				timer_settime(timer, 100);				/* 定时器设置 */	

			}
		}	
	}
}