home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 338_01 / bc1.c < prev    next >
Text File  |  1988-02-25  |  3KB  |  92 lines

  1. /* bc1.c, code building function of as68 assembler (pass1 routines)
  2.  * 
  3.  *    (C) Copyright 1982 Steve Passe
  4.  *    All Rights Reserved
  5.  *
  6.  * version 1.00
  7.  * created 10/21/82
  8.  *
  9.  * version 1.01
  10.  *
  11.  *   8/30/83 ver. 1.01 modified for Aztec ver. 1.05g smp
  12.  *   10/12/87  split into root, pass1 and pass2 parts for overlay on pdp-11
  13.  */
  14.  
  15. /* begincode */
  16.  
  17. /* includes */
  18.  
  19. #include <stdio.h>
  20. #include "as68.h"
  21.  
  22. /* externals */
  23.  
  24. extern char pass;                /* present pass number, 1 or 2 */
  25. extern unsigned    line_count;            /* line number of source file */
  26. extern long loc_counter;            /* address to assemble obj code */
  27. extern int loc_plus;                /* increment to loc counter    */
  28. extern FLAG abs_long;                /* default to absolute long add.*/
  29. extern FLAG rorg;                /* in pc relative mode */
  30. extern char label[32];            /* buffer for label from preparse */
  31. extern char instr[33];            /* buffer for mnem, psdo or macro */
  32.  
  33. extern struct _mtable mtable[];            /* mnemonic    lookup table */
  34. extern struct _mvalue mvalue[];            /* mnemonic    code table */
  35. extern struct _oprnd op1, op2;          /* structs to hold operand val */
  36. extern char code[];                /* code array */
  37.  
  38. p1_mnem(mt)
  39. register struct _mtable *mt;
  40. {
  41.     register int result, index;
  42.  
  43.     if ((index = match(mt)) == ERROR) {
  44. /** flush error stack someday? */
  45.     return ERROR;
  46.     }
  47.     switch (result = mvalue[index]._opc_len) {  /* determine code length... */
  48.     case 1:
  49.     case 2:
  50.     case 3:
  51.     break;
  52.     case 12:                    /* _imd not contained in opcode */
  53.     case 13:
  54.     result -= 10;               /* strip '10' flag */
  55.     result += p1_codelen(&op2);        /* add second operand length */
  56.     break;
  57.     case 0:                     /* gotta figure it out */
  58.     if (/**rorg**/ op1._rel_lbl && mvalue[index]._optyp1 == _sadr
  59.         && (op1._typ == _address || op1._typ == _d16_ani)) {
  60.         result = 2 + p1_codelen(&op2);    /* 1 for opcode, 1 for raddr */
  61.     }
  62.     else result = p1_codelen(&op1) + p1_codelen(&op2) + 1; /* 1 for code */
  63.     break;
  64.     }
  65.     loc_plus = result * 2;
  66.     return result;
  67. }
  68.  
  69. p1_codelen(op)
  70. register struct _oprnd *op;
  71. {
  72.     register int result;
  73.  
  74.     switch (op->_typ) {
  75.     case _address:
  76.     result = (op->_long_val) ? 2 : 1;
  77.     break;
  78.     case _d16_ani:
  79.     case _d8_anx:
  80.     case _labeli:
  81.     case _reglst:
  82.     case _label:    /* needed? */
  83.     result = 1;
  84.     break;
  85.     default:
  86.     result = 0;
  87.     }
  88.     return result;
  89. }
  90.  
  91.  
  92.