//#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; }
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; }
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; }