Вот, полностью рабочий TRD образ, в Z80Stealth работает отлично, на других эмуляторах не проверял, в ZX-Evo не работает, видимо у неё в прошивке какие-то ограничения есть, ни дискета, ни образ не запускаются, хотя образ снял на ZX-Evo :-D
protect03.zip
Пришлось к стандартному образу добавить 4к байт в конец, чтобы добавить 160 дорожку, потом с эве примонтировал этот образ и затем REALCOPY скопировал подорожечно с 0 по 160.
UPD: сомневаюсь, что у этой защиты есть что-то в межсекторном промежутке, скорее всего всё находится в 160 дорожке.
Последний раз редактировалось EvgenRU; 13.03.2016 в 19:25.
прояснился автор защиты.
(я с ним познакомился когда он увлёкся уже Амигой)
блин, там каждый бейсик сначала раскодируется, а потом отдаётся на обработку
Последний раз редактировалось goodboy; 13.03.2016 в 20:02.
только надо ещё каждый бейсик расксорить.
довольно хорошие знания trdos`a для 1993года, (Инфорком тогда в zxrewiev делал только робкие шаги)
я помнится (когда ПавелНикитин торговал дискетами для амиги в Митино) попросил у него простенький редактор типа Ced`a,
а он мне впарил WordWorth на 4х дискетах.
как говорится `две большие разницы`
Последний раз редактировалось goodboy; 13.03.2016 в 20:36.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Убейте меня, но я не пойму как он ксорит, понятно, что нули заксорены по таблице из 160 дорожки, там увеличение каждого значения на 9 и отбрасывание старшего бита (конгруэнтный генератор?), а вот как не нули ксорятся не пойму...
вот бейсик из первой игры, закодированный и незакодированный (взял с virttrd), может кто поймет как оно там....
full_throttle.zip
UPD: ладно, не буду мучаться, сейчас в анрыле бейсиков надергаю :-D
Последний раз редактировалось EvgenRU; 13.03.2016 в 23:01.
Код:LD HL,23867 LD BC,256 LD A,48 LD R,A L61549: LD A,R XOR (HL) LD (HL),A INC HL DEC BC LD A,B OR C JR NZ,L61549
Так то я бейсик выпотрошил в Unreal Speccy, там он не такой как с VirtTRD.
А вот этот код страшный, использование регистра R... там он вроде как после каждой операции равен R = (R & 0x80) | ((R+1) & 0x7F).... сейчас попробую код набросать для расшифровки...
Всё, готовый код на C# для расшифровки бейсика
Первый готов, грузится нормально, сейчас остальные сделаю и выложу trdBinaryReader br = new BinaryReader(File.OpenRead("FULLTHR2.enc"));
BinaryWriter bw = new BinaryWriter(File.OpenWrite("out.dat"));
byte r = 48;
while (true)
{
if (br.BaseStream.Position == br.BaseStream.Length) break;
byte b = br.ReadByte();
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
b = (byte)(r ^ b);
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
bw.Write(b);
}
bw.Close();
br.Close();
PS: кодируется только первый сектор бейсика, остальные не изменяются.
PS2: на всякий случай выложу программку, которая раскодирует весь TRD, в который добавлена таблица бейсик файлов из отладчика, вдруг в будущем кому-то тоже понадобится такое раскодировать
PS: выяснилось еще, что значение R меняется при кодировании, на другом диске R = 17 а не 48, так что так... правда тот диск у меня без 160 дорожки, придется вручную бейсики выковыриватьstatic void Main(string[] args)
{
BinaryReader br = new BinaryReader(File.OpenRead("2.trd"));
BinaryWriter bw = new BinaryWriter(File.OpenWrite("out.dat"));
while (br.BaseStream.Position != br.BaseStream.Length)
{
byte c = br.ReadByte();
bw.Write(c);
}
long file_offs = 0;
for(int i = 0; i < 128; i++)
{
br.BaseStream.Position = file_offs;
byte[] buf = new byte[16];
buf = br.ReadBytes(16);
file_offs = br.BaseStream.Position;
if ((buf[8] == 'B' || buf[8] == 'b') && buf[0] != 0)
{
int offset = buf[15] * 4096 + buf[14] * 256;
for (byte k = 0; k < 9; k++)
Console.Out.Write((char)buf[k]);
Console.Out.WriteLine(" Offset: " + offset);
br.BaseStream.Position = offset;
bw.BaseStream.Position = offset;
byte r = 48;
for (int j = 0; j < 256; j++)
{
byte b = br.ReadByte();
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
b = (byte)(r ^ b);
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
r = (byte)((r & 0x80) | ((r + 1) & 0x7f));
bw.Write(b);
}
}
}
bw.Close();
br.Close();
}
Последний раз редактировалось EvgenRU; 15.03.2016 в 22:08.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)