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

  1. /* psdo.c, the psdo op code for the as68 assembler.
  2.  * 
  3.  *    (C) Copyright 1982 Steve Passe
  4.  *    All Rights Reserved
  5.  * 
  6.  * version 1.00
  7.  * created 11/25/82
  8.  * 
  9.  * version 1.01
  10.  * 
  11.  *    8/30/83 ver. 1.01 modified for Aztec ver. 1.05g smp
  12.  *    12/26/83    added include psdo  smp
  13.  * 
  14.  */
  15.  
  16. /* begincode */
  17.  
  18. /* includes */
  19.  
  20. #include <stdio.h>
  21. #include "as68.h"
  22.  
  23. /* externals */
  24.  
  25. extern char fatal;
  26. extern char pass;
  27. extern unsigned    line_count;
  28. extern long loc_counter;
  29. extern int loc_plus;
  30. extern FLAG abs_long;
  31. extern FLAG rorg;
  32. extern FLAG do_label;
  33. extern char label[];
  34. extern char instr[];
  35. extern char code[];
  36. extern int src_level;
  37. extern FILE *_src[];
  38. extern char *opfld_ptr;
  39. extern struct _oprnd op1;
  40. extern struct _symbol *symtbl;
  41. extern FLAG nolist;
  42.  
  43. /* types */
  44.  
  45. char *token();
  46.  
  47. /*** note - external pseudo-op table is defined    at the end of this file ***/
  48.  
  49. p2_equ(psdo, arg)
  50. char *psdo;
  51. int arg;
  52. {
  53.     register int x;
  54.     char acode[8];
  55.  
  56.     do_label = NO;            /* don't process label in main */
  57.     if (x = symsearch(label)) {
  58.     if (symtbl[x]._atr & 4) {        /* redefined */
  59.         err_out(REDEF);
  60.     }
  61.     }
  62.     else {
  63.     err_out(UNDEF_SYMBOL);    /* label never defined */
  64.     }
  65.     code[0] = symtbl[x]._val >> 24;        /* evaluate operand */
  66.     code[1] = symtbl[x]._val >> 16;
  67.     code[2] = symtbl[x]._val >> 8;
  68.     code[3] = symtbl[x]._val;
  69.     dump_code(MSG, code, 4);            /* a long value */
  70. }
  71.  
  72. p2_set(psdo, arg)
  73. char *psdo;
  74. int arg;
  75. {
  76.     register int x;
  77.     char acode[8];
  78.  
  79.     do_label = NO;            /* don't process label in main */
  80.     if (eval(4,    0) != _address)    err_out(SET_EVAL);    /* get a long value */
  81.     else {
  82.     if (x = symsearch(label)) {
  83.         if (symtbl[x]._atr & 1) {           /* redefined */
  84.         err_out(REDEF);
  85.         }
  86.         else {
  87.         symtbl[x]._val = op1._addr;
  88.         symtbl[x]._atr |= (op1._rel_lbl) ? 0x02 : 0;
  89.         }
  90.     }
  91.     else {
  92.         err_out(UNDEF_SYMBOL);  /* label never defined */
  93.     }
  94.     }
  95.     code[0] = symtbl[x]._val >> 24;        /* evaluate operand */
  96.     code[1] = symtbl[x]._val >> 16;
  97.     code[2] = symtbl[x]._val >> 8;
  98.     code[3] = symtbl[x]._val;
  99.     dump_code(MSG, code, 4);            /* a long value */
  100. }
  101.  
  102. p2_ifeq(psdo, arg)
  103. char *psdo;
  104. int arg;
  105. {
  106. err_out(UNREC_INSTR);
  107.     if (label[0]) err_out(LABEL_USE);
  108.     dump_code(MSG, code, 0);
  109. }
  110.  
  111. p2_ifne(psdo, arg)
  112. char *psdo;
  113. int arg;
  114. {
  115. err_out(UNREC_INSTR);
  116.     if (label[0]) err_out(LABEL_USE);
  117.     dump_code(MSG, code, 0);
  118. }
  119.  
  120. p2_endc(psdo, arg)
  121. char *psdo;
  122. int arg;
  123. {
  124. err_out(UNREC_INSTR);
  125.     if (label[0]) err_out(LABEL_USE);
  126.     dump_code(MSG, code, 0);
  127. }
  128.  
  129. p2_xlst(psdo, arg)
  130. char *psdo;
  131. int arg;
  132. {
  133.     nolist = (*psdo == 'n');
  134. }
  135.  
  136. /* endcode */
  137.  
  138.  
  139.