Автор Тема: [NES] Battletoads / Battletoads & Double Dragon  (Прочитано 48885 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн feos

  • Пользователь
  • Сообщений: 786
  • Пол: Мужской
    • Просмотр профиля
[NES] Battletoads / Battletoads & Double Dragon
« : 06 Август 2012, 07:54:36 »
ОБНОВЛЕНИЕ от 18 августа:

Начат проект хакинга баттлоадс ( и также БТ и ДД ) где будет дизассемблироваться вся игра, и также будут исходники в свободном доступе для всех.

Wiki для документирвоания трюков, глюков, процедур и всего чего угодно по движку Жаб/БТДД.
http://code.google.com/p/feos-tas/wiki/Glitch_List

Также в моем гугль-коде проекты обеих игр для IDA 5.2 (с поддержкой 6502), разрабатываемые Ti_ и мной.
http://code.google.com/p/feos-tas/source/browse/#svn%2Ftrunk%2FDisAssemble

Приглашаю тех, кто уже хакал или хакает эти игры, делиться наработками, дополнениями и исправлениями!



Как скачивать с SVN:

Скачиваете TortoiseSVN и устанавливаете. Создаете новую папку, кликаете ПКМ, выбираете SVN Checkout. Копипастите туда ссылку http://feos-tas.googlecode.com/svn/trunk/DisAssemble/

Мой проект копируется вам на комп. Потом чтобы обновить контент ПКМ по папке, SVN - Update. Так у вас будет всегда свежая ревизия.



СТАРЫЙ ПОСТ:

Ti_,  нет ли желания раздебажить глюк с созданием объекта "конец 12 уровня" в 3 уровне НЕСных жаб? У меня есть скрипт, показывающий содержимое массива объектов и сами эти объекты на экране, а также мувик, в котором КОНЕЦ вызывается нажатием кнопок джоя, сумма битов которых равна ID конца уровня, и так он создается.

Еще неплохо бы вычислить, как работает инпутозависимое РНГ. Оно тикает либо по несколько раз в кадр, либо каждый кадр, и зажимаемый инпут продвигает его значение дальше, чем обычно, притом ячеек РНГ скорее всего 2, к ним привязано все поведение врагов и куча чего еще.

Кстати в БТДД жабам добавили стандартный удар из присяда, который в первой части работал рандомно на особых боссах.
« Последнее редактирование: 19 Август 2012, 20:22:05 от feos »

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3267
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #1 : 06 Август 2012, 11:41:18 »
Ti_,  нет ли желания раздебажить глюк с созданием объекта "конец 12 уровня" в 3 уровне НЕСных жаб? У меня есть скрипт, показывающий содержимое массива объектов и сами эти объекты на экране, а также мувик, в котором КОНЕЦ вызывается нажатием кнопок джоя, сумма битов которых равна ID конца уровня, и так он создается.
Меняется номер уровня ($0010)? Дык ставим брейкпоинт на запись в номер уровня .. перед самым началом запуска глюка ставим паузу, включаем логгинг кода, вызываем глюк, как вылезет брейкпоинт за запись в ячейку уровня останаваливаем лог.  Ну и там в логах можно будет посмотреть уже как произошел переход к чему-нить вроде STA $10.
Ну если хочешь выкладывай попробую глянуть, а заодно и давай тогда всё что наломано.


Оффлайн feos

  • Пользователь
  • Сообщений: 786
  • Пол: Мужской
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #2 : 06 Август 2012, 18:02:01 »
Да номер уровня ясное дело меняется, но игра при вызове 0x7F в слот 0x3CD думает, что произаошо окончание 12 уровня и касание его чекпойнта, поэтому жаба подлетает, гремят зрывы и уровен переключается, но в данном случае не на 13, а на 4.

Суть глюка: одна жаба стоит на земле, другая прыгает на байк и умирает в дырке. Так как чекпойнт трассы еще не активирован, но умерла жаба на байке, проискходит рестарт с самого начала 3 уровня. Так как РНГ у нас инпутозависимое (да плюс ответственное за точное время генерации врагов и их поведение, за точную длительность лага между уровнями, за типы ударо жаб на боссах и др.), я думаю, из него берутся данные для генерации объектов. А сама генерация объектов происходит (как заключил АнС) по принципу столбиков на трассе.

Хотя есть пара кадров сразу после рестарта ,когда можно создавать объекты непосредственно инпутом. Так, в текущем тасе мы нажали B+S+T+U+D+L+R (2^7+2^6+2^5+2^4+2^3+2^2+2^1 = 0x7F) на 2 джое во 2 кадр и СРАЗУ создали конец уровня. Если нажимать в этот кадр другие сочетания, может ломаться палитра и др. глюки.


Скрипт:
http://feos-tas.googlecode.com/svn/trunk/LUA/BattletoadsObjects.lua

Демка:
http://code.google.com/p/feos-tas/downloads/detail?name=feos%2Cmeshuggah-battletoads.7z

Архив с наработками АнСа:
http://rghost.ru/39606249

Для навигации по мувику советую юзать ТАСЭдитор (за счет гринзоны позволяет перематывать назад и прыгать на любой кадр), он вполне совместим с дебаггером.
http://fceux.com/zip

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3267
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #3 : 06 Август 2012, 21:40:28 »
2 feos:
Я посмотрел причину бага.   Для рестарта уровня с мотоциклов как известно если умереть уровень начинается не с начала, а с чекпойнта.   Точка возврата (нового начала уровня - откуда продолжить читать объекты при рестарте) записывается в память, исходя из текущего адреса конфига.
BANK0:B7E0                 LDA     lvl_cfg_adr
BANK0:B7E2                 SEC                     ; current adress-$b
BANK0:B7E3                 SBC     #$B
BANK0:B7E5                 STA     lvl_cfg_new
BANK0:B7E7                 LDA     lvl_cfg_adr+1
BANK0:B7E9                 SBC     #0
BANK0:B7EB                 STA     lvl_cfg_new+1
lvl_cfg_adr = $B7 ; текущий адрес конфига откуда читаются объекты
lvl_cfg_new = $E5  ;  адрес конфига для чекпоинта

Этот код выполяется только когда игрок взял чекпоинт (первую палочку).  Когда игрок умирает на мотоцикле из lvl_cfg_new  восстанавливается конфиг в lvl_cfg_adr.
А поскольку ты умираешь раньше взятия палочки адрес конфига еще не прописан. (ячейка $e5 пустая 0000)
$0000 - как известно это начало оперативки nes.  Поэтому чтение объектов уровня идет не с нужного адреса рома, а из оперативки прям с самого её начала. 
А как известно как раз область чтоли 0000-0020  самая часто используемая. Можно в доках по нес почитать. Соотвественно туда пишется постоянно и дохрена всего, и видимо нажатия кнопок тоже. 
Я не проверял, но скорее всего нажимая кнопки ты и создаешь там свой собственный объект. ($FF - вроде бы флаг конца уровня да? - и если все кнопки нажать будет $FF?)





Добавлено позже:
Глянул там объекты читаются вообще даже от 0000 до 014A.  (B*1E=14A) =  30 левых объектов - вот это и есть взрывы , смены палитры и т.д.
 (У меня есть список только сеговских объектов от bt$dd, все номера вроде несовскому бт и дд соответвуют - если надо пиши скину; а в первом бт надо проверять какие там объекты есть )
« Последнее редактирование: 06 Август 2012, 22:09:52 от Ti_ »

Оффлайн feos

  • Пользователь
  • Сообщений: 786
  • Пол: Мужской
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #4 : 06 Август 2012, 22:03:02 »
Проверю завтра.
Зажимаем все кроме А и получаем сумму инпута 0x7F.
Довольно шокирующая инфа если это так и есть.

Можешь запустить скрипт и мой мувик, увидишь ID большинства объектов. Или сам поиграй. Скрипт выводит содержимое слотов на первом пикселе экрана, так что надо в настройках видео поднять границу экрана с 8 до 0.
« Последнее редактирование: 06 Август 2012, 22:10:12 от feos »

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3267
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #5 : 07 Август 2012, 14:23:25 »
Можешь запустить скрипт и мой мувик, увидишь ID большинства объектов.
Я их номера в рам ватче смотрел.
А вот и объекты:
BANK0:9B8A obj_code_ptrs:  .WORD no_obj_code       ; DATA XREF: sub_0_87C2+13r
BANK0:9B8A                                         ; sub_0_87C2+18r
BANK0:9B8C                 .WORD object_player     ; 1
BANK0:9B8E                 .WORD object_player     ; 2
BANK0:9B90                 .WORD loc_0_AE2D        ; 3   ? reload gfx?
BANK0:9B92                 .WORD object_delete?    ; 4
BANK0:9B94                 .WORD hodulya_golova    ; 5 (для босса первого левела это шар на земле)
BANK0:9B96                 .WORD object_verevka    ; 6
BANK0:9B98                 .WORD object_verevka    ; 7
BANK0:9B9A                 .WORD loc_0_B5D1        ; 8
BANK0:9B9C                 .WORD loc_0_CFD0        ; 9
BANK0:9B9E                 .WORD object_muhi       ; A Мухи
BANK0:9BA0                 .WORD object_Psyko_Pig  ; B   ; бичи с первого левела
BANK0:9BA2                 .WORD object_dmg_hit    ; C удар
BANK0:9BA4                 .WORD object_level1_boss_noga ; D  нога босса первого уровня
BANK0:9BA6                 .WORD object_level1_boss_turrets ; E   турели босса первого левела (2штуки создаются)
BANK0:9BA8                 .WORD object_level1_boss ; F
BANK0:9BAA                 .WORD object_level1_boss_bullet ; 10    пули от пушек первого босса
BANK0:9BAC                 .WORD object_tall_walker ; 11 ходуля
BANK0:9BAE                 .WORD object_tall_walker ; 12
BANK0:9BB0                 .WORD object_raven      ; 13
BANK0:9BB2                 .WORD object_dead_raven ; 14
BANK0:9BB4                 .WORD object_invader    ; 15  ворующие жизни
BANK0:9BB6                 .WORD object_raven_large ; 16
BANK0:9BB8                 .WORD object_dragon     ; 17
BANK0:9BBA                 .WORD object_bike       ; 18  в тунеле байк, на 5-ом доска, в 7 самолет
BANK0:9BBC                 .WORD object_set_palette ; 19
BANK0:9BBE                 .WORD object_infernorace_animation ; 1a
BANK0:9BC0                 .WORD hodulya_golova    ; 1b
BANK0:9BC2                 .WORD hodulya_palka     ; 1c
BANK0:9BC4                 .WORD flying_life_bar   ; 1d  летящий кубик жизней
BANK0:9BC6                 .WORD object_fireball   ; 1e  выстрелы драконов с 1-ого левела
BANK0:9BC8                 .WORD loc_0_E2A4        ; 1f
BANK0:9BCA                 .WORD object_psyko_Pig_ambush ; 20    бичи с первого левела под землей
BANK0:9BCC                 .WORD object_turbo_tunnel_falling_obstacle ; 21
BANK0:9BCE                 .WORD object_WARP       ; 22  warp/hodulya poyavlenie
BANK0:9BD0                 .WORD object_turbo_tunnel_obstacle ; 23
BANK0:9BD2                 .WORD object_turbo_tunnel_obstacle ; 24
BANK0:9BD4                 .WORD object_turbo_tunnel_obstacle ; 25
BANK0:9BD6                 .WORD object_checkpoint_part1 ; 26   перегордка-чекпоинт турбо-тунеля (или водного) (или инферно)
BANK0:9BD8                 .WORD object_checkpoint_part2 ; 27
BANK0:9BDA                 .WORD object_turbo_tunnel_rat_rocket ; 28  крыса на ракете
BANK0:9BDC                 .WORD object_turbo_tunnel_falling_obstacle ; 29  перегордка которую бросает крыса на ракете
BANK0:9BDE                 .WORD object_turbo_tunnel_obstacle_up ; 2a
BANK0:9BE0                 .WORD object_turbo_tunnel_fly_obstacle ; 2b  летающие хрени в турбо тунелле
BANK0:9BE2                 .WORD object_turbo_tunnel_balls ; 2c  шары при падении
BANK0:9BE4                 .WORD object_saturn_toadtrap ; 2d   кусачки со 2-ого левела
BANK0:9BE6                 .WORD object_electro_trap ; 2e  2-ой левел электричество
BANK0:9BE8                 .WORD object_raven_claw ; 2f  ножи от ворон
BANK0:9BEA                 .WORD objects_power_ups ; 30  всякие поверапы и очки
BANK0:9BEC                 .WORD object_retro_blaster ; 31
BANK0:9BEE                 .WORD object_retro_blaster_shoot ; 32  выстрелы пушек 2-ого левела
BANK0:9BF0                 .WORD object_snowman    ; 33
BANK0:9BF2                 .WORD platform_on_last_level ; 34
BANK0:9BF4                 .WORD object_level4_platform_mov_down ; 35  и на последнем
BANK0:9BF6                 .WORD object_prujina    ; 36
BANK0:9BF8                 .WORD object_rotating_spike ; 37  вращающийся шип ласт левел
BANK0:9BFA                 .WORD object_ice_cube   ; 38
BANK0:9BFC                 .WORD object_sosulka    ; 39
BANK0:9BFE                 .WORD object_snowball   ; 3a  ili electrozaryad
BANK0:9C00                 .WORD object_snow       ; 3b  кучка снега
BANK0:9C02                 .WORD object_leve4_wall ; 3c  перегородка которую нужно разбивать
BANK0:9C04                 .WORD object_large_snowball ; 3d
BANK0:9C06                 .WORD object_level4_moving_platform ; 3e
BANK0:9C08                 .WORD object_level4_wall_moving ; 3f  перегородка двигающаяся вверхвниз
BANK0:9C0A                 .WORD object_level4_spike_moving ; 40
BANK0:9C0C                 .WORD object_level4_checkpoint ; 41
BANK0:9C0E                 .WORD object_levels_xz  ; 42  vsegda na urovne (effect?) (levels 4,6,8)
BANK0:9C10                 .WORD object_level4_sosulka_kamennaya ; 43
BANK0:9C12                 .WORD loc_0_FD9E        ; 44
BANK0:9C14                 .WORD object_level4_spike_moving ; 45
BANK0:9C16                 .WORD object_dead_robo_manus_ili_begushaya_krisa ; 46   ili koroleva
BANK0:9C18                 .WORD object_giblet     ; 47  крысы турбо тунеля
BANK0:9C1A                 .WORD object_inferno_race_create ; 48
BANK0:9C1C                 .WORD object_turbo_tunnel_warning_sprite ; 49
BANK0:9C1E                 .WORD object_elevator_platform ; 4a
BANK0:9C20                 .WORD object_rat_race_palette_fade ; 4b
BANK0:9C22                 .WORD object_snake      ; 4c
BANK0:9C24                 .WORD object_snake_animation ; 4d   SNAKE PIT LEVEL
BANK0:9C26                 .WORD object_snake_hide_head ; 4e
BANK0:9C28                 .WORD snake_pit_xz      ; 4f
BANK0:9C2A                 .WORD object_sentry_drone ; 50
BANK0:9C2C                 .WORD object_slizen     ; 51  8-ой левел которые на бошку липнут
BANK0:9C2E                 .WORD object_gas_turret ; 52
BANK0:9C30                 .WORD object_gas        ; 53
BANK0:9C32                 .WORD object_ventilyator ; 54
BANK0:9C34                 .WORD object_ventilyator ; 55
BANK0:9C36                 .WORD object_veter      ; 56
BANK0:9C38                 .WORD object_ball       ; 57  level-8
BANK0:9C3A                 .WORD loc_0_F4CB        ; 58
BANK0:9C3C                 .WORD object_ball_laucnh_hole ; 59  level-8
BANK0:9C3E                 .WORD object_l10_xz     ; 5a
BANK0:9C40                 .WORD object_screen_light ; 5b  мигание экрана при ударе по 1-ому боссу
BANK0:9C42                 .WORD object_hordhead   ; 5c  быки ласт левел
BANK0:9C44                 .WORD object_last_lvl_flying ; 5d  летающий и дующий
BANK0:9C46                 .WORD object_last_lvl_flying ; 5e
BANK0:9C48                 .WORD object_palka_v_stene ; 5f
BANK0:9C4A                 .WORD object_last_lvl_head ; 60
BANK0:9C4C                 .WORD loc_0_F350        ; 61
BANK0:9C4E                 .WORD object_swellcheeks ; 62  ласт левел летающий
BANK0:9C50                 .WORD object_level1_boss_dmg_spr ; 63  спрайт разбитого стекла первого босса
BANK0:9C52                 .WORD object_level1_boss_ball ; 64  ; шар первого босса в руке
BANK0:9C54                 .WORD object_level1_boss_dead ; 65  обломок первого босса - 4шт.
BANK0:9C56                 .WORD rocket_rat2_inferno ; 66
BANK0:9C58                 .WORD inferno_race_electricity ; 67
BANK0:9C5A                 .WORD object_level5_watermine_p1 ; 68  (takje inferno fires)
BANK0:9C5C                 .WORD object_level7_fires ; 69
BANK0:9C5E                 .WORD object_level7_rockets ; 6a
BANK0:9C60                 .WORD object_shesterenka ; 6b  terra tubes
BANK0:9C62                 .WORD object_water_hit  ; 6c  удар сёрфа об воду
BANK0:9C64                 .WORD object_robot      ; 6d terra tubes
BANK0:9C66                 .WORD object_electrofish ; 6e
BANK0:9C68                 .WORD object_hammerfish ; 6f
BANK0:9C6A                 .WORD object_shark      ; 70
BANK0:9C6C                 .WORD object_shark      ; 71
BANK0:9C6E                 .WORD object_utka       ; 72
BANK0:9C70                 .WORD object_angelica_ili_pimpl ; 73
BANK0:9C72                 .WORD object_verevka_s_propellerom ; 74
BANK0:9C74                 .WORD object_terra_tubes_xz ; 75
BANK0:9C76                 .WORD object_vodovorot  ; 76
BANK0:9C78                 .WORD object_brevno     ; 77
BANK0:9C7A                 .WORD object_level5_watermine_p2 ; 78
BANK0:9C7C                 .WORD object_big_blag   ; 79
BANK0:9C7E                 .WORD object_electroball ; 7a
BANK0:9C80                 .WORD object_electroball_phase2 ; 7b
BANK0:9C82                 .WORD object_general_slaughter ; 7c
BANK0:9C84                 .WORD object_robu_manus ; 7d
BANK0:9C86                 .WORD object_dark_queen ; 7e   poyavlaetsa 2 raza
BANK0:9C88                 .WORD object_last_lvl_end ; 7f  взрыв перед появлением королевы

Оффлайн feos

  • Пользователь
  • Сообщений: 786
  • Пол: Мужской
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #6 : 07 Август 2012, 15:23:42 »
Это случайно не сеговский код? Откуда в 8-битке Word?

А РНГ можешь вычислисть? Оно и в бтдд и в жабах одинаково работает, только возможно адрес немного отличается (например РАМ-карта бтдд смещена на 1 ячейку относительно первых жаб). Наблюдение за генератором рандома имеет прямую пользу для будущих тасов (будь то наблюдение в RAM watch или в дебаггере, если оно тикает несколько раз в кадр).

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3267
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #7 : 07 Август 2012, 15:41:17 »
Это случайно не сеговский код? Откуда в 8-битке Word?

А РНГ можешь вычислисть? Оно и в бтдд и в жабах одинаково работает, только возможно адрес немного отличается (например РАМ-карта бтдд смещена на 1 ячейку относительно первых жаб). Наблюдение за генератором рандома имеет прямую пользу для будущих тасов (будь то наблюдение в RAM watch или в дебаггере, если оно тикает несколько раз в кадр).
1) не сеговский 2) не код, а список указателей на код объектов 3) адресация на денди 16битная, пример JMP $4984. ; поэтому и поинтеры 16битные.

