Список форумов shedevr.org.ru shedevr.org.ru
Группа перевода приставочных игр "ШЕДЕВР"
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Neutopia (Pc Engine/Turbo Grafx-16)
На страницу Пред.  1, 2, 3  След.
 
Начать новую тему   Ответить на тему    Список форумов shedevr.org.ru -> Экстремальный ромхакинг
Предыдущая тема :: Следующая тема  
Автор Сообщение
Mefistotel
RRC2008
RRC2008


Зарегистрирован: 08.03.2008
Сообщения: 294
Откуда: МАГАДАН

СообщениеДобавлено: Пн Авг 11, 2008 3:04 pm    Заголовок сообщения: Ответить с цитатой

После того, как поставил бряк на запись по адресу 7360, увидел следующий код. Это цикл.
Код:
E8A7 STA $0003; 8D 03 00
E8AA: INX; E8
E8AB: CPX #$20; E020
E8AD: BCC $E89D; 90 EE
E89D: LDA $2A5C,X @ $2A60 = $82; BD 5C 2A
E8A0: STA $0002; 8D 02 00
E8AA: INX; E8
E8A4: LDA $2A5C,X @ $2A5E = $71; BD 5C 2A; Затем всё заново.


E8A7: STA $0003; 8D 03 00 - записываем три байта 8D 03 00 из регистра A в память по адресу 0003h
E8AA: INX; E8
Мнемоника означающая, что к регистру X надо прибавить значение E8??
E8AB: CPX #$20; E020
Устанавливаем флаг в соответствии с чем??
E8AD: BCC $E89D; 90 EE "Здесь как раз то в дебагере видна строка E8AF, но после нажатия S, она резко меняется на E89D"
Выполняем переход, если бит переноса очищен..? Не нашел эту мнемонику в списке, относящемуся к процессору Dendy.
E89D: LDA $2A5C,X @ $2A60 = $82; BD 5C 2A
Загружаем в аккумулятор значение 2A 5С ????
E8A0: STA $0002; 8D 02 00
записываем три байта 8D 03 00 из регистра A в память по адресу 0002h
E8A3: INX; E8
Мнемоника означающая ,что к регистру X надо прибавить значение E8??
E8A4: LDA $2A5C,X @ $2A5E = $71; BD 5C 2A
Загружаем в аккумулятор значение 2A 5С ????
Что происходит в процессе работы этого цикла?? Адреса слева и справа, это смещение относительно чего-то?? Shiru, расскажи, пожалуйста, подробнее об этом. Что после этого кода, делать дальше. Ставить бряк на следующее значение?
Я залил рисунок окон дебаггера с цифрами.

1 - ?
2 - ?
3 - структура тайла в видеопамяти.
4 - различные функции для дебага.
5 - Хексредактор...
Между 1 и вторым столбцом - мнемоники, то есть команды.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Пн Авг 11, 2008 3:21 pm    Заголовок сообщения: Ответить с цитатой

Байты после инструкций - дополнительные данные, не принимай их за часть кода. И скачай с ромхакинг.нет fceudsp - там и удобней, и понятней.
INC X - увеличить икс на один.
STA $0003; - записать регистр А по адресу 3.
CPX #$20 - сравнить икс с $20.
BCC $E89D; - условный переход в завимости от результата выполнения предыдущей инструкции.
LDA $2A5C,X @ $2A60 = $82; - грузим А из адреса $2A5C+X (2A60)

Все проще ;)

---

Сорри за fceudsp, забыл, меня че-то переклинило, что ты на NES дебажишь)
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Mefistotel
RRC2008
RRC2008


Зарегистрирован: 08.03.2008
Сообщения: 294
Откуда: МАГАДАН

СообщениеДобавлено: Пн Авг 11, 2008 3:54 pm    Заголовок сообщения: Ответить с цитатой

Тьфу ты, черт побери. Спасибо! Ну тогда уж действительно, всё проще и значение мнемоник, как в доке написано.
Ясненько. Оказывается очень интересно... дебажить игру, ещё бы понять смысл этих манипуляций в игре. Но это дело времени. Horror,
Question Как дальше продолжать дебаг, ставить бряк на следующее значение в памяти 7370 (вторая буква в слове Gold) и листать код??
Цитата:
Сорри за fceudsp, забыл, меня че-то переклинило, что ты на NES дебажишь)

Да ничего страшного. Если, я когда-нибудь разберусь в этой штуке, то дебаг на нес мне будет не страшен...наверное. Достали мегамены, бетмены и прочее аркады. Даёшь народу PRG! Laughing Шутка, конечно, но с немалой долей правды...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Пн Авг 11, 2008 4:04 pm    Заголовок сообщения: Ответить с цитатой

На следующий символ нет смысла ставить бряк, т.к. он будет читаться в пределах той же процедуры. Просто изучи процедуру. Вообще, разберешься с процедурой - скорей всего и дебаг более-менее освоишь, поймешь, что к чему Wink
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Mefistotel
RRC2008
RRC2008


Зарегистрирован: 08.03.2008
Сообщения: 294
Откуда: МАГАДАН

СообщениеДобавлено: Пн Авг 11, 2008 4:09 pm    Заголовок сообщения: Ответить с цитатой

Век живи - век учись... золотые слова...
Ок... ну а пока надо немного поспать... .
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Shiru



Зарегистрирован: 25.10.2006
Сообщения: 295
Откуда: Russia, Moscow

СообщениеДобавлено: Пн Авг 11, 2008 4:22 pm    Заголовок сообщения: Ответить с цитатой

Примечание: ответ начал писать ещё до первого ответа HoRRoR'а.

Mefistotel писал(а):
E8A7: STA $0003; 8D 03 00 - записываем три байта 8D 03 00 из регистра A в память по адресу 0003h

8D 03 00 - это код команды STA $0003 (8D сама команда и 03 00 её параметр). Так как регистр A восьмиразрядный, в нём не может быть трёх байт. Эта команда просто записывает содержимое регистра A по адресу $0003. Что именно находится в регистре, можно узнать по предыдущему коду или при пошаговом выполнении кода (содержимое регистров отображается на экране).

