Files
omf51/omf51print.c
jens 3297d1bb7e Initial import
git-svn-id: http://moon:8086/svn/software/trunk/libsrc/omf51@1 b431acfa-c32f-4a4a-93f1-934dc6c82436
2014-07-19 07:44:42 +00:00

444 lines
12 KiB
C
Executable File

/***************************************************************************/
/* omf51print.c */
/***************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include "omf51.h"
#include "omf51const.h"
#include "omf51print.h"
/***************************************************************************/
/* Constants
/***************************************************************************/
/***************************************************************************/
/* Helper Functions
/***************************************************************************/
BYTE SegmentGetSegType(BYTE segInfo)
{
return (segInfo & 0x07);
}
BYTE SegmentGetSegReg(BYTE segInfo)
{
return (segInfo & 0x18) >> 3;
}
BYTE SegmentIsEmpty(BYTE segInfo)
{
return (segInfo & 0x80) >> 7;
}
BYTE SegmentIsOVL(BYTE segInfo)
{
return (segInfo & 0x20) >> 5;
}
BYTE SymbolIsIND(BYTE symInfo)
{
return (symInfo & 0x80) >> 7;
}
BYTE SymbolIsVAR(BYTE symInfo)
{
return (symInfo & 0x40) >> 6;
}
BYTE SymbolIsRBF(BYTE symInfo)
{
return (symInfo & 0x20) >> 5;
}
BYTE SymbolGetSymReg(BYTE symInfo)
{
return (symInfo & 0x18) >> 3;
}
BYTE SegmentGetSymType(BYTE symInfo)
{
return (symInfo & 0x07);
}
/***************************************************************************/
/* Exported Functions
/***************************************************************************/
void MHDRPrint(struct _sMHDR *pObj, FILE *pFile)
{
fprintf(pFile, "Module name : %s\n",pObj->name);
fprintf(pFile, "Software used : ");
switch(pObj->trnID)
{
case 0xFD:
fprintf(pFile, "ASM51 ");
break;
case 0xFE:
fprintf(pFile, "PL/M-51 ");
break;
case 0xFF:
fprintf(pFile, "RL51 ");
break;
default:
fprintf(pFile, "Unknown ");
break;
}
fprintf(pFile, "(0x%2.2X)\n",pObj->trnID);
fprintf(pFile, "\n");
}
void SEGDEFPrint(struct _sSEGDEF *pObj, FILE *pFile)
{
fprintf(pFile, "Segment name : %s\n", pObj->name);
fprintf(pFile, "Segment ID : 0x%2.2X", pObj->segID);
if (pObj->segID == 0)
fprintf(pFile, " (Absolut)\n");
else
fprintf(pFile, "\n");
fprintf(pFile, "Relocation Type : %s (0x%2.2X)\n", relTypeName[pObj->relTYP], pObj->relTYP);
fprintf(pFile, "Empty : ");
if (SegmentIsEmpty(pObj->segINFO) == 1)
fprintf(pFile, "Yes\n");
else
fprintf(pFile, "No\n");
fprintf(pFile, "Overlayable : ");
if (SegmentIsOVL(pObj->segINFO) == 1)
fprintf(pFile, "Yes\n");
else
fprintf(pFile, "No\n");
fprintf(pFile, "Register bank : %x\n",SegmentGetSegReg(pObj->segINFO));
fprintf(pFile, "Segment Type : %s\n",segTypeName[SegmentGetSegType(pObj->segINFO)]);
fprintf(pFile, "Segment base : 0x%4.4X\n", pObj->segBASE);
fprintf(pFile, "Segment size : 0x%4.4X\n", pObj->segSIZE);
fprintf(pFile, "\n");
}
void SEGPrint(struct _sSEG *pObj, FILE *pFile)
{
DBYTE i;
for (i=0; i < pObj->numSegDef; i++)
SEGDEFPrint(&pObj->segDef[i], pFile);
}
void PUBDEFPrint(struct _sPUBDEF *pObj, FILE *pFile)
{
fprintf(pFile, "Public name : %s\n", pObj->name);
fprintf(pFile, "Segment ID : 0x%2.2X", pObj->segID);
if (pObj->segID == 0)
fprintf(pFile, " (Absolut)\n");
else
fprintf(pFile, "\n");
fprintf(pFile, "Indirect Call : ");
if (SymbolIsIND(pObj->symINFO) == 1)
fprintf(pFile, "Yes\n");
else
fprintf(pFile, "No\n");
fprintf(pFile, "Variable : ");
if (SymbolIsVAR(pObj->symINFO) == 1)
fprintf(pFile, "Yes\n");
else
fprintf(pFile, "No\n");
fprintf(pFile, "Reg. Banks used : ");
if (SymbolIsRBF(pObj->symINFO) == 1)
fprintf(pFile, "at least one bank\n");
else
fprintf(pFile, "all\n");
fprintf(pFile, "Register bank : %x\n",SymbolGetSymReg(pObj->symINFO));
fprintf(pFile, "Usage Type : %s\n",symTypeName[SegmentGetSymType(pObj->symINFO)]);
fprintf(pFile, "Symbol Offset : 0x%4.4X\n", pObj->offset);
fprintf(pFile, "\n");
}
void PUBPrint(struct _sPUB *pObj, FILE *pFile)
{
DBYTE i;
for (i=0; i < pObj->numPubDef; i++)
PUBDEFPrint(&pObj->pubDef[i], pFile);
}
void EXTDEFPrint(struct _sEXTDEF *pObj, FILE *pFile)
{
fprintf(pFile, "External name : %s\n", pObj->name);
fprintf(pFile, "ID BLK : 0x%2.2X\n", pObj->idBlk);
fprintf(pFile, "EXT ID : 0x%2.2X\n", pObj->extID);
fprintf(pFile, "Indirect Call : ");
if (SymbolIsIND(pObj->symINFO) == 1)
fprintf(pFile, "Yes\n");
else
fprintf(pFile, "No\n");
fprintf(pFile, "Variable : ");
if (SymbolIsVAR(pObj->symINFO) == 1)
fprintf(pFile, "Yes\n");
else
fprintf(pFile, "No\n");
fprintf(pFile, "Reg. Banks used : ");
if (SymbolIsRBF(pObj->symINFO) == 1)
fprintf(pFile, "at least one bank\n");
else
fprintf(pFile, "all\n");
fprintf(pFile, "Register bank : %x\n",SymbolGetSymReg(pObj->symINFO));
fprintf(pFile, "Usage Type : %s\n",symTypeName[SegmentGetSymType(pObj->symINFO)]);
fprintf(pFile, "\n");
}
void EXTPrint(struct _sEXT *pObj, FILE *pFile)
{
DBYTE i;
for (i=0; i < pObj->numExtDef; i++)
EXTDEFPrint(&pObj->extDef[i], pFile);
}
void SCDPrint(struct _sSCD *pObj, FILE *pFile)
{
fprintf(pFile, "Block name : %s\n",pObj->name);
fprintf(pFile, "BLK TYP : %s (0x%2.2X)\n",blkTypeName[pObj->blkTYP], pObj->blkTYP);
fprintf(pFile, "\n");
}
void DBGINFOPrint(struct _sDBGINFO *pObj, FILE *pFile, BYTE defType)
{
switch(defType)
{
case DBG_DEFTYP_LOCAL:
case DBG_DEFTYP_PUBLIC:
fprintf(pFile, "Symbol name : %s\n", pObj->name);
fprintf(pFile, "Segment ID : 0x%2.2X", pObj->segID);
if (pObj->segID == 0)
fprintf(pFile, " (Absolut)\n");
else
fprintf(pFile, "\n");
fprintf(pFile, "Indirect Call : ");
if (SymbolIsIND(pObj->symINFO) == 1)
fprintf(pFile, "Yes\n");
else
fprintf(pFile, "No\n");
fprintf(pFile, "Variable : ");
if (SymbolIsVAR(pObj->symINFO) == 1)
fprintf(pFile, "Yes\n");
else
fprintf(pFile, "No\n");
fprintf(pFile, "Reg. Banks used : ");
if (SymbolIsRBF(pObj->symINFO) == 1)
fprintf(pFile, "at least one bank\n");
else
fprintf(pFile, "all\n");
fprintf(pFile, "Register bank : %x\n",SymbolGetSymReg(pObj->symINFO));
fprintf(pFile, "Usage Type : %s\n",symTypeName[SegmentGetSymType(pObj->symINFO)]);
fprintf(pFile, "Symbol Offset : 0x%4.4X\n", pObj->offset);
break;
case DBG_DEFTYP_SEGMENT:
fprintf(pFile, "Symbol name : %s\n", pObj->name);
fprintf(pFile, "Segment ID : 0x%2.2X", pObj->segID);
if (pObj->segID == 0)
fprintf(pFile, " (Absolut)\n");
else
fprintf(pFile, "\n");
fprintf(pFile, "Empty : ");
if (SegmentIsEmpty(pObj->segINFO) == 1)
fprintf(pFile, "Yes\n");
else
fprintf(pFile, "No\n");
fprintf(pFile, "Overlayable : ");
if (SegmentIsOVL(pObj->segINFO) == 1)
fprintf(pFile, "Yes\n");
else
fprintf(pFile, "No\n");
fprintf(pFile, "Register bank : %x\n",SegmentGetSegReg(pObj->segINFO));
fprintf(pFile, "Segment Type : %s\n",segTypeName[SegmentGetSegType(pObj->segINFO)]);
break;
case DBG_DEFTYP_LINE:
fprintf(pFile, "Segment ID : 0x%2.2X", pObj->segID);
if (pObj->segID == 0)
fprintf(pFile, " (Absolut)\n");
else
fprintf(pFile, "\n");
fprintf(pFile, "Symbol Offset : 0x%4.4X\n", pObj->offset);
fprintf(pFile, "Line number : 0x%4.4X\n", pObj->lineNumber);
break;
}
fprintf(pFile, "\n");
}
void DBGPrint(struct _sDBG *pObj, FILE *pFile)
{
DBYTE i;
fprintf(pFile, "* DEF TYP : %s (0x%2.2X)\n",dbgDefTypeName[pObj->defTYP], pObj->defTYP);
for (i=0; i < pObj->numDbgInfo; i++)
DBGINFOPrint(&pObj->dbgInfo[i], pFile, pObj->defTYP);
}
void CNTPrint(struct _sCNT *pObj, FILE *pFile)
{
fprintf(pFile, "Segment ID : 0x%2.2X", pObj->segID);
if (pObj->segID == 0)
fprintf(pFile, " (Absolut)\n");
else
fprintf(pFile, "\n");
fprintf(pFile, "Symbol Offset : 0x%4.4X\n", pObj->offset);
fprintf(pFile, "Data Size : 0x%4.4X\n", pObj->size);
}
void ModulePrint(struct _sMODULE *pObj, FILE *pFile)
{
DBYTE i;
fprintf(pFile, "Module name : %s\n", pObj->pName);
i = 0;
while (pObj->ppCnt[i])
{
fprintf(pFile, "******************************************************************\n");
fprintf(pFile, "* Content [%2.2X]\n",i);
fprintf(pFile, "******************************************************************\n");
CNTPrint(pObj->ppCnt[i++], pFile);
}
}
void OmfPrint(struct _sOBJECT *pObj)
{
char name[255];
BYTE segID;
DBYTE i;
FILE *pFile;
SEGDEF *pSegDef;
if (pObj->allocType == OBJECT_IS_ABS)
sprintf(name, "%s_abs.omf",pObj->mhdr[0].name);
else
sprintf(name, "%s_rel.omf",pObj->mhdr[0].name);
pFile = fopen(name,"wa");
if (pObj->allocType == OBJECT_IS_ABS)
fprintf(pFile,"%s (Absolut OMF)\n",pObj->fileName);
else
fprintf(pFile,"%s (Relocatible OMF)\n",pObj->fileName);
for (i=0; i < pObj->numMHDR; i++)
{
fprintf(pFile, "******************************************************************\n");
fprintf(pFile, "* Module Header [%2.2X]\n",i);
fprintf(pFile, "******************************************************************\n");
MHDRPrint(&pObj->mhdr[i], pFile);
}
for (i=0; i < pObj->numSEG; i++)
{
fprintf(pFile, "******************************************************************\n");
fprintf(pFile, "* Segment Definition [%2.2X]\n",i);
fprintf(pFile, "******************************************************************\n");
SEGPrint(&pObj->seg[i], pFile);
}
for (i=0; i < pObj->numPUB; i++)
{
fprintf(pFile, "******************************************************************\n");
fprintf(pFile, "* Public Definition [%2.2X]\n",i);
fprintf(pFile, "******************************************************************\n");
PUBPrint(&pObj->pub[i], pFile);
}
for (i=0; i < pObj->numEXT; i++)
{
fprintf(pFile, "******************************************************************\n");
fprintf(pFile, "* External Definition [%2.2X]\n",i);
fprintf(pFile, "******************************************************************\n");
EXTPrint(&pObj->ext[i], pFile);
}
for (i=0; i < pObj->numSCD; i++)
{
fprintf(pFile, "******************************************************************\n");
fprintf(pFile, "* Scope Definition [%2.2X]\n",i);
fprintf(pFile, "******************************************************************\n");
SCDPrint(&pObj->scd[i], pFile);
}
for (i=0; i < pObj->numDBG; i++)
{
fprintf(pFile, "******************************************************************\n");
fprintf(pFile, "* Debug Item [%2.2X]\n",i);
fprintf(pFile, "******************************************************************\n");
DBGPrint(&pObj->dbg[i], pFile);
}
for (i=0; i < pObj->numCNT; i++)
{
segID = pObj->cnt[i].segID;
if (segID == 0)
pSegDef = NULL;
else
pSegDef = &pObj->seg[0].segDef[segID-1];
fprintf(pFile, "******************************************************************\n");
fprintf(pFile, "* Content [%2.2X]\n",i);
fprintf(pFile, "******************************************************************\n");
CNTPrint(&pObj->cnt[i], pFile);
if (pSegDef==NULL)
{
fprintf(pFile, "\n");
}
else
{
fprintf(pFile, "------------------------------------------------------------------\n");
fprintf(pFile, " Segment Definition:\n");
fprintf(pFile, "------------------------------------------------------------------\n");
SEGDEFPrint(pSegDef, pFile);
}
}
fprintf(pFile, "******************************************************************\n");
fprintf(pFile, "* Module Information\n");
fprintf(pFile, "******************************************************************\n\n");
for (i=0; i < pObj->numModules; i++)
{
ModulePrint(&pObj->module[i], pFile);
fprintf(pFile, "\n");
}
fprintf(pFile, "\n");
fclose(pFile);
}
/***************************************************************************/
/* Ende
/***************************************************************************/