summaryrefslogtreecommitdiffstats
path: root/coff.h
diff options
context:
space:
mode:
Diffstat (limited to 'coff.h')
-rw-r--r--coff.h208
1 files changed, 208 insertions, 0 deletions
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);