РНГ, генератор случайного числа? Вычислить можно, просто поставить дебаг на запись в эту ячейку. И вылезет код.  Только что-ты с ним будешь делать? Если ты хочешь портировать этот генератор на С++ или вроде того, то это не у меня спрашивай.
P.S. Только номер ячейки то напиши.


Добавлено позже:
например РАМ-карта бтдд смещена на 1 ячейку относительно первых жаб.
А вот это полезная инфа, спасибо.

Оффлайн Roket

  • Пользователь
  • Сообщений: 3336
  • Пол: Мужской
  • Злой Котэ
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #8 : 07 Август 2012, 16:07:10 »
Ti_,  с какого адреса начинается список врагов первого уровня? Сейчас пытался взломать, получилось только сломать графу и сделать туеву хучу серых свиней и ходуль :?

Оффлайн feos

  • Пользователь
  • Сообщений: 786
  • Пол: Мужской
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #9 : 07 Август 2012, 16:19:37 »
Ti_,  я имею в виду, эту ячейку (я склонен думать что их две) надо НАЙТИ. Для этого я предполагаю надо поискать какие адреса меняются вместе с таймером (не факт, что идентично изменениям таймера), когда инпута нет, и потом меняются по другому, когда добавляется инпут. Чтение же из РНГ для определения например поведения врагов происходит далеко не постоянно.