Цитата:
E8AA: INX; E8
Мнемоника означающая, что к регистру X надо прибавить значение E8??

Нет, это инкремент регистра X, т.е. увеличение значения, находящегося в нём, на 1. E8 - это код этой команды (один байт, так как у неё нет параметров).

Цитата:
E8AB: CPX #$20; E020
Устанавливаем флаг в соответствии с чем??

Сравнение значения в регистре X и 20h. Сравнение - это тоже самое, что вычитание (в данном случае вычитается 20h из значения в X), но значение в регистре не изменяется, только устанавливаются флаги. Про флаги и регистр флагов читай документацию.

Цитата:
E8AD: BCC $E89D; 90 EE "Здесь как раз то в дебагере видна строка E8AF, но после нажатия S, она резко меняется на E89D"
Выполняем переход, если бит переноса очищен..? Не нашел эту мнемонику в списке, относящемуся к процессору Dendy.

BCC - это одна из команд условного перехода, а именно Branch on Carry Clear, т.е. переход произойдёт, если флаг переноса не установлен. В последовательности команд CPX #$20, BCC $E89D переход на адрес #E89D произойдёт, если X меньше 20h. Я не знаю, что делает код, который ты разбираешь (не вникал), но 20h - это 32 в десятичной системе, может навести на определённые мысли.

Ну и так далее, дальше сам.

Цитата:
Адреса слева и справа, это смещение относительно чего-то??

1. Синие цифры - адреса в памяти, по которым расположены команды. Через двоеточие - сами команды (после @, как я понимаю, дополнительная информация, учитывающая состояние регистров в момент выполнения команды).
2. Коды команд, т.е. какими байтами они представлены в памяти. Это вспомогательная информация, не очень нужна, т.к. рядом отображаются команды в виде мнемоник. К слову, легко заметить, что первый байт - это код команды, а следующие - её операнд (LDA $2A5A = AD 5A 2A, байты операнда переставлены местами). Кол-во байт в команде жёстко определяется самой командой - процессор, прочитав первый байт команды, уже знает, что это за команда и сколько ещё байт надо прочитать, чтобы получить её операнд.
3. Честно говоря, не понял, что это - какие-то 256 байт чего-то. На стек процессора вроде не похоже.
4. Слева регистры процессора - сначала обычные PC, A, X, Y, SP, P, потом дополнительные, которые есть только на TG16/PCE (управление банками памяти, ещё чего-то). Средний столбик - не знаю, м.б. регистры видеоконтроллера. Правый - регистры синтезатора звука.
5. Просмотр памяти, типа hex-редактора, только не редактор.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Shiru



Зарегистрирован: 25.10.2006
Сообщения: 295
Откуда: Russia, Moscow

СообщениеДобавлено: Пн Авг 11, 2008 5:50 pm    Заголовок сообщения: Ответить с цитатой

По поводу того, что делать дальше: запастись терпением. Сходу что-то сделать не получится.

Процессор - это только половина дела. Когда ты видишь, что код обращается к памяти (пишет или читает значения), тебе нужно задуматься: а (от)куда и зачем он их пишет/читает? Чтобы это понять, нужно изучить устройство самой TG16/PCE, в частности карту памяти. 65536 адресов, к которым может обращаться процессор - это не просто кусок памяти. В них отображается одновременно ОЗУ, ПЗУ (картридж) и регистры всех устройств - суммарно гораздо больше 64 килобайт. Механизм страничной адресации PCE делит адресное пространство процессора на 8 частей по 8 КБ (т.н. 'окна'), в каждую из которых может быть подключена 8-килобайтная страница физического адресного пространства. Номера страниц указываются в регистрах MPR0..MPR7 (в MPR0 номер страницы для первых 8 КБ адресного пространства процессора, в MPR1 - для следующих и т.п.). Страницы есть такие:

00-F6 картридж (до 1976 КБ)
F7 ОЗУ для сейвов (8 КБ)
F8 основное ОЗУ обычной PCE (8 КБ)
F9-FB дополнительное ОЗУ SuperGrafx (32 КБ, включая F8)
FF - порты ввода-вывода (регистры устройств, занимают не всю страницу)

Поэтому если код пишет в 0003h (т.е. в пределах нулевого окна; счёт окон и страниц идёт с нуля) и в MPR0 выбрана страница FF - ты знаешь, что запись идёт в порт какого-то устройства. А именно, в регистр видеоконтроллера для передачи старшего байта параметра. А если (условный пример) читается байт из 41A0 (второе окно) и в MPR2 выбрана страница 10 - то это чтение из картриджа, из 11-ой страницы, с физического адреса 201A0h.

Подробности читай в документации, т.к. в двух словах всё не объяснить. Пояснения выше - к тому, что не надо ожидать, что резко наступит полное понимание.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Mefistotel
RRC2008
RRC2008


Зарегистрирован: 08.03.2008
Сообщения: 294
Откуда: МАГАДАН

СообщениеДобавлено: Ср Авг 13, 2008 1:54 pm    Заголовок сообщения: Ответить с цитатой

Нашёл довольно интересную вещь... Exclamation Hu-Go Tracer.
Так вот, у него в файле Start.html находится пример.... NEUTOPIA!! И там показывается, как искать шрифт диалогов при помощи этого трейсера! Особенно заинтересовали команды записи в видеопамять.
Шрифт в игре не пожат... Зачем нужны эти манипуляции?
Shiru, что думаешь по этому поводу, что могут означать эти надписи, после команд асма в этом примере.
Код:
A:02 X:04 Y:00 S:F2 || P0=FF P1=F8 P2=07 P3=08 P4=04 P5=05 P6=06 P7=00
A:00 X:04 Y:00 S:F2 || P0=FF P1=F8 P2=07 P3=08 P4=04 P5=05 P6=06 P7=00
A:00 X:04 Y:00 S:F2 || P0=FF P1=F8 P2=07 P3=08 P4=04 P5=05 P6=06 P7=00
A:00 X:04 Y:01 S:F2 || P0=FF P1=F8 P2=07 P3=08 P4=04 P5=05 P6=06 P7=00
A:00 X:04 Y:01 S:F2 || P0=FF P1=F8 P2=07 P3=08 P4=04 P5=05 P6=06 P7=00
A:00 X:04 Y:01 S:F2 || P0=FF P1=F8 P2=07 P3=08 P4=04 P5=05 P6=06 P7=00
A:00 X:04 Y:02 S:F2 || P0=FF P1=F8 P2=07 P3=08 P4=04 P5=05 P6=06 P7=00
A:00 X:04 Y:02 S:F2 || P0=FF P1=F8 P2=07 P3=08 P4=04 P5=05 P6=06 P7=00

