Magic Team

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Magic Team » О ромхакинге » Blue marine(nes)


Blue marine(nes)

Сообщений 1 страница 14 из 14

1

Не могу найти надписи: press start button.
По всей видимости спрайтовая надпись.
Найти ее через дебагер сложно, пузыри на экране, мешают.
Помогите, пожалуйста.
http:\\www.chief-net.fatal.ru\files\guyver.zip

Отредактировано chiefexb (2005-11-22 18:13:53)

0

2

Ссылка битая

0

3

http://www.chief-net.fatal.ru/files/Guyver.zip
Простите

0

4

http://chiefnet.1bb.ru/index.php?showtopic=19
Ссылка на тему

0

5

http://www.chief-net.fatal.ru/images/guyver/screenguy2.jpg

0

6

Вчера пришли к выводу что здесь пожатая карта тайлов, спасибо Djin'у, но что с ней делать пока не знаю :(

0

7

;) Правильной дорогой идёте товарищи.
Токо дебагом тут и можно...
Да - надпись оказалась не спрайтовая.
Кстати, Шефф -чек да мэил... фуу 2 с половиной часа дебага прошли не зря...
прям уже впору доку целую писать по этой долбанной надписи press start button... А ля Санчез
Кстати идея... [Djinn,нужна дока по неэлементарному(слово-то какое =) ) взлому для NES?]
  P.S.
А че вы все называете Blue marin?(еще бы Marine и был бы голубой моряк =) )
марЛин - рыба-меч

Отредактировано Griever (2005-11-28 04:14:42)

0

8

Не... Рыба меч - немного другая история... Её там кстати можно тоже ловить... А Марлин стоит особняком... У этой рыбы есть ещё 4 названия - она близкий родственник рыбы-меч (семейство парусниковых) но у неё спинной плавник намного больше, чем у рыбы-меч... А вообще даже в России рыбу иногда так и зовут - Синий марлин...

Отредактировано guyver (2005-11-29 01:25:09)

0

9

Серьёзно подошел к вопросу =)

0

10

Griever
Поделись что ты нашел в дебагере, я тоже дебагил, но не смог сдвинуться с мертвой точки, пузырьки мешали!

0

11

chiefexb написал(а):

Griever
я тоже дебагил, но не смог сдвинуться с мертвой точки, пузырьки мешали!

А чего ты дебагил? Спрайтовый буфер? Надпись не спрайтовая =) Ты же сам сказал, что это пожатая
( нет - вернее сказать запакованная) тайловая карта, которая не имеет никакого отношения к спрайтам!
   Я поделюсь, конечно, не жадный - вот уже целую доку написал, но токо позднее =) Терпение, мой друг....

0

12

Возобновляем старые темы. В настоящее время формат упакованных данных известен досконально. Я бы мог привести код 6502 или объяснить словами, но, думаю, намного нагляднее будет привести код распаковщика на всеми любимом Delphi (кстати, общее описание можно найти на сайте ChiefNet):

Код:
program Unpacker;

{$APPTYPE CONSOLE}

uses
  SysUtils,classes;

const
InputFileName:string='Blue Marlin, The (U).nes';
OutputFileName:string='Output.bin';
StartOffs:integer=$8143;//адрес начала упакованной тайловой карты экрана битвы с рыбой - конец по смещению 0х8359

var
 msIN,msOut:tmemorystream;

 Carry:boolean;
 PreviousChar,DecompCounter,HighControlByte,LowControlByte:byte;
 NextChar,ZeroByte:byte;
 MainCounter:integer;
Lines, Columns:byte;


//---------------------------------------------------------------
Procedure Asl(var operand:byte);
begin
Carry:= Boolean(Operand shr 7);
Operand := Operand shl 1;
end;

//---------------------------------------------------------------

Procedure MainLoop ;
begin

if (boolean(HighControlByte shr 7))=false then
msIn.Read(NextChar,1)//highContByte=0

else begin //highContByte=1
 asl(LowControlByte);
 if Carry=true then   NextChar:=ZeroByte// LowContByte=1
 else                 msIn.Read(NextChar,1);// LowContByte=0
end;//highContByte=1



