📄 console.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 + -