A:00 X:04 Y:02 S:F2 - регистры...а P?
Я чувствую ,что это ускорит процесс хакинга этой игры. Но я не смог запустить этот трейсер, блин. Создаю батник и в нём прописываю(Readme):
Код:

hugo.exe <Neutopia.pce> -c[0] -m[1] -o[0] -s[0] -w[1]
При запуске вылетает, хотя трейсер виндовый. Помоги, пожалуйста, его запустить. Там же на сайте имеется отладчик PC Engine Assembler lite bundle.
Может этот трейсер, поможет разобраться и с пойнтерами, которые остались для меня загадкой, хотя я и нашёл их... но не увидел закономерности. И при малейшой замене, диалоги косячились так же, как и графика. Об пойнтерах хочется поговорить отдельно, так как они совсем не такие, что встречались мне раньше... Они указывают не на строчки диалогов, а на весь текст с каким-либо NPС(байт F2). То есть, можно заставить NPС говорить "чужой" текст. Я случайно сменил диалог одного на другой... этим дело и ограничилось. В общем надо понять, что делает этот трейсер.


Последний раз редактировалось: Mefistotel (Ср Авг 13, 2008 2:47 pm), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Shiru



Зарегистрирован: 25.10.2006
Сообщения: 295
Откуда: Russia, Moscow

СообщениеДобавлено: Ср Авг 13, 2008 2:25 pm    Заголовок сообщения: Ответить с цитатой

Mefistotel писал(а):
A:00 X:04 Y:02 S:F2 - регистры...а P?

Это регистры MPR.

Цитата:
hugo.exe <Neutopia.pce> -c[0] -m[1] -o[0] -s[0] -w[1]

Квадратные скобки традиционно обозначают необязательный параметр командной строки, набирать их не надо. Т.е. -c0, а не -c[0]. Имя файла тоже без треугольных скобок.

По поводу поинтеров. Я не знаю, как оно на самом деле, но могу предположить, что поинтеры на PCE должны состоять из трёх байт - номер страницы и смещение в ней (либо 0000-1FFFh, либо абсолютный адрес, если страница всегда включается в одно и тоже окно).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Mefistotel
RRC2008
RRC2008


Зарегистрирован: 08.03.2008
Сообщения: 294
Откуда: МАГАДАН

СообщениеДобавлено: Ср Авг 13, 2008 3:06 pm    Заголовок сообщения: Ответить с цитатой

Хм.. даже батник был в папке Neutopia.bat. Только в нём почему-то две игры для запуска прописаны были... Убрав одну, игра запустилась.
Код:
hugo "Neutopia (U).pce" -o1 -s1 -w1

Теперь осталось понять, что делает эта программа.
Я, как все регистры запомню, выложу сюда со своими коментариями... Такой развернутой темы, по моему, нет в разделе.
Спасибо за ответ! Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Mefistotel
RRC2008
RRC2008


Зарегистрирован: 08.03.2008
Сообщения: 294
Откуда: МАГАДАН

СообщениеДобавлено: Чт Авг 14, 2008 2:01 pm    Заголовок сообщения: Ответить с цитатой

Программа позволяет дампить много нужной инфы, как я и хотел. Она сохраняет в файл весь дизассемблированный код и значения в регистрах. Ещё она позволяет ставить "хуки" и дампить информацию после этого в файл Hook.txt(кусочек чуть ниже). Хуки, как я понял, позволяют перехватывать события, вызываемые каким-либо устройством... На фрагменте снизу, судя по всему была перехвачена информация, связанная с видеопамятью и VDC. Question
Код:
[000929] VRAM W08: $e929 = 00 [8c40]
[000929] VRAM W08: $e929 = 00 [8c41]
[000929] VRAM W08: $e929 = 00 [8c42]
[000929] VRAM W08: $e929 = 00 [8c43]
[000929] VRAM W08: $e929 = 00 [8c44]
[000929] VRAM W08: $e929 = 00 [8c45]
[000929] VRAM W08: $e929 = 00 [8c46]

Ещё возник вопрос по таймерах...
Цитата:
The timer frequency is 6.992KHz.
$0C00 R/W - bit 7 : (unused)
bit 0-6 : 7-bit down counter
An interrupt is raised when the counter generates
a carry, in other words, when the counter is to be
decremented and its value is zero.
$0C01 /W - bit 7-1: (unused)
bit 0 : start/stop bit (0 = off, 1 = on)

Частота таймера составляет 6.992KHz.
$0C00 R/W - 7 бит : (не используются)
биты с 0 по 6 : 7-битный счетчик??
Прерывание возникает, когда счетчик декриминируется (уменьшается вниз на 1 единицу) и его значение становится равным нулю.
$0C01 /W - биты 7-1: (не используются)
bit 0 : старт/стоп бит (0 = выкл., 1 = вкл.)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Shiru



Зарегистрирован: 25.10.2006
Сообщения: 295
Откуда: Russia, Moscow

СообщениеДобавлено: Чт Авг 14, 2008 2:22 pm    Заголовок сообщения: Ответить с цитатой

Mefistotel писал(а):
Ещё возник вопрос по таймерах...

И в чём вопрос?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Mefistotel
RRC2008
RRC2008