Могу записать пару коротких мувиков, где тот или иной враг ведет себя по-разному, чтобы сравнить, что изменилось в РАМ. Между прочим, если записать мувик в старом ППУ и потом врубить новое и запустить мувик, враги будут свести себя иначе при том же инпуте. Либо картина лага меняется, либо это свидетельство того, что действительно оно тикает между кадрами.

Один из примеров заметности влияния РНГ на игру:
Когда лупим робомануса, надо юзать самый быстрый удар, который не дает боссу летать по экрану - нижний удар кулаками. Чтобы его активизировать, надо попробовать нажимать разные кнопки в кадр ПЕРЕД ударом. Это будет изменять тип удара. Сказывается инпут обоих игроков, даже если они в этот момент находятся в какой-то своей анимации. То есть, не координаты влияют, а именно инпут.

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3267
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #10 : 07 Август 2012, 16:34:10 »
Ti_,  с какого адреса начинается список врагов первого уровня? Сейчас пытался взломать, получилось только сломать графу и сделать туеву хучу серых свиней и ходуль :?
Для рома адресс 1E844;  В конфигах - objID, точка появляения - 2байта, еще по два на место появления XYZ, и последние два на аттрибуты. (в bt$dd один из них за жизни отвечал, тут не проверял)

BANK3:E834 level1_cfg:     .BYTE    1,   0,   0,   0, $60,   1, $78,   2, $10,  $A, $20
BANK3:E834                 .BYTE    2,   0,   0,   0, $80,   1, $78,   2, $10, $14, $20
BANK3:E834                 .BYTE    6,   0,   0,   0, $70,   1, $78,   1, $C0, $60, $20
BANK3:E834                 .BYTE    7,   0,   0,   0, $80,   1, $78,   1, $C0, $80, $20
BANK3:E834                 .BYTE  $22,   0,   0,   1, $30,   1, $48,   0, $D0, $55, $B0
BANK3:E834                 .BYTE  $20,   0,   0,   0, $2E,   1, $9B,   0, $90, $50,   0
BANK3:E834                 .BYTE  $20,   0,   0,   0, $CE,   1, $7B,   0, $90, $48,   0
BANK3:E834                 .BYTE  $22,   0, $60,   0, $E0,   1, $80,   0, $A8,   0, $10
BANK3:E834                 .BYTE    8,   0, $A0,   0, $EC,   1, $42,   0, $98,   1, $20
BANK3:E834                 .BYTE    8,   0, $A0,   1, $6C,   1, $42,   0, $98,   1, $20
BANK3:E834                 .BYTE   $B,   0, $A0,   0, $F0,   1, $48,   0, $90, $FF, $10
BANK3:E834                 .BYTE   $B,   0, $A0,   1, $70,   1, $48,   0, $90, $FF, $10
BANK3:E834                 .BYTE  $22,   0, $F0,   1, $70,   1, $90,   0, $A8,   0, $10
BANK3:E834                 .BYTE  $19,   1,   0,  $F,   0, $10,   0, $1C,   0,   1, $20
BANK3:E834                 .BYTE  $1F,   1, $10,   1, $88,   1, $48,   0, $99, $18, $10
BANK3:E834                 .BYTE   $A,   1, $50,   2, $50,   1, $80,   0, $B0,   0,   0
BANK3:E834                 .BYTE   $A,   1, $50,   2, $50,   1, $A0,   0, $B0, $1F,   0
BANK3:E834                 .BYTE    8,   1, $C0,   2, $4C,   1, $82,   0, $98,   1, $20
BANK3:E834                 .BYTE   $B,   1, $C0,   2, $50,   1, $88,   0, $90, $FF, $10
BANK3:E834                 .BYTE  $19,   2,   0,  $F, $16, $26,   0, $1C,   0,   1, $20
BANK3:E834                 .BYTE  $17,   2, $20,   3, $1F,   1, $70,   0, $A8,   0, $10
BANK3:E834                 .BYTE  $17,   2, $A0,   3, $9F,   1, $50,   0, $A8,   0, $20
BANK3:E834                 .BYTE    8,   3, $E0,   4, $10,   1, $22,   0, $78,   1, $20
BANK3:E834                 .BYTE   $B,   3, $E0,   4, $10,   1, $28,   0, $70, $FF, $10
BANK3:E834                 .BYTE    8,   3, $E0,   4, $D0,   1,   2,   0, $78,   1, $20
BANK3:E834                 .BYTE   $B,   3, $E0,   4, $D0,   1,   8,   0, $70, $FF, $10
BANK3:E834                 .BYTE  $20,   3, $E0,   4, $8E,   1, $5B,   0, $70, $C0,   0
BANK3:E834                 .BYTE   $A,   4, $40,   5, $40,   1, $10,   0, $90, $1F,   0
BANK3:E834                 .BYTE   $A,   4, $40,   5, $50,   1, $20,   0, $90, $1F,   0
BANK3:E834                 .BYTE   $A,   4, $40,   5, $60,   1, $30,   0, $90, $1F,   0
BANK3:E834                 .BYTE   $A,   4, $40,   5, $70,   1, $40,   0, $90, $1F,   0
BANK3:E834                 .BYTE  $30,   4, $51,   5, $50,   1, $28,   0, $80,   9,   0
BANK3:E834                 .BYTE   $D,   4, $D8,   5, $D8,   1, $20,   0, $2A,   0, $20
BANK3:E834                 .BYTE   $E,   6, $C0,   5, $C0,   1,   0,   0, $20, $26, $20
BANK3:E834                 .BYTE   $E,   6, $C0,   5, $C0,   1,   0,   0, $20, $E1, $20
BANK3:E834                 .BYTE   $F,   6, $C0,   5, $C0,   1,   0,   0, $93, $84, $20
BANK3:E834                 .BYTE  $FE


