итак... по Z80, и неработающему звуку. как бы восстанавливать память по трассеру было не обязательно

. надо было делать трассер Z80 и смотреть. аж на 250 тысячной строчке убийца вылез и показал ушки. путем многочасовых переписок с ИИшницей для себя выяснил следующее:
Z80 помимо своих законных 8 килобайт оперативки еще имеет окно в мир в 32 килобайта. это типа там где-то там задается, и типа Z80 может подглядывать в ром. получается он со своей маленькой рукой может обратиться к любому месту рома. маленькой рукой - в смысле адрес не более 32 килобайт. он будет думать что он обращается в пределах этих килобайт, но на самом деле это будет: адрес окна в ром + адрес по которому обращается Z80 - таким образом Z80 может хоть к 3 мегабайту, хоть к 4 обращаться. само это окно типа может быть кратно $8000. где это само окно выставляется я пока не нашел... но проблемное место примерно здесь:
правильный ром:
APU 0c28 ld hl,($bc02) AF:0042 BC:0000 DE:1f00 HL:0bae IX:1f00 IY:0000 SP:1feb IFF:00 IM:1
APU 0c2b add hl,bc AF:0042 BC:0000 DE:1f00 HL:bc60 IX:1f00 IY:0000 SP:1feb IFF:00 IM:1
ром курильщика:
APU 0c28 ld hl,($bc02) AF:0042 BC:0000 DE:1f00 HL:0bae IX:1f00 IY:0000 SP:1feb IFF:00 IM:1
APU 0c2b add hl,bc AF:0042 BC:0000 DE:1f00 HL:bc0c IX:1f00 IY:0000 SP:1feb IFF:00 IM:1типа в HL должно записаться из памяти по адресу в окне bc02 - и в нормальном роме по этому адресу лежит число bc60, а у курильщика bc0c, так как он укурен на 2 байта дальше здорового рома. по итогу надо вместо этого адреса втуливать метку, причем со сложной математикой. как бы для конкретно этого случая можно просто плюс 2 и порись оно конем... но по плану то нужна возможность двигать код хоть на километр. посему задача состоит из двух частей - найти где это окно в мир выставляется, поставить туда метку и в зависимости от этой метки придумать формулу для расчета этого смещения в данном конкретном адресе. по счастливому случайному обстоятельств такое место нашлось всего одно... но добавление двух байт туда несрояло - звук не родился

опять надо писать трассер - смотреть. но теперь понятен алгоритм работы - дальше рутина.
зато пока писал этот пост нашлось место загрузки банка окна в европу для Z80:
APU 0d1c ld a,$01 AF:8090 BC:0000 DE:1ff0 HL:1fef IX:0000 IY:0000 SP:1fe9 IFF:11 IM:1
APU 0d1e ld ($6000),a AF:0190 BC:0000 DE:1ff0 HL:1fef IX:0000 IY:0000 SP:1fe9 IFF:11 IM:1
APU 0d21 ld b,$08 AF:0190 BC:0000 DE:1ff0 HL:1fef IX:0000 IY:0000 SP:1fe9 IFF:11 IM:1
APU 0d23 ld a,($1ffe) AF:0190 BC:0800 DE:1ff0 HL:1fef IX:0000 IY:0000 SP:1fe9 IFF:11 IM:1
APU 0d26 ld ($6000),a AF:0390 BC:0800 DE:1ff0 HL:1fef IX:0000 IY:0000 SP:1fe9 IFF:11 IM:1
APU 0d29 rrca AF:0390 BC:0800 DE:1ff0 HL:1fef IX:0000 IY:0000 SP:1fe9 IFF:11 IM:1
APU 0d2a djnz $0d26 AF:8181 BC:0800 DE:1ff0 HL:1fef IX:0000 IY:0000 SP:1fe9 IFF:11 IM:1
а свою очередь в ячейку памяти $1ffe для Z80 писал старина 68K:
label_6CE:
move.b (a5)+, (a6)+ ; 1CDD ; 6CE
dbf d0, label_6CE ; 51C8 ; 6D0
move.b #$3, ($00A01FFE).l ; 13FC ; 6D4то есть 3 - третий банк по восемь тыщь долларов. ноооооо если было бы так все просто... по итогу банк все-таки 7, и его еще надо найти где он ставится. а вот от 7 банка по нужному адресу мы приходим в 3BC00 - и там лежит 0C BC 60 BC - то есть правильный ром читает 60 BC, а курильщик из-за сдвига по фазе - 0C BC.
на сём точно сегодня закругляюсь. хоть ничего и недобился за сегодня - все равно позитив, хоть понятно над чем голову завтра ломать.
Добавлено позже:казалось бы утра вечера мудреннее, но нет! мало было мне дизморали с глючными трассерами и восстановлением образа памяти оперативки - как заходит Z80 со своим бзиком и говорит подержи мое пиво

