151. Марат - 26 Октября, 2018 - 19:13:43 - перейти к сообщению
Ну, MTE/DTE по-любому не сожмёт лучше хаффмана. Только если после DTE/MTE сжать ещё и хаффманом, может быть, будет толк.
152. Griever - 27 Октября, 2018 - 21:26:58 - перейти к сообщению
Марат пишет:
Ну, MTE/DTE по-любому не сожмёт лучше хаффмана.
Не уверен. Я взял скрипт Battletoads & Double Dragon. Сжатие оригинальным Хаффманом дало 1495 байт экономии (вместе с деревом). А грубая прикидка инструментом CUE дала 2295 байт экономии на ~200 найденных сочетаниях. Если учесть ~800 байт на словарь, экономия с MTE будет около тех же 1495.
Но, видимо, даже в лучшем случае, коэффициенты сжатия примерно одинаковы. Если нужно ужаться процентов на 5, можно попробовать. Больше - нет смысла.
153. alex_231 - 28 Октября, 2018 - 01:09:02 - перейти к сообщению
Ужать нужно 170 кб текста в 97 кб свободного места.
После использования МТЕ излишек составляет чуть больше 10 кб, после DTE - 7 кб, после Хаффмана - 6 кб.
Иного варианта, кроме кастрации скрипта, к сожалению, не вижу
После использования МТЕ излишек составляет чуть больше 10 кб, после DTE - 7 кб, после Хаффмана - 6 кб.
Иного варианта, кроме кастрации скрипта, к сожалению, не вижу
154. Mefistotel - 28 Октября, 2018 - 11:04:15 - перейти к сообщению
Может, у китайцев перенять смену маппера)?
155. alex_231 - 29 Октября, 2018 - 04:34:55 - перейти к сообщению
Я честно пытался, но дальше логотипа Enix игра отказывается работать, так как не получается запрограммировать смену банка для блоков $C000 - $FFFF. В оригинальной игре там переключение идет между банками $0F и $1F, а после смены маппера я не смог заставить его переключаться, хотя у китайцев это переключение работает, его аналог в моем исполнении ничего не переключает
156. Mefistotel - 30 Октября, 2018 - 00:06:44 - перейти к сообщению
Что скажут коллеги по цеху?
157. Griever - 30 Октября, 2018 - 21:57:34 - перейти к сообщению
Покажи хоть как пытался - дай версию рома, на которой застопорился.
158. alex_231 - 31 Октября, 2018 - 03:01:25 - перейти к сообщению
Вот.
Переключение банков (рабочее) прописано по адресу x7FFAF, плюс по адресу x7F0C2 убрал обработку прерывания (хотя, возможно, зря), которое так же рушило процесс.
Переключение банков (не рабочее) - x7C9B4, чтобы его поймать, нужно ставить бряк на $6CC2.
Переключение банков (рабочее) прописано по адресу x7FFAF, плюс по адресу x7F0C2 убрал обработку прерывания (хотя, возможно, зря), которое так же рушило процесс.
Переключение банков (не рабочее) - x7C9B4, чтобы его поймать, нужно ставить бряк на $6CC2.
159. alex_231 - 31 Октября, 2018 - 03:10:48 - перейти к сообщению
В данном маппере переключение банков производится записью номера слота в $8000 и номера банка в $8001, слоты и банки размером по 8 кб.
Слот $8000-$9FFF имеет номер h06, слот $A000-$BFFF - h07, это проверено и точно работает.
Слот $C000-$DFFF должен иметь номер h00, слот $E000-$FFFF - h01, у меня это не работает, но в китайском Dragon Quest VII переключает.
Слот $8000-$9FFF имеет номер h06, слот $A000-$BFFF - h07, это проверено и точно работает.
Слот $C000-$DFFF должен иметь номер h00, слот $E000-$FFFF - h01, у меня это не работает, но в китайском Dragon Quest VII переключает.
160. Griever - 31 Октября, 2018 - 21:37:39 - перейти к сообщению
alex_231 пишет:
Вот.
Переключение банков (рабочее) прописано по адресу x7FFAF, плюс по адресу x7F0C2 убрал обработку прерывания (хотя, возможно, зря), которое так же рушило процесс.
Переключение банков (не рабочее) - x7C9B4, чтобы его поймать, нужно ставить бряк на $6CC2.
Переключение банков (рабочее) прописано по адресу x7FFAF, плюс по адресу x7F0C2 убрал обработку прерывания (хотя, возможно, зря), которое так же рушило процесс.
Переключение банков (не рабочее) - x7C9B4, чтобы его поймать, нужно ставить бряк на $6CC2.
Ну, для начала,
CODE:
0x06 42 -> 52
0x07 00 -> F0
0x07 00 -> F0
У китайского дампа ошибка в хедере, которая фиксится эмуляторным костылём .
До Эникса проходит. Ты знаешь, что делать дальше?
161. alex_231 - 31 Октября, 2018 - 23:53:16 - перейти к сообщению
Дальше он в какой-то момент пытается переключить банк в слоте $C000-$FFFF с h1F на h0F, но я не могу его заставить это сделать с новым маппером.
162. Марат - 01 Ноября, 2018 - 19:43:42 - перейти к сообщению
alex_231 пишет:
В данном маппере переключение банков производится записью номера слота в $8000 и номера банка в $8001, слоты и банки размером по 8 кб.
Слот $8000-$9FFF имеет номер h06, слот $A000-$BFFF - h07, это проверено и точно работает.
Слот $C000-$DFFF должен иметь номер h00, слот $E000-$FFFF - h01, у меня это не работает, но в китайском Dragon Quest VII переключает.
Слот $8000-$9FFF имеет номер h06, слот $A000-$BFFF - h07, это проверено и точно работает.
Слот $C000-$DFFF должен иметь номер h00, слот $E000-$FFFF - h01, у меня это не работает, но в китайском Dragon Quest VII переключает.
Где ты это вычитал? Согласно https://wiki.nesdev.com/w/index.php/MMC3 ,
Слот $8000-$9FFF имеет номер R06, слот $A000-$BFFF - R07, как ты и пишешь, но
слот $C000-$DFFF также имеет номер R06, а слот $E000-$FFFF вообще непереключаемый и всегда закреплен за последним банком. Чтобы поменять слот $C000-$DFFF, надо писать что-то типа:
CODE:
LDA #$46
STA $8000
LDA #$XX
STA $8001
LDA #$46
STA $8000
LDA #$XX
STA $8001
после этого предпоследний банк будет уже закреплен за слотом $8000-$9FFF,
а в слоте $C000-$DFFF будет тот банк, который мы выбрали.
163. Марат - 01 Ноября, 2018 - 19:47:14 - перейти к сообщению
alex_231 пишет:
Дальше он в какой-то момент пытается переключить банк в слоте $C000-$FFFF с h1F на h0F, но я не могу его заставить это сделать с новым маппером.
Разве последний банк можно переключать? Там же, по-моему, вектора прерывания находятся.
164. alex_231 - 02 Ноября, 2018 - 03:33:27 - перейти к сообщению
Я это нигде не вычитывал, а увидел во время выполнения кода китайского рома.
И да, последний банк не должен быть переключаемым, но он переключается и в DW4 и у китайцев, я сам был в шоке, но как-то оно работает.
Можешь сам посмотреть на оригинальном роме DW4, поставив бряк на $6CAD.
Там до этой подпрограммы код читается из банка h1F, а после JSR уже из банка h0F.
У китайцев там немного не так, сейчас пересмотрел повнимательней:
при записи в $8000 байта h00 и в $8001 байта h00 происходит переключение всех банков, в слот $8000-$BFFF подключается банк $0000-$3FFF, а в слот $С000-$FFFF банк $7C000-$7FFFF,
а при записи в $8000 байта h00 и в $8001 байта h02 все банки переключаются на следующую страницу рома - в $8000-$BFFF - банк $80000-$83FFF, а в $C000-$FFFF - банк $FC000-$FFFFF.
А у меня это переключение почему-то не работает.
И да, последний банк не должен быть переключаемым, но он переключается и в DW4 и у китайцев, я сам был в шоке, но как-то оно работает.
Можешь сам посмотреть на оригинальном роме DW4, поставив бряк на $6CAD.
Там до этой подпрограммы код читается из банка h1F, а после JSR уже из банка h0F.
У китайцев там немного не так, сейчас пересмотрел повнимательней:
при записи в $8000 байта h00 и в $8001 байта h00 происходит переключение всех банков, в слот $8000-$BFFF подключается банк $0000-$3FFF, а в слот $С000-$FFFF банк $7C000-$7FFFF,
а при записи в $8000 байта h00 и в $8001 байта h02 все банки переключаются на следующую страницу рома - в $8000-$BFFF - банк $80000-$83FFF, а в $C000-$FFFF - банк $FC000-$FFFFF.
А у меня это переключение почему-то не работает.
165. Марат - 02 Ноября, 2018 - 08:03:03 - перейти к сообщению
С оригиналом понятно. Там маппер подключает либо первые 256 КБ, либо вторые. И последние банки, видимо, у них одинаковые или, по крайней мере, содержат прерывания и идентичный код. А в китайском клон mmc3, который тоже переключает страницу, но по 512 КБ. Теперь более менее понятно. Через регистр R0 выбираем первые или вторые 512 КБ, а через регистры R6, R7 нужный банк. Непонятно, правда, почему у тебя не работает. Буду дома попробую поэкспериментировать.
166. Марат - 02 Ноября, 2018 - 16:48:25 - перейти к сообщению
Griever пишет:
Ну, для начала,
CODE:
0x06 42 -> 52
0x07 00 -> F0
У китайского дампа ошибка в хедере, которая фиксится эмуляторным костылём .
CODE:
0x06 42 -> 52
0x07 00 -> F0
У китайского дампа ошибка в хедере, которая фиксится эмуляторным костылём .
Вот же Гривер, оказывается написал причину, почему у тебя не переключается банк.
Надо именно эти значения записать в хедер, так как игра использует 245 маппер, клон mmc3.
И в мессадже лог, должна появиться надпись Mapper #: 245.
Если исправишь, то будут переключаться банки.
167. Griever - 02 Ноября, 2018 - 22:31:38 - перейти к сообщению
alex_231 пишет:
Дальше он в какой-то момент пытается переключить банк в слоте $C000-$FFFF с h1F на h0F, но я не могу его заставить это сделать с новым маппером.
Нет. Скорректируй хедер и посмотри, что все нормально работает, включая экран Эникса.
Дальше виснет, потому что твой код в PRG RAM постоянно переключает нулевой банк, а не тот, который нужен для дальнейшего выполнения программы.
Полагаю, это твой код для тренировки.
168. alex_231 - 03 Ноября, 2018 - 01:03:58 - перейти к сообщению
Ок, спасибо, что-то я про исправление маппера забыл совсем. Посмотрю, что получится.
169. alex_231 - 06 Ноября, 2018 - 10:09:22 - перейти к сообщению
Да, переключение заработало, теперь осталось нормально перепрограммировать переключение банков.
170. alex_231 - 07 Ноября, 2018 - 10:04:09 - перейти к сообщению
Вот и получается, как я и говорил, довольно долго, так как приходится трейсить весь код и отслеживать соответствие работе оригинала.
171. alex_231 - 09 Ноября, 2018 - 04:55:14 - перейти к сообщению
Вот прям не знаю, вроде бы, корректно переписал переключение, и переместил банки куда нужно и игра, вроде бы, запускается, но...
ни name table mirroring нормально не определяется, ни спрайты нормально не рисуются, а что самое паршивое - в произвольный момент времени игра может зависнуть из-за неожиданного прерывания, которое вылезает посреди процедуры переключения банков.
Плюс ещё в самом начале новый маппер свинью подкладывает и прерывания срабатывают совершенно не так как в оригинале.
Боюсь руками я это все-таки доделать не смогу, нужен тотальный дизасм и пересборка кода с нуля, но для меня это непосильная задача
ни name table mirroring нормально не определяется, ни спрайты нормально не рисуются, а что самое паршивое - в произвольный момент времени игра может зависнуть из-за неожиданного прерывания, которое вылезает посреди процедуры переключения банков.
Плюс ещё в самом начале новый маппер свинью подкладывает и прерывания срабатывают совершенно не так как в оригинале.
Боюсь руками я это все-таки доделать не смогу, нужен тотальный дизасм и пересборка кода с нуля, но для меня это непосильная задача
172. Griever - 09 Ноября, 2018 - 22:28:08 - перейти к сообщению
alex_231 пишет:
в произвольный момент времени игра может зависнуть из-за неожиданного прерывания, которое вылезает посреди процедуры переключения банков.
Попробуй SEI в начале переключения с CLI в конце.
173. alex_231 - 10 Ноября, 2018 - 04:18:48 - перейти к сообщению
Там какое-то прерывание, которое игнорирует флаг I, он установлен, но оно все равно срабатывает.
174. Марат - 10 Ноября, 2018 - 06:53:10 - перейти к сообщению
Отследи адрес прерывания и посмотри в какой ячейке векторов прерываний он лежит. Скорее всего это прерывание по кадрам.
175. alex_231 - 12 Ноября, 2018 - 01:56:11 - перейти к сообщению
Да, это NMI, но это мне ничем не поможет, я не особо понимаю, как на него можно повлиять.
176. Марат - 12 Ноября, 2018 - 15:01:32 - перейти к сообщению
Оно и не должно негативно влиять на игру. Это происходит во время переключения любого банка или в последнем слоте?
177. alex_231 - 13 Ноября, 2018 - 03:08:06 - перейти к сообщению
Оно случайно попадает в любое переключение банка и там где-то при работе со стэком нарисовывается косяк, из-за которого RTI идет не туда куда нужно (только сейчас понял, что происходит).
Буду ковырять.
Буду ковырять.
178. alex_231 - 13 Ноября, 2018 - 03:50:27 - перейти к сообщению
Ага, это победил, но со спрайтами всё-равно косяк.
Почему-то после смены маппера первый слот PPU ($0000-$0800) постоянно переключается туда сюда, между первой и второй страницей памяти, при этом сама видеопамять не изменяется, но в окне PPU Viewer видно как меняются тайлы. Хотя в оригинале ничего такого не было.
Почему-то после смены маппера первый слот PPU ($0000-$0800) постоянно переключается туда сюда, между первой и второй страницей памяти, при этом сама видеопамять не изменяется, но в окне PPU Viewer видно как меняются тайлы. Хотя в оригинале ничего такого не было.
179. Марат - 13 Ноября, 2018 - 07:35:36 - перейти к сообщению
А ты оригинальный код переключения банков удалил везде?
180. alex_231 - 13 Ноября, 2018 - 10:08:36 - перейти к сообщению
Да, я его везде заменил на свой.
Хотя сомнительно, что переключение банков ROM влияет на индексацию страниц памяти PPU.
Тут вообще очень странно: в простое (когда игрок не трогает кнопки геймпада) работает только отрисовка спрайтов и вывод звука (изменения фона нет), и в некоторый момент времени прерывание NMI (одно из многих) переключает в слот $0000-$07FF тайлы из PPU $0800-$0FFF, а через какое-то время (всегда разное) основная программа (так же как и NMI - в один из многих проходов) возвращает туда правильные тайлы.
И я не могу пока отследить, кто это делает (запись в какой адрес).
Хотя сомнительно, что переключение банков ROM влияет на индексацию страниц памяти PPU.
Тут вообще очень странно: в простое (когда игрок не трогает кнопки геймпада) работает только отрисовка спрайтов и вывод звука (изменения фона нет), и в некоторый момент времени прерывание NMI (одно из многих) переключает в слот $0000-$07FF тайлы из PPU $0800-$0FFF, а через какое-то время (всегда разное) основная программа (так же как и NMI - в один из многих проходов) возвращает туда правильные тайлы.
И я не могу пока отследить, кто это делает (запись в какой адрес).