Зарегистрирован: 08.03.2008
Сообщения: 294
Откуда: МАГАДАН

СообщениеДобавлено: Чт Авг 14, 2008 2:48 pm    Заголовок сообщения: Ответить с цитатой

Вопрос в том, правильно ли я всё понимаю, или несу чушь. Question Суть использования таймера..?
[000929] VRAM W08: $e929 = 00 [8c40]
Как можно, а главное нужно использовать информацию, полученную после применения хука?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Shiru



Зарегистрирован: 25.10.2006
Сообщения: 295
Откуда: Russia, Moscow

СообщениеДобавлено: Чт Авг 14, 2008 6:06 pm    Заголовок сообщения: Ответить с цитатой

Mefistotel писал(а):
Суть использования таймера..?

Всё написано в твоей цитате и переводе - таймер генерирует прерывания с заданной частотой (входная частота делится на 7-битное значение).

Mefistotel писал(а):
Как можно, а главное нужно использовать информацию, полученную после применения хука?

Трассировка, точки останова, хуки - это всё средства для выяснения, когда и какая часть кода обращается к определённому участку памяти. Дальше в любом случае требуется разбор кода.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Mefistotel
RRC2008
RRC2008


Зарегистрирован: 08.03.2008
Сообщения: 294
Откуда: МАГАДАН

СообщениеДобавлено: Сб Авг 23, 2008 3:54 pm    Заголовок сообщения: Ответить с цитатой

Времени совсем мало...поэтому конкретно заняться изучением не получается.
Shiru у меня есть пару вопросов.
Цитата:
А именно, в регистр видеоконтроллера для передачи старшего байта параметра

Как ты узнал ,что пишет именно в порт видеоконтроллера??
Цитата:
E8A4: LDA $2A5C,X @ $2A5E = $71

Загружаем в аккумулятор из основной памяти по адресу 2A5C значение X, а именно h71. Как можно найти это значение, хексредактором допустим...
Не могу найти инфу по некоторым мнемоникам:
Код:
        | BBRi | --0----- | Branch if Bit Reset         |
        | BBSi | --0----- | Branch if Bit Set           |
        | BCC  | --0----- | Branch if Carry Clear       |

Условные переходы... В соответствии с ранее установленным флагом, могут произойти события...Но какие?
Код:
        | ST0  | --0----- | Store into HuC6270 port 0   |
        | ST1  | --0----- | Store into HuC6270 port 2   |
        | ST2  | --0----- | Store into HuC6270 port 3   |

Что-то связано с видеопроцессором...
Код:
        | TDD  | --0----- | Transfer block              |
        | TIA  | --0----- | Transfer block              |
        | TII  | --0----- | Transfer block              |
        | TIN  | --0----- | Transfer block              |
        | TMAi | --0----- | Transfer MPRi to A          |
        | TRB  | XX0---X- | Test and Reset Bit          |
        | TSB  | XX0---X- | Test and Set Bit            |
        | TST  | XX0---X- | Test memory                 |

Может подскажешь доку, в которой есть подробное описание этих мнемоник...
После общения с трейсером, сдампил видеопамять(64 kb). Бинарный файл с распакованной графикой... Shiru, возможно ли просто вставить её обратно в ром, конечно, перерисовав??
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Shiru



Зарегистрирован: 25.10.2006
Сообщения: 295
Откуда: Russia, Moscow

СообщениеДобавлено: Сб Авг 23, 2008 7:44 pm    Заголовок сообщения: Ответить с цитатой

Mefistotel писал(а):
Как ты узнал ,что пишет именно в порт видеоконтроллера??

Из карты адресов страницы FF. В документации на видеконтроллер адреса его портов в странице FF указаны в разделе 'Accessing the VDC from the CPU'.

Mefistotel писал(а):
Цитата:
E8A4: LDA $2A5C,X @ $2A5E = $71

Загружаем в аккумулятор из основной памяти по адресу 2A5C значение X, а именно h71.

Нет - в команде LDA $nnnn,X адрес, откуда будет прочитано значение в регистр A, является суммой указанного значения (2A5Ch) и значения в регистре X - в твоём случае (исходя из содержимого регистра X в момент выполнения команды) получится адрес, указанный в подсказке после @.

Mefistotel писал(а):
Как можно найти это значение, хексредактором допустим..

Выясняешь, к какому 'окну' относится адрес. Если старший разряд hex-адреса 0 или 1, то нулевое окно; если 2 или 3 - то первое; и т.д.

Смотришь значение в соответствующем регистре MPR - какая страница общего адресного пространства включена в это окно в момент обращения к адресу.

Считаешь смещение в странице - оно всегда в пределах 0000h..1FFFh, т.е. если старший разряд адреса 0 или 1, он остаётся 0 или 1; если 2 или 3 - то становится 0 или 1; если 4 или 5 - тоже становится 0 или 1; и т.д.

Смотришь нужную страницу по полученному смещению. Если это страница ПЗУ (картриджа), то умножаешь номер страницы на 2000h и добавляешь смещение в странице - получаешь смещение от начала файла (не учитывая заголовок - сколько он там, вроде 512 байт?).

Выяснение номера 'окна' и смещения в странице не требует применения калькулятора - после того, как поймёшь идею, это делается в уме (просто замена старшего разряда hex-адреса).

Mefistotel писал(а):
Не могу найти инфу по некоторым мнемоникам:
Код:
        | BBRi | --0----- | Branch if Bit Reset         |
        | BBSi | --0----- | Branch if Bit Set           |
        | BCC  | --0----- | Branch if Carry Clear       |

Условные переходы... В соответствии с ранее установленным флагом, могут произойти события...Но какие?

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

BCC - обычная команда 6502, переход выполняется при сброшенном флаге переноса (Carry). BBRi и BBSi - дополнительные команды, присутствующие в HuC6280. Они выполняют переход, если указанный бит по указанному адресу в Zero Page (первые 256 байт адресного пространства процессора, адрес в пределах 0000..00FFh) сброшен или установлен (по восемь вариантов каждой команды для каждого бита - BBR0..BBR7 и BBS0..BBS7).

