⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 console.c

📁 一个MIPS虚拟机的源码
💻 C
字号:
#ifdef EXTERN
#undef EXTERN
#endif
#define EXTERN extern

#include "global.h"



void console_ready_keybord()
{
	/*make the keybord ready*/
	//printf("\nkeybord ready!!!\n");
	console.keybord.control_reg= CONSOLE_KEYBORD_READY;
}
void console_unready_keybord()
{
	task_type task;
	console.keybord.control_reg = CONSOLE_KEYBORD_UNREADY;
	task.left_nsecond=KEYBORD_READY_TIME;
	task.task_category = READY_KEYBORD;
	task.is_processed= false;				
	add_task(task);
	
}
void console_ready_display()
{
	int i;
	//printf("\nConsole ready!!!\n");
	
	console.display.control_reg= CONSOLE_DISPLAY_READY;
	
}
void console_unready_display(UINT32 data)
{
	task_type task;
	
	console.display.control_reg = CONSOLE_DISPLAY_UNREADY;
	task.left_nsecond=DISPLAY_READY_TIME;
	task.task_category = READY_DISPLAY;
	task.is_processed= false;				
	add_task(task);
	
}
void console_store_word(UINT32 phyaddr,UINT32 data)
{
	UINT32 offset;
	int display_data;

	//printf("phyaddr %x",phyaddr);
	offset = phyaddr & 0x0000000f;
	data = data & 0x000000ff;
	//printf("offset %x",offset);
	//printf("data %x",data);
	
	switch (offset)
		{
			case KEYBOARD_CONTROL:    
				 if (console.keybord.control_reg==CONSOLE_KEYBORD_READY)
				 	interrupt_controller.device[3].interrupt_line.interrupt_word = interrupt_controller.device[3].interrupt_line.interrupt_word | IRQ3;
				break;
			case KEYBOARD_DATA:
				break;
			case DISPLAY_CONTROL:
				 if (console.display.control_reg==CONSOLE_DISPLAY_READY)
				 	interrupt_controller.device[4].interrupt_line.interrupt_word = interrupt_controller.device[4].interrupt_line.interrupt_word | IRQ4;
				break;
			case DISPLAY_DATA:
				display_data = (int)(data & 0x000000ff);
				if ((display_data>=0) && (display_data<=9))
					display_data+=48;
				//printf("display_data  %x",display_data);
				write(console.display_fd,&display_data,sizeof(char));
				console_unready_display(data);
				break;
			default:
				break;
				
		}
}
void console_store_halfword(UINT32 phyaddr,UINT16 data)
{
	console_store_word(phyaddr,(UINT32)data);
}

void console_store_byte(UINT32 phyaddr,UINT8 data)
{
	console_store_word(phyaddr,(UINT32)data);
}

UINT32  console_load_word(UINT32 phyaddr)
{
	UINT32 offset;
	UINT32 data;
	int i;
	
	//printf("phyaddr  %x",phyaddr);
	offset = phyaddr & 0x0000000f;
	//printf("offset %x",offset);

	
	data = 0x00000000;
	switch (offset)
		{
			case KEYBOARD_CONTROL:   
				//delete interrupt
				data = console.keybord.control_reg  ;
				console.keybord.control_reg  = 0x00000000;
				break;
			case KEYBOARD_DATA:
				//fscanf(console.keybord_fd,"%d",&data);
				scanf("%d",&data);
				console_unready_keybord();
				break;
			case DISPLAY_CONTROL:
				
				data = console.display.control_reg  ;
				//printf("load data from console\n");
				//printf("%x\n",data);
				//scanf("%d",&i);
				console.display.control_reg  = 0x00000000;
				break;
			case DISPLAY_DATA:
				
				break;
			default:
				break;
				
		}
	return data;
}

UINT16  console_load_halfword(UINT32 phyaddr)
{
	return (UINT16)console_load_word(phyaddr);
}

UINT8  console_load_byte(UINT32 phyaddr)
{
	return (UINT8)console_load_word(phyaddr);
}

int reorder_pending_task()
{
	int i,j,k,interval;
	int number;
	
	number = 0;
	for (i=0;i<MAX_PENDING_TASK;i++)
		if (pending_task[i].is_processed==false)
			number++;
	for (i=0;i<MAX_PENDING_TASK;i++)
		{
			
					
			k=i+1;
			while  (pending_task[k].is_processed==true)
				{
					k++;
				
				}
			interval = k-i;
			if (pending_task[i].is_processed==true)
				{
					for (j=i;j<MAX_PENDING_TASK-interval;j++)
						{
						pending_task[j].left_nsecond = pending_task[j+interval].left_nsecond ;
						pending_task[j].is_processed= pending_task[j+interval].is_processed ;
						pending_task[j].task_category= pending_task[j+interval].task_category ;
						}
				}
			
		}
	return number;
	
}


void add_task(task_type task)
{
	int i;
	//Add a task to task array pending_task
	if (pending_task_number>=MAX_PENDING_TASK)
		{
			pending_task_number = reorder_pending_task();
			if (pending_task_number>=MAX_PENDING_TASK)
				{
					printf("pending_task_number>MAX_PENDING_TASK");
					exit(1);
				}
			
		}
	
	pending_task[pending_task_number]=task;
	pending_task_number++;
}
void delete_task(int i)
{
	pending_task[i].is_processed = true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -