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

📄 emem8051.c

📁 一個單晶片8051模擬軟體,可以查看模擬的內部外部RAM資料及暫存器資料,並設置斷點 windows 平台下執行
💻 C
📖 第 1 页 / 共 2 页
字号:
            else if(memicmp(cp,"SMALL",5)==0){
               //if(memStr->model != UNDEFINED_MODEL){ ErrorMessage("Multiple model definition\n",0); return 0;}
               memStr->model = SMALL_MODEL;
               FreeMechs(memStr);         // get rid of any mechs generated by CreateMem
               memStr->numBanks = 2;
               memStr->bankSize = 0x10000;
               memStr->addMask  = 0xffff;}
            else if(memicmp(cp,"LARGE",5)==0){
               //if(memStr->model != UNDEFINED_MODEL){ ErrorMessage("Multiple model definition\n",0); return 0;}
               memStr->model = LARGE_MODEL;
               FreeMechs(memStr);         // get rid of any mechs generated by CreateMem
               //
               cp+=5;
               while(*cp==' ')cp++;
               if(*cp==':')cp++;
               memStr->numBanks = strtol(cp,&cp,0);
               if(memStr->numBanks == 0){
                  ErrorMessage("# of memory banks must be non-zero (-mLARGE:nnn/sss)\n",0);
                  return 0;}
               while(*cp==' ')cp++;
               if(*cp=='/')cp++;
               memStr->bankSize = strtol(cp,&cp,0);
               if(memStr->bankSize == 0){
                  ErrorMessage("bank size must be non-zero (-mLARGE:nnn/sss)\n",0);
                  return 0;}
               if(*cp=='/')cp++;
               memStr->magicBank = strtol(cp,&cp,0);
               }
            else if(memcmp(cp,"code:",5)==0 || memcmp(cp,"data:",5)==0){
               //
               MECHARRAY*mechPP = (*cp=='c' || *cp=='C') ? &memStr->codeMechs    : &memStr->dataMechs;
               int*numMechPtr   = (*cp=='c' || *cp=='C') ? &memStr->numCodeMechs : &memStr->numDataMechs;
               //
               cp+=5;
               //
               if(memStr->model != LARGE_MODEL){
                  ErrorMessage("'-mLARGE:nnn' must precede '-mCODE' or '-mDATA'\n",0);
                  return 0;}
               if(*mechPP != 0){
                  ErrorMessage("Duplicate specifications of '-mCODE' or '-mDATA'\n",0);
                  return 0;}
               //
               *numMechPtr = GetMechs(cp,mechPP,ErrorMessage);
               if(*numMechPtr == 0){
                  ErrorMessage("one or more illegal mapping mechanism definition(s)\n",0);
                  return 0;}}
            return 1;}
         default:break;}}
   return 0;}     // not handled //
//
static char*GetSingleMech(char buff[],char*cp){
   char*cq;
   for(cq=cp;*cq!=0 && *cq!=',';cq++){}
   strcpy(buff,cp);
   buff[cq-cp]=0;
   if(*cq==',')cq++;
   return cq;}
//
static int GetNumMechs(char*cp){
   int n;
   for(n=0;;n++){
      char buff[256];
      cp = GetSingleMech(buff,cp);
      if(buff[0]==0){         // empty buffer? must be end-of-line (or 2 consecutive commas)
         if(*cp!=0)return 0;  // not end-of-line (error!)
         break;}}
   return n;}
//
static int GetNumber(char**cpp,int*returnValue){
   char*cp=*cpp;
   while(*cp==' ')cp++;
   if(*cp>='0' && *cp<='9'){
      *returnValue = strtol(cp,&cp,0);
      while(*cp==' ')cp++;
      *cpp=cp;
      return 1;}
   return 0;}