Добавлено позже:
 А можно и так :

Добавлено позже:
Ti_,  я имею в виду, эту ячейку (я склонен думать что их две) надо НАЙТИ.
Ячейки -  $25-$28, основная $25.  Из нее берется само число для взятия номера анимации одного из супер-ударов.  (число AND #$6  + $71)
Цитата
BANK0:A642                 LDA     rnd_value
BANK0:A644                 AND     #6
BANK0:A646                 ADC     #$71 ; 'q'      ; super-udari (4raznix)

С самим рандомом всё сложнее.  Судя по всему, рандом навечно зациклен и выполняется до прерывания, то есть всё оставшееся время после обработки физики игры игра тупо крутит рандом. 
В самом рандоме 2 участка кода. Первый тупо мешает 4значения рандом числа. Второй мешает эти числа с переменными игры - такими как счетчик кадров, координата X первой жабы,  координаты Y первых четырех объектов, ещё какая-то переменная объекта, ячейка (024).
Джойстики вроде не подмешиваются, но раз рандом выполняется всё время, то любое нажатие будет влиять. Так как код обрабатывая нажатие выполнится быстрее или медленне. Поэтому и возьмется рандом другой.   Плюс к самому рандому(первому) есть переходы из кода игры, от разных событий. 
А ещё есть код рандома в других местах рома , там например во время заставок. Но когда первый левел начинается, память очищается и начальное значение нулевое.

BANK0:871F random_cycle:                           ; CODE XREF: BANK0:8725j
BANK0:871F                 JSR     change_random_values
BANK0:8722                 JSR     random
BANK0:8725                 JMP     random_cycle
BANK0:8728
BANK0:8728 ; =============== S U B R O U T I N E =======================================
BANK0:8728
BANK0:8728
BANK0:8728 change_random_values:                   ; CODE XREF: BANK0:random_cyclep
BANK0:8728                 LDX     #3
BANK0:872A
BANK0:872A loc_0_872A:                             ; CODE XREF: change_random_values+18j
BANK0:872A                 LDA     rnd_value,X
BANK0:872C                 ADC     frame_counter
BANK0:872E                 SBC     objects_X_coor
BANK0:8731                 EOR     object_unkn
BANK0:8734                 EOR     random_value2,X
BANK0:8736                 SBC     byte_0_24,X
BANK0:8738                 ADC     objects_Y_cord,X
BANK0:873B                 ADC     frame_counter
BANK0:873D                 STA     rnd_value,X
BANK0:873F                 DEX
BANK0:8740                 BPL     loc_0_872A
BANK0:8742                 RTS
BANK0:8742 ; End of function change_random_values
BANK0:8742
BANK0:8743
BANK0:8743 ; =============== S U B R O U T I N E =======================================
BANK0:8743
BANK0:8743
BANK0:8743 random:                                 ; CODE XREF: BANK0:8722p
BANK0:8743                                         ; BANK0:BA8Bp ...
BANK0:8743                 LDA     rnd_value
BANK0:8745                 EOR     random_value4
BANK0:8747                 ADC     random_value3
BANK0:8749                 STA     random_value2
BANK0:874B                 LDA     random_value3
BANK0:874D                 ROL     A
BANK0:874E                 SBC     random_value4
BANK0:8750                 STA     random_value3
BANK0:8752                 EOR     random_value2
BANK0:8754                 STA     rnd_value
BANK0:8756                 RTS
BANK0:8756 ; End of function random


« Последнее редактирование: 07 Август 2012, 20:06:58 от Ti_ »

Оффлайн Roket

  • Пользователь
  • Сообщений: 3336
  • Пол: Мужской
  • Злой Котэ
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #11 : 07 Август 2012, 20:42:40 »
Спасибо. Кое -что уже сделал. А не знаешь где хранится смена блоков графики для спрайтов для первого и других уровней?

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3267
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #12 : 07 Август 2012, 20:48:55 »
Спасибо. Кое -что уже сделал. А не знаешь где хранится смена блоков графики для спрайтов для первого и других уровней?
Не знаю, в bt$dd это был объект $03,  правда тут что-то не видно его использования. Попробуй проверь объекты $08 и $09 ну и другие которые в списке обозначены как loc_.

Анимации ударов:

Оффлайн Roket

  • Пользователь
  • Сообщений: 3336
  • Пол: Мужской
  • Злой Котэ
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #13 : 07 Август 2012, 20:57:52 »
Цитата: Ti_
Попробуй проверь объекты $08 и $09 ну и другие которые в списке обозначены как loc_.

  Не, лок, это эффекты, когда взрываются стены и из них выходят свиньи. Их можно заменить на рядового врага.
Мне бы попытаться первого босса заменить на босса из пятого уровня, но поскольку у босса первого другой блок, то если вставить из пятого уровня босса, то у него будет бажная графика. 
Да кстати в Боевых жабах последний атрибут отвечает за жизни. 00 - жизней нет -враг бьётся с одного мощного удара, 10 с двух, 20 с трёх и так далее.

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3267
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #14 : 07 Август 2012, 21:16:19 »
Мне бы попытаться первого босса заменить на босса из пятого уровня, но поскольку у босса первого другой блок, то если вставить из пятого уровня босса, то у него будет бажная графика. 
Да кстати в Боевых жабах последний атрибут отвечает за жизни. 00 - жизней нет -враг бьётся с одного мощного удара, 10 с двух, 20 с трёх и так далее.
В БТ и ДД  СМД-шном так:   

Оффлайн Roket

  • Пользователь
  • Сообщений: 3336
  • Пол: Мужской
  • Злой Котэ
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #15 : 07 Август 2012, 21:39:13 »
Дай, всё равно если замочить такого босса то уровень не завершить. Так что я думаю первого босса пока не изменить. <_<

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3267
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #16 : 07 Август 2012, 23:59:56 »
Дай, всё равно если замочить такого босса то уровень не завершить. Так что я думаю первого босса пока не изменить. <_<

Оффлайн Roket

  • Пользователь
  • Сообщений: 3336
  • Пол: Мужской
  • Злой Котэ
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #17 : 08 Август 2012, 11:10:29 »
Ti_, а ну только если.  ;) Дай всё равно без нужного блока будет каша из спрайтов бывшего босса. Блок бы сменить на боссе уровня 1 на блок босса уровня 5 - тогда может чего и получится я думаю.

