![Список форумов shedevr.org.ru](templates/subSilver/images/logo_phpBB.gif) |
shedevr.org.ru Группа перевода приставочных игр "ШЕДЕВР"
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Guyver RRC2008
![RRC2008 RRC2008](images/medals/guyversmedals.gif)
![](images/avatars/84174882844d4307187617.jpg)
Зарегистрирован: 12.05.2005 Сообщения: 302 Откуда: СИНЕГОРЬЕ
|
Добавлено: Чт Фев 05, 2009 8:48 am Заголовок сообщения: |
|
|
Странно... Я в своё время перевёл примерно 60% этой игры - подобных проблем не возникало... Не было в роме проверки контрольной суммы...
Но так как перевод на денди уже выпустили - я так и не доделал перевод... _________________ Я не волшебник - я только учусь...
Мой сайт: GUYVERperevod |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
bitchboy
![](images/avatars/2005478301498f121ce6bf6.jpg)
Зарегистрирован: 24.01.2009 Сообщения: 11
|
Добавлено: Чт Фев 05, 2009 9:15 pm Заголовок сообщения: |
|
|
а как и где можно узнать, что уже переведено на русский а что нет...
и поосоветуйте плиз прогу для извлечения запакованой графики для сегиМД и СНЕСа.. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Марат
![](images/avatars/7350069547997a7396e76.jpg)
Зарегистрирован: 08.01.2008 Сообщения: 211 Откуда: Казахстан, Астана
|
Добавлено: Чт Фев 05, 2009 10:28 pm Заголовок сообщения: |
|
|
bitchboy писал(а): |
и поосоветуйте плиз прогу для извлечения запакованой графики для сегиМД и СНЕСа.. |
Нет такой программы. Для каждой игры нужно писать отдельную программу, для извлечения и обратной вставки графики. Бывают, конечно, ислючения, если это игры одной серии или одного разработчика, да и то не всегда. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mefistotel RRC2008
![RRC2008 RRC2008](images/medals/silver.gif)
![](images/avatars/11468916147e9ac9187a17.jpg)
Зарегистрирован: 08.03.2008 Сообщения: 294 Откуда: МАГАДАН
|
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Shinigami Неграмотный
![](images/avatars/107783629648ea750c01876.jpg)
Зарегистрирован: 25.09.2008 Сообщения: 87 Откуда: Екатеринбург
|
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
IfoR
Зарегистрирован: 16.05.2006 Сообщения: 334
|
Добавлено: Пт Мар 27, 2009 12:17 am Заголовок сообщения: |
|
|
Люди! Я вот на каникулах решил разобрать архитектуру и вот у меня накопилась кучка вопросов с которыми я толком неразобрался.
Где собственно хранится этот самый системный стек (и пользовательский и супервизорский)? Из программ мануала я это так и не понял, в другой документации говорится, что по адрессам FF00-FFFF ОЗУ, в эмуляторе разных играх A7 указывает на разные участки ОЗУ. Месторасположение выберается произвольно чтоль?
Регистры A7 и A7' - это отдельные регистры (независимые)?
Как праильно обозначается адресс начала ОЗУ(например) в 32 битном виде 00FF0000 или FFFF0000?
Что за параметр Cycles в дебагере Gens-а?
Вот. )
P.S. M68000
Последний раз редактировалось: IfoR (Сб Мар 28, 2009 6:57 pm), всего редактировалось 1 раз |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
silenthill
Зарегистрирован: 26.03.2009 Сообщения: 1
|
Добавлено: Пт Мар 27, 2009 11:24 am Заголовок сообщения: |
|
|
Народ я вот хочу заняться переводом игры GTA CW на Нинтендо DS . Но вот с чего начать незнаю. Помогите разобраться как и чем вытащить\найти там тексты и т.п.
Есть образ игры для эмуля...
Очень прошу помочь. Для меня лично считаю это того стоит. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Густь Гость
|
Добавлено: Пт Мар 27, 2009 6:32 pm Заголовок сообщения: |
|
|
Я думаю, тебе будет достаточно знать, что самостоятельно ты её не переведёшь. А дальнейшее и так понятно. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
IfoR
Зарегистрирован: 16.05.2006 Сообщения: 334
|
Добавлено: Пт Мар 27, 2009 9:54 pm Заголовок сообщения: |
|
|
Ах, ну да... Со стеком тупанул. Там же на 0 векторе адресс стоит. Вобщем, так понимаю его можно распологать в любом месте ОЗУ.
На счёт правильности указания я так понял, что правильно 00FF0000. Однако, в некоторых играх адрес ставится именно FFFF0000. Так понял, что впринципе это одно и тоже... |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
lupus
Зарегистрирован: 09.08.2006 Сообщения: 485 Откуда: Украина, Крым
|
Добавлено: Пт Мар 27, 2009 10:42 pm Заголовок сообщения: |
|
|
silenthill писал(а): | Народ я вот хочу заняться переводом игры GTA CW на Нинтендо DS . Но вот с чего начать незнаю. Помогите разобраться как и чем вытащить\найти там тексты и т.п.
Есть образ игры для эмуля...
Очень прошу помочь. Для меня лично считаю это того стоит. |
начни с чего-то попроще. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Марат
![](images/avatars/7350069547997a7396e76.jpg)
Зарегистрирован: 08.01.2008 Сообщения: 211 Откуда: Казахстан, Астана
|
Добавлено: Сб Мар 28, 2009 12:12 am Заголовок сообщения: |
|
|
IfOrAnD писал(а): |
На счёт правильности указания я так понял, что правильно 00FF0000. Однако, в некоторых играх адрес ставится именно FFFF0000. Так понял, что впринципе это одно и тоже... |
Одно и то же, просто, по-моему, при установке адреса озу в команде содержатся только 4 младших байта адреса, а старшие автоматически устанавливаются FFFF. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Гость
|
Добавлено: Сб Мар 28, 2009 12:53 am Заголовок сообщения: |
|
|
2 IfOrAnD:
Если я правильно понял, речь о процессоре M68K, Sega Genesis..
Там старший байт в адресах игнорируется (т.к. адресное пространство 24-битное: 000000..FFFFFF).. Адрес задается младшими 3 байтами..
Поэтому, для Сеги 00FF0000 и FFFF0000 - это один и тот же адрес (FF0000).. Для адресов FF8000..FFFFFF полезно устанавливать старший байт = FF, для адресов 000000..007FFF полезно устанавливать старший байт = 00 (это позволяет в машинном коде хранить адреса в "короткой" 16-битной форме).. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
IfoR
Зарегистрирован: 16.05.2006 Сообщения: 334
|
Добавлено: Сб Мар 28, 2009 6:49 pm Заголовок сообщения: |
|
|
Ясно, спасибо. Так понял, что для указания памяти\портов 4 байт вобщем-то не важен.
Осталось разобраться с Пользовательским, Супервизовским, Прерываний стеками и регистрами-указателями А7, А7', А7", а собственно как это всё организовывается, а тоесть как распологаются в памяти эти стеки и разные ли эти регистры. И что это за Cycles. ![Smile](images/smiles/icon_smile.gif) |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
GrayLightTaliz
![](images/avatars/115557092043f650cda70b6.gif)
Зарегистрирован: 13.10.2005 Сообщения: 204 Откуда: Краснодар/Королёв
|
Добавлено: Вс Мар 29, 2009 1:41 am Заголовок сообщения: |
|
|
2 IfOrAnD:
Внимание! В этом сообщении есть мои ошибочные мысли! Исправления см в последующих сообщениях!
Почитав доки, пришел к такому выводу (все нижесказанное относится только к процессору 68000, в других моделях может быть по другому.. возможно, ты изучаешь общую документацию по 680XX, и потому рассматриваешь возможности, не реализованные в 68000):
(сразу замечу, что не уверен на все сто, что все именно так.. если кто-то может поправить - пишите )
Все инструкции при использовании стека (например, JSR) используют A7 как указатель на вершину стека. Вместо A7 еще пишут SP. (A7 и SP - одно и то же)
При этом у процессора в наличии 2 стековых регистра: USP и SSP.
A7(или SP) представляет собой один из них (в зависимости от текущего режима User/Supervisor). Т.е. A7 действует как "ярлык" и ссылается либо на USP, либо на SSP.. Таким образом все инструкции автоматически используют либо USP, либо SSP
Текущий режим отражается состоянием 5-го бита в старшем байте регистра SR (0=user, 1=supervisor)
Заметив, что при сбросе эмулятор Gens устанавливает SR = $2700, я пришел к выводу, что все программы на Сеге запускаются в режиме Supervisor (это подтверждается также и тем, что в коде используются инструкции типа MOVE xxx, SR)..
Значит, сразу после запуска A7 ссылается на SSP..
Также при запуске в SSP записывается адрес, хранящийся в первых 4-х байтах рома..
После чего программа может переопределить адрес стека, записав нужное значение в A7
В итоге:
У процессора есть 2 отдельных стековых регистра:
1. USP (User Stack Pointer)
2. SSP (System Stack Pointer) (в общей документации его также обозначают ISP)..
Регистра A7, получается, вообще нет.. При работе с ним на самом деле используется один из стековых регистров, в зависимости от режима..
В режиме Supervisor: A7 = SP = SSP; USP можно менять, используя специальную инструкцию;
В режиме User: A7 = SP = USP; SSP недоступен.
Программа начинается в режиме Supervisor.
При прерываниях или исключительных ситуациях (TRAP, ILLEGAL и т.п.) программа автоматически переходит в режим supervisor, а после обработки возвращается в тот режим, который был до этого..
---
Организован системный стек так, что растет в сторону уменьшения адресов.. По идее, если используются оба стека, то они должны располагаться по разным адресам, иначе работа одного может нарушить данные в другом..
---
Cycles - это количество циклов процессора.. на выполнение каждой инструкции уходит некоторое кол-во циклов.. в дебаггере Gens эта величина показывает сколько циклов прошло от прошлого шага отладки до текущего.. например, если нажимать "T", то Cycles покажет сколько циклов ушло на выполнение последней инструкции..
Последний раз редактировалось: GrayLightTaliz (Пн Мар 30, 2009 1:08 am), всего редактировалось 1 раз |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
IfoR
Зарегистрирован: 16.05.2006 Сообщения: 334
|
Добавлено: Вс Мар 29, 2009 8:47 pm Заголовок сообщения: |
|
|
GrayLight писал(а): | При этом у процессора в наличии 2 стековых регистра: USP и SSP.
A7(или SP) представляет собой один из них (в зависимости от текущего режима User/Supervisor). Т.е. A7 действует как "ярлык" и ссылается либо на USP, либо на SSP.. Таким образом все инструкции автоматически используют либо USP, либо SSP
...
Значит, сразу после запуска A7 ссылается на SSP..
Также при запуске в SSP записывается адрес, хранящийся в первых 4-х байтах рома..
После чего программа может переопределить адрес стека, записав нужное значение в A7
В итоге:
У процессора есть 2 отдельных стековых регистра:
1. USP (User Stack Pointer)
2. SSP (System Stack Pointer) (в общей документации его также обозначают ISP)..
Регистра A7, получается, вообще нет.. При работе с ним на самом деле используется один из стековых регистров, в зависимости от режима..
|
Так, я немного не понял. А7 при изменении регистра сам меняется на где-то сохранёные значения указателей вершин стеков или нужны программые действия? Как я понял, сам меняется. (Наконец-то выговорил внятно свой вопрос )
GrayLight писал(а): | 2. SSP (System Stack Pointer) (в общей документации его также обозначают ISP).. |
ISP - это Указатель на вершину стека прерывания. Является 1 из 2 подразделов Системного стека в который входит ещё и SSP - Указатель на вершину стека Супервизора. Режим ISP или SSP определяет 12 бит (по разрядности) Статус регистра. (Когда 13 выберает Пользовательский стек или Системный стек) Итого получается 3 указателя стека. В кучке процессоров в которую входит и M68000 такая система, вроде как, реализована, а вроде как и нет. В программ мануале написано, что потдерживается, а в даташите нет про это и слова.... Это я собственно тоже не понял. :)
GrayLight писал(а): | Регистра A7, получается, вообще нет.. При работе с ним на самом деле используется один из стековых регистров, в зависимости от режима.. |
По моему формулероовка немного неверна.
USP, SSP - Это, вроде как, обозначения, куда A7 указывает. USP, SSP регистрами не являются. :)
GrayLight писал(а): | Организован системный стек так, что растет в сторону уменьшения адресов.. По идее, если используются оба стека, то они должны располагаться по разным адресам, иначе работа одного может нарушить данные в другом.. |
Ну, вроде как, стеки всегда растут снизу вверх. По этому указатели и называются вершинами. :)
GrayLight писал(а): | Cycles - это количество циклов процессора.. на выполнение каждой инструкции уходит некоторое кол-во циклов.. в дебаггере Gens эта величина показывает сколько циклов прошло от прошлого шага отладки до текущего.. например, если нажимать "T", то Cycles покажет сколько циклов ушло на выполнение последней инструкции.. |
То есть это просто количество тактов? Ясно. ![Smile](images/smiles/icon_smile.gif) |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Марат
![](images/avatars/7350069547997a7396e76.jpg)
Зарегистрирован: 08.01.2008 Сообщения: 211 Откуда: Казахстан, Астана
|
Добавлено: Пн Мар 30, 2009 12:12 am Заголовок сообщения: |
|
|
GrayLight писал(а): |
Регистра A7, получается, вообще нет.. При работе с ним на самом деле используется один из стековых регистров, в зависимости от режима..
|
Как это нет? Его не может не быть. Это же адресный регистр, он для того и нужен, чтобы указывать на какую-то область памяти. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
GrayLightTaliz
![](images/avatars/115557092043f650cda70b6.gif)
Зарегистрирован: 13.10.2005 Сообщения: 204 Откуда: Краснодар/Королёв
|
Добавлено: Пн Мар 30, 2009 12:55 am Заголовок сообщения: |
|
|
2 IfOrAnD:
Да, пожалуй, я не так все представил.. см ниже )
---
Касаемо ISP
Как я понял, начиная с 68020 у процессоров вместо одного SSP регистра появляются два: ISP и MSP (именно их переключает бит-12). Но у 68000 нет MSP (и бит-12 не используется).. И, как я понял, есть только SSP (который играет также роль ISP, если сравнивать с поздними моделями)..
---
Насчет формулировки (ты правильнее выразил), похоже, наиболее близкая к истине будет такая:
"реально" существуют в процессоре два регистра: A7 и A7' (второй никак не доступен в режиме user)
в режиме user: A7 хранит USP (в это время в A7' хранится SSP, но обратиться к регистру в этом режиме невозможно)
при переключении режима, регистры меняются значениями.
в режиме supervisor: A7 хранит SSP (в это время A7' хранит USP и этот регистр доступен под именем USP, т.е. инструкции типа MOVE xxx, USP это на самом деле MOVE xxx, a7' )
SP - альтернативное обозначение для A7
все инструкции, использующие стек, работают с регистром A7 (таким образом, используя тот или иной стек, в зависимости от текущего режима)
фух..
вот еще выдержка из исходника Gens'а (точнее исходника использующегося в нем эмулятора 68k):
Код: | ** First of all, the 68000/68010 stack pointer behavior has
** not changed:
**
** 1. In supervisor mode, __a7 contains the supervisor stack
** pointer and __asp contains the user stack pointer.
** 2. In user mode, __a7 contains the user stack pointer and
** __asp contains the supervisor stack pointer. |
---
Относительно адресации в памяти, стеки могут расти в либо в сторону увеличения адресов, либо в сторону уменьшения.. если ты реализуешь собственный стек в памяти, то выбор направления за тобой.. Но системный стек, которым пользуется процессор, растет именно в сторону уменьшения адресов.. например, инструкция JSR, сохраняя адрес для возврата в стеке, уменьшит адрес в указателе стека на 4 байта, таким образом адрес вершины стека уменьшится на 4..
---
2 Марат:
Я ошибся .. неправильно все представил.. A7 - есть! Он жив и будет жить!
Но смысл, содержащегося в нем адреса, меняется (как и сам адрес) при переходе из одного режима в другой.. вот )
Последний раз редактировалось: GrayLightTaliz (Пн Мар 30, 2009 1:24 pm), всего редактировалось 1 раз |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Гость
|
Добавлено: Пн Мар 30, 2009 4:30 am Заголовок сообщения: |
|
|
lps писал(а): | silenthill писал(а): | Народ я вот хочу заняться переводом игры GTA CW на Нинтендо DS . Но вот с чего начать незнаю. Помогите разобраться как и чем вытащить\найти там тексты и т.п.
Есть образ игры для эмуля...
Очень прошу помочь. Для меня лично считаю это того стоит. |
начни с чего-то попроще. |
А мне не надо попроще. Мне нужна именно ЭТА игра. Что никто незнает как и что? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
IfoR
Зарегистрирован: 16.05.2006 Сообщения: 334
|
Добавлено: Пн Мар 30, 2009 10:27 pm Заголовок сообщения: |
|
|
2GrayLight, спасибо за разъяснение.
GrayLight писал(а): |
Относительно адресации в памяти, стеки могут расти в либо в сторону увеличения адресов, либо в сторону уменьшения.. если ты реализуешь собственный стек в памяти, то выбор направления за тобой.. Но системный стек, которым пользуется процессор, растет именно в сторону уменьшения адресов.. например, инструкция JSR, сохраняя адрес для возврата в стеке, уменьшит адрес в указателе стека на 4 байта, таким образом адрес вершины стека уменьшится на 4.. |
Так я это и не отрицал. Я и говорю, что стеки обычно растут снизу вверх (в сторону уменьшения адрессов, по твоему ). Каждая ячейка занимает ровно 4 байта.
Ну а в программной реализации его можно хоть по диагонали реализовывать. ![Laughing](images/smiles/icon_lol.gif) |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Ti-Jey
Зарегистрирован: 06.01.2009 Сообщения: 21
|
Добавлено: Пн Июн 08, 2009 5:35 pm Заголовок сообщения: |
|
|
У меня такая проблема начал переводить Final Fantasy Legend на GB Color при поиске шрифта нашёл его но возникла проблема с таблицей там в одом тайле сразу две буквы.
Помогите с составлением таблицы.
P.S.: Заранее спасибо.
P.P.S.: Буду рад если сразу готовую напишите. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Ti-Jey
Зарегистрирован: 06.01.2009 Сообщения: 21
|
Добавлено: Пн Июн 08, 2009 5:37 pm Заголовок сообщения: |
|
|
Кстати вот скрин:
![](http://s46.radikal.ru/i113/0906/a4/4f39598fb32e.jpg) |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
HoRRoR RRC2008
![RRC2008 RRC2008](images/medals/HorrorsMedals.gif)
![](images/avatars/784012214449a7df6533cc.gif)
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Ghost
![](images/avatars/61685904643d8f12e5eed4.png)
Зарегистрирован: 24.04.2004 Сообщения: 237
|
Добавлено: Сб Июн 13, 2009 3:23 pm Заголовок сообщения: |
|
|
С A7 и SR есть некая путаница. Я специально проверял статусы на железе и вот что выяснил:
биты SR:
T1 0 S 0 0 I I I 0 0 0 X N Z V C
Битов T0 и M нет. Соответственно, нет режимов Trace on change of flow и Trace: Undefined. И нет регистра MSP, есть только SSP и USP.
Если T1 = 1, ПОСЛЕ каждой инструкции происходит прерывание на 9-й вектор. PC указывает на следующую инструкцию. Внутри прерывания в SR сбрасывается флаг T1, при выходе из прерывания восстанавливается значение SR из стека (а оно было с установленным флагом SR).
Привилегированные инструкции
RTE
Все writes to SR
RESET
STOP
Непонятно:
MOVE to USP
MOVE from USP
"Непонятно" потому, что иногда в User Mode прерывание Privileged срабатывало, иногда нет, я сам толком ничего не понял. Но в мануале написано, что эти инструкции привилегированные.
MOVE from SR НЕ является привилегированной для MC68HC000 (который в сеге стоит), а для MC68EC000 является. Тесты это подтвердили.
ЕМНИП, прерывание "Illegal" не даёт супервизорского режима.
Ещё написано "The MC68000 and MC68008 cannot write the vector offset and format code to the system stack", но в некоторых случаях данные заносятся в стек, в некоторых - нет.
При переходе в User Mode выполнение привилегированных инструкций приводит к срабатыванию прерывания, затем выходу из него (PC, занесенный в стек, указывает на следующую инструкцию, т.е. привилегированная инструкция вызывает прерывание и пропускается). Что с USP - непонятно. Но главное в том, что при переходе в User Mode, емнип, A7 и USP не менялись местами.
Вот такая вот ерунда. Я, правда, делал немного тестов.
Дальше думаю написать небольшой дебуггер ДЛЯ сеги с выводом инфы на экран, чтоб понятней было. _________________ Мысль - это интеллектуальный эксцесс данного индивидуума. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Ghost
![](images/avatars/61685904643d8f12e5eed4.png)
Зарегистрирован: 24.04.2004 Сообщения: 237
|
Добавлено: Сб Июн 13, 2009 11:52 pm Заголовок сообщения: |
|
|
upd: в общем, я провёл тесты. Вот мои записи:
При запуске приставки значения:
SR = 2700
USP = 77FFDFFF
MOVE USP обе являются привилегированными. USP и A7 никак не связаны. Если в привилегированном режиме (он по умолчанию) записать в A7 значение X, а в USP - Y, то при переходе в User Mode и обратно A7 остаётся равен X, а из USP считать Y нельзя, т.к. инструкция привилегированная. Если насильно перейти в прив. режим, значения A7 и USP остаются прежними.
В обоих режимах стек поинтер - A7, это видно по его изменениям при вызовах подпрограмм и прерываний.
Теперь про другие прерывания.
При вызове подпрограммы в стек заносится PC следующей команды, прерывания - PC, затем старый SR, т.е.
(A7) указывает на значение SR,
2(A7) - на PC.
Все проверенные прерывания сбрасывали флаг T1=0 и ставили флаг S=1 (supervisor).
Если флаг T1=1, то включается режим трассировки. Trace срабатывает ПОСЛЕ КАЖДОЙ правильной инструкции, в т.ч. bra $fe (каждый раз после её исполнения). Со STOP я не разобрался, но факт то, что шедшие за ней команды выполнялись. "ПОСЛЕ" значит, что инструкция выполнит все действия (в т.ч. запись в стек, если она это делает, в т.ч. изменение регистра SR, если она вызывает прерывание (подробнее см. пример с CHK)), вычислится адрес следующей инструкции, и только затем в стек заносятся PC (адрес следующей инструкции) и SR (если команда его меняет, то занесётся изменённый SR) и выполняется обработчик Trace. Т.к. после входа в прерывание T1=0 (см. выше), команды в обработчике Trace будут идти как обычно.
Пример Trace и CHK.
Код: | _0000033E: 46FC 8515 MOVE.W #$8515,SR
_00000342: 41BC 0005 CHK.W #$0005,D0
_00000346: 7011 MOVEQ #$11,D0
_00000348: 41BC 0005 CHK.W #$0005,D0
_0000034C: 4E71 NOP
_00000548: 4E73 RTE ; предыдущее прерывание
* Здесь начинается CHK
_0000054A: 40C0 MOVE SR,D0
_0000054C: 2CFC 2D2D2D2D MOVE.L #$2D2D2D2D,(A6)+
_00000552: 2CFC 43484B20 MOVE.L #$43484B20,(A6)+; "CHK " |
Если CHK не сработал, всё идет как обычно. Если сработал, то CHK заносит в стек PC следующей команды и старый SR (например, 8510), а новый становится с S=1, T1=0 (т.е. 2510), только ЗАТЕМ срабатывает Trace, занося в стек PC прерывания CHK и уже новый SR (2510), а в самом прерывании он не изменится и будет 2510. Таким образом, A7 сдвигается на 12 байт назад, и в стеке будет
2510 0000 054A 8510 0000 034C
Вектор Illegal вызывает любая неверная команда и команда ILLEGAL.
Команды прерываний:
Illegal, Line10, Line15, Privileged пишут в стек PC неверной инструкции, таким образом, RTE возвращается к ней. Т.к. неверная инструкция фактически не выполняется, после неё не срабатывает Trace. Чтобы выйти из Privileged, можно в стеке исправить значение SR, и выполнение RTE занесёт в SR это значение, т.о., при выходе из прерывания Privileged мы окажемся в прив. режиме.
CHK, Div0, TRAP, TRAPV пишут в стек PC инструкции, следующей за той, что вызвала прерывание. Сразу после прервашей инструкции срабатывает Trace, занося в стек PC той команды, которая должна выполниться после входа в прерывание, т.е. PC точки входа в прерывание (см. выше про полное выполнение инструкции перед срабатыванием Trace).
Addr заносит в стек 14 байт (см. ниже), слева направо:
w - искажённый опкод команды, вызвавшей прерывание
l - вычисленный полный нечётный адрес, из-за которого сработало прерывание
w - опкод команды, вызвавшей прерывание
w - старый SR
l - PC того места, где прервалось чтение команды. Например, в
move.l odd,address
заносится PC операнда address, а в
move.l even,odd
заносится почему-то PC середины операнда odd, а не его конца (см. ниже).
Т.к. команда с нечётным адресом не выполняется, Trace не срабатывает. В случае с командами Bcc, RTS и т.д., они также не выполняются и будут просто пропущены.
С ошибкой по нечётному адресу я не разобрался до конца с неким байтом, который заносится в стек. Ниже поясняется, каким именно.
Примеры с Address_Error:
Код: | _00000364: 3038 0001 MOVE.W ROM:$0001,D0
При срабатывании Address_Error A7 = FFEFF2 (взято 14 байт из стека), содержимое стека:
? add_long w1 SR PC
3031 0000 0001 3038 861F 0000 0368
w1 - 1-е слово инструкции (опкод)
add_long - полный нечётный адрес, вычисленный по инструкции
PC указывает на следующую команду
? - непонятно, что за значение. Старший байт всегда совпадает со старшим байтом опкода w1 |
Соответствия неверных команд и стека:
Код: | _00000364: 3038 0001 MOVE.W ROM:$0001,D0
3031 00000001 3038
_0000036A: 2038 0001 MOVE.L ROM:$0001,D0
2031 00000001 2038
_0000036E: 2CC0 MOVE.L D0,(A6)+
d0 содержал значение SR = 261F, т.е. инструкция move.l $1,d0 не выполнилась
_00000372: 2A39 01234567 MOVE.L ROM:$01234567,D5
2A31 01234567 2A39
_0000037A: 23C2 01234567 MOVE.L D2,ROM:$01234567
23C1 01234567 23C2
_00000382: 6001 BRA ROM:$00000385(pc)
6012 00000385 6001
_00000386: 6000 0001 BRA ROM:$00000389(pc)
6012 00000389 6000
_0000038C: 4EF9 FE986725 JMP UNK:$FE986725
4EF2 FE986725 4EF9
Следующий PC был 38E почему-то
_00000394: 23F9 01234567 00FF9000 MOVE.L ROM:$01234567,RAM:$00FF9000
23F1 01234567 23F9
Следующий PC = 39A, т.е. не считан второй dword
_000003A0: 23F9 01234568 00FF9001 MOVE.L ROM:$01234568,RAM:$00FF9001
23E1 00FF9001 23F9
Следующий PC = 3A8, т.е. не считан последний word
_000003AC: 23F9 01234567 00FF9001 MOVE.L ROM:$01234567,RAM:$00FF9001
23F1 01234567 23F9
Следующий PC = 3B2, т.е. не считан второй dword |
upd2:
да, ещё.... Сделать нечётный адрес без команды можно, если вписать его в 1-м векторе (PC init). Но что будет дальше, я не представляю.
Регистр PC 32-хбитный. _________________ Мысль - это интеллектуальный эксцесс данного индивидуума. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
GothenX
![](images/avatars/2956027234a7eed65f2436.png)
Зарегистрирован: 09.08.2009 Сообщения: 19
|
Добавлено: Пт Сен 04, 2009 6:45 am Заголовок сообщения: |
|
|
В общем решил начать с малого и первым моим шагом стал поиск в игре шрифта. Использовал мануал. Игра - F1 World Championship Edition на SMD. Взял, что попроще для начала. С помощью Tile Molester полистал ром... шрифт вроде нашёл, но даже в лучшем из форматов (4bpp linear) он выглядит вот так:
Подскажите, пожалуйста, в чём может быть проблема и как её решить? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
|
|
Вы не можете начинать темы Вы можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|