git-svn-id: http://moon:8086/svn/software/trunk/libsrc/omf51@1 b431acfa-c32f-4a4a-93f1-934dc6c82436
641 lines
16 KiB
C
Executable File
641 lines
16 KiB
C
Executable File
/***************************************************************************/
|
|
/* omf51.c */
|
|
/***************************************************************************/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <memory.h>
|
|
#include "omf51.h"
|
|
#include "omf51const.h"
|
|
#include <types.h>
|
|
#include <ihexparse.h>
|
|
|
|
/***************************************************************************/
|
|
/* Helper Functions
|
|
/***************************************************************************/
|
|
void MHDRInit(struct _sMHDR *pObj)
|
|
{
|
|
pObj->chkSum = 0;
|
|
pObj->reserved = 0;
|
|
pObj->len = 0;
|
|
pObj->name[0] = 0;
|
|
pObj->nameLen = 0;
|
|
pObj->trnID = 0;
|
|
}
|
|
|
|
void MENDInit(struct _sMEND *pObj)
|
|
{
|
|
pObj->chkSum = 0;
|
|
pObj->len = 0;
|
|
pObj->name[0] = 0;
|
|
pObj->nameLen = 0;
|
|
pObj->regMSK = 0;
|
|
pObj->res16 = 0;
|
|
pObj->res8 = 0;
|
|
}
|
|
|
|
void SEGDEFInit(struct _sSEGDEF *pObj)
|
|
{
|
|
pObj->relTYP = 0;
|
|
pObj->res8 = 0;
|
|
pObj->segBASE = 0;
|
|
pObj->segID = 0;
|
|
pObj->segINFO = 0;
|
|
pObj->segSIZE = 0;
|
|
pObj->nameLen = 0;
|
|
pObj->name[0] = 0;
|
|
}
|
|
|
|
void SEGInit(struct _sSEG *pObj)
|
|
{
|
|
DBYTE i;
|
|
|
|
pObj->segDef = (SEGDEF*)malloc(MAX_SEGDEF*sizeof(SEGDEF));
|
|
for(i=0; i < MAX_SEGDEF; i++)
|
|
SEGDEFInit(&pObj->segDef[i]);
|
|
|
|
pObj->chkSum = 0;
|
|
pObj->numSegDef = 0;
|
|
pObj->len = 0;
|
|
}
|
|
|
|
void PUBDEFInit(struct _sPUBDEF *pObj)
|
|
{
|
|
pObj->name[0] = 0;
|
|
pObj->nameLen = 0;
|
|
pObj->offset = 0;
|
|
pObj->res8 = 0;
|
|
pObj->segID = 0;
|
|
pObj->symINFO = 0;
|
|
}
|
|
|
|
void PUBInit(struct _sPUB *pObj)
|
|
{
|
|
DBYTE i;
|
|
|
|
pObj->pubDef = (PUBDEF*)malloc(MAX_PUBDEF*sizeof(PUBDEF));
|
|
for(i=0; i < MAX_PUBDEF; i++)
|
|
PUBDEFInit(&pObj->pubDef[i]);
|
|
|
|
pObj->chkSum = 0;
|
|
pObj->len = 0;
|
|
pObj->numPubDef = 0;
|
|
}
|
|
|
|
void EXTDEFInit(struct _sEXTDEF *pObj)
|
|
{
|
|
pObj->extID = 0;
|
|
pObj->idBlk = 0;
|
|
pObj->name[0] = 0;
|
|
pObj->nameLen = 0;
|
|
pObj->res8 = 0;
|
|
pObj->symINFO = 0;
|
|
}
|
|
|
|
void EXTInit(struct _sEXT *pObj)
|
|
{
|
|
DBYTE i;
|
|
|
|
pObj->extDef = (EXTDEF*)malloc(MAX_EXTDEF*sizeof(EXTDEF));
|
|
for(i=0; i < MAX_EXTDEF; i++)
|
|
EXTDEFInit(&pObj->extDef[i]);
|
|
|
|
pObj->chkSum = 0;
|
|
pObj->len = 0;
|
|
pObj->numExtDef = 0;
|
|
}
|
|
|
|
void SCDInit(struct _sSCD *pObj)
|
|
{
|
|
pObj->blkTYP = 0;
|
|
pObj->chkSum = 0;
|
|
pObj->len = 0;
|
|
pObj->name[0] = 0;
|
|
pObj->nameLen = 0;
|
|
}
|
|
|
|
void DBGINFOInit(struct _sDBGINFO *pObj)
|
|
{
|
|
pObj->lineNumber = 0;
|
|
pObj->name[0] = 0;
|
|
pObj->nameLen = 0;
|
|
pObj->offset = 0;
|
|
pObj->res8 = 0;
|
|
pObj->segID = 0;
|
|
pObj->segINFO = 0;
|
|
pObj->symINFO = 0;
|
|
|
|
}
|
|
|
|
void DBGInit(struct _sDBG *pObj)
|
|
{
|
|
DBYTE i;
|
|
|
|
pObj->dbgInfo = (DBGINFO*)malloc(MAX_DBGINFO*sizeof(DBGINFO));
|
|
for(i=0; i < MAX_DBGINFO; i++)
|
|
DBGINFOInit(&pObj->dbgInfo[i]);
|
|
|
|
pObj->chkSum = 0;
|
|
pObj->defTYP = 0;
|
|
pObj->len = 0;
|
|
pObj->numDbgInfo = 0;
|
|
|
|
}
|
|
|
|
void CNTInit(struct _sCNT *pObj)
|
|
{
|
|
pObj->chkSum = 0;
|
|
pObj->len = 0;
|
|
pObj->offset = 0;
|
|
pObj->pData = NULL;
|
|
pObj->segID = 0;
|
|
pObj->size = 0;
|
|
}
|
|
|
|
void FIXDEFInit(struct _sFIXDEF *pObj)
|
|
{
|
|
pObj->refLoc = 0;
|
|
pObj->refTYP = 0;
|
|
pObj->operand.ID = 0;
|
|
pObj->operand.IDBlk = 0;
|
|
pObj->operand.offset = 0;
|
|
}
|
|
|
|
void FIXInit(struct _sFIX *pObj)
|
|
{
|
|
DBYTE i;
|
|
|
|
|
|
pObj->fixDef = (FIXDEF*)malloc(MAX_FIXDEF*sizeof(FIXDEF));
|
|
for(i=0; i < MAX_FIXDEF; i++)
|
|
FIXDEFInit(&pObj->fixDef[i]);
|
|
|
|
pObj->chkSum = 0;
|
|
pObj->len = 0;
|
|
pObj->numFixDef = 0;
|
|
}
|
|
|
|
void ModuleInit(struct _sMODULE *pObj)
|
|
{
|
|
DBYTE i;
|
|
|
|
pObj->numCnt = 0;
|
|
pObj->numDbg = 0;
|
|
pObj->numFix = 0;
|
|
pObj->pName = NULL;
|
|
|
|
for (i=0; i < MAX_DBG; i++)
|
|
pObj->ppDbg[i] = NULL;
|
|
|
|
for (i=0; i < MAX_CNT; i++)
|
|
pObj->ppCnt[i] = NULL;
|
|
|
|
for (i=0; i < MAX_FIX; i++)
|
|
pObj->ppFix[i] = NULL;
|
|
}
|
|
|
|
/***************************************************************************/
|
|
/* Exported Functions
|
|
/***************************************************************************/
|
|
void OmfInit(struct _sOBJECT *pObj)
|
|
{
|
|
DBYTE i;
|
|
|
|
pObj->mhdr = (MHDR*)malloc(MAX_MHDR*sizeof(MHDR));
|
|
for (i=0; i < MAX_MHDR; i++)
|
|
MHDRInit(&pObj->mhdr[i]);
|
|
|
|
pObj->mend = (MEND*)malloc(MAX_MEND*sizeof(MEND));
|
|
for (i=0; i < MAX_MEND; i++)
|
|
MENDInit(&pObj->mend[i]);
|
|
|
|
pObj->seg = (SEG*)malloc(MAX_SEG*sizeof(SEG));
|
|
for (i=0; i < MAX_SEG; i++)
|
|
SEGInit(&pObj->seg[i]);
|
|
|
|
pObj->pub = (PUB*)malloc(MAX_PUB*sizeof(PUB));
|
|
for (i=0; i < MAX_PUB; i++)
|
|
PUBInit(&pObj->pub[i]);
|
|
|
|
pObj->ext = (EXT*)malloc(MAX_EXT*sizeof(EXT));
|
|
for (i=0; i < MAX_EXT; i++)
|
|
EXTInit(&pObj->ext[i]);
|
|
|
|
pObj->scd = (SCD*)malloc(MAX_SCD*sizeof(SCD));
|
|
for (i=0; i < MAX_SCD; i++)
|
|
SCDInit(&pObj->scd[i]);
|
|
|
|
pObj->dbg = (DBG*)malloc(MAX_DBG*sizeof(DBG));
|
|
for (i=0; i < MAX_DBG; i++)
|
|
DBGInit(&pObj->dbg[i]);
|
|
|
|
pObj->cnt = (CNT*)malloc(MAX_CNT*sizeof(CNT));
|
|
for (i=0; i < MAX_CNT; i++)
|
|
CNTInit(&pObj->cnt[i]);
|
|
|
|
pObj->fix = (FIX*)malloc(MAX_FIX*sizeof(FIX));
|
|
for (i=0; i < MAX_FIX; i++)
|
|
FIXInit(&pObj->fix[i]);
|
|
|
|
pObj->module = (MODULE*)malloc(MAX_MODULES*sizeof(MODULE));
|
|
for (i=0; i < MAX_MODULES; i++)
|
|
ModuleInit(&pObj->module[i]);
|
|
|
|
pObj->numUnknown = 0;
|
|
pObj->numMHDR = 0;
|
|
pObj->numCNT = 0;
|
|
pObj->numDBG = 0;
|
|
pObj->numEXT = 0;
|
|
pObj->numFIX = 0;
|
|
pObj->numLDIC = 0;
|
|
pObj->numLHDR = 0;
|
|
pObj->numLML = 0;
|
|
pObj->numLMN = 0;
|
|
pObj->numMEND = 0;
|
|
pObj->numPUB = 0;
|
|
pObj->numSCD = 0;
|
|
pObj->numSEG = 0;
|
|
pObj->numModules = 0;
|
|
pObj->numUnimplemented = 0;
|
|
pObj->allocType = OBJECT_IS_ABS;
|
|
|
|
}
|
|
|
|
int OmfOpen(struct _sOBJECT *pObj, char *pName)
|
|
{
|
|
strcpy((char*)pObj->fileName, (char*)pName);
|
|
pObj->pFile = fopen(pName, "rb");
|
|
if (pObj->pFile == NULL)
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
void OmfClose(struct _sOBJECT *pObj)
|
|
{
|
|
fclose(pObj->pFile);
|
|
}
|
|
|
|
void OmfRead(struct _sOBJECT *pObj)
|
|
{
|
|
BYTE recType, recChkSum, modFinished;
|
|
DBYTE recCnt,recLen, i;
|
|
MHDR *pMHDR;
|
|
MEND *pMEND;
|
|
SEG *pSEG;
|
|
SEGDEF *pSEGDEF;
|
|
PUB *pPUB;
|
|
PUBDEF *pPUBDEF;
|
|
EXT *pEXT;
|
|
EXTDEF *pEXTDEF;
|
|
SCD *pSCD, *pCpyScd;
|
|
DBG *pDBG, *pCpyDbg;
|
|
DBGINFO *pDBGINFO;
|
|
CNT *pCNT, *pCpyCnt;
|
|
FIX *pFIX, *pCpyFix;
|
|
FIXDEF *pFIXDEF;
|
|
MODULE *pMod;
|
|
|
|
recCnt=0;
|
|
modFinished=0;
|
|
pCpyDbg = pObj->dbg;
|
|
pCpyCnt = pObj->cnt;
|
|
pCpyFix = pObj->fix;
|
|
pCpyScd = pObj->scd;
|
|
|
|
while(!feof(pObj->pFile))
|
|
{
|
|
if (fread(&recType, sizeof(BYTE), 1, pObj->pFile)==0)
|
|
break;
|
|
if (fread(&recLen, sizeof(DBYTE), 1, pObj->pFile)==0)
|
|
break;
|
|
|
|
pMod = &pObj->module[pObj->numModules];
|
|
switch(recType)
|
|
{
|
|
case REC_TYPE_MHDR: /* Module Header Record */
|
|
pMHDR = &pObj->mhdr[pObj->numMHDR];
|
|
pMHDR->len = recLen;
|
|
fread(&pMHDR->nameLen, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(pMHDR->name, sizeof(BYTE), (size_t)pMHDR->nameLen, pObj->pFile);
|
|
pMHDR->name[pMHDR->nameLen] = 0;
|
|
fread(&pMHDR->trnID, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pMHDR->reserved, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pMHDR->chkSum, sizeof(BYTE), 1, pObj->pFile);
|
|
pObj->numMHDR++;
|
|
break;
|
|
|
|
case REC_TYPE_MEND: /* Module End Record */
|
|
pMEND = &pObj->mend[pObj->numMEND];
|
|
pMEND->len = recLen;
|
|
fread(&pMEND->nameLen, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(pMEND->name, sizeof(BYTE), (size_t)pMEND->nameLen, pObj->pFile);
|
|
pMEND->name[pMEND->nameLen] = 0;
|
|
fread(&pMEND->res16, sizeof(DBYTE), 1, pObj->pFile);
|
|
fread(&pMEND->regMSK, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pMEND->res8, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pMEND->chkSum, sizeof(BYTE), 1, pObj->pFile);
|
|
pObj->numMEND++;
|
|
|
|
/* Update Modules (Sorting) */
|
|
pMod->pName = pCpyScd->name;
|
|
for (i=0; i < pMod->numCnt; i++)
|
|
pMod->ppCnt[i] = pCpyCnt++;
|
|
|
|
for (i=0; i < pMod->numDbg; i++)
|
|
pMod->ppDbg[i] = pCpyDbg++;
|
|
|
|
for (i=0; i < pMod->numFix; i++)
|
|
pMod->ppFix[i] = pCpyFix++;
|
|
pObj->numModules++;
|
|
modFinished = 0;
|
|
break;
|
|
|
|
case REC_TYPE_CNT: /* Content Record */
|
|
pCNT = &pObj->cnt[pObj->numCNT];
|
|
pCNT->len = recLen;
|
|
fread(&pCNT->segID, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pCNT->offset, sizeof(DBYTE), 1, pObj->pFile);
|
|
if (pCNT->segID > 0)
|
|
{
|
|
pSEGDEF = &pObj->seg[0].segDef[pCNT->segID-1];
|
|
pCNT->size = pSEGDEF->segSIZE;
|
|
}
|
|
pCNT->size = pCNT->len-4;
|
|
|
|
pCNT->pData = (BYTE*)malloc(pCNT->size*sizeof(BYTE));
|
|
fread(pCNT->pData, sizeof(BYTE), (size_t)pCNT->size, pObj->pFile);
|
|
fread(&pCNT->chkSum, sizeof(BYTE), 1, pObj->pFile);
|
|
pObj->numCNT++;
|
|
pMod->numCnt++;
|
|
break;
|
|
|
|
case REC_TYPE_FIX: /* Fixup Record */
|
|
pFIX = &pObj->fix[pObj->numFIX];
|
|
pFIX->len = recLen;
|
|
|
|
recLen -= 1;
|
|
while (recLen)
|
|
{
|
|
pFIXDEF = &pFIX->fixDef[pFIX->numFixDef];
|
|
fread(&pFIXDEF->refLoc, sizeof(DBYTE), 1, pObj->pFile);
|
|
fread(&pFIXDEF->refTYP, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pFIXDEF->operand.IDBlk, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pFIXDEF->operand.ID, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pFIXDEF->operand.offset, sizeof(DBYTE), 1, pObj->pFile);
|
|
recLen -= (DBYTE)7;
|
|
pFIX->numFixDef++;
|
|
}
|
|
fread(&pFIX->chkSum, sizeof(BYTE), 1, pObj->pFile);
|
|
pObj->numFIX++;
|
|
pMod->numFix++;
|
|
break;
|
|
|
|
case REC_TYPE_SEG: /* Segment Definition Record */
|
|
pSEG = &pObj->seg[pObj->numSEG];
|
|
pSEG->len = recLen;
|
|
|
|
recLen -= 1;
|
|
while (recLen)
|
|
{
|
|
pSEGDEF = &pSEG->segDef[pSEG->numSegDef];
|
|
fread(&pSEGDEF->segID, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pSEGDEF->segINFO, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pSEGDEF->relTYP, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pSEGDEF->res8, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pSEGDEF->segBASE, sizeof(DBYTE), 1, pObj->pFile);
|
|
fread(&pSEGDEF->segSIZE, sizeof(DBYTE), 1, pObj->pFile);
|
|
fread(&pSEGDEF->nameLen, sizeof(BYTE), 1, pObj->pFile);
|
|
if (pSEGDEF->nameLen > 0)
|
|
fread(&pSEGDEF->name, sizeof(BYTE), (size_t)pSEGDEF->nameLen, pObj->pFile);
|
|
pSEGDEF->name[pSEGDEF->nameLen] = 0;
|
|
recLen -= (DBYTE)(pSEGDEF->nameLen + 9);
|
|
pSEG->numSegDef++;
|
|
}
|
|
fread(&pSEG->chkSum, sizeof(BYTE), 1, pObj->pFile);
|
|
pObj->numSEG++;
|
|
pObj->allocType = OBJECT_IS_REL;
|
|
break;
|
|
|
|
case REC_TYPE_SCD: /* Scope Definition Record */
|
|
pSCD = &pObj->scd[pObj->numSCD];
|
|
pSCD->len = recLen;
|
|
|
|
fread(&pSCD->blkTYP, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pSCD->nameLen, sizeof(BYTE), 1, pObj->pFile);
|
|
if (pSCD->nameLen > 0)
|
|
fread(pSCD->name, sizeof(BYTE), pSCD->nameLen, pObj->pFile);
|
|
|
|
pSCD->name[pSCD->nameLen] = 0;
|
|
fread(&pSCD->chkSum, sizeof(BYTE), 1, pObj->pFile);
|
|
pObj->numSCD++;
|
|
if (pSCD->blkTYP == SCD_BLKTYP_MOD_BLOCK)
|
|
{
|
|
if (modFinished == 1)
|
|
{
|
|
/* Update Modules (Sorting) */
|
|
pMod->pName = pCpyScd->name;
|
|
for (i=0; i < pMod->numCnt; i++)
|
|
pMod->ppCnt[i] = pCpyCnt++;
|
|
|
|
for (i=0; i < pMod->numDbg; i++)
|
|
pMod->ppDbg[i] = pCpyDbg++;
|
|
|
|
for (i=0; i < pMod->numFix; i++)
|
|
pMod->ppFix[i] = pCpyFix++;
|
|
pObj->numModules++;
|
|
modFinished = 0;
|
|
pCpyScd++;
|
|
pCpyScd++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(pSCD->blkTYP == SCD_BLKTYP_MOD_END)
|
|
{
|
|
modFinished = 1;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case REC_TYPE_DBG: /* Debug Item Record */
|
|
pDBG = &pObj->dbg[pObj->numDBG];
|
|
pDBG->len = recLen;
|
|
fread(&pDBG->defTYP, sizeof(BYTE), 1, pObj->pFile);
|
|
|
|
recLen -= 2;
|
|
switch(pDBG->defTYP)
|
|
{
|
|
case DBG_DEFTYP_LOCAL:
|
|
case DBG_DEFTYP_PUBLIC:
|
|
while (recLen)
|
|
{
|
|
pDBGINFO = &pDBG->dbgInfo[pDBG->numDbgInfo];
|
|
fread(&pDBGINFO->segID, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pDBGINFO->symINFO, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pDBGINFO->offset, sizeof(DBYTE), 1, pObj->pFile);
|
|
fread(&pDBGINFO->res8, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pDBGINFO->nameLen, sizeof(BYTE), 1, pObj->pFile);
|
|
if (pDBGINFO->nameLen > 0)
|
|
fread(&pDBGINFO->name, sizeof(BYTE), (size_t)pDBGINFO->nameLen, pObj->pFile);
|
|
pDBGINFO->name[pDBGINFO->nameLen] = 0;
|
|
recLen -= (DBYTE)(pDBGINFO->nameLen + 6);
|
|
pDBG->numDbgInfo++;
|
|
}
|
|
break;
|
|
case DBG_DEFTYP_SEGMENT:
|
|
while (recLen)
|
|
{
|
|
pDBGINFO = &pDBG->dbgInfo[pDBG->numDbgInfo];
|
|
fread(&pDBGINFO->segID, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pDBGINFO->segINFO, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pDBGINFO->offset, sizeof(DBYTE), 1, pObj->pFile);
|
|
fread(&pDBGINFO->res8, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pDBGINFO->nameLen, sizeof(BYTE), 1, pObj->pFile);
|
|
if (pDBGINFO->nameLen > 0)
|
|
fread(&pDBGINFO->name, sizeof(BYTE), (size_t)pDBGINFO->nameLen, pObj->pFile);
|
|
pDBGINFO->name[pDBGINFO->nameLen] = 0;
|
|
recLen -= (DBYTE)(pDBGINFO->nameLen + 6);
|
|
pDBG->numDbgInfo++;
|
|
}
|
|
break;
|
|
case DBG_DEFTYP_LINE:
|
|
while (recLen)
|
|
{
|
|
pDBGINFO = &pDBG->dbgInfo[pDBG->numDbgInfo];
|
|
fread(&pDBGINFO->segID, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pDBGINFO->offset, sizeof(DBYTE), 1, pObj->pFile);
|
|
fread(&pDBGINFO->lineNumber, sizeof(DBYTE), 1, pObj->pFile);
|
|
recLen -= (DBYTE)5;
|
|
pDBG->numDbgInfo++;
|
|
}
|
|
break;
|
|
}
|
|
fread(&pDBG->chkSum, sizeof(BYTE), 1, pObj->pFile);
|
|
pObj->numDBG++;
|
|
pMod->numDbg++;
|
|
break;
|
|
|
|
case REC_TYPE_PUB: /* Public Definition Record */
|
|
pPUB = &pObj->pub[pObj->numPUB];
|
|
pPUB->len = recLen;
|
|
|
|
recLen -= 1;
|
|
while (recLen)
|
|
{
|
|
pPUBDEF = &pPUB->pubDef[pPUB->numPubDef];
|
|
fread(&pPUBDEF->segID, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pPUBDEF->symINFO, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pPUBDEF->offset, sizeof(DBYTE), 1, pObj->pFile);
|
|
fread(&pPUBDEF->res8, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pPUBDEF->nameLen, sizeof(BYTE), 1, pObj->pFile);
|
|
if (pPUBDEF->nameLen > 0)
|
|
fread(&pPUBDEF->name, sizeof(BYTE), (size_t)pPUBDEF->nameLen, pObj->pFile);
|
|
pPUBDEF->name[pPUBDEF->nameLen] = 0;
|
|
recLen -= (DBYTE)(pPUBDEF->nameLen + 6);
|
|
pPUB->numPubDef++;
|
|
}
|
|
fread(&pPUB->chkSum, sizeof(BYTE), 1, pObj->pFile);
|
|
pObj->numPUB++;
|
|
break;
|
|
|
|
case REC_TYPE_EXT: /* External Definition Record */
|
|
pEXT = &pObj->ext[pObj->numEXT];
|
|
pEXT->len = recLen;
|
|
|
|
recLen -= 1;
|
|
while (recLen)
|
|
{
|
|
pEXTDEF = &pEXT->extDef[pEXT->numExtDef];
|
|
fread(&pEXTDEF->idBlk, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pEXTDEF->extID, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pEXTDEF->symINFO, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pEXTDEF->res8, sizeof(BYTE), 1, pObj->pFile);
|
|
fread(&pEXTDEF->nameLen, sizeof(BYTE), 1, pObj->pFile);
|
|
if (pEXTDEF->nameLen > 0)
|
|
fread(&pEXTDEF->name, sizeof(BYTE), (size_t)pEXTDEF->nameLen, pObj->pFile);
|
|
pEXTDEF->name[pEXTDEF->nameLen] = 0;
|
|
recLen -= (DBYTE)(pEXTDEF->nameLen + 5);
|
|
pEXT->numExtDef++;
|
|
}
|
|
fread(&pEXT->chkSum, sizeof(BYTE), 1, pObj->pFile);
|
|
pObj->numEXT++;
|
|
break;
|
|
|
|
case REC_TYPE_LML: /* LIB ModLocs Record */
|
|
fseek(pObj->pFile, (long)recLen-1, SEEK_CUR);
|
|
fread(&recChkSum, sizeof(BYTE), 1, pObj->pFile);
|
|
pObj->numLML++;
|
|
pObj->numUnimplemented++;
|
|
break;
|
|
|
|
case REC_TYPE_LMN: /* LIB ModName Record */
|
|
fseek(pObj->pFile, (long)recLen-1, SEEK_CUR);
|
|
fread(&recChkSum, sizeof(BYTE), 1, pObj->pFile);
|
|
pObj->numLMN++;
|
|
pObj->numUnimplemented++;
|
|
break;
|
|
|
|
case REC_TYPE_LDIC: /* LIB DICTNRY Record */
|
|
fseek(pObj->pFile, (long)recLen-1, SEEK_CUR);
|
|
fread(&recChkSum, sizeof(BYTE), 1, pObj->pFile);
|
|
pObj->numLDIC++;
|
|
pObj->numUnimplemented++;
|
|
break;
|
|
|
|
case REC_TYPE_LHDR: /* LIB Header Record */
|
|
fseek(pObj->pFile, (long)recLen-1, SEEK_CUR);
|
|
fread(&recChkSum, sizeof(BYTE), 1, pObj->pFile);
|
|
pObj->numLHDR++;
|
|
pObj->numUnimplemented++;
|
|
break;
|
|
|
|
default:
|
|
fseek(pObj->pFile, (long)recLen, SEEK_CUR);
|
|
pObj->numUnknown++;
|
|
break;
|
|
}
|
|
recCnt++;
|
|
}
|
|
}
|
|
|
|
void Omf2Hex(struct _sOBJECT *pObj)
|
|
{
|
|
char name[255];
|
|
|
|
DBYTE i, size, len;
|
|
BYTE *pData;
|
|
CNT *pCnt;
|
|
HEXREC hex;
|
|
sprintf(name, "%s.hex",pObj->mhdr[0].name);
|
|
HexCreate(&hex, name);
|
|
|
|
for (i=0; i < pObj->numCNT; i++)
|
|
{
|
|
pCnt = &pObj->cnt[i];
|
|
pData = pCnt->pData;
|
|
size = pCnt->size;
|
|
|
|
hex.dataStart = pCnt->offset;
|
|
while(size)
|
|
{
|
|
len = size;
|
|
|
|
if (len > HEXREC_MAXLEN)
|
|
len = HEXREC_MAXLEN;
|
|
|
|
memcpy(hex.recData, pData, len);
|
|
hex.length = (BYTE)len;
|
|
hex.type = 0;
|
|
HexWriteRecord(&hex);
|
|
hex.dataStart += len;
|
|
pData += len;
|
|
size -= len;
|
|
}
|
|
|
|
}
|
|
HexClose(&hex);
|
|
}
|
|
/***************************************************************************/
|
|
/* Ende
|
|
/***************************************************************************/
|