Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Griever RRC2008
Зарегистрирован: 15.07.2005 Сообщения: 112 Откуда: Н.Новгород
|
Добавлено: Пн Дек 19, 2005 2:55 pm Заголовок сообщения: Бряк на кнопку [?] |
|
|
Здрасте! недавно понадобилось в отладчике на NES сделать так чтобы останов произошел сразу после нажатия кнопки(в
моем случае START), заглянул в документацию - вроде опрос джойстиков чисто программный[Через порт $4016 для 1-го
джойстика] поставил бряк на запись в порт - естессно в порт пишется $FF несколько сот раз в секунду - пробовал
использовать Conditional Breakpoints - никакого эффекта. Может я чего-то не так делаю? стопудово должен быть способ
заставить игру встать после нажатия START! _________________
|
|
Вернуться к началу |
|
|
Ghost
Зарегистрирован: 24.04.2004 Сообщения: 237
|
Добавлено: Вт Дек 27, 2005 9:22 pm Заголовок сообщения: |
|
|
Скажи, что за игра.
В ФСЕУшном дебаггере не очень удобно взламывать кнопку: скажем, меняешь значение регистра A на нужное (пусть Start), а оно всё равно не срабатывает. Приходится ломать в нужный момент адрес оперативки, куда пишется кнопка. |
|
Вернуться к началу |
|
|
Griever RRC2008
Зарегистрирован: 15.07.2005 Сообщения: 112 Откуда: Н.Новгород
|
Добавлено: Вт Дек 27, 2005 10:35 pm Заголовок сообщения: |
|
|
Скажем, Dick Tracy. А какой за адрес оперативки? есть только один порт 4016 _________________
|
|
Вернуться к началу |
|
|
Ghost
Зарегистрирован: 24.04.2004 Сообщения: 237
|
Добавлено: Ср Дек 28, 2005 3:40 pm Заголовок сообщения: |
|
|
Любая нормальная игра после обработки порта записывает текущую кнопку в оперативку в пару адресов, хотя бы для будущего использования: например, чтобы определить, была ли нажата кнопка ДО текущего момента и т.д.
Для Dick Tracy ставь бряк на чтение $375 или на выполнение $C76D. Как только нажмёшь кнопку - попадёшь в дебаггер. |
|
Вернуться к началу |
|
|
Griever RRC2008
Зарегистрирован: 15.07.2005 Сообщения: 112 Откуда: Н.Новгород
|
Добавлено: Ср Дек 28, 2005 7:51 pm Заголовок сообщения: |
|
|
Спасибо большое, еще бы узнать как ты это нашел =) _________________
|
|
Вернуться к началу |
|
|
Ghost
Зарегистрирован: 24.04.2004 Сообщения: 237
|
Добавлено: Ср Дек 28, 2005 8:04 pm Заголовок сообщения: |
|
|
Можно посмотреть в самом дебаггере, в какой адрес записывается текущая кнопка. Но можно открыть окно с памятью, так чтобы видно было всё окно, и нажимать в игре кнопки - какие-то адреса в памяти будут меняться соответственно кнопкам. Вот я заметил, что по адресам $000A, $000C и $000E устанавливается значение кнопки (там есть ещё другие адреса, но они не нужны). Поставил бряк на чтение $E и оттуда уже вышел к чтению $375. |
|
Вернуться к началу |
|
|
Griever RRC2008
Зарегистрирован: 15.07.2005 Сообщения: 112 Откуда: Н.Новгород
|
Добавлено: Ср Дек 28, 2005 10:47 pm Заголовок сообщения: |
|
|
спасибо =) _________________
|
|
Вернуться к началу |
|
|
ZURG
Зарегистрирован: 13.03.2008 Сообщения: 7
|
Добавлено: Чт Мар 13, 2008 4:26 pm Заголовок сообщения: |
|
|
Здрасте ромхакеры.
У меня возникла одна проблема, и я честно пытался решить её методом научного тыка. Но у меня нечего не вышло, и теперь приходится задавать глупые вопросы. Вобщем мне надо взломать кнопку. А точнее - найти код отвечающий за какиелибо действия после нажатия кнопок. К примеру как найти TMNT3(черепашки ниндзя 3) процедуру прыжка или удара? |
|
Вернуться к началу |
|
|
Shredder
Зарегистрирован: 20.02.2007 Сообщения: 73 Откуда: Россия, Самара.
|
Добавлено: Чт Мар 13, 2008 4:36 pm Заголовок сообщения: |
|
|
Интересно, а для чего тебе это? |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Чт Мар 13, 2008 4:40 pm Заголовок сообщения: |
|
|
Не знаю, как на NES, но на GBA я ставил бряк на считывание байта, в котором хранится инфа о нажатых кнопках, а дальше скакал по процедурам. _________________ Работаю за деньги
KILL ALL HUMANS!!!!!111 |
|
Вернуться к началу |
|
|
Chronix RRC2008
Зарегистрирован: 27.12.2003 Сообщения: 288 Откуда: CYBERIA
|
Добавлено: Чт Мар 13, 2008 6:11 pm Заголовок сообщения: |
|
|
HoRRoR писал(а): | Не знаю, как на NES, но на GBA я ставил бряк на считывание байта, в котором хранится инфа о нажатых кнопках, а дальше скакал по процедурам. |
Точно так.
Опрос джойстиков происходит ч/з регистр 4016h (4017h - для второго порта), так что ставь бряк на запись в регистр 4016h, чтобы поймать момент формирования строба, и тогда ты без труда попадешь на самое начало подпрограммы опроса джойстиков. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Чт Мар 13, 2008 7:26 pm Заголовок сообщения: |
|
|
Самая *опа - когда таких процедур тьма тьмущая, и среди них надо найти одну единственную... _________________ Работаю за деньги
KILL ALL HUMANS!!!!!111 |
|
Вернуться к началу |
|
|
ZURG
Зарегистрирован: 13.03.2008 Сообщения: 7
|
Добавлено: Вс Мар 23, 2008 12:35 pm Заголовок сообщения: |
|
|
Chronix писал(а): | HoRRoR писал(а): | Не знаю, как на NES, но на GBA я ставил бряк на считывание байта, в котором хранится инфа о нажатых кнопках, а дальше скакал по процедурам. |
Точно так.
Опрос джойстиков происходит ч/з регистр 4016h (4017h - для второго порта), так что ставь бряк на запись в регистр 4016h, чтобы поймать момент формирования строба, и тогда ты без труда попадешь на самое начало подпрограммы опроса джойстиков. |
Нечего я там в коде не понял, в ассемблере почти не разбираюсь. Объясните пожалуйста как на кнопку селект повесить какую нибудь команду. Если это конечно вообще возможно. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
|
Вернуться к началу |
|
|
ZURG
Зарегистрирован: 13.03.2008 Сообщения: 7
|
Добавлено: Пн Мар 24, 2008 9:45 am Заголовок сообщения: |
|
|
HoRRoR писал(а): | Это возможно, если сперва разобраться в ассемблере. |
Я и не сомневаюсь. Просто хотелось уточнить. Но мне бы хотелось увидеть пример хотя бы с переназначением одной клавиши на другую, дальше я бы разобрался сам. А вообще я хочу в TMNT3 сделать смену черепах кнопкой селект прямо в процессе игры, а не только когда тебя убивают. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Пн Мар 24, 2008 11:20 am Заголовок сообщения: |
|
|
- Как мне написать программу?
- Сперва надо научиться программировать.
- Я и не сомневаюсь. Покажите мне на примере, я хочу написать серьезную программу. _________________ Работаю за деньги
KILL ALL HUMANS!!!!!111 |
|
Вернуться к началу |
|
|
ZURG
Зарегистрирован: 13.03.2008 Сообщения: 7
|
Добавлено: Пн Мар 24, 2008 11:49 am Заголовок сообщения: |
|
|
HoRRor, несмешно, потомучто програмировать учаться именно на примерах. И тем более я не прошу написать всё за меня. Чтобы реализовать смену черепах, надо в памяти изменить всего две ячейки - это я сделать смогу. Но вот как повесить всё это дело на кнопку я не знаю, и прошу показать на примере. А доков в сети по этому поводу нет(по крайне мере на русском языке). |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Пн Мар 24, 2008 12:23 pm Заголовок сообщения: |
|
|
Мда... Ты можешь понять, что если ты ничего не будешь понимать, то примеры бесполезны? Научись сперва хотя бы просто ставить бряки и понимать, что делает игра. _________________ Работаю за деньги
KILL ALL HUMANS!!!!!111 |
|
Вернуться к началу |
|
|
ZURG
Зарегистрирован: 13.03.2008 Сообщения: 7
|
Добавлено: Пн Мар 24, 2008 2:10 pm Заголовок сообщения: |
|
|
Я думаю тебе не составит труда объснить мне убогому следующий код: Код: |
$F928:A0 08 LDY #$08
$F92A:AD 16 40 LDA $4016 = #$FF
$F92D:85 0C STA $000C = #$FF
$F92F:4A LSR
$F930:05 0C ORA $000C = #$FF
$F932:4A LSR
$F933:36 08 ROL $08,X @ $0008 = #$40
$F935:AD 17 40 LDA $4017 = #$FF
$F938:85 0D STA $000D = #$01
$F93A:4A LSR
$F93B:05 0D ORA $000D = #$01
$F93D:4A LSR
$F93E:36 09 ROL $09,X @ $0009 = #$A0
$F940:88 DEY
$F941:D0 E7 BNE $F92A
$F943:60 RTS
|
Код: |
$F8F2:A5 08 LDA $0008 = #$02
$F8F4:C5 0A CMP $000A = #$02
$F8F6:D0 1C BNE $F914
$F8F8:A5 09 LDA $0009 = #$00
$F8FA:C5 0B CMP $000B = #$00
$F8FC:D0 16 BNE $F914
$F8FE:A2 00 LDX #$00
$F900:20 04 F9 JSR $F904
$F903:E8 INX
$F904:B5 08 LDA $08,X @ $000A = #$02
$F906:A8 TAY
$F907:55 FA EOR $FA,X @ $00FC = #$00
$F909:35 08 AND $08,X @ $000A = #$02
$F90B:95 F8 STA $F8,X @ $00FA = #$02
$F90D:95 54 STA $54,X @ $0056 = #$02
$F90F:94 FA STY $FA,X @ $00FC = #$00
$F911:94 56 STY $56,X @ $0058 = #$00
$F913:60 RTS
|
Точто мне нужно сдесь или нужно смотерть дальше? |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Пн Мар 24, 2008 2:36 pm Заголовок сообщения: |
|
|
Первый фрагмент кода - цикл чтения кнопок из порта ввода и запись результата в ячейку памяти. Из порта 4016 пишутся 8 битов (кнопки первого джойстика) в 0C, их 4017 (кнопки второго джойстика) - в 0D.
Дальше игра не будет обращаться к портам 4016/4017, а при проверке нажатия Start она просто смотрит ячейку памяти (0C/0D).
Второй кусок кода явно не в тему.
Ни на каких примерах ты не научишься, тут надо заниматься этим плотно. |
|
Вернуться к началу |
|
|
ZURG
Зарегистрирован: 13.03.2008 Сообщения: 7
|
Добавлено: Пн Мар 24, 2008 4:59 pm Заголовок сообщения: |
|
|
АнС спасибо, буду разбираться. |
|
Вернуться к началу |
|
|
ZURG
Зарегистрирован: 13.03.2008 Сообщения: 7
|
Добавлено: Вт Мар 25, 2008 11:14 am Заголовок сообщения: |
|
|
Сделал финт ушами - впихнул свою проверку на нажатие селекта и пробный код. Всё работает, но как и следовало ожидать слишком быстро. Как можно сделать чтобы мой код выполнялся только один раз после нажатия кнопки, а не всё время пока она зажата? Думаю сделать флаг, который будет устанавливаться сразу после нажатия нужной кнопки, и обнуляться при нажатии постронних кнопок. Но может есть способ попроще? |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Вт Мар 25, 2008 2:49 pm Заголовок сообщения: |
|
|
Напиши свой код, который добавил.
В игре помимо 0C/0D должны быть ещё две ячейки рядом, которые XOR'ятся с предыдущими значениями состояния джойстика. В итоге операции EOR остаются только кнопки, нажатые в данный момент, в следующем кадре они не будут считаться нажатыми, пока не отпустишь кнопку и не нажмёшь снова. |
|
Вернуться к началу |
|
|
KDEboroda
Зарегистрирован: 13.11.2015 Сообщения: 2 Откуда: СССР
|
Добавлено: Пт Ноя 13, 2015 2:11 pm Заголовок сообщения: Отладчик SMD - останов по нажатию клавиши. |
|
|
Работаю над игрой Operation Europe - Path to Victory (1939-1945) (SMD).
Есть тема на emu-land . net по адресу / forum / index.php?topic=27971.120 (убрать пробелы, если интересно)
Задача: пропустить экран установки параметров командиров, чтобы изначально задать их жёстко и назначать команду себе из уже готовых.
Что делаю: в отладчике ставлю точку останова на чтение последней (перед экраном изменения параметров) строки текста, далее по одной команде выполняю - и попал в какой-то замкнутый цикл. Нужно посмотреть, что происходит после нажатия кнопки "C" любого джойстика. И там соответственно пропустить эту часть, чтобы сразу появился экран назначения на должности.
Предполагаю, что можно поступить аналогично тому, что тут описано: отслеживать память по нажатию кнопок, затем ставить точки останова на эти места в памяти.
Есть ещё варианты?
P.S. Кстати, пока что не нашёл, где нажатие кнопок меняет память. |
|
Вернуться к началу |
|
|
|