操作系统的完整代码——命令处理代码ycshell.cpp

命令处理代码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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值