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