//
// base[magic/mask/shift] or base[]
static int ParseMech(char*cp,MECH*mechP){
   if(!GetNumber(&cp,&mechP->baseBank))return 0;
   if(*cp == '(')cp++;
   if(GetNumber(&cp,&mechP->magicLocation)){
      if(*cp == '/')cp++;
      if(!GetNumber(&cp,&mechP->mask))return 0;
      if(*cp == '/')cp++;
      if(!GetNumber(&cp,&mechP->shift))return 0;}
   else {                  // [] (all zero)
      mechP->magicLocation = 0;
      mechP->mask = 0;
      mechP->shift = 0;}
   if(*cp == ')')cp++;
   if(*cp++ != 0)return 0;
   return 1;}
//
// base[magic/mask/shift],base[magic/mask/shift], ...
static int GetMechs(char*cp,MECHARRAY*mp,void ErrorMessage(char*,int)){
   int numMechs = GetNumMechs(cp);
   if(numMechs != 0){
      int n;
      MECHARRAY mechArray = calloc(numMechs,sizeof(MECH));
      for(n=0;n<numMechs;n++){
         char buff[256];
         cp = GetSingleMech(buff,cp);
         if(!ParseMech(buff,&(*mechArray)[n])){
            if(ErrorMessage != 0){
               char erbuf[256];
               sprintf(erbuf,"Illegal mapping mechanism <%s>\n",buff);
               ErrorMessage(erbuf,0);}
            return 0;}}
      *mp = mechArray;}
   return numMechs;}
//
static void FreeMechs(MEM_STR*memStr){
   if(memStr->codeMechs!=0){ free(memStr->codeMechs); memStr->codeMechs=0;}
   if(memStr->dataMechs!=0){ free(memStr->dataMechs); memStr->dataMechs=0;}
   memStr->numCodeMechs=0;
   memStr->numDataMechs=0;}
//
static void FreeBanks(MEM_STR*memStr){
   int n;
   if(memStr->banks != 0){
      for(n=0;n<memStr->numBanks;n++){
         free((*memStr->banks)[n].data);}
      free(memStr->banks);}
   memStr->numBanks = 0;}
//
static void FreeMemStruct(MEM_STR*memStr){
   // free any alloc'd memory
   FreeMechs(memStr);
   FreeBanks(memStr);
   free(memStr);}
//
static void BuildMechsString(MECHARRAY mechArray,int numMechs,char buff[]){
   int n;
   //
   char*cp=buff;
   //
   if(mechArray!=0 && numMechs>0){
      for(n=0;n<numMechs;n++){
         MECH*mechP = &(*mechArray)[n];
         cp += sprintf(cp,"%d(",mechP->baseBank);
         if(mechP->magicLocation != 0 || mechP->mask != 0){
            cp += sprintf(cp,"%d/%d/%d",mechP->magicLocation,mechP->mask,mechP->shift);}
         *cp++=')';
         *cp++=',';}
      cp--;}      // remove final comma //
   *cp=0;}
//
static BOOL SameMechs(int numMechs,MECHARRAY mech1,MECHARRAY mech2){
   int n;
   if(mech1==0 || mech2==0){
      return mech1==mech2;}
   for(n=0;n<numMechs;n++){
      MECH*mp1 = &(*mech1)[n];
      MECH*mp2 = &(*mech2)[n];
      if(mp1->baseBank      != mp2->baseBank      )return FALSE;
      if(mp1->magicLocation != mp2->magicLocation )return FALSE;
      if(mp1->mask          != mp2->mask          )return FALSE;
      if(mp1->shift         != mp2->shift         )return FALSE;}
   return TRUE;}        // all the same
//
static BOOL SameMemStructs(MEM_STR*newMemStr,MEM_STR*memStr){
   if(  newMemStr->model    == memStr->model
     && newMemStr->numBanks == memStr->numBanks 
     && newMemStr->bankSize == memStr->bankSize
     && newMemStr->addMask  == memStr->addMask){
      if(  memStr->model   == TINY_MODEL
        || memStr->model   == SMALL_MODEL
        || ( memStr->model == LARGE_MODEL 
          && newMemStr->addShift     == memStr->addShift
          && newMemStr->magicBank    == memStr->magicBank
          && newMemStr->numCodeMechs == memStr->numCodeMechs
          && newMemStr->numDataMechs == memStr->numDataMechs
          && SameMechs(newMemStr->numCodeMechs,newMemStr->codeMechs,memStr->codeMechs)
          && SameMechs(newMemStr->numDataMechs,newMemStr->dataMechs,memStr->dataMechs))){
         return TRUE;}}
   return FALSE;}
