Exemple #1
0
//#TPT-Directive ElementHeader Element_WARP static int update(UPDATE_FUNC_ARGS)
int Element_WARP::update(UPDATE_FUNC_ARGS)
{
	int trade, r, rx, ry;
	if (parts[i].tmp2>2000)
	{
		parts[i].temp = 10000;
		sim->pv[y/CELL][x/CELL] += (parts[i].tmp2/5000) * CFDS;
		if (!(rand()%50))
			sim->create_part(-3, x, y, PT_ELEC);
	}
	for ( trade = 0; trade<5; trade ++)
	{
		rx = rand()%3-1;
		ry = rand()%3-1;
		if (BOUNDS_CHECK && (rx || ry))
		{
			r = pmap[y+ry][x+rx];
			if (!r)
				continue;
			if (TYP(r)!=PT_WARP&&TYP(r)!=PT_STKM&&TYP(r)!=PT_STKM2&&TYP(r)!=PT_DMND&&TYP(r)!=PT_CLNE&&TYP(r)!=PT_BCLN&&TYP(r)!=PT_PCLN)
			{
				parts[i].x = parts[ID(r)].x;
				parts[i].y = parts[ID(r)].y;
				parts[ID(r)].x = x;
				parts[ID(r)].y = y;
				parts[ID(r)].vx = (rand()%4)-1.5;
				parts[ID(r)].vy = (rand()%4)-2;
				parts[i].life += 4;
				pmap[y][x] = r;
				pmap[y+ry][x+rx] = PMAP(i, parts[i].type);
				trade = 5;
			}
		}
	}
	return 0;
}
Exemple #2
0
dword fs_read(int handle, void far *buffer, dword size)
{
  TaskUArea *Task = GetCurrentTaskUArea();
  int	    MySysIndex;
  dword	    where_pos,q;
  MNODE	    *MyNode;
  word      CacheFlag, CallResult;
  int 	    eof;
  dword	    logical, preload;

  SyscallActive = 1;
  Task->ErrorLevel = ERR_FS_NO_ERROR;

  if (!Task->OpenFiles[handle].Used)
  {
    Task->ErrorLevel = ERR_NOT_VALID_FILE_HANDLE;
    SyscallActive = 0;
    return 0xffffffff;
  }

  MySysIndex = Task->OpenFiles[handle].SystemTabIndex;
  if (!(SysTab.Access & IO_CAN_READ))
  {
    Task->ErrorLevel = ERR_FILE_NOT_TO_READ;
    SyscallActive = 0;
    return 0xffffffff;
  }

  where_pos = 0; eof = 0;
  CacheFlag = (SysTab.Access & IO_CACHE_ADD) ? FPACK_ADD : FPACK_NOTHING;

  MyNode = SysTab.MemNODE;
  MyNode->Locked.Acquire();
  if (SysTab.DirtyBuffer)
  {
   CallResult = PMAP ( MyNode,           SysTab.Position,
		       logical,          MyNode->packID,
		       PMAP_READ,        SysTab.Buffer,
		       SysTab.BufferPos, preload,
		       CacheFlag );

   if (CallResult != ERR_FS_NO_ERROR) goto ReadError;
   SysTab.DirtyBuffer = 0;
  }

  if (size > 512-SysTab.BufferPos)
   {
    q = 512-SysTab.BufferPos;
    size -= (512-SysTab.BufferPos);
   }
   else
   {
    q = size;
    size = 0;
   }


  if (SysTab.MemNODE->Size < SysTab.Position + q)
  { eof = 1;
    q = SysTab.MemNODE->Size - SysTab.Position;
    if (q<=0) goto ReadEof;
  }

  memcpy((byte *)buffer,SysTab.Buffer+SysTab.BufferPos,q);
  where_pos += q; SysTab.Position +=q; SysTab.BufferPos += q;

  while ((size) && (!eof))
  {
   CallResult = PMAP ( MyNode,           SysTab.Position,
		       logical,          MyNode->packID,
		       PMAP_READ,        SysTab.Buffer,
		       SysTab.BufferPos, preload,
		       CacheFlag );

   if (CallResult != ERR_FS_NO_ERROR) goto ReadError;

   if (size > 512) { q = 512; size -= 512; }
	      else { q = size; size = 0;   }

   if (SysTab.MemNODE->Size <= SysTab.Position + q)
   { eof = 1;
     q = SysTab.MemNODE->Size - SysTab.Position;
     if (q<=0) goto ReadEof;
   }

   memcpy((byte *)buffer+where_pos,SysTab.Buffer+SysTab.BufferPos,q);
   where_pos += q; SysTab.Position +=q; SysTab.BufferPos += q;
  }


  if (eof) goto ReadEof;
ReadFinish:
  MyNode->Locked.Release();
  SyscallActive = 0;
  return where_pos;

ReadError:
  MyNode->Locked.Release();
  Task->ErrorLevel = CallResult;
  SyscallActive = 0;
  return 0xffffffff;

ReadEof:
  SysTab.Position = SysTab.MemNODE->Size;
  SysTab.BufferPos = (SysTab.Position & 511);
  MyNode->Locked.Release();
  SyscallActive = 0;
  return 0;
}
Exemple #3
0
dword fs_write(int handle, void far *buffer, dword size)
{
  TaskUArea *Task = GetCurrentTaskUArea();
  int	    MySysIndex;
  dword	    where_pos,q;
  MNODE	    *MyNode;
  word      CacheFlag, CallResult;
  dword	    preload;

  SyscallActive = 1;
  Task->ErrorLevel = ERR_FS_NO_ERROR;


  if (!Task->OpenFiles[handle].Used)
  {
    Task->ErrorLevel = ERR_NOT_VALID_FILE_HANDLE;
    SyscallActive = 0;
    return 0xffffffff;
  }

  MySysIndex = Task->OpenFiles[handle].SystemTabIndex;
  if (!(SysTab.Access & IO_CAN_WRITE))
  {
    Task->ErrorLevel = ERR_FILE_NOT_TO_WRITE;
    SyscallActive = 0;
    return 0xffffffff;
  }

  where_pos = 0;
  CacheFlag = (SysTab.Access & IO_CACHE_ADD) ? FPACK_ADD : FPACK_NOTHING;

  MyNode = SysTab.MemNODE;
  MyNode->Locked.Acquire();
  if (SysTab.DirtyBuffer)
  {
   CallResult = PMAP ( MyNode,           SysTab.Position,
		       SysTab.logical,          MyNode->packID,
		       PMAP_WRITE,        SysTab.Buffer,
		       SysTab.BufferPos, preload,
		       CacheFlag );
   if (CallResult != ERR_FS_NO_ERROR) goto WriteError;
   SysTab.DirtyBuffer = 0;
  }

  if (size > 512-SysTab.BufferPos)
   {
    q = 512-SysTab.BufferPos;
    size -= (512-SysTab.BufferPos);
   }
   else
   {
    q = size;
    size = 0;
   }

  memcpy(SysTab.Buffer+SysTab.BufferPos,buffer,q);

  CallResult =
   CacheManSaveSector( MyNode->Device, MyNode->Partition,
		       SysTab.logical,1,
		       MyNode->packID, CacheFlag, SysTab.Buffer);
   if (CallResult != ERR_FS_NO_ERROR) goto WriteError;
  where_pos += q; SysTab.Position +=q; SysTab.BufferPos += q;
  if (SysTab.Position > SysTab.MemNODE->Size)
   SysTab.MemNODE->Size = SysTab.Position;


  while (size)
  {
   CallResult = PMAP ( MyNode,           SysTab.Position,
		       SysTab.logical,  MyNode->packID,
		       PMAP_WRITE,       SysTab.Buffer,
		       SysTab.BufferPos, preload,
		       CacheFlag );
   if (CallResult != ERR_FS_NO_ERROR) goto WriteError;

   if (size > 512) { q = 512; size -= 512; }
	      else { q = size; size = 0;   }

   memcpy(SysTab.Buffer+SysTab.BufferPos,buffer,q);

   CallResult =
    CacheManSaveSector( MyNode->Device, MyNode->Partition,
			SysTab.logical,1,
			MyNode->packID, CacheFlag, SysTab.Buffer);
    if (CallResult != ERR_FS_NO_ERROR) goto WriteError;
   where_pos += q; SysTab.Position +=q; SysTab.BufferPos += q;
  if (SysTab.Position > SysTab.MemNODE->Size)
   SysTab.MemNODE->Size = SysTab.Position;
  }


  if (SysTab.Position > SysTab.MemNODE->Size)
  SysTab.MemNODE->Size = SysTab.Position;
  if (CacheFlag == FPACK_NOTHING) SaveMNODE (MyNode, FPACK_NOTHING);
  BitmapDoAction(Task->OpenFiles[handle].Bitmap,MaxOpenedFiles,SetDirty);
  MyNode->Locked.Release();
  SyscallActive = 0;
  return where_pos;


WriteError :
  if (SysTab.Position > SysTab.MemNODE->Size)
  SysTab.MemNODE->Size = SysTab.Position;
  if (CacheFlag == FPACK_NOTHING) SaveMNODE (MyNode, FPACK_NOTHING);
  BitmapDoAction(Task->OpenFiles[handle].Bitmap,MaxOpenedFiles,SetDirty);
  MyNode->Locked.Release();
  Task->ErrorLevel = CallResult;
  SyscallActive = 0;
  return 0xffffffff;
}