home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / OBJASM.ZIP / O.H < prev    next >
C/C++ Source or Header  |  1990-12-12  |  18KB  |  436 lines

  1.  
  2. #define FALSE   (0==1)
  3. #define TRUE    (!FALSE)
  4. #define FULL    (EOF-1)
  5.  
  6. #define L_SET   0                       /* Seek methods for fseek() */
  7. #define L_REL   1
  8. #define L_APND  2
  9.  
  10. /*
  11. ** Definitions for AVL balanced, threaded tree structures
  12. */
  13. #define LEFT        0                   /* Left pointer is array element 0  */
  14. #define RIGHT       1                   /* Right ptr is array element 1     */
  15. #define BALANCED    2                   /* Balanced is not right nor left   */
  16. #define EQUAL       2                   /* Value returned for equal compare */
  17.  
  18. #define NAMESIZE    40                  /* Max Size of Labels */
  19. #define OPSIZE      60                  /* Max Size of Operand Text */
  20. #define COMSIZE     60                  /* Max Size of Hex Comment */
  21.  
  22. #define UNKNOWN     0                   /* Symbol 'type' values */
  23. #define NEAR        1                   /* Symbol is a NEAR label        */
  24. #define FAR         2                   /* Symbol is a FAR label         */
  25. #define BYTE_PTR    3                   /* Symbol is a   1 byte quantity */
  26. #define WORD_PTR    4                   /* Symbol is a   2 byte quantity */
  27. #define DWORD_PTR   5                   /* Symbol is a   4 byte quantity */
  28. #define FWORD_PTR   6                   /* Symbol is a   6 byte quantity */
  29. #define QWORD_PTR   7                   /* Symbol is an  8 byte quantity */
  30. #define TBYTE_PTR   8                   /* Symbol is a  10 byte quantity */
  31.  
  32. #define LOCAL       0                   /* Symbol 'domain' values */
  33. #define PUBLIC      1
  34.  
  35. #define ENUMERATED  0                   /* Data record 'type' values */
  36. #define ITERATED    1
  37.  
  38. #define LOBYTE  0                       /* Fix-up record forms */
  39. #define OFFSET  1
  40. #define BASE    2
  41. #define POINTER 3
  42. #define HIBYTE  4
  43. #define LOADOFF 5
  44.  
  45. #define SEGMENT     0
  46. #define GROUP       1
  47. #define EXTERNAL    2
  48. #define FRAME       3
  49. #define LOCATION    4
  50. #define TARGET      5
  51. #define NONE        6
  52.  
  53.  
  54. #define NORMAL  0                       /* data_check() return values */
  55. #define LABEL   1
  56. #define FIXUP   2
  57. #define BAD     3                       /* Half aligned */
  58.  
  59. #define REGULAR 0                       /* Regular Intel OMF record types    */
  60. #define LARGER  1                       /* Extended for > 64k segments by MS */
  61.  
  62. #define EXT_PER_REC     64              /* Easy number of EXT's per segment */
  63.  
  64. #define NREG    0                       /* Shorthand register notations */
  65. #define AL      1
  66. #define CL      2
  67. #define DL      3
  68. #define BL      4
  69. #define AH      5
  70. #define CH      6
  71. #define DH      7
  72. #define BH      8
  73.  
  74. #define AX      9                       /* Or EAX, etc. as may arise */
  75. #define CX      10
  76. #define DX      11
  77. #define BX      12
  78. #define SP      13
  79. #define BP      14
  80. #define SI      15
  81. #define DI      16
  82.  
  83. #define ES      17                      /* Segment register identifiers */
  84. #define CS      18
  85. #define SS      19
  86. #define DS      20
  87. #define FS      21
  88. #define GS      22
  89.  
  90. #define MAX_SEG_REGS    6
  91.  
  92. typedef struct node_s NODE_T;
  93.  
  94. struct node_s {                         /*--- Structure of a tree node ---*/
  95.     short   balance;                    /* Balance of this tree node      */
  96.     NODE_T  *ptr[2];                    /* Left & Right pointers          */
  97.     int     thread[2];                  /* Indicates thread or pointer    */
  98.     char    *data;
  99. };
  100.  
  101. typedef struct name_s NAME_T;
  102.  
  103. struct name_s {                         /*--- Structure of NAME list ---*/
  104.     int     index;                      /* Sequentially assigned number */
  105.     char    name[NAMESIZE+1];           /* Name from LNAMES record      */
  106. };
  107.  
  108. typedef struct seg_s SEG_T;
  109.  
  110. struct seg_s {                              /*--- Structure of SEGMENT list --*/
  111.     int             index;                  /* Sequentially assigned no.      */
  112.     int             name;                   /* Name index for segment name    */
  113.     NAME_T          *class;                 /* Pointer to Name for seg. class */
  114.     unsigned int    length;                 /* Length of segment (incl. dups) */
  115.     int             code;                   /* Flag indicating code segment   */
  116.     int             bit32;                  /* 32 bit segment                 */
  117.     int             new_mode[MAX_SEG_REGS]; /* Frame Mode                     */
  118.     int             new_index[MAX_SEG_REGS];/* Frame Index                    */
  119.     int             prv_mode[MAX_SEG_REGS]; /* Frame Mode                     */
  120.     int             prv_index[MAX_SEG_REGS];/* Frame Index                     */
  121. };
  122.  
  123. typedef struct grp_s GRP_T;
  124.  
  125. struct grp_s {                          /*---- Structure of GROUP list ----*/
  126.     int     index;                      /* Sequentially assigned number    */
  127.     int     name;                       /* Name index for group name       */
  128. };
  129.  
  130. typedef struct struc_s STRUC_T;
  131.  
  132. struct struc_s {                        /*- Structure of STRUC definitions -*/
  133.     char            *form;              /* Form of structure                */
  134.     int             index;              /* Structure number                 */
  135. };
  136.  
  137. typedef struct pub_s PUB_T;
  138.  
  139. struct pub_s {                          /*--- Structure of PUBLICS list ---*/
  140.     int             seg_idx;            /* Publics are kept in segment     */
  141.     unsigned long   offset;             /*   index and offset order        */
  142.     char            name[NAMESIZE];     /* Name from PUBDEF record         */
  143.     int             type;               /* UNKNOWN,NEAR,FAR,BYTE_PTR,...   */
  144.     int             domain;             /* 0 = Local, 1 = Public           */
  145.     int             scope;              /* TRUE = public, FALSE = local    */
  146.     STRUC_T         *structure;         /* Label before a dup struc record */
  147. };
  148.  
  149. typedef struct ext_s EXT_T;
  150.  
  151. struct ext_s {                          /*-- Structure of EXTERNALS list --*/
  152.     int             index;              /* Sequentially assigned number    */
  153.     char            name[NAMESIZE];     /* Name from EXTDEF record         */
  154.     int             type;               /* UNKNOWN,NEAR,FAR,BYTE_PTR,...   */
  155.     int             pos_abs;            /* TRUE = Could be ABS, FALSE = no */
  156.     int             com_ext;            /* 0 = EXTRN, 1 = COMM             */
  157.     int             var_type;           /* Number from COMDEF record       */
  158.     unsigned long   size;               /* Number of Bytes (For COMMUNAL)  */
  159.     int             used;               /* Ever accessed?                  */
  160.     int             scope;              /* TRUE = public, FALSE = local    */
  161. };
  162.  
  163.  
  164. typedef struct sex_s SEX_T;             
  165.  
  166. struct sex_s {                          /*-- Segment/External usage record --*/
  167.     int     seg_index;                  /* Segment being used in             */
  168.     EXT_T   *ext_rec;                   /* External being used               */
  169. };
  170.  
  171. typedef struct dat_s DAT_T;
  172.  
  173. struct dat_s {                          /*- Structure of DATA records list -*/
  174.     int             seg_idx;            /* Data records are kept in         */
  175.     unsigned long   offset;             /*   segment index and offset order */
  176.     int             type;               /* 0 = Enumerated, 1 = Iterated     */
  177.     int             size;               /* Size of data (db,dw,dq, etc.)    */
  178.     long            file_pos;           /* Position stored in .OBJ file     */
  179.     int             length;             /* Length in bytes of .OBJ data     */
  180.     int             extended;           /* 386 type record                  */
  181.     STRUC_T         *structure;         /* Structure for some DUP records   */
  182. };
  183.  
  184. typedef struct fix_s FIX_T;
  185.  
  186. struct fix_s {                          /*- Structure for a FIXUPP record -*/
  187.     int             seg_idx;            /* Fixups are kept in segment      */
  188.     unsigned long   dat_offset;         /*   index, data offset, and       */
  189.     int             offset;             /*   offset order                  */
  190.     int             relate;             /* Self / Segment Relative         */
  191.     int             form;               /* hibyte/lobyte/base/offset/ptr...*/
  192.     int             a_mode;             /* Mode of Frame                   */
  193.     int             a_index;            /* Index of Frame                  */
  194.     int             b_mode;             /* Mode of Target                  */
  195.     int             b_index;            /* Index of Target                 */
  196.     long            displacement;       /* Added to Result of Frame:Target */
  197.     int             extended;           /* 386 type fixup?                 */
  198.     int             word_sized;         /* BASE/OFFSET/LOADOFF             */
  199. };
  200.  
  201. typedef struct thread_s THREAD_T;
  202.  
  203. struct thread_s {
  204.     int     mode;
  205.     int     index;
  206. };
  207.  
  208. typedef struct fixer_s FIXER_T;
  209.  
  210. struct fixer_s {
  211.     int     num_bytes;
  212.     char    *form;
  213.     char    *prefix;
  214. };
  215.  
  216. typedef struct hint_s HINT_T;
  217.  
  218. struct hint_s {
  219.     int             seg_idx;    /* Segment for processing           */
  220.     int             hint_type;  /* 0=Code,1=Data(DB)                */
  221.     unsigned long   offset;     /* Starting position within segment */
  222.     unsigned long   length;     /* Length of hint                   */
  223. };
  224.  
  225.  
  226. typedef struct inst_s INST_T;
  227.  
  228. struct inst_s {                                     /*-- Instruction Table --*/
  229.     int     (*rtn)( unsigned char, char *, int );   /* Rtn to process byte   */
  230.     int     special;                                /* Data to pass to rtnn  */
  231.     char    *text;                                  /* Data to pass to rtn   */
  232. };
  233.  
  234. #define EDATA   0                       /* Enumerated data type */
  235. #define IDATA   1                       /* Iterated data type */
  236.  
  237. extern FILE     *o_file;                /* Input file (.OBJ) */
  238. extern long     o_position;             /* Position in file of current data */
  239.  
  240. extern NODE_T   *name_tree;             /* Names by index */
  241. extern NODE_T   *segment_tree;          /* Segments by index */
  242. extern NODE_T   *public_tree;           /* Public values by segment/offset */
  243. extern NODE_T   *extern_tree;           /* Externals by index */
  244. extern NODE_T   *sex_tree;              /* External usage by segment */
  245. extern NODE_T   *data_tree;             /* Data records by segment/offset */
  246. extern NODE_T   *struc_tree;            /* Tree of structures */
  247. extern NODE_T   *fix_tree;              /* Fix up records by segment/offset */
  248. extern NODE_T   *hint_tree;             /* Dis-assembly hints */
  249. extern NODE_T   *group_tree;            /* Not Used */
  250. extern NODE_T   *type_tree;             /* Not Used */
  251. extern NODE_T   *block_tree;            /* Not Used */
  252.  
  253. extern SEG_T    *seg_rec;
  254. extern NODE_T   *pub_node;              /* Next node of public symbol in list */
  255. extern PUB_T    *pub_rec;               /* Next public symbol in list */
  256. extern PUB_T    *last_pub_rec;          /* Last public symbol encountered */
  257. extern NODE_T   *fix_node;              /* Next node of fixup in list */
  258. extern FIX_T    *fix_rec;               /* Next fixup in list */
  259. extern NODE_T   *hint_node;             /* Next node of hint in list */
  260. extern HINT_T   *hint_rec;              /* Next hint in list */
  261.  
  262. extern SEG_T    seg_search;
  263. extern GRP_T    grp_search;
  264. extern PUB_T    pub_search;
  265. extern FIX_T    fix_search;
  266. extern NAME_T   name_search;
  267. extern HINT_T   hint_search;
  268.  
  269. extern int      label_count;
  270.  
  271. extern unsigned int code_string;        /* Stringizing Limit in Code */
  272. extern unsigned int data_string;        /* Stringizing Limit in Data */
  273.  
  274. extern FIXER_T  fix_type[];             /* Fixup types                     */
  275. extern INST_T   instr[];                /* Dis-assembly routine table      */
  276. extern INST_T   ex_instr[];             /* Extra [0F] Dis-assembly rtn tbl */
  277. extern char     *esc_inst[];            /* Floating Point opcode table     */
  278. extern char     *op_grp[][8];           /* Special Groups of instructions  */
  279.  
  280. extern int  pass;                               /* Pass number for process() */
  281. extern int  processor_type_comment_occurred;    /* COMENT record occurred? */
  282.  
  283. extern int              segment;            /* Segment being "process()'d" */
  284. extern unsigned long    inst_offset;        /* Address being "process()'d" */
  285. extern int              processor_mode;     /* 86,286,386,etc              */
  286. extern int              segment_mode;       /* processor mode for curr seg */
  287. extern int              segment_bytes;      /* Segment WORD size           */
  288.  
  289. extern char     *cseg_name;         /* Code segment name             */
  290. extern char     *dseg_name;         /* Data segment name             */
  291. extern PUB_T    *start_pub;         /* Starting addr public          */
  292. extern int      hex_finish;         /* Finish hex comment?           */
  293. extern int      tab_offset;         /* Current output tab stop       */
  294. extern int      compatibility;      /* Output type                   */
  295. extern int      add_labels;         /* Invent new labels?            */
  296. extern int      hex_output;         /* Hex output in comments?       */
  297. extern int      over_seg;           /* -1 = No overiding segment yet */
  298.  
  299. int name_compare( NAME_T *, NAME_T * );
  300. int pub_compare( PUB_T *, PUB_T * );
  301. int seg_compare( SEG_T *, SEG_T * );
  302. int grp_compare( GRP_T *, GRP_T * );
  303. int fix_compare( FIX_T *, FIX_T * );
  304. int dat_compare( DAT_T *, DAT_T * );
  305. int ext_compare( EXT_T *, EXT_T * );
  306. int struc_compare( STRUC_T *, STRUC_T * );
  307. int hint_compare( HINT_T *, HINT_T * );
  308.  
  309. NODE_T *pub_insert( int, unsigned long, char *, int, int );
  310. void sex_insert( int, EXT_T * );
  311. void ext_insert( char *, int, int, unsigned long, unsigned int, int );
  312. void dat_insert( int, unsigned long, long, int, int, int );
  313. STRUC_T *struc_insert( char * );
  314.  
  315. void theadr( void );
  316. void lnames( unsigned int );
  317. void grpdef( unsigned int );
  318. void segdef( void );
  319. void pubdef( unsigned int, int );
  320. void extdef( unsigned int, int );
  321. void ledata( unsigned int, int );
  322. void lidata( unsigned int, int );
  323. void fixupp( unsigned int, int );
  324. void coment( unsigned int );
  325. void comdef( unsigned int, int );
  326. void modend( unsigned int, int );
  327. void typdef( unsigned int );
  328. void pubrpt( void );
  329. void extrpt( void );
  330.  
  331. void print_ext( EXT_T * );
  332. void list_ext( void );
  333. void list_pub( void );
  334. void list_struc( void );
  335. void list_fix( void );
  336.  
  337. void process( void );
  338.  
  339. void load_extra( char *, char * );
  340.  
  341. void init_trees( void );
  342.  
  343. int size_to_type( int );
  344. int reg_size_to_type( int );
  345. int type_to_size( int );
  346. char *type_to_text( int );
  347. char *size_to_opcode( int, int * );
  348.  
  349. unsigned char get_byte( void );
  350. int get_int( void );
  351. unsigned int get_word( void );
  352. unsigned long get_long( void );
  353. void get_str( int, char * );
  354. int get_name( char * );
  355. int get_index( int * );
  356.  
  357. void empty_string( int );
  358.  
  359. int buff_init( int );
  360. int buff_add( int );
  361. void buff_reseek( void );
  362. void buff_empty( void );
  363. int buff_getc( void );
  364. int buff_regetc( void );
  365.  
  366. void out_label( char * );
  367. void out_labelc( char * );
  368. void out_opcode( char * );
  369. void out_operand( char * );
  370. void out_comment( char * );
  371. void out_endline( void );
  372. void out_newline( void );
  373. void out_directive( char * );
  374. void out_line( char *, char *, char *, char * );
  375. char *out_hexize( unsigned long, char *, int );
  376.  
  377. void fmt_error( char * );
  378.  
  379. NODE_T *new_tree( char *, int );
  380. NODE_T *start( NODE_T *, int );
  381. NODE_T *traverse( NODE_T *, int );
  382. NODE_T *insert( char *, NODE_T *, int(*)(void *, void *) );
  383. char *find( char *, NODE_T *, int(*)(void *, void *), NODE_T ** );
  384. char *search( char *, NODE_T *, int(*)() );
  385. char *o_malloc( unsigned int );
  386. void tab_seek( int );
  387.  
  388. int find_member( char *, STRUC_T *, long * );
  389. PUB_T *check_public( int, int, long, char );
  390. void get_target( char *, FIX_T *, int, long, int, int, int, int *, int );
  391. int get_fix( char *, int, int, int, int, int, int *, int );
  392. char *mode_name( int, int );
  393. void adjust_assumes( void );
  394. void abort_assumes( void );
  395.  
  396. void fix_advance( void );
  397.  
  398. int decode_fixup( int, int, int, int, int );
  399.  
  400. int data_check( unsigned int );
  401. void esc_special( char *, char *, int, int );
  402.  
  403. void inst_init    ( void );
  404.  
  405. int stub         ( unsigned char, char *, int );
  406.  
  407. int one_byte     ( unsigned char, char *, int );
  408. int two_byte     ( unsigned char, char *, int );
  409. int two_ubyte    ( unsigned char, char *, int );
  410. int three_byte   ( unsigned char, char *, int );
  411. int five_byte    ( unsigned char, char *, int );
  412.  
  413. int one_a        ( unsigned char, char *, int );
  414. int two_a        ( unsigned char, char *, int );
  415. int three_a      ( unsigned char, char *, int );
  416.  
  417. int in_out       ( unsigned char, char *, int );
  418. int string_byte  ( unsigned char, char *, int );
  419. int enter        ( unsigned char, char *, int );
  420. int two_bcd      ( unsigned char, char *, int );
  421.  
  422. int disp8        ( unsigned char, char *, int );
  423. int disp16       ( unsigned char, char *, int );
  424.  
  425. int wait         ( unsigned char, char *, int );
  426. int prefix       ( unsigned char, char *, int );
  427. int seg_over     ( unsigned char, char *, int );
  428.  
  429. int opsize_over  ( unsigned char, char *, int );
  430. int adrsize_over ( unsigned char, char *, int );
  431.  
  432. int mod_reg      ( unsigned char, char *, int );
  433.  
  434. int esc          ( unsigned char, char *, int );
  435. int extra        ( unsigned char, char *, int );
  436.