命令处理代码ycshell.cpp
#define YCORG -1 //该设置使编译器生成头部为YCEXE结构的可执行文件
#include "ycio.cpp" //提供前缀为ycio_的函数和C/C++标准函数
ycfsCLASS *YCFS; //文件管理接口指针
ycmmCLASS *YCMM; //内存管理接口指针
ycttyCLASS *YCTTY; //键盘管理接口指针
e820map e820v;
char cmdbuf[2048]; //命令缓冲区
char linebuf[128]; //当前输入缓冲区
void main()
{
printf("YCos is now in shell. - ycshell.cpp\n");
ycio_get_driver(&YCFS,"ycfs"); //获得文件管理接口指针
ycio_get_driver(&YCMM,"ycmm"); //获得内存管理接口指针
ycio_get_driver(&YCTTY,"yctty"); //获得键盘管理接口指针
static byte caps_lock,num_lock,scroll_lock,shift_val,alt_val,ctrl_val;
static int pcur,cmd_line,cmd_num;
int vk_char,vk_value,vk_press,kk,bb,lineLen=0,down_flag=0;
e820v = *(e820map*)(KERNEL_POS + DATA_POS + e820_POS);
wr_pmt_message();
YCTTY->display_LED(caps_lock,num_lock,scroll_lock);
YCTTY->wr_prompt();
while(1)
{
vk_value = vk_char = vk_press = 0;
YCTTY->keyboard_read(vk_char,vk_value,vk_press,caps_lock,num_lock,
scroll_lock,shift_val,alt_val,ctrl_val);
if(vk_press && !vk_char)
{
switch(vk_value)
{
case VK_LEFT:
YCTTY->pmt_cursor_pos(pcur ? --pcur : pcur);
continue;
case VK_RIGHT:
YCTTY->pmt_cursor_pos(pcur>=lineLen ? pcur : ++pcur);
continue;
case VK_HOME: YCTTY->pmt_cursor_pos(pcur = 0); continue;
case VK_END: YCTTY->pmt_cursor_pos(pcur = lineLen); continue;
case VK_RETURN:
for(; lineLen>=1; lineLen--)
if((byte)linebuf[lineLen - 1] > ' ') break;
if(lineLen)
{
linebuf[lineLen] = 0;
if(cmd_line <= cmd_num)
{
if(cmd_line < cmd_num) cmd_line++;
kk = pmt_cmd_pos(cmd_line - 1);
if(strlen(&cmdbuf[kk])!=lineLen ||
memcmp(&cmdbuf[kk],linebuf,lineLen))
goto up_p_005;
down_flag = 1;
}
else
{
up_p_005:
kk = pmt_cmd_pos(cmd_num);
while(kk + lineLen >= sizeof(cmdbuf)-1)
{
bb = pmt_cmd_pos(1);
memcpy(cmdbuf,&cmdbuf[bb],sizeof(cmdbuf)-bb);
kk = pmt_cmd_pos(--cmd_num);
}
memcpy(&cmdbuf[kk],linebuf,lineLen+1);
cmd_line = ++cmd_num;
down_flag = 0;
}
run_command(linebuf,lineLen);
lineLen = pcur = 0;
}
YCTTY->wr_prompt();
continue;
case VK_BACK:
if(!pcur) continue;
memmove(&linebuf[pcur-1],&linebuf[pcur], lineLen - pcur);
pcur--;
lineLen--;
goto up_p_001;
case VK_DELETE:
if(pcur >= lineLen) continue;
lineLen--;
memmove(&linebuf[pcur],&linebuf[pcur+1], lineLen - pcur);
goto up_p_001;
case VK_DOWN:
if(cmd_line >= cmd_num) continue;
if(!down_flag) cmd_line++;
else down_flag = 0;
goto up_p_000;
case VK_UP:
if(cmd_line) cmd_line--;
up_p_000:
if(cmd_line >= cmd_num) pcur = lineLen = 0;
else
{
bb = pmt_cmd_pos(cmd_line);
memcpy(linebuf,&cmdbuf[bb],strlen(&cmdbuf[bb]) + 1);
pcur = lineLen = strlen(linebuf);
}
down_flag = 0;
goto up_p_001;
case VK_ESCAPE:
lineLen = pcur = 0;
up_p_001:
pmt_write(linebuf, lineLen, 0);
ycio_write(" ", -80*25);
YCTTY->pmt_cursor_pos(pcur);
continue;
}
}
if(!vk_char || lineLen>=sizeof(linebuf)-1 || lineLen>=80-5) continue;
memmove(&linebuf[pcur+1],&linebuf[pcur], lineLen-pcur);
linebuf[pcur] = vk_char;
lineLen++;
pmt_write(linebuf, lineLen, 0);
YCTTY->pmt_cursor_pos(++pcur);
}
}
int pmt_cmd_pos(int lineNo)
{
for(int kk=0,ii=0; ; ii++)
{
if(ii >= lineNo) return kk;
kk += strlen(&cmdbuf[kk]) + 1;
}
}
void pmt_write(const char *_Dest,int glen,int cpos)
{
YCTTY->pmt_cursor_pos(cpos);
ycio_write(_Dest,glen);
}
void wr_pmt_message()
{
printf("\nInner Command: dir cls type mem page\n");
}
void run_command(char *cmdptr,int glen)
{
while((byte)*cmdptr <= ' ') { cmdptr++; glen--; }
int ii,kk,bb;
byte *codeptr;
for(kk=0; kk<glen; kk++)
{
if((byte)cmdptr[kk] <= ' ') break;
if(cmdptr[kk]>='A' && cmdptr[kk]<='Z') cmdptr[kk] += ' ';
}
for(ii=kk; ii<glen; ii++) if((byte)cmdptr[ii] > ' ') break;
for(bb=ii; ii<glen; ii++)
{
if((byte)cmdptr[ii] <= ' ') break;
if(cmdptr[ii]>='A' && cmdptr[ii]<='Z') cmdptr[ii] += ' ';
}
printf("\n");
if(kk == 3)
{
if(!memcmp(cmdptr,"cls",3))
{
YCTTY->cls();
return;
}
if(!memcmp(cmdptr,"dir",3))
{
for(ii=0; ; ii++)
{
char *fptr = YCFS->get_file_name(ii,kk);
if(!fptr) break;
printf("%10d %s\n",kk,fptr);
}
return;
}
if(!memcmp(cmdptr,"mem",3))
{
for(ii=0; ii<e820v.nr_map; ii++)
printf("%016lX %16lx, %16l %d\n", e820v.map[ii].addr,
e820v.map[ii].size,
e820v.map[ii].size,
e820v.map[ii].type);
printf("\n");
YMEM *phyHead = YCMM->get_head();
YMEM *pLink = phyHead;
int mem_size = 0;
while(pLink)
{
printf(`addr=%08X size=%8x,%10d,%6d Lk=%6X Next=%6X Last=%6X\n`,
pLink->addr,
pLink->size,
pLink->size,
pLink->size/4096,
pLink,
pLink->pNext,
pLink->pLast);
pLink = pLink->pNext;
mem_size += pLink->size;
if(pLink == phyHead) break;
}
printf("\n%d bytes Memory free, %d pages\n",mem_size,mem_size/4096);
return;
}
}
if(kk == 4)
{
if(!memcmp(cmdptr,"page",4))
{
bb = atoi(&cmdptr[bb]);
if(bb < 0)
{
int *pageDir = (int*)(KERNEL_POS + PageDir_POS);
for(ii=256*(-bb-1); ii>=0 && ii<256*(-bb-1) + 256; )
{
for(kk=0;kk<32;ii++,kk++)
printf("%x ",ii<1024 ? pageDir[ii] : 1);
printf("\n");
}
return;
}
int *pageTable = (int*)(KERNEL_POS + PageTable_pos);
for(ii=256*bb; ii<256*bb + 256; )
{
for(kk=0; kk<16; ii++,kk++)
{
printf("%x ", pageTable[ii] & ~PAGE_MASK);
}
printf("\n");
}
return;
}
if(!memcmp(cmdptr,"type",4))
{
if(bb >= ii) printf("syntax error.\n");
else
{
codeptr = YCFS->get_file_code(&cmdptr[bb],ii-bb,&kk);
if(codeptr) ycio_write((char*)codeptr,kk);
else printf("file not found: %s\n", &cmdptr[bb]);
}
return;
}
}
if(glen==2 && cmdptr[0]>='a' && cmdptr[0]<='z' && cmdptr[1]==':')
{
YCTTY->set_disk(cmdptr[0] - 'a'); //设置盘符
return;
}
int64 pval = *(int64*)&cmdptr[kk];
strcpy(&cmdptr[kk],".exe");
codeptr = YCFS->get_file_code(cmdptr); //从ycfs.cpp获得cmdptr文件代码
*(int64*)&cmdptr[kk] = pval;
if(codeptr)
{
ycio_create_process(codeptr,cmdptr,glen); //创建进程, 执行程序
return;
}
printf("'%s' is not a inner or outer command or exe file\n",cmdptr);
wr_pmt_message();
}
C/C++代码文件: ycshell.cpp