Оффлайн feos

  • Пользователь
  • Сообщений: 786
  • Пол: Мужской
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #18 : 08 Август 2012, 20:27:37 »
Непонятно, откуда берется это значение 0x7F для записи в 0x03C4.
Команда в дебаггере выглядит так:
07:D349:9D C1 03  STA $03C1,X @ $03C4 = #$7F
В РОМе:
0001D359: 9DC103 STA $03C1,XЯ так понимаю, он берет адрес первого объекта, отступает на X (=3) и пишет в этот адрес 0x7F из аккумулятора. Но с кодом не дружу и как прокрутить дебаггер вверх, соблюдя текущие значения, не понимаю.

Зато помониторил $B7-B8.
Желтым отмечены кадры, в которые меняется значение этого "слова". Коричневым приписано, какое значение оно принимает (то есть, откуда начинается чтение массива объектов). В кадр, когда зарегестрировался инпут равный 7F (кадр 3528), только 2 адреса в РАМ принимают то же значение, что и объект номер 4 (его адрес $03C4). $2A и $2C. Причем чтение объектов с $2C происходит позже.
« Последнее редактирование: 08 Август 2012, 21:06:05 от feos »

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3267
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #19 : 09 Август 2012, 13:33:43 »
В РОМе:
0001D359: 9DC103 STA $03C1,XЯ так понимаю, он берет адрес первого объекта, отступает на X (=3) и пишет в этот адрес 0x7F из аккумулятора. Но с кодом не дружу и как прокрутить дебаггер вверх, соблюдя текущие значения, не понимаю.
Вначале надо найти свободную ячейчку в памяти. Ячейка считается пустой если объект_ID (номер объекта нулевой), для этого используется цикл проверки первой пустой (начиная с 3-ей, так как 1 и 2 заняты игроками всегда).   X- счетчик цикла.