//
// ******************************** //
//
#define HIDE_ALTERNATES
//
static void ShowModelButtons(HWND hwnd,int mode){
   BOOL ewT = (mode == TINY_MODEL);
   BOOL ewS = (mode == SMALL_MODEL);
   BOOL ewL = (mode == LARGE_MODEL);
   //
   CheckRadioButton(hwnd,IDR_TINY,IDR_LARGE,
                    ewT ? IDR_TINY : ewS ? IDR_SMALL : IDR_LARGE);
   //
#ifdef HIDE_ALTERNATES
   {
      int swT = (ewT  ? SW_SHOW : SW_HIDE);
      int swS = (ewS  ? SW_SHOW : SW_HIDE);
      int swL = (ewL  ? SW_SHOW : SW_HIDE);
      //
      ShowWindow(GetDlgItem(hwnd,IDG_LARGE),swL);
      ShowWindow(GetDlgItem(hwnd,IDS_BANK) ,swL);
      ShowWindow(GetDlgItem(hwnd,IDE_BANK) ,swL);
      ShowWindow(GetDlgItem(hwnd,IDS_BANKSIZE),swL);
      ShowWindow(GetDlgItem(hwnd,IDE_BANKSIZE),swL);
      ShowWindow(GetDlgItem(hwnd,IDS_CODE) ,swL);
      ShowWindow(GetDlgItem(hwnd,IDE_CODE) ,swL);
      ShowWindow(GetDlgItem(hwnd,IDS_DATA) ,swL);
      ShowWindow(GetDlgItem(hwnd,IDE_DATA) ,swL);
      ShowWindow(GetDlgItem(hwnd,IDS_MAGICBANK),swL);
      ShowWindow(GetDlgItem(hwnd,IDE_MAGICBANK),swL);
      //
      ShowWindow(GetDlgItem(hwnd,IDS_BANK_TINY),swT);
      ShowWindow(GetDlgItem(hwnd,IDS_BANK_SMALL),swS);
      ShowWindow(GetDlgItem(hwnd,IDS_BANK_SMALL2),swS);}
   //
#else
   EnableWindow(GetDlgItem(hwnd,IDG_LARGE),ewL);
   EnableWindow(GetDlgItem(hwnd,IDS_BANK) ,ewL);
   EnableWindow(GetDlgItem(hwnd,IDE_BANK) ,ewL);
   EnableWindow(GetDlgItem(hwnd,IDS_BANKSIZE),ewL);
   EnableWindow(GetDlgItem(hwnd,IDE_BANKSIZE),ewL);
   EnableWindow(GetDlgItem(hwnd,IDS_CODE) ,ewL);
   EnableWindow(GetDlgItem(hwnd,IDE_CODE) ,ewL);
   EnableWindow(GetDlgItem(hwnd,IDS_DATA) ,ewL);
   EnableWindow(GetDlgItem(hwnd,IDE_DATA) ,ewL);
   EnableWindow(GetDlgItem(hwnd,IDS_MAGICBANK),ewL);
   EnableWindow(GetDlgItem(hwnd,IDE_MAGICBANK),ewL);
   //
   EnableWindow(GetDlgItem(hwnd,IDS_BANK_TINY),ewT);
   EnableWindow(GetDlgItem(hwnd,IDS_BANK_SMALL),ewS);
   EnableWindow(GetDlgItem(hwnd,IDS_BANK_SMALL2),ewS);
#endif
   }
