📄 emem8051.c
字号:
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 + -