BANK3:FF38 get_obj_free_mem:                       ; CODE XREF: level_objects_load:loc_3000_D340p
BANK3:FF38                 LDX     #2
BANK3:FF3A
BANK3:FF3A loc_3000_FF3A:                          ; CODE XREF: get_obj_free_mem+Aj
BANK3:FF3A                 LDA     obj_id_memory,X
BANK3:FF3D                 BEQ     locret_3000_FF45
BANK3:FF3F                 INX
BANK3:FF40                 CPX     #$F
BANK3:FF42                 BNE     loc_3000_FF3A
BANK3:FF44                 DEX
BANK3:FF45
BANK3:FF45 locret_3000_FF45:                       ; CODE XREF: get_obj_free_mem+5j
BANK3:FF45                 RTS
BANK3:FF45 ; End of function get_obj_free_mem

Далее мы читаем число из адреса текущего конфиг поинтера в A.  (первое число - ID объекта)
 LDA     (lvl_cfg_adr),Y
Далее записываем из A в память объекта: STA     obj_id_memory,X  (тоже что ты написал sta $3C1,X); $3C1 - адрес нулевого объекта, а X- наше полученное добавчное значение номера. (например x=3= 4-ый объект )


BANK3:D340                 JSR     get_obj_free_mem
BANK3:D343                 BNE     locret_3000_D391
BANK3:D345
BANK3:D345 loc_3000_D345:                          ; CODE XREF: level_objects_load+7Ej
BANK3:D345                 LDY     #0
BANK3:D347                 LDA     (lvl_cfg_adr),Y
BANK3:D349                 STA     obj_id_memory,X

Чтобы найти из какой ячейки памяти считывается $7F, просто поставь брейкпоинт на предыдущую строчку:
LDA     (lvl_cfg_adr),Y  , таким образом увидишь адрес lvl_cfg_adr - текущий адрес поинтера откуда читать конфиги левелов.

 

Добавлено позже:
Коричневым приписано, какое значение оно принимает (то есть, откуда начинается чтение массива объектов).
Ну это можно было и не рисовать - т.к. длина строчки объекта = 11  ($0B) байт. Поэтому и получается так:
00 0B 16 21 2С 37 42 4D
Правда есть еще объект $FE - который состоит из одного байта, и может сместить всю строчку.

Объектов читается много, но создается меньше, потому что многие объекты получаются с нулевым ID. (то есть считаются пустышками и просто перезаписываются в одну и ту же ячейку)
То есть лучшим вариантом будет конечно если объект $7F создатся в первой же ячейке поскольку поинтер у нас сбивается на ($0000), а после него еще и что-то вроде  $ff или $fe будет, чтобы другие объекты не создавались и не вызывали баги и лаги.


Добавлено позже:
Причем чтение объектов с $2C происходит позже.
Ну значит с $2C и проходит чтение =$7F.  Так как $2A не является кратной длине строчки - то не является номером ID объекта.  А одним из параметров объекта с адреса $21.     С $2C понятно что позже у нас же объекты по порядку читаются, а не от балды.
« Последнее редактирование: 09 Август 2012, 14:08:50 от Ti_ »

Оффлайн feos

  • Пользователь
  • Сообщений: 786
  • Пол: Мужской
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #20 : 09 Август 2012, 19:37:42 »
Ключевой оказалась ячейка $16. В кадр 3527 именно на нее указывает $B7.
$D347:B1 B7     LDA ($B7),Y @ $0016 = #$7F
Но в трейс логе я не нашел $4017 == #$7F, хотя именно оттуда (2 джой) это число рождается и пишется также в $2A и $2C, хотя в 4 объект оно берется не из них. Вообще, вот список адресов, принимающих значение из 2 джоя в ключевой кадр и меняющихся одинаково с изменением инпута 2 джоя:
$16, $2a, $2c, $4e, $1f8, $27d, $3c4.

