Code archives/Algorithms/IPS Routines
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
International Patching System - creating and using IPS files. | |||||
; International Patching System (IPS) routines, v1.0 ; Written by Duncan Cross, 24/08/2002 Dim IPSData(5) Function ApplyIPSPatch(Source$, IPSFile$, Dest$) Dim IPSData(5) IPS = ReadFile(IPSFile$) CheckStr$ = "" For X = 1 To 5 CheckStr$ = CheckStr$ + Chr( ReadByte(IPS) ) Next If Upper$(CheckStr$) <> "PATCH" Then RuntimeError("Error: Not an IPS patchfile") CopyFile Source$, Dest$ PatchedFile = OpenFile(Dest$) For X = 0 To 4 IPSData(X) = ReadByte(IPS) Next Repeat Address = IPSData(2) + (IPSData(1) * $100) + (IPSData(0) * $10000) ByteCount = IPSData(4) + (IPSData(3) * $100) SeekFile PatchedFile, Address If ByteCount = 0 RLE_Count = ( ReadByte(IPS) * $100 ) + ReadByte(IPS) RLE_Value = ReadByte(IPS) For X = 1 To RLE_Count WriteByte PatchedFile, RLE_Value Next Else For X = 1 To ByteCount WriteByte PatchedFile, ReadByte(IPS) Next End If For X = 0 To 4 IPSData(X) = ReadByte(IPS) Next If IPSData(0)=Asc("E") And IPSData(1)=Asc("O") And IPSData(2)=Asc("F") Then Stopped = True If Eof(IPS) Then Stopped = True Until Stopped CloseFile(IPS) CloseFile(PatchedFile) End Function Function MakeIPSPatch(From_n$, To_n$, Dest$) Dim IPSData(5) IPS = WriteFile(Dest$) FromFile = ReadFile(From_n$) ToFile = ReadFile(To_n$) WriteByte IPS, Asc("P") WriteByte IPS, Asc("A") WriteByte IPS, Asc("T") WriteByte IPS, Asc("C") WriteByte IPS, Asc("H") Use_RLE = True While Eof(FromFile) = False FromByte = ReadByte(FromFile) ToByte = ReadByte(ToFile) If InBlock = False If FromByte <> ToByte Then FirstByte = ToByte BeginLoc = FilePos(FromFile) - 1 InBlock = True BlockLength = 0 End If End If If InBlock If ToByte <> FirstByte Then Use_RLE = False If FromByte = ToByte InBlock = False WriteByte IPS, (BeginLoc And $FF0000) / $10000 WriteByte IPS, (BeginLoc And $FF00) / $100 WriteByte IPS, (BeginLoc And $FF) If Use_RLE And BlockLength >= 3 ; If the block is less than 3 bytes, WriteByte IPS, 0 ; RLE is counter-productive. WriteByte IPS, 0 WriteByte IPS, (BlockLength And $FF00) / $100 WriteByte IPS, (BlockLength And $FF) WriteByte IPS, FirstByte Else WriteByte IPS, (BlockLength And $FF00) / $100 WriteByte IPS, (BlockLength And $FF) SeekFile ToFile, BeginLoc For X = 1 To BlockLength WriteByte IPS, ReadByte(ToFile) Next ReadByte ToFile End If Use_RLE = True Else BlockLength = BlockLength + 1 End If End If Wend WriteByte IPS, Asc("E") WriteByte IPS, Asc("O") WriteByte IPS, Asc("F") CloseFile(IPS) CloseFile(ToFile) CloseFile(FromFile) End Function |
Comments
None.
Code Archives Forum