mirror of
https://github.com/SabreTools/psxt001z.git
synced 2026-02-04 05:35:55 +00:00
102 lines
2.9 KiB
C#
102 lines
2.9 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
using SabreTools.IO;
|
|
|
|
namespace psxt001z
|
|
{
|
|
/// <see href="https://github.com/Dremora/psxt001z/blob/master/functions.cpp"/>
|
|
public partial class LibCrypt
|
|
{
|
|
public static int CalculateEDC(in byte[] src, int srcPtr, int size, int[] edc_lut)
|
|
{
|
|
int edc = 0;
|
|
while (size-- > 0)
|
|
{
|
|
edc = (edc >> 8) ^ edc_lut[(edc ^ src[srcPtr++]) & 0xFF];
|
|
}
|
|
|
|
return edc;
|
|
}
|
|
|
|
internal static bool ZeroCompare(byte[] buffer, int bufferPtr, int bsize)
|
|
{
|
|
for (int i = 0; i < bsize; i++)
|
|
{
|
|
if (buffer[bufferPtr + i] != 0x00)
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
internal static void MSF(long lba, byte[] buffer, int bufferOffset)
|
|
{
|
|
lba += 150;
|
|
|
|
double mindbl = lba / 60 / 75;
|
|
byte min = (byte)Math.Floor(mindbl);
|
|
double secdbl = (lba - (min * 60 * 75)) / 75;
|
|
byte sec = (byte)Math.Floor(secdbl);
|
|
byte frame = (byte)(lba - (min * 60 * 75) - (sec * 75));
|
|
|
|
buffer[bufferOffset] = IntegerToBinary(min);
|
|
buffer[bufferOffset + 1] = IntegerToBinary(sec);
|
|
buffer[bufferOffset + 2] = IntegerToBinary(frame);
|
|
}
|
|
|
|
public static bool GetEDC(Stream file)
|
|
{
|
|
long currentposition = file.Position;
|
|
file.Seek(30572, SeekOrigin.Begin);
|
|
uint buffer = file.ReadUInt32();
|
|
file.Seek(currentposition, SeekOrigin.Begin);
|
|
return buffer == 0;
|
|
}
|
|
|
|
internal static byte[] GetExecutableName(Stream file)
|
|
{
|
|
byte[] buffer = new byte[20];
|
|
byte[] exename = new byte[20];
|
|
|
|
//Searching for SYSTEM.CNF
|
|
file.Seek(51744, SeekOrigin.Begin);
|
|
while (Encoding.ASCII.GetString(buffer) != "SYSTEM.CNF")
|
|
{
|
|
file.Read(buffer, 0, 10);
|
|
buffer[10] = 0;
|
|
file.Seek(-9, SeekOrigin.Current);
|
|
}
|
|
|
|
file.Seek(-32, SeekOrigin.Current);
|
|
uint lba = file.ReadUInt32();
|
|
file.Seek((2352 * lba) + 29, SeekOrigin.Begin);
|
|
file.Read(buffer, 0, 6);
|
|
buffer[6] = 0;
|
|
while (Encoding.ASCII.GetString(buffer) != "cdrom:")
|
|
{
|
|
file.Seek(-5, SeekOrigin.Current);
|
|
file.Read(buffer, 0, 6);
|
|
}
|
|
|
|
file.Read(buffer, 0, 1);
|
|
if (buffer[0] != '\\')
|
|
file.Seek(-1, SeekOrigin.Current);
|
|
|
|
int i = -1;
|
|
do
|
|
{
|
|
file.Read(buffer, ++i, 1);
|
|
} while (buffer[i] != ';');
|
|
|
|
for (int a = 0; a < i; a++)
|
|
{
|
|
exename[a] = (byte)char.ToUpper((char)buffer[a]);
|
|
}
|
|
|
|
exename[i] = 0;
|
|
return exename;
|
|
}
|
|
}
|
|
}
|