на самом деле этот начальный 3 банк, как я думал - нифига не банк, а просто некое число, некий коэфициент... который потом путем Z80 в своей функции дописи (фрагмент трассера выше) раскручивает 3 до числа 7 - а вот уже 7 наконец и является этим банком.
получается мне надо родить систему, которая учитывает все эти бзики:
1. держит в уме начальный 3
2. знает как происходит раскручивание Z80 этого числа 3 до числа 7
3. знает где Z80 читает из окна по адресу $bc02
при всем этом надо держать в уме кратность $8000, а докучи мне ИИ что-то там втирает про четность тоже какой-то нюанс. что-то там надо чтоб банк был нечетным...
хотелось бы минимально влезать в оригинальный ром со своими грязными ногами, но тут видимо только вырезать проблемные места и менять их на что-то попроще и более понятное, чтобы ASM68K.exe мог это обработать и собрать корректно.
надо думать.
пока-что надо сделать трассер-сравниватель для Z80. прошлый раз вручную глазами искал... не айс

надо автоматику запилить. уж хоть это я смогу.
Добавлено позже:итак... родил! мать её, родил! еще правда не тестировал

ноооо уже родил!
добавил три метки в нужных местах рома, после придумал математику, чтоб просчитывала и записывала результаты в два места из этих трех.
;label_3F292 + 1 = куда писать итоговое смещение внутри Z80, 2 байта задом наперед, то есть 00 BC вместо BC 00
;label_3BC00 = адрес, который должен влететь в Z80 и в банка
;label_6D4 + 2 = адрес, куда вписать номер банка, 2 байта 00 03
banknum = label_3BC00/$8000 ; считаем номер банка
org label_6D4+2
dc.w banknum>>1 ; сдвиг для превращения 7 в 3
ostatok = label_3BC00-(banknum*$8000)+$8000 ; расчет остатка
org label_3F292+1
dc.b ostatok&$FF ; переворачиваем число .w задом наперед и пишем побайтово
dc.b ostatok>>8пришлось конечно попереживать за ASM68K.exe - а сможет ли он сделать такие математические операции? оказалось сможет. так-же у меня нельзя метку влепить куда вздумается. поэтому пришлось к меткам добавлять эти +1 или +2, чтобы попасть на нужный байт параметра. и это еще надо будет придумать как реализовать возможность добавлять необходимый код к итоговому асм файлу в моем дизассемблере. пока-что в текстовом блокноте пришлось... а надо сделать чтоб из коробки можно было это задавать. то есть проблема то в чем - у меня каждый раз асм файл создается с нуля, по сохраненным адресам. Ида же может загрузить и ром и асм файл одновременно и продолжать работать с ним, как с текстовым файлом. типа там юзер комментарии, разметку текста и все такое вручную сделал - все сохранилось и может быть загружено. у меня так не работает - у меня берется голый ром, дизасмится согласно сохраненным адресам. то есть ручной прогресс, что юзер тыркал ранее - не сохраняется. но может я к этому приду... потом... когда-нибудь. пока у меня как бы только чтение, без возможности редактировать. ну не суть. пойду тестировать мою систему ниппель и искать еще проблемные места с Z80 по трассерам. загрузку Z80 трассеров и их сравнение я уже сделал.
Добавлено позже:как бы прогресс маленький есть - трассер исправляется с правкой этих моментов... но тут опять Z80 сказал второй раз подержи мое пиво