А в адресе $16 значение #$7F образуется каким-то магическим путем. Ведь значение $4017 во всей этой субрутине равно #$FF!

  $8683:20 78 8D  JSR $8D78                    A:90 X:00 Y:00 S:FD P:NVUBdIzc
    $8D78:A2 01     LDX #$01                     A:90 X:00 Y:00 S:FB P:NVUBdIzc
    $8D7A:8E 16 40  STX $4016 = #$FF             A:90 X:01 Y:00 S:FB P:nVUBdIzc
    $8D7D:CA        DEX                          A:90 X:01 Y:00 S:FB P:nVUBdIzc
    $8D7E:8E 16 40  STX $4016 = #$FF             A:90 X:00 Y:00 S:FB P:nVUBdIZc
    $8D81:A2 08     LDX #$08                     A:90 X:00 Y:00 S:FB P:nVUBdIZc
    $8D83:AD 16 40  LDA $4016 = #$FF             A:90 X:08 Y:00 S:FB P:nVUBdIzc
    $8D86:6A        ROR                          A:40 X:08 Y:00 S:FB P:nVUBdIzc
    $8D87:26 15     ROL $0015 = #$30             A:20 X:08 Y:00 S:FB P:nVUBdIzc
    $8D89:AD 17 40  LDA $4017 = #$FF             A:20 X:08 Y:00 S:FB P:nVUBdIzc
    $8D8C:6A        ROR                          A:40 X:08 Y:00 S:FB P:nVUBdIzc
    $8D8D:26 16     ROL $0016 = #$02             A:20 X:08 Y:00 S:FB P:nVUBdIzc
    $8D8F:CA        DEX                          A:20 X:08 Y:00 S:FB P:nVUBdIzc
    $8D90:D0 F1     BNE $8D83                    A:20 X:07 Y:00 S:FB P:nVUBdIzc
    $8D83:AD 16 40  LDA $4016 = #$FF             A:20 X:07 Y:00 S:FB P:nVUBdIzc
    $8D86:6A        ROR                          A:40 X:07 Y:00 S:FB P:nVUBdIzc
    $8D87:26 15     ROL $0015 = #$60             A:20 X:07 Y:00 S:FB P:nVUBdIzc
    $8D89:AD 17 40  LDA $4017 = #$FF             A:20 X:07 Y:00 S:FB P:NVUBdIzc
    $8D8C:6A        ROR                          A:41 X:07 Y:00 S:FB P:nVUBdIzc
    $8D8D:26 16     ROL $0016 = #$04             A:20 X:07 Y:00 S:FB P:nVUBdIzC
    $8D8F:CA        DEX                          A:20 X:07 Y:00 S:FB P:nVUBdIzc
    $8D90:D0 F1     BNE $8D83                    A:20 X:06 Y:00 S:FB P:nVUBdIzc
    $8D83:AD 16 40  LDA $4016 = #$FF             A:20 X:06 Y:00 S:FB P:nVUBdIzc
    $8D86:6A        ROR                          A:40 X:06 Y:00 S:FB P:nVUBdIzc
    $8D87:26 15     ROL $0015 = #$C0             A:20 X:06 Y:00 S:FB P:nVUBdIzc
    $8D89:AD 17 40  LDA $4017 = #$FF             A:20 X:06 Y:00 S:FB P:NVUBdIzC
    $8D8C:6A        ROR                          A:41 X:06 Y:00 S:FB P:nVUBdIzC
    $8D8D:26 16     ROL $0016 = #$09             A:A0 X:06 Y:00 S:FB P:NVUBdIzC
    $8D8F:CA        DEX                          A:A0 X:06 Y:00 S:FB P:nVUBdIzc
    $8D90:D0 F1     BNE $8D83                    A:A0 X:05 Y:00 S:FB P:nVUBdIzc
    $8D83:AD 16 40  LDA $4016 = #$FF             A:A0 X:05 Y:00 S:FB P:nVUBdIzc
    $8D86:6A        ROR                          A:40 X:05 Y:00 S:FB P:nVUBdIzc
    $8D87:26 15     ROL $0015 = #$80             A:20 X:05 Y:00 S:FB P:nVUBdIzc
    $8D89:AD 17 40  LDA $4017 = #$FF             A:20 X:05 Y:00 S:FB P:nVUBdIZC
    $8D8C:6A        ROR                          A:41 X:05 Y:00 S:FB P:nVUBdIzC
    $8D8D:26 16     ROL $0016 = #$13             A:A0 X:05 Y:00 S:FB P:NVUBdIzC
    $8D8F:CA        DEX                          A:A0 X:05 Y:00 S:FB P:nVUBdIzc
    $8D90:D0 F1     BNE $8D83                    A:A0 X:04 Y:00 S:FB P:nVUBdIzc
    $8D83:AD 16 40  LDA $4016 = #$FF             A:A0 X:04 Y:00 S:FB P:nVUBdIzc
    $8D86:6A        ROR                          A:40 X:04 Y:00 S:FB P:nVUBdIzc
    $8D87:26 15     ROL $0015 = #$00             A:20 X:04 Y:00 S:FB P:nVUBdIzc
    $8D89:AD 17 40  LDA $4017 = #$FF             A:20 X:04 Y:00 S:FB P:nVUBdIZc
    $8D8C:6A        ROR                          A:41 X:04 Y:00 S:FB P:nVUBdIzc
    $8D8D:26 16     ROL $0016 = #$27             A:20 X:04 Y:00 S:FB P:nVUBdIzC
    $8D8F:CA        DEX                          A:20 X:04 Y:00 S:FB P:nVUBdIzc
    $8D90:D0 F1     BNE $8D83                    A:20 X:03 Y:00 S:FB P:nVUBdIzc
    $8D83:AD 16 40  LDA $4016 = #$FF             A:20 X:03 Y:00 S:FB P:nVUBdIzc
    $8D86:6A        ROR                          A:40 X:03 Y:00 S:FB P:nVUBdIzc
    $8D87:26 15     ROL $0015 = #$00             A:20 X:03 Y:00 S:FB P:nVUBdIzc
    $8D89:AD 17 40  LDA $4017 = #$FF             A:20 X:03 Y:00 S:FB P:nVUBdIZc
    $8D8C:6A        ROR                          A:41 X:03 Y:00 S:FB P:nVUBdIzc
    $8D8D:26 16     ROL $0016 = #$4F             A:20 X:03 Y:00 S:FB P:nVUBdIzC
    $8D8F:CA        DEX                          A:20 X:03 Y:00 S:FB P:NVUBdIzc
    $8D90:D0 F1     BNE $8D83                    A:20 X:02 Y:00 S:FB P:nVUBdIzc
    $8D83:AD 16 40  LDA $4016 = #$FF             A:20 X:02 Y:00 S:FB P:nVUBdIzc
    $8D86:6A        ROR                          A:40 X:02 Y:00 S:FB P:nVUBdIzc
    $8D87:26 15     ROL $0015 = #$00             A:20 X:02 Y:00 S:FB P:nVUBdIzc
    $8D89:AD 17 40  LDA $4017 = #$FF             A:20 X:02 Y:00 S:FB P:nVUBdIZc
    $8D8C:6A        ROR                          A:41 X:02 Y:00 S:FB P:nVUBdIzc
    $8D8D:26 16     ROL $0016 = #$9F             A:20 X:02 Y:00 S:FB P:nVUBdIzC
    $8D8F:CA        DEX                          A:20 X:02 Y:00 S:FB P:nVUBdIzC
    $8D90:D0 F1     BNE $8D83                    A:20 X:01 Y:00 S:FB P:nVUBdIzC
    $8D83:AD 16 40  LDA $4016 = #$FF             A:20 X:01 Y:00 S:FB P:nVUBdIzC
    $8D86:6A        ROR                          A:40 X:01 Y:00 S:FB P:nVUBdIzC
    $8D87:26 15     ROL $0015 = #$00             A:A0 X:01 Y:00 S:FB P:NVUBdIzc
    $8D89:AD 17 40  LDA $4017 = #$FF             A:A0 X:01 Y:00 S:FB P:nVUBdIZc
    $8D8C:6A        ROR                          A:41 X:01 Y:00 S:FB P:nVUBdIzc
    $8D8D:26 16     ROL $0016 = #$3F             A:20 X:01 Y:00 S:FB P:nVUBdIzC
    $8D8F:CA        DEX                          A:20 X:01 Y:00 S:FB P:nVUBdIzc
    $8D90:D0 F1     BNE $8D83                    A:20 X:00 Y:00 S:FB P:nVUBdIZc
    $8D92:A5 15     LDA $0015 = #$00             A:20 X:00 Y:00 S:FB P:nVUBdIZc
    $8D94:AA        TAX                          A:00 X:00 Y:00 S:FB P:nVUBdIZc
    $8D95:45 29     EOR $0029 = #$10             A:00 X:00 Y:00 S:FB P:nVUBdIZc
    $8D97:86 29     STX $0029 = #$10             A:10 X:00 Y:00 S:FB P:nVUBdIzc
    $8D99:25 15     AND $0015 = #$00             A:10 X:00 Y:00 S:FB P:nVUBdIzc
    $8D9B:85 2B     STA $002B = #$10             A:00 X:00 Y:00 S:FB P:nVUBdIZc
    $8D9D:A5 16     LDA $0016 = #$7F             A:00 X:00 Y:00 S:FB P:nVUBdIZc
    $8D9F:AA        TAX                          A:7F X:00 Y:00 S:FB P:nVUBdIzc
    $8DA0:45 2A     EOR $002A = #$00             A:7F X:7F Y:00 S:FB P:nVUBdIzc
    $8DA2:86 2A     STX $002A = #$00             A:7F X:7F Y:00 S:FB P:nVUBdIzc
    $8DA4:25 16     AND $0016 = #$7F             A:7F X:7F Y:00 S:FB P:nVUBdIzc
    $8DA6:85 2C     STA $002C = #$00             A:7F X:7F Y:00 S:FB P:nVUBdIzc
    $8DA8:60        RTS                          A:7F X:7F Y:00 S:FB P:nVUBdIzc
  $8686:A4 10     LDY $0010 = #$03     

Вот весь лог от начала кадра 3527 до записи #$7F в $16.
http://pastebin.com/Guq1NCK1

