home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * put.c
- * Copyright © 1992 Niklas Röjemo
- */
-
- #include "put.h"
- #include "error.h"
- #include "area.h"
-
- void putData(int size, WORD data)
- {
- if(!areaCurrent) {
- error(ErrorError,TRUE,"No area defined.");
- return;
- }
- switch(size) {
- case 1: break;
- case 2: if(areaCurrent->value.ValueInt.i & 1) {
- error(ErrorInfo,TRUE,"Unaligned halfword.");
- areaCurrent->value.ValueInt.i += 1;
- areaCurrent->value.ValueInt.i &= ~1;
- }
- break;
- case 4: if(areaCurrent->value.ValueInt.i & 3) {
- error(ErrorInfo,TRUE,"Unaligned word.");
- areaCurrent->value.ValueInt.i += 3;
- areaCurrent->value.ValueInt.i &= ~3;
- }
- break;
- default:error(ErrorSerious,TRUE,"Internal putData: Illegal size.");
- }
-
- if(AREA_IMAGE(areaCurrent->area.info)) {
- if(AREA_NOSPACE(areaCurrent->area.info,areaCurrent->value.ValueInt.i+size))
- areaGrow(areaCurrent->area.info,size);
- switch(size) {
- case 4:
- areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+3] = (data>>24) & 0xff;
- areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+2] = (data>>16) & 0xff;
- case 2:
- areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+1] = (data>> 8) & 0xff;
- case 1:
- areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+0] = data & 0xff;
- }
- } else
- if(data) {
- error(ErrorError,TRUE,"Trying to define a non-zero value in an uninitzialised area.");
- return;
- }
- areaCurrent->value.ValueInt.i +=size;
- }
-
- void putDataFloat(int size, FLOAT data)
- {
- union {
- double d;
- float f;
- struct {
- char c[8];
- } u;
- } translate;
- int i;
-
- if(!areaCurrent)
- error(ErrorError,TRUE,"No area defined.");
- switch(size) {
- case 4: translate.f = (float)data;
- if(areaCurrent->value.ValueInt.i & 3) {
- error(ErrorError,TRUE,"Unaligned float single.");
- areaCurrent->value.ValueInt.i += 3;
- areaCurrent->value.ValueInt.i &= ~3;
- }
- break;
- case 8: translate.d = (double)data;
- if(areaCurrent->value.ValueInt.i & 3) {
- error(ErrorError,TRUE,"Unaligned float double.");
- areaCurrent->value.ValueInt.i += 3;
- areaCurrent->value.ValueInt.i &= ~3;
- }
- break;
- default:error(ErrorSerious,TRUE,"Internal putDataFloat: Illegal size %d.",size);
- }
-
- if(AREA_IMAGE(areaCurrent->area.info)) {
- if(AREA_NOSPACE(areaCurrent->area.info,areaCurrent->value.ValueInt.i+size))
- areaGrow(areaCurrent->area.info,size);
- for(i=0; i<size; i++) {
- areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+i] = translate.u.c[i];
- }
- } else
- if(data) {
- error(ErrorError,TRUE,"Trying to define a non-zero value in an uninitzialised area.");
- return;
- }
- areaCurrent->value.ValueInt.i +=size;
- }
-
-
- void putIns(WORD ins)
- {
- if(!areaCurrent) {
- error(ErrorError,TRUE,"No area defined.");
- return;
- }
- if(areaCurrent->value.ValueInt.i & 3) {
- error(ErrorInfo,TRUE,"Unaligned instruction.");
- areaCurrent->value.ValueInt.i += 3;
- areaCurrent->value.ValueInt.i &= ~3;
- }
-
-
- if(AREA_IMAGE(areaCurrent->area.info)) {
- if(AREA_NOSPACE(areaCurrent->area.info,areaCurrent->value.ValueInt.i+4))
- areaGrow(areaCurrent->area.info,4);
- areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+3] = (ins>>24) & 0xff;
- areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+2] = (ins>>16) & 0xff;
- areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+1] = (ins>> 8) & 0xff;
- areaCurrent->area.info->image[areaCurrent->value.ValueInt.i+0] = ins & 0xff;
- areaCurrent->value.ValueInt.i += 4;
- } else
- error(ErrorError,TRUE,"Trying to define code an uninitzialised area.");
- }
-