В общем, все проблемы из-за того, что IDA не заточена под банксвитчинг. Несмотря на то, что вы при создании базы присвоили всем переключаемым сегментам адреса 4000-7FFF, IDA этот параметр применяет только к счетчику команд, продолжая использовать реальный адрес сегмента в исходном файле для вычисления относительных адресов. Потому как рушатся только те команды, которые, используют относительную адресацию операнда. Кстати, они не соответствуют Z80. И если отменить распознавание и по чистому запустить сразу, например, в сегменте ROM04, то все ошибочные адреса вылезают в ROM06, что и соответствует правильным адресам, если бы ROM04 реально стоял в 4000, а ROM06 при этом как раз попадает на ОЗУ. У IDA есть вот такое окно:
Это карта видимости сегментов. И согласно мапперу, ROM00 должен видеть всех, а ROM01...ROM1F должны видеть только ROM00 и все верхние сегменты (адреса внутри процессора 8000-FFFF). Если это указать здесь, то часть ошибок уходит, остаются только спецкоманды Шарпа с относительной адресацией. И я не знаю, как это решить здесь, может плагин-маппер нужно написать (не путать с лоадером)?
PS А вот массивы лучше задавать вот с такими параметрами:
И тогда, было:
Стало:
- - - Добавлено - - -
Ах да, куча мест, где код распознан как массив и наоборот (например, массив выше это код). Продолжайте изучать тему дизассемблинга, повышайте свое мастерство. И, быть может, в этом как раз и таится загадка этих ошибочных адресов, которых быть и не должно. Кто знает?








Ответить с цитированием