Остальные команды, которые ты перечислил - из дополнительных, в основном предназначены для общения с железом приставки. В частности, ST0..ST2 позволяют обращаться к портам видеоконтроллера напрямую, не через адресное пространство (т.е. при их использовании не нужно включать страницу FF в адресное пространство).

Полное описание команд 6280, включая обычные 6502 и дополнительные - здесь.

Mefistotel писал(а):
После общения с трейсером, сдампил видеопамять(64 kb). Бинарный файл с распакованной графикой... Shiru, возможно ли просто вставить её обратно в ром, конечно, перерисовав??

Просто - невозможно. Видеопамять - это ОЗУ, данные в нём создаются программой. А программа может брать один фрагмент из одного места ROM'а, другой из другого, третий распаковывать, четвёртый вообще генерировать, и т.д. В дампе видеопамяти нет информации, откуда взялись эти данные и в каком виде они были изначально. Это, собственно, и требуется выяснить с помощью дебаггера и трейсера.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Mefistotel
RRC2008
RRC2008


Зарегистрирован: 08.03.2008
Сообщения: 294
Откуда: МАГАДАН

СообщениеДобавлено: Ср Окт 01, 2008 11:16 pm    Заголовок сообщения: Ответить с цитатой

Возникает ощущение, что данный код не имеет отношения к надписям в меню. А может и имеет.Question
В доках явно написано,
что индекс тайла необходимо умножить на 32, дабы узнать его расположение в Vram.
Более того, это находит своё подтверждение в доке про трейсер:
Our aim is to find the dialogue font via data traversal.
De-interleave your image first.
$DA60 VRAM appears to be our font tiles.
Nametable says:
6D3 6D3 6D4 6D4 6D5 6D5
6D3 6D3 6D4 6D4 6D5 6D5
How? Examine the palette colors: C,D,E,F.
So we've got 4 interleaved 1-bpp tiles inside one PC Engine tile.
Адрес первого символа шрифта диалогов в Vram равен 6D3. Умножаем это значение на 32 и получаем DA60.
Но этот адрес указывает на расположение тайла в тайловом редакторе... Простое совпадение или что?
Далее идёт что-то об палитрах под индексами C, D, E, F и об 4 1 bpp тайлах на один тайл Pc engine....
Почему адрес тогда указывается таким образом в отладчике справа от индекса тайла?
Как ты и говорил, это значение умноженное на 10.
По первой процедуре я менял адреса памяти, из которых загружались значения,
увеличивал/уменьшал значения регистров, но с надписями ничего не происходило. Изменялась заставка и фон, спрайты персонажей.
Почему у процессоров так много регистров, что у 16 битного видео процессора 20 регистров, что у 8 битного центрального 19 штук??? Smile
Зато у цветового процессора всего 5...
Код:
Детальный разбор процедуры:
E8A0: STA $0002; 8D 02 00
E8A3: INX; E8
E8A4: LDA $2A5C,X @ $2A5D = $00;  BD 5C 2A
E8A7: STA $0003; 8D 03 00
E8AA: INX; E8
E8AB: CPX #$20; E020
Если x<=h20(32), то переход.
E8AD: BCC $E89D; 90 EE "
E89D: LDA $2A5C,X @ $2A5E= $71; BD 5C 2A

