October 28, 2020, 11:42:14 PM

Author Topic: [bb] IPS Routines by taxlerendiosk [ 1+ years ago ]  (Read 1384 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] IPS Routines by taxlerendiosk [ 1+ years ago ]
« on: June 29, 2017, 12:28:43 AM »
Title : IPS Routines
Author : taxlerendiosk
Posted : 1+ years ago

Description : International Patching System - creating and using IPS files.

Code :
Code: BlitzBasic
  1. ; International Patching System (IPS) routines, v1.0
  2. ; Written by Duncan Cross, 24/08/2002
  3.  
  4. Dim IPSData(5)
  5.  
  6. Function ApplyIPSPatch(Source$, IPSFile$, Dest$)
  7.         Dim IPSData(5)
  8.         IPS = ReadFile(IPSFile$)
  9.         CheckStr$ = ""
  10.         For X = 1 To 5
  11.                 CheckStr$ = CheckStr$ + Chr( ReadByte(IPS) )
  12.         Next
  13.         If Upper$(CheckStr$) <> "PATCH" Then RuntimeError("Error: Not an IPS patchfile")
  14.         CopyFile Source$, Dest$
  15.         PatchedFile = OpenFile(Dest$)
  16.         For X = 0 To 4
  17.                 IPSData(X) = ReadByte(IPS)
  18.         Next
  19.         Repeat
  20.  
  21.                 Address = IPSData(2) + (IPSData(1) * $100) + (IPSData(0) * $10000)
  22.                 ByteCount = IPSData(4) + (IPSData(3) * $100)
  23.                 SeekFile PatchedFile, Address
  24.                 If ByteCount = 0
  25.                         RLE_Count = ( ReadByte(IPS) * $100 ) + ReadByte(IPS)
  26.                         RLE_Value = ReadByte(IPS)
  27.                         For X = 1 To RLE_Count
  28.                                 WriteByte PatchedFile, RLE_Value
  29.                         Next
  30.                 Else
  31.                         For X = 1 To ByteCount
  32.                                 WriteByte PatchedFile, ReadByte(IPS)
  33.                         Next
  34.                 End If
  35.                        
  36.                 For X = 0 To 4
  37.                         IPSData(X) = ReadByte(IPS)
  38.                 Next
  39.                 If IPSData(0)=Asc("E") And IPSData(1)=Asc("O") And IPSData(2)=Asc("F") Then Stopped = True
  40.                 If Eof(IPS) Then Stopped = True
  41.  
  42.         Until Stopped
  43.         CloseFile(IPS)
  44.         CloseFile(PatchedFile)
  45. End Function
  46.  
  47. Function MakeIPSPatch(From_n$, To_n$, Dest$)
  48.         Dim IPSData(5)
  49.         IPS = WriteFile(Dest$)
  50.         FromFile = ReadFile(From_n$)
  51.         ToFile = ReadFile(To_n$)
  52.         WriteByte IPS, Asc("P")
  53.         WriteByte IPS, Asc("A")
  54.         WriteByte IPS, Asc("T")
  55.         WriteByte IPS, Asc("C")
  56.         WriteByte IPS, Asc("H")
  57.  
  58.         Use_RLE = True
  59.  
  60.         While Eof(FromFile) = False
  61.  
  62.                 FromByte = ReadByte(FromFile)
  63.                 ToByte = ReadByte(ToFile)
  64.  
  65.                 If InBlock = False
  66.                         If FromByte <> ToByte Then
  67.                                 FirstByte = ToByte
  68.                                 BeginLoc = FilePos(FromFile) - 1
  69.                                 InBlock = True
  70.                                 BlockLength = 0
  71.                         End If
  72.                 End If
  73.  
  74.                 If InBlock
  75.                         If ToByte <> FirstByte Then Use_RLE = False
  76.                         If FromByte = ToByte
  77.                                 InBlock = False
  78.                                 WriteByte IPS, (BeginLoc And $FF0000) / $10000
  79.                                 WriteByte IPS, (BeginLoc And   $FF00) / $100
  80.                                 WriteByte IPS, (BeginLoc And     $FF)
  81.                                 If Use_RLE And BlockLength >= 3 ; If the block is less than 3 bytes,
  82.                                         WriteByte IPS, 0            ; RLE is counter-productive.
  83.                                         WriteByte IPS, 0
  84.                                         WriteByte IPS, (BlockLength And $FF00) / $100
  85.                                         WriteByte IPS, (BlockLength And   $FF)
  86.                                         WriteByte IPS, FirstByte
  87.                                 Else
  88.                                         WriteByte IPS, (BlockLength And $FF00) / $100
  89.                                         WriteByte IPS, (BlockLength And   $FF)
  90.                                         SeekFile ToFile, BeginLoc
  91.                                         For X = 1 To BlockLength
  92.                                                 WriteByte IPS, ReadByte(ToFile)
  93.                                         Next
  94.                                         ReadByte ToFile
  95.                                 End If
  96.                                 Use_RLE = True
  97.                         Else
  98.                                 BlockLength = BlockLength + 1
  99.                         End If
  100.                 End If
  101.  
  102.         Wend
  103.  
  104.         WriteByte IPS, Asc("E")
  105.         WriteByte IPS, Asc("O")
  106.         WriteByte IPS, Asc("F")
  107.         CloseFile(IPS)
  108.         CloseFile(ToFile)
  109.         CloseFile(FromFile)
  110. End Function


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal