// COFF file parser // COFF file structure: // file header // optional header // sections(name, address, size, raw data pointer, reloc entry, ptr to first line, number of lines) // relocation entries // symbols (name, value, section, type, class) + optional info // lines (source file symbol, line number, address of code) // symbol table // string table #define LMAX 0x2200 #define DATA_MAX 0x2200 #define ULMAX 0x400 typedef struct filehdr { unsigned short f_magic; unsigned short f_nscns; unsigned long f_timdat; unsigned long f_symptr; unsigned long f_nsyms; unsigned short f_opthdr; unsigned short f_flags; } filehdr_t; typedef struct opthdr { unsigned short magic; unsigned long vstamp; unsigned long proc_type; unsigned long rom_width_bits; unsigned long ram_width_bits; } opthdr_t; typedef struct scnhdr { union { char _s_name[8]; /* section name is a string */ struct { unsigned long _s_zeroes; unsigned long _s_offset; }_s_s; }_s; unsigned long s_paddr; unsigned long s_vaddr; unsigned long s_size; unsigned long s_scnptr; unsigned long s_relptr; unsigned long s_lnnoptr; unsigned short s_nreloc; unsigned short s_nlnno; unsigned long s_flags; } scnhdr_t; typedef struct reloc { unsigned long r_vaddr; unsigned long r_symndx; short r_offset; unsigned short r_type; } reloc_t; #define SYMNMLEN 8 typedef struct syment { union { char _n_name[SYMNMLEN]; struct { unsigned long _n_zeroes; unsigned long _n_offset; } _n_n; char *_n_nptr[2]; } _n; unsigned long n_value; short n_scnum; unsigned long n_type; char n_sclass; unsigned char n_numaux; } syment_t; typedef struct coff_lineno { unsigned long l_srcndx; unsigned short l_lnno; unsigned long l_paddr; unsigned short l_flags; unsigned long l_fcnndx; } coff_lineno_t; typedef struct aux_file { unsigned long x_offset; unsigned long x_incline; unsigned char x_flags; char _unused[11]; } aux_file_t; typedef struct aux_scn { unsigned long x_scnlen; unsigned short x_nreloc; unsigned short x_nlinno; char _unused[12]; } aux_scn_t; typedef struct aux_tag { char _unused[6]; unsigned short x_size; char _unused2[4]; unsigned long x_endndx; char _unused3[4]; } aux_tag_t; typedef struct aux_eos { unsigned long x_tagndx; char _unused[2]; unsigned short x_size; char _unused2[12]; } aux_eos_t; typedef struct aux_fcn { unsigned long x_tagndx; unsigned long x_size; unsigned long x_lnnoptr; unsigned long x_endndx; short x_actscnum; char _unused[2]; } aux_fcn_t; typedef struct aux_fcn_calls { unsigned long x_calleendx; unsigned long x_is_interrupt; char _unused[12]; } aux_fcn_calls_t; #define X_DIMNUM 4 typedef struct aux_arr { unsigned long x_tagndx; unsigned short x_lnno; unsigned short x_size; unsigned short x_dimen[X_DIMNUM]; char _unused[4]; } aux_arr_t; typedef struct aux_eobf { char _unused[4]; unsigned short x_lnno; char _unused2[14]; } aux_eobf_t; typedef struct aux_bobf { char _unused[4]; unsigned short x_lnno; char _unused2[6]; unsigned long x_endndx; char _unused3[4]; } aux_bobf_t; typedef struct aux_var { unsigned long x_tagndx; char _unused[2]; unsigned short x_size; char _unused2[12]; } aux_var_t; typedef struct aux_field { char _unused[6]; unsigned short x_size; char _unused2[12]; } aux_field_t; struct src_i { char* label; int src_file; int src_line; }; struct srcfile { unsigned long l_srcndx; char* name; FILE* ptr; int nlines; long int *lineptr; //line pointer array }; struct symbol { char* name; int value; }; FILE* scanSourceFile(struct srcfile *s_files_p); int analyzeCOFF(char *filename,char* label[LMAX],char* ulabel[ULMAX],struct src_i source_info[LMAX],\ struct srcfile **s_files_p,unsigned short data[0x2200],struct symbol **sym_p, int* nsym);