Добавлено позже:
О, так ведь первый джой получается связан с ячейкой $15, а второй с $16!
« Последнее редактирование: 09 Август 2012, 20:00:34 от feos »

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3267
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #21 : 09 Август 2012, 20:13:59 »
Добавлено позже:
О, так ведь первый джой получается связан с ячейкой $15, а второй с $16!
Посмотри внимательно - в том логе что ты выложил она как раз и образуется командами ROL ($16)  - битовый сдвиг.

Оффлайн feos

  • Пользователь
  • Сообщений: 786
  • Пол: Мужской
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #22 : 09 Август 2012, 20:24:19 »
Да я вижу, просто не врубаюсь в саму суть этих последовательных ROL'ов а также, почему он не показывает значение джоя равным 7F. Можешь на пальцах объяснить, как в ячейке 16 образуется 7F?

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3267
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #23 : 09 Август 2012, 20:40:17 »
Да я вижу, просто не врубаюсь в саму суть этих последовательных ROL'ов а также, почему он не показывает значение джоя равным 7F. Можешь на пальцах объяснить, как в ячейке 16 образуется 7F?
Ну это просто особенности команд. По каким-то соображениям создатели проца сделали добавление битов из статуса (флагов результатов операций) ко многим командам.  Ты наверно видел в коде NES операции ADC #0.  А нафига добавлять ничего...просто там еще может добавится бит из статус регистра. Поэтому в итоге добавится 1, а не 0.(если бит окажется =1).
С ROL точно также, там перед ней идет команда ROR.. поворот числа направо на 1бит. И если бит окажется 1 то и флаг результата в процессоре будет 1. (флаг carry)
А команда ROR наоборот двигает число влево, поэтому в него и запишется  значение этого флага.
На Сеговском проце такое же есть, только там для таких фич выделили отдельные вариации команд ADDX и roxl.
По этим же причинам они везде например при сложнении и пихают толи CLC (clear flag carry) толи SEC(set carry), дабы в значение не попало лишний бит.




Добавлено позже:
А ячеек несколько используется, потому что например опрос джойстиков создают не только на нажатие кнопки , а на нажатие и зажатие. (ну и мб даже отпускание кнопки бывает)
Поэтому четыре ячейки - 2 игрока -  и для каждого текущее нажатие кнопки считывается, и еще используется предыдущее. В одной ячейке будет значение в тот момент когда нажал, и в следующем кадре обнулится уже, а в другой ячейке будет хранится пока кнопку не отпустишь.
« Последнее редактирование: 09 Август 2012, 20:57:40 от Ti_ »

Оффлайн feos

  • Пользователь
  • Сообщений: 786
  • Пол: Мужской
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #24 : 09 Август 2012, 21:07:49 »
То есть...

00000D99: AD1740 LDA $4017
00000D9C: 6A ROR A
00000D9D: 2616 ROL $16

Имеем число 0111 1111, загруженное в аккумулятор из джоя.
Делаем ROR. Получаем 1011 1111, да плюс 1 в carry флаге, так?
Потом обратно делаем ROL, то есть возвращаем 0111 1111 и пишем в ячейку $16 штоль?
А флаг потом просто для прыжков юзается?

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3267
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #25 : 09 Август 2012, 21:15:08 »
Потом обратно делаем ROL, то есть возвращаем 0111 1111 и пишем в ячейку $16 штоль?
А флаг потом просто для прыжков юзается?

Такой код тут использован потому что там из порта джойстика $4016 нельзя считать целиком все биты кнопок за 1 команду, поэтому приходится перекидывать по одному биту.
« Последнее редактирование: 09 Август 2012, 21:25:25 от Ti_ »

Оффлайн feos

  • Пользователь
  • Сообщений: 786
  • Пол: Мужской
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #26 : 09 Август 2012, 21:37:02 »
Дошло!!! Оно пуляет по 1 биту из джоя в $16 до тех пор, пока значение $16 не сравняется со значением джоя (то есть 8 раз), и потом выходит из субрутины!

А запоминание предыдущего инпута там необходимо, чтобы работало ускорение и несколько трюков связанных с ним:
Нажали, отпустили, снова нажали ВПЕРЕД ->
Держим ВПЕРЕД - перс бежит;
Держим ПРЫЖОК - перс делает гипер-прыжок;
Держим ВВЕРХ или ВНИЗ рядом с лестницей - перс бежит по лестнице

Добавлено позже:
ПОСЛЕДНИЙ ВОПРОС на сегодня: откуда он берет, что именно в эти кадры надо увеличивать поинтер? Что я заметил - прямо перед рестартом он начинает автоматически КАЖДЫЙ КАДР увеличивать его на 11, за исключением лаговых кадров. Потом натыкается на #$7F и просто запускает конец. Команду увеличения поинтера я нашел, но когда он ее выполняет?
Добавлено позже:

Ну вот, разобрался. Он в начале уровня, или (что то же самое) на рестарте загружает необходимые объекты по очереди:
посреди лага загружаются жабы, потом после лага загружается точка рестарта, потом враги по очереди, и далее уровень идет своим чередом, загружая объекты когда надо.
« Последнее редактирование: 09 Август 2012, 22:34:57 от feos »

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3267
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #27 : 10 Август 2012, 00:00:00 »
ПОСЛЕДНИЙ ВОПРОС на сегодня: откуда он берет, что именно в эти кадры надо увеличивать поинтер? Что я заметил - прямо перед рестартом он начинает автоматически КАЖДЫЙ КАДР увеличивать его на 11, за исключением лаговых кадров. Потом натыкается на #$7F и просто запускает конец. Команду увеличения поинтера я нашел, но когда он ее выполняет?
Это происходит потому что чтение конфига не зациклено - он не будет выполнять проверку на чтение следующего объекта, если уже создал один, даже если объекты одинаковые и должны появится в одной точке. То есть вызов функции 'прочитать и проверить следующий объект' произойдет всего 1 раз за игровой 'цикл'. (jsr level_config_reading).  Если игра идет во все 60fps то и получается что создается каждый кадр.


Исключение - загрузка уровня. Там строчка jsr level_config_reading  продублирована. То есть загрузятся два объекта одновременно. (и это будут жабы игрока 1 и 2 , т.к. они всегда вначале уровней прописаны).


Можешь скачать из темы хаков NES рипы конфигов уровней, там есть и куски кода подгрузки объекта.
[NES] Хаки на любой вкус
« Последнее редактирование: 10 Август 2012, 00:11:10 от Ti_ »

Оффлайн Roket

  • Пользователь
  • Сообщений: 3336
  • Пол: Мужской
  • Злой Котэ
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #28 : 13 Август 2012, 12:39:33 »
Мега глюк в Battletoads Double Dragon . Пушка стреляет вторым игроком. :lol:

Оффлайн Yaranga

  • Администратор
  • Сообщений: 13832
  • Пол: Мужской
    • Просмотр профиля
Re: [NES] Battletoads / Battletoads & Double Dragon
« Ответ #29 : 13 Август 2012, 12:42:19 »
Roket, дык она им не стреляет, она его весело подбивает своими пульками с разных точек, по-моему это никакой не глюк, так и задумывалось изначально...