コード例 #1
0
ファイル: relocs.c プロジェクト: nmlgc/alink
void performFixups(PSEG s)
{
	UINT i,j;
	PSEG f,t;
	PRELOC r;
	UINT offset;
	INT section;
	UINT disp;
	PSYMBOL pub;
	UINT delta;
	PDATABLOCK d;

	if(!s) return;

	/* recurse down tree */
	for(i=0;i<s->contentCount;++i)
	{
		if(s->contentList[i].flag==SEGMENT)
		{
			performFixups(s->contentList[i].seg);
		}
	}

	for(i=0;i<s->relocCount;++i)
	{
		r=s->relocs+i;
		for(j=0;j<s->contentCount;++j)
		{
			if(s->contentList[j].flag!=DATA) continue;
			if((s->contentList[j].data->offset <= r->ofs)
			   && ((s->contentList[j].data->offset + s->contentList[j].data->length) > r->ofs)) break;
		}
		if(j==s->contentCount)
		{
			addError("Fixup location %08lX is outside any data in segment %s",r->ofs,s->name);
			continue;
		}
		d=s->contentList[j].data;
		offset=r->ofs-d->offset;

		t=NULL;
		disp=0;
		if(r->tseg)
		{
			t=r->tseg;
			disp=t->base;
		}
		else if(r->text)
		{
			pub=r->text->pubdef;
			if(!pub)
			{
				addError("Unresolved external %s",r->text->name);
				continue;
			}
			t=pub->seg;
			if(t)
				disp=t->base+pub->ofs;
		}
		if(!t)
		{
			addError("Fixup target unresolved");
			continue;
		}
		if(r->fseg)
		{
			f=r->fseg;
		}
		else if(r->fext)
		{
			pub=r->fext->pubdef;
			if(!pub)
			{
				addError("Unresolved external %s",r->fext->name);
				continue;
			}
			f=pub->seg;
		}
		else
		{
			f=NULL;
		}
		if(f && f->absolute && (r->base==REL_DEFAULT))
		{
			r->base=REL_FRAME;
		}
		switch(r->base)
		{
		case REL_ABS:
		case REL_DEFAULT:
		case REL_RVA:
			section=t->section;
			while(t->parent)
			{
				t=t->parent;
				if(section<0) section=t->section;
				disp+=t->base;
			}
			if(r->base==REL_RVA)
			{
				disp-=t->base;
			}
			break;
		case REL_FILEPOS:
			if(t->absolute)
			{
				addError("Attempt to get file position of absolute segment %s",t->name);
				continue;
			}
			section=t->section;
			while(t->parent && !t->fpset)
			{
				t=t->parent;
				if(section<0) section=t->section;
				disp+=t->base;
			}
			disp-=t->base;
			if(t->fpset)
				disp+=t->filepos;
			if(f)
			{
				if(f->absolute)
				{
					addError("Attempt to get file position of absolute segment %s",f->name);
					continue;
				}
				while(f->parent && !f->fpset)
				{
					f=f->parent;
					if(section<0) section=f->section;
					disp-=f->base;
				}
				disp+=f->base;
				if(f->fpset)
					disp-=f->filepos;
			}
			break;
		case REL_SELF:
			section=t->section;
			while(t->parent)
			{
				t=t->parent;
				if(section<0) section=t->section;
				disp+=t->base;
			}
			f=s;
			disp-=r->ofs;
			while(f)
			{
				disp-=f->base;
				f=f->parent;
			}
			break;
		case REL_FRAME:
			if(!f)
			{
				addError("Unspecified frame");
				continue;
			}
			while(t->parent)
			{
				t=t->parent;
				disp+=t->base;
			}
			section=f->section;
			disp-=f->base;
			if(section>=0)
				disp+=f->base&(frameAlign-1);
			while(f->parent && !f->absolute)
			{
				f=f->parent;
				if(section<0)
				{
					section=f->section;
					if(section>=0)
						disp+=f->base&(frameAlign-1);
				}
				if(section>=0)
				{
					disp-=f->base;
				}
			}
			break;
		default:
			addError("Unspecified reloc base");
			continue;
		}
		disp+=r->disp;
		switch(r->rtype)
		{
		case REL_OFS8:
			delta=d->data[offset];
			delta+=disp;
			d->data[offset]=delta&0xff;
			break;
		case REL_OFS16:
			if(disp>=0x10000)
			{
				addError("16-bit offset limit exceeded");
				continue;
			}
			delta=d->data[offset]+(d->data[offset+1]<<8);
			delta+=disp;
			Set16(&d->data[offset],delta);
			break;
		case REL_OFS32:
			delta=d->data[offset]+(d->data[offset+1]<<8)+(d->data[offset+2]<<16)+(d->data[offset+3]<<24);
			delta+=disp;
			Set32(&d->data[offset],delta);
			break;
		case REL_BYTE2:
			delta=d->data[offset];
			delta+=disp>>8;
			d->data[offset]=delta&0xff;
			break;
		case REL_SEG:
			if(section<0)
			{
				addError("Segmented reloc not permitted for specified frame");
				continue;
			}
			if(section>=0x10000)
			{
				addError("Section number too large %08lX",section);
				continue;
			}
			delta=d->data[offset]+(d->data[offset+1]<<8);
			delta+=section;
			Set16(&d->data[offset],delta);
			break;
		case REL_PTR16:
			if(section<0)
			{
				addError("Segmented reloc not permitted for specified frame");
				continue;
			}
			if(section>=0x10000)
			{
				addError("Section number too large %08lX",section);
				continue;
			}
			if(disp>=0x10000)
			{
				addError("16-bit offset limit exceeded");
				continue;
			}
			delta=d->data[offset]+(d->data[offset+1]<<8);
			delta+=disp;
			Set16(&d->data[offset],delta);

			delta=d->data[offset+2]+(d->data[offset+3]<<8);
			delta+=section;
			Set16(&d->data[offset+2],delta);
			break;
		case REL_PTR32:
			if(section<0)
			{
				addError("Segmented reloc not permitted for specified frame");
				continue;
			}
			delta=d->data[offset]+(d->data[offset+1]<<8)+(d->data[offset+2]<<16)+(d->data[offset+3]<<24);
			delta+=disp;
			Set32(&d->data[offset],delta);

			delta=d->data[offset+4]+(d->data[offset+5]<<8);
			delta+=section;
			Set16(&d->data[offset+4],delta);
			break;
		default:
			addError("Invalid relocation type");
			continue;
			break;
		}
	}
}
コード例 #2
0
ファイル: Kismet.c プロジェクト: Linrstudio/projectssynergy
int8 KismetExecuteEvent(int16 _DeviceID,int8 _EventID)
{
	int8  a;//variable for the kismet blocks to use
	int8  read8;
	int16 read16;
	int16 eventaddr;
	int16 methodaddr;
	int16 BlockAddr;
	int16 timeout;

	if(!OperationEnabled)return 1;//return if no operating is allowed

	//ToSendDataBuffer[2]=((int8*)&_DeviceID)[0];
	//ToSendDataBuffer[3]=((int8*)&_DeviceID)[1];
	//ToSendDataBuffer[4]=_EventID;

	MemoryBeginRead(EEPROMHEADERSIZE);

	for(timeout=0;timeout<1024;timeout++)
	{
		read16=MemoryReadInt16();
		eventaddr =MemoryReadInt16();
		if(read16==_DeviceID)break;
		if(read16==0xffff) { MemoryEndRead(); return 2; }
	}
	MemoryEndRead(); 
	MemoryBeginRead(eventaddr);
	for(timeout=0;timeout<1024;timeout++)
	{
		read8=MemoryReadInt8();
		methodaddr=MemoryReadInt16();
		
		if(read8==_EventID)break;
		if(read8==0xff) { MemoryEndRead(); return 3; }
	}
	MemoryEndRead();
	//ToSendDataBuffer[12]=((int8*)&eventaddr)[0];
	//ToSendDataBuffer[13]=((int8*)&eventaddr)[1];
	//ToSendDataBuffer[14]=((int8*)&methodaddr)[0];
	//ToSendDataBuffer[15]=((int8*)&methodaddr)[1];
	
	BlockAddr=methodaddr;
	MemoryBeginRead(BlockAddr);
	while(1)
	{
		int8 blocktype=MemoryReadInt8();
		//#=EEPROM DATA $=REGISTER DATA
		switch(blocktype)
		{
			case 0x00://end of code
			default://or we dont understand it
			{
				MemoryEndRead();
				return 0;
			}
			case 0x01://load literal int16
			{
				int8 reg	=MemoryReadInt8();
				int16 value	=MemoryReadInt16();
				Set16(reg,value);
			}break;
			case 0x02://load literal int8
			{
				int8 reg	=MemoryReadInt8();
				int8 value	=MemoryReadInt8();
				Set8(reg,value);
			}break;
			case 0x0B://equal
			{
				int8 reg1	=MemoryReadInt8();
				int8 reg2	=MemoryReadInt8();
				int8 reg3	=MemoryReadInt8();
				Set16(reg3,(Get16(reg1)==Get16(reg2))?0xffff:0);
			}break;
			case 0x0C://differ
			{
				int8 reg1	=MemoryReadInt8();
				int8 reg2	=MemoryReadInt8();
				int8 reg3	=MemoryReadInt8();
				Set16(reg3,(Get16(reg1)!=Get16(reg2))?0xffff:0);
			}break;
			case 0x0D://and
			{
				int8 reg1	=MemoryReadInt8();
				int8 reg2	=MemoryReadInt8();
				int8 reg3	=MemoryReadInt8();
				Set16(reg3,Get16(reg1)&Get16(reg2));
			}break;
			case 0x0E://or
			{
				int8 reg1	=MemoryReadInt8();
				int8 reg2	=MemoryReadInt8();
				int8 reg3	=MemoryReadInt8();
				Set16(reg3,Get16(reg1)|Get16(reg2));
			}break;
			case 0x0F://xor
			{
				int8 reg1	=MemoryReadInt8();
				int8 reg2	=MemoryReadInt8();
				int8 reg3	=MemoryReadInt8();
				Set16(reg3,Get16(reg1)^Get16(reg2));
			}break;
			case 0x20://add
			{
				int8 reg1	=MemoryReadInt8();
				int8 reg2	=MemoryReadInt8();
				int8 reg3	=MemoryReadInt8();
				Set16(reg3,Get16(reg1)+Get16(reg2));
			}break;
			case 0x21://sub
			{
				int8 reg1	=MemoryReadInt8();
				int8 reg2	=MemoryReadInt8();
				int8 reg3	=MemoryReadInt8();
				Set16(reg3,Get16(reg1)-Get16(reg2));
			}break;
			case 0x22://mul
			{
				int8 reg1	=MemoryReadInt8();
				int8 reg2	=MemoryReadInt8();
				int8 reg3	=MemoryReadInt8();
				Set16(reg3,Get16(reg1)*Get16(reg2));
			}break;
			case 0x23://div
			{
				int8 reg1	=MemoryReadInt8();
				int8 reg2	=MemoryReadInt8();
				int8 reg3	=MemoryReadInt8();
				Set16(reg3,Get16(reg1)/Get16(reg2));
			}break;
			case 0x30://hours
			{
				int8 reg1	=MemoryReadInt8();
				Set16(reg1,(int16)RTCHour);
			}break;
			case 0x31://minutes
			{
				int8 reg1	=MemoryReadInt8();
				Set16(reg1,(int16)RTCMinute);
			}break;
			case 0x32://seconds
			{
				int8 reg1	=MemoryReadInt8();
				Set16(reg1,(int16)RTCSecond);
			}break;
			case 0x33://days
			{
				int8 reg1	=MemoryReadInt8();
				Set16(reg1,(int16)RTCDay);
			}break;
			case 0x0A://Set LED
			{
				int8 reg	=MemoryReadInt8();
				//Set16(reg,1);
				SetLED(Get16(reg));
			}break;
			case 0x80:// $if goto $here?
			{
				int8 reg1	=MemoryReadInt8();
				int8 reg2	=MemoryReadInt8();
				if(Get16(reg1)==0)
				{
					BlockAddr=methodaddr+(int16)reg2;
					MemoryEndRead();MemoryBeginRead(BlockAddr);
				}
			}break;
			case 0x70://mov
			{
				int8 reg1	=MemoryReadInt8();
				int8 reg2	=MemoryReadInt8();
				int8 amnt	=MemoryReadInt8();
				for(a=0;a<amnt;a++)
					Set8(reg2+a,Get8(reg1+a));
			}break;
			case 0x71://EPSend
			{
				int16 dev	=MemoryReadInt16();
				EPBufferSize=MemoryReadInt8();
				//try three times
				if(EPSend(dev))break;
				if(EPSend(dev))break;
				if(EPSend(dev))break;
			}break;
			case 0x90://Set Delay
			{
				int8 timer	=MemoryReadInt8();
				int8 event	=MemoryReadInt8();
				int8 reg	=MemoryReadInt8();
				int16 time=Get16(reg);
				SetTimer(timer,event,time);
			}break;
		}
	}
	return 4;
}