мало того была ссылка на BC04, которая должна стать BC06 - так и те два байта куда она ссылается - тоже должны стать ссылкой - эффект матрешки. завести звук сегодня я уже оставил надежду. можно конечно попытаться кратно $8000 сдвинуть, поправить только один байт - номер банка и все запоет... в теории... но это такое себе решение. хотелось бы все-ж все эти ссылки отловить, но я боюсь их ооооочень много. но сама математика меня прям порадовала. вчера хватался заголову в ужосе как эту систему родить... а сегодня родил

пусть пока и не доконца. но концепция родилась, и работает. так что я рад.
Добавлено позже:ну что? уже первый бзык случился

потом правда звук сразу посыпался, но уже прогресс! раньше это был эмулятор Герасима и Муму. однако теперь моему трассер-парсеру нужно докручивать логику - сейчас он срабатывает на место если строка с регистрами несовпадает между двумя трассерами. однако как я стал прикручивать +2 смещение - то теперь моя система возбуждается по делу и без дела - на такие +2 смещения тоже. придется лепить дополнительную проверку... чтоб если строки неравны, то допроверять сами регистры. если разница между регистрами 2 байта - забить. если 1 или больше 2 - паниковать. но этот самый первый бзык - прям порадовал

значит копаю в правильном, пусть и садомазо, месте. несадомазо это конечно двигать кратно $8000 или точнее видимо дважды по $8000 - ибо там какой-то нюанс с нечетным банком для окна Z80... но мы легких путей не ищем. пойду думать над +2...
Добавлено позже:ладно хрен с ней. когда до звука дойдет - будем двигать целиком. пока на звук предлагаю забить... там миллион меток править надо будеть

сдаюсь. главное схему я сам понял, занимательная. и очень поможет когда буду ковырять какой-то другой драйвер, чтоб потом конвертить в GEMS. теперь понимаю что это не что-то заоблачное. ИИшница прям тащит процесс семимильными шагами. главное его направлять, а то он как взбалмошная женщина

но прям подсказывает, объясняет - хз как без него лет 5-10 назад ромхакеры сами в этих нюансах разбирались - я не шарю совсем, но понимаю помаленьку из его объяснений

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

проблема как бы есть - графоний сыплется и рэмбо не в том направлении бегает в демке - но в трассере я это не вижу. там все прекрасно выглядит. и адреса новые не появляются в этом фрагменте, чтобы их добавить. видимо надо восстановление VDP из трассера сделать, так-же как память сделал (недоделал, ибо все равно разница между дампом из эмуля и моим восстановлением - огромная).
Добавлено позже:поиск точки синхронизации пока не сделал. второй день туплю сижу без особого прогресса. зато пока придумал сделать подсветку кода при загрузке трассера в дизассемблер. типа он проверяет адреса из трассера - а разобран ли код в ассемблере по этим адресам? и добавляет подсветку синим для тех строк, какие в трассере засветились. в результате я могу видеть какие именно участки использовались на данном этапе (то есть старт рома, логотип Sega, логотип Rambo, начало демо игры). теперь надо засесть за восстановление VDP образа памяти согласно трассеру. так как демо игра как раз сыплется на графонии, то лелею надежду, что в этом самом графонии будет понятно с какого адреса начинается не то что надо. но объем писанины меня дизморалит. будет видимо сопоставимо с объемом, когда обычную оперативку пытался восстановить из трассера. в общем надо думать.
Добавлено позже:в общем... нужен эмуль с сурсами, чтобы поправить там выгрузку трассера. во первых чтобы выгружало все, во вторых сам текст выгрузки хотелось бы перебрать. оставить только адрес обращения, без текста опкода, без текста дизасма, и прилагать текст только тех регистров, какие изменяются в этой конкретной команде. тогда общий объем трассера будет поменьше. сейчас Арес съедает циклы, добавляя omitted и количество циклов, сколько он сожрал. и даже с этим съедением все равно объем километровый. думаю можно побороться за размер, включая в выгрузку только то что надо. восстановление VDP я походу не сделаю. оно во первых может быть съеденено этими omitted, а во вторых эта самая DMA. слишком много костылей понадобится.