From 925d0670c45e1100e412070fa0ce2405604f219a Mon Sep 17 00:00:00 2001 From: Attila Veghelyi Date: Thu, 29 Jun 2023 16:24:54 +0200 Subject: Init repo --- coff.h | 208 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 coff.h (limited to 'coff.h') diff --git a/coff.h b/coff.h new file mode 100644 index 0000000..1175c04 --- /dev/null +++ b/coff.h @@ -0,0 +1,208 @@ +// 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); -- cgit v1.2.3-54-g00ecf