Сначала из аккумулятора загружается значение в регистр
видеоконтроллера для передачи младшего байта параметра.
Затем регистр X увеливается на 1. В аккумулятор загружается первое значение 0 из ОЗУ.
Затем из аккумулятора загружается значение в регистр
видеоконтроллера для передачи старшего байта параметра.
Регистр X нужно увеличить на единицу.
Устанавливается флаг в зависимости от результата вычитания операнды из содержимого X.
Если X меньше 20(32), то происходит условный переход по адресу E89D, так как 1<h20(32),
то флаг включен и происходит переход в начало процедуры.
Далее в аккумулятор загружается значение(71) из адреса 2A5E основного ОЗУ обычной PCE
(является суммой указанного значения (2A5Ch) и значения в регистре X(02).
Значения считываются последовательно по мере увеличения регистра X.
Это значит, что адрес ОЗУ, с которого записываются значения в аккумулятор увеличивался по
единичке каждый раз после записи.
Но выгрузку значений из аккумулятора я не нашел...
Код:
Когда регистр X достигнет значения h20(32), произойдёт его сброс и процедура перейдёт на адрес:
E8AF: DEC $2A5B @ @2A5B = $B6; CE 5B 2A
E8B2: BNE $E84F, D0 9B
Если флаг Z=1, то переход на E84F.
E84F: LDA $2A5A @ $2A5A = $19; Ad 5A 2A
E852: AND #$30; 29 30
E854: BEQ $E866 ;F0 10
"""""""""""""""""""""
На всякий случай привёл различные переходы, которые приводят к началу процедуры.
E866: LDA $2A5A @ $2A5A = $19; AD 5A 2A
E869: AND: #$08; 29 08
E86B: BEQ $E883; F0 16
 
E883: LDA $2A5A @ $2A5A = $19; AD 5A 2A
E886: AND: #$01; 29 01
E888: BEQ $E89C; F0 12

E89C: CLX        ; 82
E89D: LDA $2A5C, X @ $2A7C = $03
E8A0: STA $0002; 8D 02 00
""""""""""""""""""""""""
E856: STA $10; 80 10
E858: CLX; 82
E859: PHX; DA
E85A: JSR $FE70; 20 70 FE


По адресу E8AF происходит уменьшение значение операнда на 1.
Условный переход по адресу E84F, если Z флаг = 1, то есть операция приводит к нулю.
Загружается значение h19 в аккумулятор с адреса 2A5A. Если значение в аккумуляторе = 30, то условный переход ,если флаг Z=0,
то есть результат операции не равен нулю - происходит переход на адрес E866.
Записывается 10 значений из аккумулятора???
После этого значение регистра X сбрасывается и помещается в стек.
При всех операциях по загрузке значений в аккумулятор, в MPR1 стояла страница F8, то есть ОЗУ приставки.
Память составляет 8 килобайт (h2000). Поэтому у меня вопрос, каким образом брались значение с адресов >2000(2A**)???
И каким образом возможно найти эти физические адреса в роме.
Страницу под номером F8 не умножишь на h2000в противном случае получится значение, превышающее размер рома Neutopia...
С картриджем я понял, что и как считать. Также понял идею выяснение номера 'окна' и смещения в странице. Smile
Заголовок, действительно, размером 512 байт(h200). Но всё ещё остаётся ощущение, что я упустил что-то.
В общем, Shiru, жду совета...
P.S. Я так понял, этот отладчик позволяет трассировать код только в прямом направлении.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Shiru



Зарегистрирован: 25.10.2006
Сообщения: 295
Откуда: Russia, Moscow

СообщениеДобавлено: Чт Окт 02, 2008 5:14 pm    Заголовок сообщения: Ответить с цитатой

Mefistofel писал(а):
Более того, это находит своё подтверждение в доке про трейсер:
...
De-interleave your image first.

Непонятно, что имеется в виду под de-interleave image. Понятно, что нужно перетасовать данные, но зачем, как, и в каком состоянии они изначально - непонятно.

Mefistofel писал(а):
Почему у процессоров так много регистров, что у 16 битного видео процессора 20 регистров, что у 8 битного центрального 19 штук???
Зато у цветового процессора всего 5...

Регистров столько, сколько надо. Это ещё не много - скажем, у синтезатора звука в SMD (YM2612) более 200 регистров.

Mefistofel писал(а):
Если X меньше 20(32), то происходит условный переход по адресу E89D, так как 1<h20(32),
то флаг включен и происходит переход в начало процедуры.

Тогда почему ты разбираешь процедуру с адреса E8A0, если видишь, что цикл начинается по адресу E89D? А до цикла ещё может быть инициализация этого цикла.

Mefistofel писал(а):
Но выгрузку значений из аккумулятора я не нашел...

А команды STA в разобранном тобой фрагменте цикла - это что?

Mefistofel писал(а):
При всех операциях по загрузке значений в аккумулятор, в MPR1 стояла страница F8, то есть ОЗУ приставки. Память составляет 8 килобайт (h2000). Поэтому у меня вопрос, каким образом брались значение с адресов >2000(2A**)???

Если разрядность шины адреса отдельного устройства, в нашем случае ОЗУ (13 разрядов), меньше, чем разрядность шины адреса процессора (16 разрядов), лишние разряды будут игнорироваться. Например, к процессору подключено ОЗУ объёмом 8 КБ, а мы пишем по адресу h2345. Для наглядности смотрим, как выглядят адреса в двоичном виде:

Код:
h2345 в двоичном виде: 0010001101000101
адресные линии ОЗУ:    xxx1111111111111 (x нет линии, 1 есть линия)


Биты линий, помеченные 'x', будут проигнорированы, т.к. ОЗУ объёмом 8 КБ не имеет этих линий. Получится адрес 0000001101000101, т.е. h0345. Я говорил об этом выше - старший разряд hex-адреса 0=0, 1=1, 2=0, 3=1, 4=0, 5=1 и т.д.

Mefistofel писал(а):
И каким образом возможно найти эти физические адреса в роме.

Адреса ОЗУ в ROM'е никак не найти, на то он и ROM - ПЗУ. ОЗУ находится в приставке, все данные в него заносятся программой в процессе её работы.

Mefistofel писал(а):
P.S. Я так понял, этот отладчик позволяет трассировать код только в прямом направлении.

Трассировка - это пошаговое выполнение программы. А программа, разумеется, может выполняться только в одном направлении.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
ALLiGaToR
Гость





СообщениеДобавлено: Чт Окт 02, 2008 5:51 pm    Заголовок сообщения: Ответить с цитатой

Ой, как все сложно то.. Блин, и надо бы мне разобраться с одной стороны, а с другой стороны - долгое это дело, ведь я и половины не знаю о чем вообще говорите :)

Mefistotel, я так понимаю, обычный текст ты нашел?
Вернуться к началу
Марат



Зарегистрирован: 08.01.2008
Сообщения: 211
Откуда: Казахстан, Астана

СообщениеДобавлено: Чт Окт 02, 2008 6:11 pm    Заголовок сообщения: Ответить с цитатой

Вот процедура распаковки данных
Код:

E84F: LDA $2A5A  @ $2A5A = $19      ;AD 5A 2A
E852: AND #$30                      ;29 30
E854: BEQ $E866 перейти, если флаг Z=1
E856: STA $10                       ;85 10
E858: CLX                           ;82
E859: PHX                           ;DA
E85A: JSR $FE70 прыжок на подпрограмму FE70   
E85D: PLX                           ;FA
E85E: STA $2A5C,X  @ $2A5C          ;9D 5C 2A
E861: INX                           ;E8
E862: DEC $10    @ $2010 = $10      ;C6 10
E864: BNE $E859  перейти,если флаг Z=0   
E866: LDA $2A5A  @ $2A5A = $19      ;AD 5A 2A
E869: AND #$08                      ;29 08
E86B: BEQ $E883 перейти,если флаг Z=1 
E86D: STA $10                       ;85 10
E86F: LDA $2A5A  @ $2A5A = $19      ;AD 5A 2A
E872: AND #$30                      ;29 30
E874: TAX                           ;AA
E875: PHX                           ;DA
E876: JSR $FE70  прыжок на подпрограмму FE70
E879: PLX                           ;FA
E87A: STA $2A5C,X  @ $2A6C          ;9D 5C 2A
E87D: INX                           ;E8
E87E: INX                           ;E8
E87F: DEC $10    @ $2010 = $08      ;C6 10
E881: BNE $E875 перейти,если флаг Z=0       
E883: LDA $2A5A  @ $2A5A = $19      ;AD 5A 2A
E886: AND #$01                      ;29 01
E888: BEQ $E89C  перейти,если флаг Z=1
E88A: LDX #$0E                      ;A2 0E
E88C: LDA $2A5C,X  @ $2A6A = $00    ;BD 5C 2A
E88F: ORA $2A5D,X  @ $2A6B = $00    ;1D 5D 2A
E892: ORA $2A6C,X  @ $2A7A = $00    ;1D 6C 2A
E895: STA $2A6D,X  @ $2A7B          ;9D 6D 2A
E898: DEX                           ;CA
E899: DEX                           ;CA
E89A: BPL $E88C перейти, если Флаг N=0                   
E89C: CLX                           ;82
E89D: LDA $2A5C,X  @ $2A5C = $00    ;BD 5C 2A
E8A0: STA $0002                     ;8D 02 00
E8A3: INX                           ;E8
E8A4: LDA $2A5C,X  @ $2A5D = $00    ;BD 5C 2A
E8A7: STA $0003                     ;8D 03 00
E8AA: INX                           ;E8
E8AB: CPX #$20                      ;E0 20
E8AD: BCC $E89D перейти, если флаг c=0 
E8AF: DEC $2A5B  @ $2A5B = $EC      ;CE 5B 2A
E8B2: BNE $E84F перейти,если флаг z=0
E8B4: RTS ВЫХОД ИЗ ПРЦЕДУРЫ

FE5F: LDA #$EF
FE61: STA $7C
FE63: LDA ($79)
FE65: STA $7F                       ;85 7F   A=80;
FE67: LDA #$08                      ;A9 08   A=08;
FE69: STA $80                       ;85 80   A=08;
FE6B: LDA #$01                      ;A9 01   A=01
FE6D: STA $7B                       ;85 7B   A=01;
FE6F: RTS                           ;60

ПОДПРОГРАММА “FE70”
FE70: LDA $7D    @ $207D = $00      ;A5 7D
FE72: BNE $FE99 перейти, если флаг Z=0
FE74: LDX #$01                      ;A2 01
FE76: JSR $FEA4  ПРЫЖОК НА ПОДПРОГРАММУ FEA4
FE79: TAY                           ;A8
FE7A: BEQ $FE89 перейти, если флаг Z=1     
FE7C: LDX #$08                      ;A2 08
FE7E: JSR $FEA4   ПРЫЖОК НА ПОДПРОГРАММУ FEA4
FE81: LDY $7C    @ $207C = $F5      ;A4 7C
FE83: STA $2E8E,Y  @ $2F83          ;99 8E 2E
FE86: INC $7C    @ $207C = $F5      ;E6 7C
FE88: RTS                           ;60
FE89: LDX #$08                      ;A2 08
FE8B: JSR $FEA4    ПРЫЖОК НА ПОДПРОГРАММУ FEA4
FE8E: STA $7E                       ;85 7E
FE90: LDX #$04                      ;A2 04
FE92: JSR $FEA4    ПРЫЖОК НА ПОДПРОГРАММУ FEA4
FE95: INC                           ;1A
FE96: INC                           ;1A
FE97: STA $7D                       ;85 7D
FE99: LDY $7E    @ $207E = $F6      ;A4 7E
FE9B: LDA $2E8E,Y  @ $2F84 = $00    ;B9 8E 2E
FE9E: INC $7E    @ $207E = $F6      ;E6 7E
FEA0: DEC $7D    @ $207D = $06      ;C6 7D
FEA2: BRA $FE81                     ;80 DD

ПОДПРОГРАММА “FEA4”
FEA4: CLA                           ;62
FEA5: ASL $7F    @ $207F = $98      ;06 7F
FEA7: ROL                           ;2A
FEA8: DEC $80    @ $2080 = $05      ;C6 80
FEAA: BEQ $FEB0  перейти, если флаг Z=1   
FEAC: DEX                           ;CA
FEAD: BNE $FEA5    перейти, если флаг Z=0   
FEAF: RTS goto FE79             
FEB0: PHA                           ;48
FEB1: LDY $7B    @ $207B = $05      ;A4 7B
FEB3: LDA ($79),Y  @ $5DBF = $C9 ЗАГРУЗКА В АККУМ. БАЙТА ИЗ РОМА
FEB5: STA $7F                       ;85 7F
FEB7: INY                           ;C8
FEB8: BEQ $FEC3  перейти, если флаг Z=1   
FEBA: STY $7B                       ;84 7B
FEBC: LDA #$08                      ;A9 08
FEBE: STA $80                       ;85 80
FEC0: PLA                           ;68
FEC1: BRA $FEAC                     ;80 E9
FEC3: INC $7A     @ $207A
FEC5: BRA $FEBA
FEC7: BRK



Как ни пытался так и не разобрался в ней. Данные в РОМе начинаются с адреса 27DBB или 27DBA. Распакованные данные временно сохраняются в ОЗУ(наверное) начиная с адресса 2А5С по 2А7С, как раз под один тайл, а уже оттуда считываются в Виде ОЗУ. И ещё как я понял после того как распакован 1 тайл в ОЗУ и после того как он будет считан в видео ОЗУ, начинается распаковка следующего тайла в то же место куда был распакован предыдущий тайл, причём некоторые байты не затираются, а пропускаются. К примеру в озу есть такая запись: 2A 3B 74 58 16 8C 9B..., при распаковке следующего тайла, некоторые байты заменяются новыми, а некоторые остаются получается, например, 35 3B 12 58 4A 8C 10..., т.е. байты 3B,58 и 8С остались на не затёртыми и образуют вместе с другими байтами уже другой тайл, получается взаимосвязь 1 и 2, 2 и 3 и т.д. тайлов. Поэтому, если изменить байты какого-нибудь тайла, последующие тайлы уже не распаковываются должным образом.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Shiru



Зарегистрирован: 25.10.2006
Сообщения: 295
Откуда: Russia, Moscow

СообщениеДобавлено: Чт Окт 02, 2008 6:50 pm    Заголовок сообщения: Ответить с цитатой

Марат писал(а):
причём некоторые байты не затираются, а пропускаются

В принципе, звучит как алгоритм, походящий для сжатия шрифта. Так как символы обычно сильно похожи, сохранение отличий каждого тайла от предыдущего должно быть вполне эффективно (лучше RLE, проще LZ).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Марат



Зарегистрирован: 08.01.2008
Сообщения: 211
Откуда: Казахстан, Астана

СообщениеДобавлено: Чт Окт 02, 2008 7:12 pm    Заголовок сообщения: Ответить с цитатой

Shiru писал(а):

В принципе, звучит как алгоритм, походящий для сжатия шрифта.

Ну им, как раз, и запакованы надписи CRYSTAL, KEY COMPAS и т.д. в Neutopia
Цитата:
проще LZ).
Я пока кроме RLE ни с чем ни сталкивался, поэтому мне пока сложно его понять.[/quote]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Mefistotel
RRC2008
RRC2008


Зарегистрирован: 08.03.2008
Сообщения: 294
Откуда: МАГАДАН

СообщениеДобавлено: Пт Окт 03, 2008 1:29 am    Заголовок сообщения: Ответить с цитатой

Цитата:
Ой, как все сложно то.. Блин, и надо бы мне разобраться с одной стороны, а с другой стороны - долгое это дело, ведь я и половины не знаю о чем вообще говорите Smile
Mefistotel, я так понимаю, обычный текст ты нашел?

Laughing А ты что думал?
Текст я не только нашел, но он уже практически переведён. Перевожу не я. Проблема с пойнтерами.Они очень интересные. Но об этом потом.
А сейчас мне надо таки разобраться в этом алгоритме.
Цитата:
тогда почему ты разбираешь процедуру с адреса E8A0, если видишь, что цикл начинается по адресу E89D? А до цикла ещё может быть инициализация этого цикла.

На всякий случай взял кусочке процедуры до E89D.
Вижу и Марат занимался на досуге. Wink
Думаю, стоит поэксперементировать с кодом... поменять значение и прочее. Чтобы больше понять эту процедуру. Ведь, я так понимаю, разобравшись в этом алгоритме необходимо будет написать такой же, но на языке высокого уровня.
И ведь действительно, распаковывается тайл, затем следующий, в котором не только остается часть прошлого, но и добавляется что-то новое(при этом затирая некоторую часть)... и получается новый тайл.
Очень интересно. Я так понимаю таких фрагментов общей картинки этих надписей какое-то определенное количество.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Shiru



Зарегистрирован: 25.10.2006
Сообщения: 295
Откуда: Russia, Moscow

СообщениеДобавлено: Пт Окт 03, 2008 11:55 am    Заголовок сообщения: Ответить с цитатой

Mefistotel писал(а):
Ведь, я так понимаю, разобравшись в этом алгоритме необходимо будет написать такой же, но на языке высокого уровня.

Необязательно - ведь процедура распаковки и так уже есть (в игре), соответственно и распакованные данные тоже есть. А тебе нужно заменить упакованные данные своими - проделать обратный процесс, сжать свои данные таким-же способом. В процедуре распаковки нужно разобраться, чтобы понять, как данные хранятся, каким образом они упакованы. Потом нужно будет написать собственный упаковщик, который будет паковать твои изменённые данные в такой-же формат. Если данных мало, можно и вручную их закодировать, конечно, но тогда при малейшем изменении исходных данных придётся повторять процесс.

С упаковщиком могут быть проблемы: новые данные после упаковки могут иметь больший размер, чем старые, и не помещаться в имеющееся место. Есть вариант, позволяющий решить эту проблему и не требующий выяснения алгоритма сжатия - можно найти свободное место в ROM'е под несжатые данные (расширить ROM, если свободного места нет) и заменить процедуру распаковки данных своей, выполняющей простое копирование несжатых данных.

Mefistotel писал(а):
Я так понимаю таких фрагментов общей картинки этих надписей какое-то определенное количество.

Определённое для пары отдельно взятых тайлов, но для разных пар - разное.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Mefistotel
RRC2008
RRC2008


Зарегистрирован: 08.03.2008
Сообщения: 294
Откуда: МАГАДАН

СообщениеДобавлено: Пт Окт 03, 2008 12:49 pm    Заголовок сообщения: Ответить с цитатой

Цитата:
С упаковщиком могут быть проблемы: новые данные после упаковки могут иметь больший размер, чем старые, и не помещаться в имеющееся место. Есть вариант, позволяющий решить эту проблему и не требующий выяснения алгоритма сжатия - можно найти свободное место в ROM'е под несжатые данные (расширить ROM, если свободного места нет) и заменить процедуру распаковки данных своей, выполняющей простое копирование несжатых данных.

А вот это уже интересно... Но насколько я знаю, расширить ром - это довольно трудоёмкое занятие...
И ещё.... В общем, общались мы с Маратом по QIP. Меня заинтересовала процедура -
Код:
FEB3: LDA ($79),Y  @ $5DBF = $C9 ЗАГРУЗКА В АККУМ. БАЙТА ИЗ РОМА

Так вот, делаем расчет: 5DBF - 13*2000+1DBF=27DBF. Вот... По этому адресу в роме должен находиться байт С9. В роме Марата, он есть.... а у меня в моём роме по этому адресу его нет... В итоге выяснилось, что он что-то проделал с ромом, и как мне показалось, убрал заголовок из рома. Ну потом мы разобрались. Он конвертировал ром эмулятором Ootake. И у него, адреса в дебаггере совпадают с адресами в роме.
А я к этому адресу, просто добавил заголовок(h200)... И в итоге - адрес 27FBF... И вот на этом адресе находится искомый байт. Это в моём роме, который уже имеет заголовок 512 байт...
Вот такие дела... Я пока толком не понимаю, что действительно проделывает с ромом Ootake. Кроме как уменьшает размер за счет заголовка...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов shedevr.org.ru -> Экстремальный ромхакинг Часовой пояс: GMT + 3
На страницу Пред.  1, 2, 3  След.
Страница 2 из 3

 
Перейти:  
Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group