📄 hcfgh8h.c
字号:
fprintf(fp, "T_MCB mcbtbl[%d];\n", nMaxID);
fprintf(fp, "const T_MCBS mcbstbl[%d] = {\n", nMaxID);
for ( i = 0; i < nMaxID; i++ ) {
if ( pppMbxTable[i] == NULL )
fprintf(fp, "\t\t{}");
else
fprintf(fp, "\t\t{%s, msgbuf%d, msgbuf%d + %s}",
pppMbxTable[i][1], i, i, pppMbxTable[i][2]);
if ( i == nMaxID - 1 )
fprintf(fp, "\n");
else
fprintf(fp, ",\n");
}
fprintf(fp, "\t};\n");
}
fprintf(fp, "const H mcbcnt = %d;\t/* 儊乕儖儃僢僋僗悢 */\n", nMaxID);
/* ------- 屌掕挿儊儌儕僾乕儖僨乕僞弌椡 -------- */
fprintf(fp, "\n");
/* 嵟戝屌掕挿儊儌儕僾乕儖ID専嶕 */
nMaxID = 0;
for ( i = 0; i < MAX_ID; i++ ) {
if ( pppMpfTable[i] != NULL ) {
nMpfCount++;
nMaxID = i + 1;
}
}
if ( nMaxID > 0 ) {
fprintf(fp, "\n\n/* 屌掕挿儊儌儕僾乕儖梡儊儌儕 */\n");
for ( i = 0; i < nMaxID; i++ )
fprintf(fp, "UB mpfblk%d[(%s) * (%s)];\n", i,
pppMpfTable[i][2], pppMpfTable[i][3]);
/* 屌掕挿儊儌儕僾乕儖掕媊 */
fprintf(fp, "\n/* 屌掕挿儊儌儕僾乕儖搊榐 */\n");
fprintf(fp, "T_FMCB fmcbtbl[%d];\n", nMaxID);
fprintf(fp, "const T_FMCBS fmcbstbl[%d] = {\n", nMaxID);
for ( i = 0; i < nMaxID; i++ ) {
if ( pppMpfTable[i] == NULL )
fprintf(fp, "\t\t{}");
else
fprintf(fp, "\t\t{%s, mpfblk%d, %s, %s}",
pppMpfTable[i][1], i,
pppMpfTable[i][2], pppMpfTable[i][3]);
if ( i == nMaxID - 1 )
fprintf(fp, "\n");
else
fprintf(fp, ",\n");
}
fprintf(fp, "\t};\n");
}
fprintf(fp, "const H fmcbcnt = %d;\t/* 屌掕挿儊儌儕僾乕儖悢 */\n", nMaxID);
/* 弶婜壔儖乕僠儞弌椡 */
fprintf(fp, "\n\n/* 弶婜壔 */\n"
"void __initialize(void)\n{\n"
);
if ( bUseTimer )
fprintf(fp, "\t__ini_tim();\t/* 僞僀儅弶婜壔 */\n");
if ( nTaskCount > 0 )
fprintf(fp, "\t__ini_tsk();\t/* 僞僗僋弶婜壔 */\n");
if ( nSemCount > 0 )
fprintf(fp, "\t__ini_sem();\t/* 僙儅僼僅弶婜壔 */\n");
if ( nFlgCount > 0 )
fprintf(fp, "\t__ini_flg();\t/* 僀儀儞僩僼儔僌弶婜壔 */\n");
if ( nMbxCount > 0 )
fprintf(fp, "\t__ini_mbx();\t/* 儊僀儖儃僢僋僗弶婜壔 */\n");
if ( nMpfCount > 0 )
fprintf(fp, "\t__ini_mpf();\t/* 屌掕挿儊儌儕僾乕儖弶婜壔 */\n");
fprintf(fp, "}\n");
fclose(fp);
}
/* 傾僙儞僽儕尵岅晹弌椡 */
void Write_Asm_Cfg(void)
{
FILE *fp;
int i;
/* 僼傽僀儖僆乕僾儞 */
if ( (fp = fopen(szAsmFile, "w")) == NULL ) {
fprintf(stderr, "%s 偺嶌惉偵幐攕偟傑偟偨\n", szAsmFile);
exit(1);
}
/* IMPORT愰尵弌椡 */
fprintf(fp, "; 僐儞僼傿僊儏儗乕僞乕 傾僙儞僽儔晹\n\n");
#ifndef __USE_CROSS_GCC__
fprintf(fp, "\t\t.CPU %s\n\n"
"\t\t.IMPORT\t_hos_start\n"
"\t\t.IMPORT\t_int_default\n"
"\t\t.IMPORT\t_int_trap\n",
Mode == ADVANCED ? "300HA": "300HN");
for ( i = 1; i < maxInt; i++ ) {
if ( ppIntTable[i] != NULL )
fprintf(fp, "\t\t.IMPORT\t_%s\n", ppIntTable[i]);
}
/* 儀僋僞僥乕僽儖弌椡 */
fprintf(fp, "\n\t\t.SECTION VECT,DATA,ALIGN=2\n\n"
"; -----------------------------------------------\n"
"; 妱傝崬傒儀僋僞僥乕僽儖\n"
"; -----------------------------------------------\n"
"\t\t.DATA.%c\t_hos_start\n",
Mode == ADVANCED ? 'L': 'W');
for ( i = 1; i < maxInt; i++ ) {
if ( ppIntTable[i] != NULL ) {
fprintf(fp, "\t\t.DATA.%c\tINT%02X\n",
Mode == ADVANCED ? 'L': 'W', i);
}
else {
fprintf(fp, "\t\t.DATA.%c\t_int_default\n",
Mode == ADVANCED ? 'L': 'W');
}
}
#endif /* __USE_CROSS_GCC_ */
/* 妱傝崬傒僴儞僪儔弌椡 */
fprintf(fp,
#ifdef __USE_CROSS_GCC__
"\t\t.h8300h\n"
#else
"\n\n\t\t.SECTION P,CODE,ALIGN=2\n\n"
#endif
"; -----------------------------------------------\n"
"; 妱傝崬傒僴儞僪儔\n"
"; -----------------------------------------------\n\n"
);
for ( i = 1; i < maxInt; i++ ) {
if ( ppIntTable[i] != NULL ) {
fprintf(fp,
#ifdef __USE_CROSS_GCC__
"\t\t.global\tint%02x\nint%02x:\t\tpush.l\ter1\n"
"\t\tmov.%c\t#_%s,%s1\n"
"\t\tjmp\t@_int_trap\n\n",
i , i, Mode == ADVANCED ? 'l': 'w' ,
ppIntTable[i], Mode == ADVANCED ? "er": "r");
#else
"INT%02X:\t\tPUSH.L\tER1\n"
"\t\tMOV.%c\t#_%s,%s1\n"
"\t\tjmp\t@_int_trap\n\n",
i , Mode == ADVANCED ? 'L': 'W' ,
ppIntTable[i], Mode == ADVANCED ? "ER": "R");
#endif
}
}
/* 僥乕僽儖偑柍偄応崌 Warning 懳嶔偵傾僪儗僗偺傒妱傝怳傝 */
#ifndef __USE_CROSS_GCC__
if ( nTaskCount == 0 || nSplCount == 0 || nSemCount == 0
|| nFlgCount == 0 || nMbxCount == 0 || nMpfCount == 0 ) {
fprintf(fp, "\n\n");
if ( nSplCount == 0 )
fprintf(fp,"\t\t.EXPORT\t_spcbtbl\n"
"\t\t.EXPORT\t_spcbstbl\n");
if ( nTaskCount == 0 )
fprintf(fp,"\t\t.EXPORT\t_tcbtbl\n"
"\t\t.EXPORT\t_tcbstbl\n");
if ( nSemCount == 0 )
fprintf(fp,"\t\t.EXPORT\t_scbtbl\n"
"\t\t.EXPORT\t_scbstbl\n");
if ( nFlgCount == 0 )
fprintf(fp,"\t\t.EXPORT\t_fcbtbl\n"
"\t\t.EXPORT\t_fcbstbl\n");
if ( nMbxCount == 0 )
fprintf(fp,"\t\t.EXPORT\t_mcbtbl\n"
"\t\t.EXPORT\t_mcbstbl\n");
if ( nMpfCount == 0 )
fprintf(fp,"\t\t.EXPORT\t_fmcbtbl\n"
"\t\t.EXPORT\t_fmcbstbl\n");
fprintf(fp,"\n\n\t\t.SECTION C,DATA,ALIGN=2\n\n");
if ( nSplCount == 0 )
fprintf(fp, "_spcbtbl:\n"
"_spcbstbl:\n");
if ( nTaskCount == 0 )
fprintf(fp,"_tcbtbl:\n"
"_tcbstbl:\n");
if ( nSemCount == 0 )
fprintf(fp,"_scbtbl:\n"
"_scbstbl:\n");
if ( nFlgCount == 0 )
fprintf(fp,"_fcbtbl:\n"
"_fcbstbl:\n");
if ( nMbxCount == 0 )
fprintf(fp,"_mcbtbl:\n"
"_mcbstbl:\n");
if ( nMpfCount == 0 )
fprintf(fp,"_fmcbtbl:\n"
"_fmcbstbl:\n");
}
fprintf(fp, "\n\n\t\t.END\n");
#else
fprintf(fp, "\n\n\t\t.end\n");
#endif
fclose(fp);
}
/* ------------------------------------ */
/* 僐儅儞僪夝愅 */
/* ------------------------------------ */
/* 僐儅儞僪夝愅 (CRE_TSK, CRE_SEM, CRE_FLG, CRE_MBX) */
/* 奺僷儔儊乕僞乕傪 pppTable[id][pram] 偵暥帤楍偺傑傑奿擺 */
int AnalizeCommand(char ***pppTable, int nPara, char *pBuf)
{
char **ppPar;
int nID;
/* 儊儌儕妋曐 */
ppPar = (char **)calloc(MAX_PARAMETER, sizeof(char *));
if ( ppPar == NULL ) {
fprintf(stderr, "儊儌儕偑懌傝傑偣傫\n");
exit(1);
}
/* 僷儔儊乕僞乕暘夝 */
if ( !ClipParameter(ppPar, nPara, pBuf) ) {
FreeParameter(ppPar);
return -1;
}
/* ID僠僃僢僋 */
if ( StrToInt(&nID, ppPar[0]) ) {
nID--;
if ( nID < 0 || nID >= MAX_ID ) {
/* ID斣崋偑晄惓 */
fprintf(stdout, "line(%d): 晄惓側俬俢斣崋偱偡\n", nLine);
FreeParameter(ppPar);
bErr = TRUE;
return -1;
}
if ( pppTable[nID] != NULL ) {
/* ID斣崋偑廳暋 */
fprintf(stdout, "line(%d): 俬俢斣崋偑廳暋偟偰偄傑偡\n", nLine);
FreeParameter(ppPar);
bErr = TRUE;
return -1;
}
ppPar[0][0] = '\0';
}
else {
for ( nID = 0; nID < MAX_ID; nID++ ) {
if ( pppTable[nID] == NULL )
break;
}
if ( nID >= MAX_ID ) {
/* 僆僽僕僃僋僩偑懡偡偓傞 */
fprintf(stdout, "line(%d): 僆僽僕僃僋僩偑懡偡偓傑偡\n", nLine);
FreeParameter(ppPar);
bErr = TRUE;
return -1;
}
}
/* 搊榐 */
pppTable[nID] = ppPar;
return nID;
}
/* DEF_INT 偺夝愅 */
void AnalizeDefInt(char *pBuf)
{
char *ppPara[2] = {NULL, NULL};
int nIntNum;
/* 僐儅儞僪愗傝弌偟 */
if ( !ClipParameter(ppPara, 2, pBuf) ) {
if ( ppPara[0] != NULL ) free(ppPara[0]);
if ( ppPara[1] != NULL ) free(ppPara[1]);
return;
}
/* 妱傝崬傒斣崋僠僃僢僋 */
if ( !StrToInt(&nIntNum, ppPara[0])
|| nIntNum < 1 || nIntNum >= maxInt ) {
/* 妱傝崬傒斣崋偑晄惓 */
fprintf(stdout, "line(%d): illegal intrrupt-number.\n", nLine);
if ( ppPara[0] != NULL ) free(ppPara[0]);
if ( ppPara[1] != NULL ) free(ppPara[1]);
bErr = TRUE;
return;
}
if ( ppIntTable[nIntNum] != NULL ) {
/* 妱傝崬傒斣崋偑廳暋 */
fprintf(stdout, "line(%d): 妱傝崬傒斣崋偑廳暋偟偰偄傑偡\n", nLine);
if ( ppPara[0] != NULL ) free(ppPara[0]);
if ( ppPara[1] != NULL ) free(ppPara[1]);
bErr = TRUE;
return;
}
/* 妱傝崬傒僙僢僩 */
ppIntTable[nIntNum] = ppPara[1];
free(ppIntTable[0]);
}
/* INCLUDE_C 偺夝愅 */
void AnalizeIncludeC(char *pBuf)
{
char *ppPara[1] = {NULL};
if ( !ClipParameter(ppPara, 1, pBuf) ) {
if ( ppPara[0] != NULL ) free(ppPara[0]);
return;
}
if ( nIncCCount >= MAX_INCLUDE_C ) {
/* 僀儞僋儖乕僪僼傽僀儖偑懡偡偓傞 */
fprintf(stdout, "line(%d): 僀儞僋儖乕僪僼傽僀儖偑懡偡偓傑偡\n",
nLine);
free(ppPara[0]);
bErr = TRUE;
return;
}
ppIncludeCTable[nIncCCount++] = ppPara[0];
}
/* MAX_TSKPRI 偺夝愅 */
void AnalizeMaxTskPri(char *pBuf)
{
char *ppPara[1] = {NULL};
if ( !ClipParameter(ppPara, 1, pBuf) ) {
if ( ppPara[0] != NULL ) free(ppPara[0]);
return;
}
pMaxTskPri = ppPara[0];
}
/* SYSTEM_STACK 偺夝愅 */
void AnalizeSysStack(char *pBuf)
{
char *ppPara[1] = {NULL};
long nAdr;
if ( !ClipParameter(ppPara, 1, pBuf) ) {
if ( ppPara[0] != NULL ) free(ppPara[0]);
return;
}
if ( StrToLong(&nAdr, ppPara[0]) ) {
SystemStack = (unsigned long)nAdr;
}
else {
/* 僷儔儊乕僞乕偑晄惓 */
fprintf(stdout, "line(%d): 僷儔儊乕僞乕偑晄惓偱偡\n", nLine);
}
free(ppPara[0]);
}
/* ------------------------------------ */
/* 儊儌儕奐曻 */
/* ------------------------------------ */
/* 僷儔儊乕僞曐懚晹暘偺奐曻 */
void FreeParameter(char **ppPara)
{
int i;
for ( i = 0; i < MAX_PARAMETER; i++ ) {
if ( ppPara[i] != NULL ) {
free(ppPara[i]);
ppPara[i] = NULL;
}
}
free(ppPara);
}
/* 僷儔儊乕僞乕僥乕僽儖偺奐曻 */
void FreeTable(char ***pppTable)
{
int i;
for ( i = 0; i < MAX_ID; i++ ) {
if ( pppTable[i] != NULL ) {
FreeParameter(pppTable[i]);
pppTable[i] = NULL;
}
}
}
/* ------------------------------------ */
/* 暥帤楍張棟 */
/* ------------------------------------ */
/* 慜屻偺嬻敀偺彍嫀 */
void CutSpace(char *pBuf)
{
char *p;
/* 屻傠偺嬻敀僇僢僩 */
p = &pBuf[strlen(pBuf) - 1];
while ( p >= pBuf && (*p == ' ' || *p == '\t' || *p == '\n') )
p--;
*(p + 1) = '\0';
/* 慜敿偺嬻敀僇僢僩 */
p = pBuf;
while ( *p == ' ' || *p == '\t' )
p++;
memmove(pBuf, p, strlen(p) + 1);
}
/* 妵屖偱埻傑傟偨椞堟偐傜僷儔儊乕僞傪愗傝弌偡 */
int ClipParameter(char *ppPar[], int nNum, char *pBuf)
{
char *pBase;
int nParNest = 1;
int i;
/* 巒傑傝偺 '(' 僠僃僢僋 */
CutSpace(pBuf);
if ( *pBuf++ != '(' ) {
/* 暥朄僄儔乕 */
fprintf(stdout, "line(%d): 暥朄僄儔乕\n", nLine);
bErr = TRUE;
return FALSE;
}
/* 堷悢暘夝 */
for ( i = 0; i < nNum; i++ ) {
pBase = pBuf;
while ( *pBuf ) {
if ( nParNest == 1 && *pBuf == ',' )
break;
if ( *pBuf == '(' )
nParNest++;
if ( *pBuf == ')' )
nParNest--;
if ( nParNest == 0 )
break;
pBuf++;
}
if ( (i < nNum - 1 && *pBuf == ',')
|| (i == nNum - 1 && *pBuf == ')') ) {
*pBuf++ = '\0';
CutSpace(pBase);
ppPar[i] = (char *)calloc(strlen(pBase) + 1, sizeof(char));
if ( ppPar[i] == NULL ) {
/* 儊儌儕晄懌 */
fprintf(stderr, "儊儌儕偑懌傝傑偣傫\n");
exit(1);
}
strcpy(ppPar[i], pBase);
}
else {
/* 僷儔儊乕僞乕悢偑堎忢 */
fprintf(stdout, "line(%d): 僷儔儊乕僞悢偑堎忢偱偡\n", nLine);
bErr = TRUE;
return FALSE;
}
}
return TRUE;
}
/* 暥帤楍傪悢抣偵曄姺偡傞(16恑懳墳) */
int StrToInt(int *pNum, char *pBuf)
{
/* 嬻敀僇僢僩 */
CutSpace(pBuf);
/* 悢抣偐偳偆偐僠僃僢僋 */
if ( pBuf[0] < '0' || pBuf[0] > '9' )
return FALSE;
/* 侾俇恑偐偳偆偐僠僃僢僋 */
if ( pBuf[0] == '0' && (pBuf[1] == 'x' || pBuf[1] == 'X') )
return (sscanf(&pBuf[2], "%x", pNum) == 1);
return (sscanf(&pBuf[0], "%d", pNum) == 1);
}
/* 暥帤楍傪悢抣偵曄姺偡傞(16恑懳墳) */
int StrToLong(long *pNum, char *pBuf)
{
/* 嬻敀僇僢僩 */
CutSpace(pBuf);
/* 悢抣偐偳偆偐僠僃僢僋 */
if ( pBuf[0] < '0' || pBuf[0] > '9' )
return FALSE;
/* 侾俇恑偐偳偆偐僠僃僢僋 */
if ( pBuf[0] == '0' && (pBuf[1] == 'x' || pBuf[1] == 'X') )
return (sscanf(&pBuf[2], "%lx", pNum) == 1);
return (sscanf(&pBuf[0], "%ld", pNum) == 1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -