home *** CD-ROM | disk | FTP | other *** search
/ APDL Public Domain 1 / APDL_PD1A.iso / program / assembler / as / src / c / put < prev    next >
Encoding:
Text File  |  1993-02-08  |  3.8 KB  |  124 lines

  1.  
  2. /*
  3.  * put.c
  4.  * Copyright © 1992 Niklas Röjemo
  5.  */
  6.  
  7. #include "put.h"
  8. #include "error.h"
  9. #include "area.h"
  10.  
  11. void putData(int size, WORD data)
  12. {
  13.   if(!areaCurrent) {
  14.     error(ErrorError,TRUE,"No area defined.");
  15.     return;
  16.   }
  17.   switch(size) {
  18.     case 1: break;
  19.     case 2: if(areaCurrent->value.ValueInt.i & 1) {
  20.               error(ErrorInfo,TRUE,"Unaligned halfword.");
  21.               areaCurrent->value.ValueInt.i += 1;
  22.               areaCurrent->value.ValueInt.i &= ~1;
  23.             }
  24.             break;
  25.     case 4: if(areaCurrent->value.ValueInt.i & 3)  {
  26.               error(ErrorInfo,TRUE,"Unaligned word.");
  27.               areaCurrent->value.ValueInt.i += 3;
  28.               areaCurrent->value.ValueInt.i &= ~3;
  29.             }
  30.             break;
  31.     default:error(ErrorSerious,TRUE,"Internal putData: Illegal size.");
  32.   }
  33.  
  34.   if(AREA_IMAGE(areaCurrent->area.info)) {
  35.     if(AREA_NOSPACE(areaCurrent->area.info,areaCurrent->value.ValueInt.i+size))
  36.       areaGrow(areaCurrent->area.info,size);
  37.     switch(size) {
  38.       case 4:
  39.         areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+3] = (data>>24) & 0xff;
  40.         areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+2] = (data>>16) & 0xff;
  41.       case 2:
  42.         areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+1] = (data>> 8) & 0xff;
  43.       case 1:
  44.         areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+0] = data & 0xff;
  45.     }
  46.   } else
  47.     if(data) {
  48.       error(ErrorError,TRUE,"Trying to define a non-zero value in an uninitzialised area.");
  49.       return;
  50.     }
  51.   areaCurrent->value.ValueInt.i +=size;
  52. }
  53.  
  54. void putDataFloat(int size, FLOAT data)
  55. {
  56.   union {
  57.     double d;
  58.     float f;
  59.     struct {
  60.     char c[8];
  61.     } u;
  62.   } translate;
  63.   int i;
  64.  
  65.   if(!areaCurrent)
  66.     error(ErrorError,TRUE,"No area defined.");
  67.   switch(size) {
  68.     case 4: translate.f = (float)data;
  69.             if(areaCurrent->value.ValueInt.i & 3) {
  70.               error(ErrorError,TRUE,"Unaligned float single.");
  71.               areaCurrent->value.ValueInt.i += 3;
  72.               areaCurrent->value.ValueInt.i &= ~3;
  73.             }
  74.             break;
  75.     case 8: translate.d = (double)data;
  76.             if(areaCurrent->value.ValueInt.i & 3) {
  77.               error(ErrorError,TRUE,"Unaligned float double.");
  78.               areaCurrent->value.ValueInt.i += 3;
  79.               areaCurrent->value.ValueInt.i &= ~3;
  80.             }
  81.             break;
  82.     default:error(ErrorSerious,TRUE,"Internal putDataFloat: Illegal size %d.",size);
  83.   }
  84.  
  85.   if(AREA_IMAGE(areaCurrent->area.info)) {
  86.     if(AREA_NOSPACE(areaCurrent->area.info,areaCurrent->value.ValueInt.i+size))
  87.       areaGrow(areaCurrent->area.info,size);
  88.     for(i=0; i<size; i++) {
  89.       areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+i] = translate.u.c[i];
  90.     }
  91.   } else
  92.     if(data) {
  93.       error(ErrorError,TRUE,"Trying to define a non-zero value in an uninitzialised area.");
  94.       return;
  95.     }
  96.   areaCurrent->value.ValueInt.i +=size;
  97. }
  98.  
  99.  
  100. void putIns(WORD ins)
  101. {
  102.   if(!areaCurrent) {
  103.     error(ErrorError,TRUE,"No area defined.");
  104.     return;
  105.   }
  106.   if(areaCurrent->value.ValueInt.i & 3) {
  107.               error(ErrorInfo,TRUE,"Unaligned instruction.");
  108.               areaCurrent->value.ValueInt.i += 3;
  109.               areaCurrent->value.ValueInt.i &= ~3;
  110.   }
  111.  
  112.  
  113.   if(AREA_IMAGE(areaCurrent->area.info)) {
  114.     if(AREA_NOSPACE(areaCurrent->area.info,areaCurrent->value.ValueInt.i+4))
  115.       areaGrow(areaCurrent->area.info,4);
  116.     areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+3] = (ins>>24) & 0xff;
  117.     areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+2] = (ins>>16) & 0xff;
  118.     areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+1] = (ins>> 8) & 0xff;
  119.     areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+0] =  ins & 0xff;
  120.     areaCurrent->value.ValueInt.i += 4;
  121.     } else
  122.       error(ErrorError,TRUE,"Trying to define code an uninitzialised area.");
  123. }
  124.