На первый взгляд там 10 указателей на такие экраны, но это еще проверить нужно.
Blue Marline(Nes)
Сообщений 41 страница 45 из 45
Поделиться422006-09-12 12:52:47
Когда я писал верхний пост, то сначала написал "Там в игре 10 таких экранов", но потом подумал что могу ошибаться - давно не играл, и написал "как минимум штук 6"... Вот ведь как бывает ;о)
Поделиться432006-09-12 22:15:34
Griever, а может пока я пакер пишу ты разберёшься, как программа определяет когда пора заканчивать распаковку, а то я сделал по адресам, но это не совсем правильно, так как в роме есть указатель только на начало пакета, а конец как-то вычисляется.
Хорошо, если тебе всё ещё это интересно, то пожалуйста:
По адресу $a2d5 (если ты помнишь, это перед самым началом нашей тайловой карты) есть два байта: $1E и $3E. Они XOR'ятся и получается $20 - объём извлекаемых данных, характерный для этой карты(не знаю, почему именно двадцать и почему нельзя распаковать сразу весь экран). Он сохраняется в ячейку $02 и $304. Первая используется при копировании уже распакованных данных в PPU, а вторая - при первичной распаковке в RAM. И потом командой по адресу 8037 в первом случае и С338 во втором постоянно сравнивается с нулём после декремента. Казалось бы: почему $20, ведь экран
на NES состоит из 32*20 тайлов? На самом деле после распаковки 32-х тайлов в RAM, их сразу сбрасывают в PPU. Поэтому распаковка осуществляется этакими "блоками" по 32 тайла. Значит экран будет заполнен после тридцати таких "итераций" (учёба в вузе пополнила мой лексикон =)) Так вот, в принципе, можно поставить счётчик на блоки, и закончить распаковку на тридцатом блоке. Ну ещё можно поставить условие, что если в 304 будет записано не $20, а $08, то распаковка должна закончиться. В отношении нашей карты я встретил такую ситуацию, когда производилось чтение из рома по адресу $A461.
Не знаю точно - сработает ли, но конец карты должен быть именно там. Эта ситуация объясняется тем что после распаковки тайловых карт сразу начинается распаковка таблиц аттрибутов(23с0-2400), которая в свою очередь
скидывается в PPU в блоках по 8 (восемь итераций). Поэтому, как только начинается распаковка аттрибутов - прекращаем распаковку.
Примечательно что в ячейках $301 и $302 содержится адрес PPU, относящийся к области тайловых карт, с которого следует возобновить
распаковку индексов. Причём они не загружаются из рома, а к ним прибавляется постоянно число $20, которое предварительно
берётся из рома по адресу $a29d
Поделиться442006-09-13 08:22:07
Ну, блоки я и сам видел, а вот то, что их должно быть двадцать как-то не догадался, но это погоды не делает придётся так оставить, по адресам.
Поделиться452006-09-13 22:47:52
Ну я и написал это для того, чтобы показать, что у алгоритма нет какого-то кода завершения распаковки. А вообще - можно, наверное, просто отследить загрузку вомьмерки(см. выше)