//
static BOOL CALLBACK CfgMemProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
   char buff[256];
   MEM_STR*memStr;
   //
   switch(uMsg){
      case WM_INITDIALOG:{
         memStr = (MEM_STR*)lParam;
         CheckRadioButton(hwnd,IDR_TINY,IDR_LARGE,
           (   memStr->model == TINY_MODEL  ? IDR_TINY
             : memStr->model == LARGE_MODEL ? IDR_LARGE
             : IDR_SMALL));
         if(memStr->model == LARGE_MODEL){
            SetDlgItemInt(hwnd,IDE_BANK,memStr->numBanks,FALSE);
            SetDlgItemInt(hwnd,IDE_BANKSIZE,memStr->bankSize,FALSE);
            SetDlgItemInt(hwnd,IDE_MAGICBANK,memStr->magicBank,FALSE);
            BuildMechsString(memStr->codeMechs,memStr->numCodeMechs,buff);
            SetDlgItemText(hwnd,IDE_CODE,buff);
            BuildMechsString(memStr->dataMechs,memStr->numDataMechs,buff);
            SetDlgItemText(hwnd,IDE_DATA,buff);
            }
         ShowModelButtons(hwnd,memStr->model);
         return FALSE;}    // don't want default focus
      case WM_COMMAND:{
         switch(wParam){
            case IDR_TINY: { ShowModelButtons(hwnd,TINY_MODEL);  return FALSE;}
            case IDR_SMALL:{ ShowModelButtons(hwnd,SMALL_MODEL); return FALSE;}
            case IDR_LARGE:{ ShowModelButtons(hwnd,LARGE_MODEL); return FALSE;}
            case IDCANCEL:{
               EndDialog(hwnd,0);
               return TRUE;}
            case IDOK:{
               NEW(MEM_STR,memStr);
               //
               // default value //
               memStr->model    = UNDEFINED_MODEL;
               memStr->bankSize = 0x10000;
               memStr->addMask  = 0xffff;
               //
               if(IsDlgButtonChecked(hwnd,IDR_TINY)){
                  memStr->model    = TINY_MODEL;
                  memStr->numBanks = 1;}
               else if(IsDlgButtonChecked(hwnd,IDR_SMALL)){
                  memStr->model    = SMALL_MODEL;
                  memStr->numBanks = 2;}
               else {
                  memStr->model    = LARGE_MODEL;
                  //
                  memStr->numBanks = GetDlgItemInt(hwnd,IDE_BANK,0,FALSE);
                  if(memStr->numBanks == 0){
                     MessageBox(hwnd,"# of banks must be non-zero",0,0);
error_quit:          FreeMechs(memStr);
                     free(memStr);
                     return TRUE;}
                  //
                  memStr->bankSize = GetDlgItemInt(hwnd,IDE_BANKSIZE,0,FALSE);
                  if(memStr->bankSize == 0){
                     MessageBox(hwnd,"bank size must be non-zero",0,0);
                     goto error_quit;}
                  //
                  memStr->magicBank = GetDlgItemInt(hwnd,IDE_MAGICBANK,0,FALSE);
                  //
                  GetDlgItemText(hwnd,IDE_CODE,buff,sizeof buff);
                  memStr->numCodeMechs = GetMechs(buff,&memStr->codeMechs,0);
                  if(memStr->codeMechs == 0 || memStr->numCodeMechs == 0){
                     MessageBox(hwnd,"Error in code mapping parameters",0,0);
                     goto error_quit;}
                  //
                  GetDlgItemText(hwnd,IDE_DATA,buff,sizeof buff);
                  memStr->numDataMechs = GetMechs(buff,&memStr->dataMechs,0);
                  if(memStr->dataMechs == 0 || memStr->numDataMechs == 0){
                     MessageBox(hwnd,"Error in data mapping parameters",0,0);
                     goto error_quit;}
                  //
                  if(memStr->numCodeMechs != memStr->numDataMechs){
                     MessageBox(hwnd,"# of code mapping parameters must be same as # of data mapping parameters",0,0);
                     goto error_quit;}
                  //
                  }
               //
               EndDialog(hwnd,(long)memStr);
               return TRUE;}
            default:break;}}
      default:break;}
   return FALSE;}
//
// ******************************** //
//

⌨️ 快捷键说明

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