// _readsym.idc // This script imports Pentica-B symbol file information // code by twh, rev 10/04/2000 #include // These values for use with Hitachi H8300L (3644F) #define SEGOFFSET 0x10000 #define IVT_START 0x0000 #define IVT_END 0x002F #define ROM_START 0x0030 #define ROM_END 0x7FFF #define RAM_START 0xFB80 #define RAM_END 0xFF7F static htox(strHex) { auto hlt, ea, i, x; hlt = "0123456789ABCDEF"; i = 0; ea = 0; // ignore trailing 'H' while (i < (strlen(strHex)-1)) { x = strstr(hlt, substr(strHex, i, i+1)); ea = (ea * 16) + x; i = i + 1; } return(ea); } static GNFToken(InFileH) { auto name, t, whitespace; whitespace = "\040\012\015"; name = ""; t = fgetc(InFileH); while ( ( t != -1 ) && ( strstr(whitespace, t) >= 0 ) ) { t = fgetc(InFileH); } while ( t != -1 ) { name = name + t; t = fgetc(InFileH); if ( strstr(whitespace, t) >= 0 ) break; } return(name); } static GetInputPath() { auto p, r, e; p = GetInputFilePath(); r = -1; e = strlen( p ); while ( r < 0 ) { e--; r = strstr(substr(p, e, -1), "\\"); } return( substr(p, 0, ++e) ); } static main(void) { auto minea, ea, tkn, name; auto InFName, InFileH; auto errcode; auto i, j; minea = MinEA(); // browse for an input symbol file name (.sym) InFName = AskFile(0, GetInputPath() + "*.sym", "Locate symbol file:"); InFileH = fopen(InFName, "rb"); if (InFileH != 0) { Message("Fixing up segments...\n"); errcode = SegBounds(SEGOFFSET + ROM_START, SEGOFFSET + ROM_START, SEGOFFSET + ROM_END + 1, 0); errcode = SegRename(SEGOFFSET + ROM_START, "ROM"); errcode = SegCreate(SEGOFFSET + IVT_START, SEGOFFSET + IVT_END + 1, (SEGOFFSET >> 4), 0, saRelPage, scPub); errcode = SegRename(SEGOFFSET + IVT_START, "IVT"); errcode = SegCreate(SEGOFFSET + RAM_START, SEGOFFSET + RAM_END + 1, (SEGOFFSET >> 4), 0, saRelPage, scPub); errcode = SegRename(SEGOFFSET + RAM_START, "RAM"); Message("Beginning import of Hitachi symbols.\n"); // locate tof marker - BEGIN tkn = GNFToken(InFileH); while ( tkn != "BEGIN" ) { tkn = GNFToken(InFileH); } // watch for eof marker - "END" tkn = GNFToken(InFileH); while ( tkn != "END" ) { // calculate address from HEX rep ea = htox( tkn ); ea = ea + minea; // read the name label tkn = GNFToken(InFileH); name = tkn; if (MakeName( ea, "" ) == 0 ) { MakeUnkn(ea, 0); MakeName( ea, "" ); } if (MakeName( ea, name ) == 0 ) { Message(" Address: '" + tkn + "'" + "(%x) ", ea ); Message(" Label: '" + name); Message(" Failed!\n"); } tkn = GNFToken(InFileH); } Message("Finished importing Hitachi symbols.\n"); fclose (InFileH); for (i = (SEGOFFSET + IVT_START); i < (SEGOFFSET + ROM_START); i = i + 2 ) { MakeWord(i); OpOff(i,0,SEGOFFSET); j = Word( i ) + SEGOFFSET; errcode = AddEntryPoint(j,j,"",1); MakeCode( j ); AutoMark( j, AU_PROC ); } // get Power On Reset vector i = Word(SEGOFFSET + IVT_START) + SEGOFFSET; Message("Entry point is: %08x\n", i ); AnalyseArea(i, SEGOFFSET + ROM_END); Wait(); } }