inc(decompCounter);
if (DecompCounter mod $40)=0 then begin //(decompcounter mod $40)=0

 msIn.Read(HighControlByte,1);
 if HighControlByte=0 then begin
  msIn.Read(ZeroByte,1);
  msIn.Read(HighControlByte,1);
 end;

 if (boolean(HighControlByte shr 7))=true then msIn.Read(LowControlByte,1);
end//(decompcounter mod $40)=0
else
begin //(decompcounter mod $40)<>0
 if (DecompCounter mod 8) =0 then
 begin
  HighControlbyte:=HighControlbyte shl 1;
  if (boolean(HighControlByte shr 7))=true then msIn.Read(LowControlByte,1);
 end;
end;//(decompcounter mod $40)<>0

end;


//---------------------------------------------------------------


begin
msIn:=tmemoryStream.Create;
msOut:=tmemoryStream.Create;


ZeroByte:=0;
msIn.LoadFromFile(InputFileName);
msIn.Position:=StartOffs;

msIn.Read(HighControlByte,1);
MsIn.Read(LowControlByte,1);


mainLoop;
PreviousChar :=NextChar xor PreviousChar;
Lines :=PreviousChar ;

mainLoop ;
PreviousChar :=NextChar xor PreviousChar;
Columns:=PreviousChar;



for MainCounter:=0 to (Lines*Columns-1) do
begin

mainLoop;
PreviousChar:=NextChar xor PreviousChar;
msOut.Write(PreviousChar,1);
end;



msOut.SaveToFile(OutputFileName);
msIn.Free;
msOut.Free;

end.

Распаковщик отличный =) Да и формат, как вы видите довольно прост (предназначен, в основном, для повторяющихся байт). НО, как всегда, есть загвоздка... Рассмотрим этот кусок кода распаковщика:

Код:
msIn.Read(HighControlByte,1);
if HighControlByte=0 then begin
 msIn.Read(ZeroByte,1);
 msIn.Read(HighControlByte,1);
end;

Теперь ZeroByte может быть любым: алгоритм становится эффективным для байт, XOR между которыми равен любому байту (0-255). Таким образом, одинаковые байты - лишь частный случай (в этом случае ZeroByte=0). Этот частный случай работает бОльшую часть времени: например на первом титульнике ZeroByte вообще всегда равен 0, но есть такие тайловые карты, в которых имеются примерно такие последовательности:
...5C 5D 5C... (это тайловая карта экрана битвы с рыбой) и тогда эффективным становится ситуация, когда ZeroByte=1.
Итак, распаковщик должен это уметь делать... В связи с этим две предпосылки:

-В любом случае, ZeroByte может изменяется всего один раз в $40 распакованных байт тайловой карты;
-По всей видимости, ZeroByte меняется только в случае, если в этом буфере из $40 распакованных байт не оказывается одинаковых (видимо, распаковщик должен совершить ещё один проход по буферу с поиском байт, XOR между которыми равен 1, в случае неудачи - 2 и т.д.)

Мой распаковщик довольно кривой, но хорошо упаковывал карты с одинаковыми байтами. К сожалению, он не может справиться с байтами, XOR между которыми равен разным числам - упакованные файлы больше оригинальных упакованных блоков.

Вот и всё. Как видите, проблема, скорее, в моих скромных умениях в кодинге. Возможно, кто-нибудь более опытный справится с этой задачей. Спасибо за внимание ^_^

PS: Упаковка вручную довольно трудоёмка: если вы успели заметить, здесь применён простейший крипт: элементарный XOR с предыдущим байтом приводит к тому, что изменение одного байта  приводит к запарыванию всей части карты, лежащей ниже этого байта.

0

13

Какой ВУЖАС!!! Пойду на китайский форум - там и то понятнее ;о))))) Мда... Особено в посте убивают слова типа простейший и элементарный ;о))))

0

14

Какой ВУЖАС!!! Пойду на китайский форум - там и то понятнее ;о))))) Мда... Особено в посте убивают слова типа простейший и элементарный ;о))))

Учи Дельфи и асм ;) Ничего сложного :) Я тож когда-то шугался)

0


Вы здесь » Magic Team » О ромхакинге » Blue marine(nes)