Автор Тема: [SMD] Создание собственной многоигровки на одном чипе  (Прочитано 10448 раз)

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

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2885
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
насчет списка не знаю. пока из личного опыта:

1. в батнике, точнее для консольной команды надо указывать входной асм и выходной бин через запятую и без пробелов слитно. иначе рыгнет:
Rambo.asm,RamboReBuild.bin ; правильно
Rambo.asm, RamboReBuild.bin ; неправильно
если сам путь с пробелами, то по моему можно в кавычках:
"R:\Rambo III [!].asm","R:\Rambo ReBuild.bin"
2. упомянутый EXG d4, d2 - он делает по нарастающей EXG d2, d4. с точки зрения кода как бы нет разницы - это замена значений внутри между собой. но вот на выходе это разные опкоды и побайтное сравнение двух ромов выдаст несоответствие в этих местах. ну и будет несоответствие чексуммы конечно-же.

3. метки с двоеточием - без табов и пробелов, сразу с начала строки:
label_25E: ; правильно
 label_25E: ; неправильно

4. команды или функции move.l и все прочее лучше наоборот - лучше добавлять парочку табов в начале строки перед функцией.

5. переменные можно с начала строки:
frame_delay equ $C
RETFRAME = 0
TableFile EQUS "R:\tablesinclude.asm" ; текстовые переменные
пример использования текстовой переменной:
include \TableFileнужен слэш чтоб заработало.

а тут пример использования IF ELSE:
IF (SOUNDDRIVER=0)
; GEMS
*****
ELSEIF (SOUNDDRIVER=1)
; PCM
*****
ELSE
; start XGM
*****
ENDIF
сами эти IF ELSE в ром не попадают, но они решают какой участок внутри IF ELSE в ром попадет.

6. математика тут больная. надо операции проводить без пробелов:
dc.w (frame236tilemap-frame236tileset)/32-1 ; правильно
dc.w (frame236tilemap - frame236tileset)/32 - 1 ; неправильно

7. прыжок org работает только если изначально что-то загрузить в ром - incbin какой-тофайл.бин - и то он прыгнет только в пределах размера этого файла. то есть даже если после этого инклуда происходит какое-то формирование кода дальше, то выше размера этого файла он не прыгнет. типа:
incbin C:\game.bin ; весит 500 байт

move.l блаблабла
jsr куда-топрыгнуть
rts

org 508
dc.l $123456
то есть предполагается что ты хотел прыгнуть на jsr и исправить его параметр куда прыгнуть на новое место, которое ты пока не знал на момент прохода кода сверху. только в самом конце просчитывал куда тебе надо прыгнуть... и хочешь типа вернутся и указать это место. вот org пошлет тебя в пешее эротическое. ну или можно изначально как болванку загружать, к примеру, пустой файл 4 мегабайта. после загрузки ставить org 0, после фигачить весь дизасм кода. тогда в принципе org может прокатить. хотя сам файл на выходе видимо будет как раз кратным этим 4 мегабайта - с нулями в конце.

момент с org оказывается под вопросом. это лично у меня что-то не работает, а у нормальных людей все прекрасно :) потом еще наверное потестю более пристрастно.

*****

возвращаясь к нашим баранам. при добавлении метки думаю сделать что-то типа отдельного текстового файла:
; address enable originalvalue label comment
$1234 1 #$13F #label_13F какой-то текст для метки, главное без табов
$45678 0 а тут только какой-то комментарий, с выключенном флагом метки

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

ну и некоторый затрах будет с необходимостью всегда подтверждать изменения буквой S - сохранить в памяти. то есть это не сохранение файла на hdd - это именно что в памяти только. типа добавил метку, если все устроило - подтвердил нажатием S. непонравилось - откатил нажатием R. дело в том, что организовать целую очередь отмен сложно (для меня). поэтому у меня откат возможен только на 1 шаг назад. соответственно два раза подряд C нажимать (разбор кода начиная с заселекченной Бэшки - dc.b - не разобранный код) тоже нельзя, иначе второе нажатие откатит назад сделанное в первом нажатии :) надо С, если понравилось - S, потом новая С, если понравилось опять S... если не понравилось, то можно либо С в другом месте (сделается разбор в другом месте, но откатит предыдущее нажатие С) или R - просто откатит назад, без нового разбора. и L - просто добавит метку, без разбора. чтобы понять какой текущий статус - сохранено S или нет - слева и справа в окне будут красные или зеленые полосы.


*** офтоп:
хахахаха! сраный ВК - видео залить не дал, но при создании канала в вк видео - оказывается тут-же прилетел спам. хотя к чести вк сказать не долетел... ибо акромя "здравствуйте" от спам-бота прилететь не успело - смотрю он уже забанен. видимо предполагалось что сначала завязывается диалог между ботом и человеком... а я провтыкал и не завязался.
« Последнее редактирование: 04 Апрель 2026, 11:38:49 от SeregaZ »

Оффлайн SegaMark

  • Пользователь
  • Сообщений: 131
  • Пол: Мужской
    • Просмотр профиля
1. в батнике, точнее для консольной команды надо указывать входной асм и выходной бин через запятую и без пробелов слитно. иначе рыгнет:
Странно у меня работает с пробелом и все прекрасно компилируется, вот например команда для компилирования Gunstar heroes, который я скидывал

asm68k /k /p /o ae- gh.asm, ghbuilt.bin >errors.txt, , gh.lst

если сам путь с пробелами, то по моему можно в кавычках:
НУЖНО в кавычках, это принцип подачи аргументов в консольные программы, потому что пробелом разделяются аргументы.

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

сами эти IF ELSE в ром не попадают, но они решают какой участок внутри IF ELSE в ром попадет.
их называют предпроцессорные команды, это не обычные инструкции языка if else. Их испокон веков писали с начала строки, начиная еще с Fortran, так как там была fixed-form, то есть напишешь не сначала будет думать что это команда. Сейчас уже в некоторых языках можно не сначала строки, но привычка осталась

математика тут больная. надо операции проводить без пробелов:
Вот это боль для моих глаз :cry:

дело в том, что организовать целую очередь отмен сложно (для меня)
сделай так же отдельным текстовым файлом где будут все изменения сохраняться

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2885
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
это были тяжелые роды... но вроде родил этот код по добавлению меток и комментариев. но так всё зауши притянуто... я половину старого кода не понимаю чего я этим хотел добится :) два года все-ж прошло... все забыл. мозг отупел. но теперь зато попробую рэмбовские адреса повылавливать, да попользоваться этим новым функционалом.

Добавлено позже:
мде... недолго музыка играла. три места пофиксил, а дальше опять затык :) не совсем явная ашипка. я так заполнение памяти из трассера не сделал. без него будет сложновато отследить где косяк...

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

Добавлено 4 апреля 2026 года:
сижу плачу от счастья... с таким скрипом хоть как-то натянул сову на глобус этот код по вставке лейбла в какие-то нераспарсенные 4 бэшки. вроде работает, но зная внутреннюю кухню, насколько там все криво сделано - я удивляюсь, почему оно работает! в результате на данный момент с найденными начальными адресами трассеры до меню - ОДИНАКОВЫЕЕЕЕЕЕЕ!!! конечно с учетом, что в трассере курильщика все смещено на 2 байта (nop добавил). но игра по сути не икает до этого места :) и визуально все один в один. звук только что сдох... и в трассере с наскока не видно где это.

ну и по итогу я сделал слишком много кнопок "сохранить" которые по сути несохраняют. но нажать их обязательно. что раздражает после десятого нажатия...

пойду теперь попробую поискать почему у меня демо игры не стартует, как в оригинале.

Добавлено 5 апреля 2026 года:
хы... уже демо начала стартовать! пусть и сыплет артефактами и звука нет, но потихоньку дело движется. рад по самые помидоры. но есть и минусы - реально запарывает по писят раз одно и то-же жмакать в процессе фикса кода (пока тупо расставление меток). и проблемы если ошибся - целая история откатить назад. но самый эпик что сам маленько начал понимать - глаз сразу проблему выхватывает в трассере, потом быстренько находишь проблемное место. тыкаешь туда ссылку, ребилд, запись трассера, парсинг, опять проблемное место... повторить овер дохера раз :) рутина пошла.
« Последнее редактирование: 06 Апрель 2026, 14:06:40 от ghostdog3 »

Оффлайн SegaMark

  • Пользователь
  • Сообщений: 131
  • Пол: Мужской
    • Просмотр профиля
SeregaZ, я так и не понял удалось дизассемблировать rambo чтобы он заработал, без добавления лишних nop в начало? если да, можешь скинуть его дизасм

Добавлено позже:
потом быстренько находишь проблемное место. тыкаешь туда ссылку, ребилд, запись трассера, парсинг, опять проблемное место
а нельзя скрипт написать чтобы автоматически делалось?
« Последнее редактирование: 05 Апрель 2026, 10:20:14 от SegaMark »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2885
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
без нопа в начале нет смысла в дизасме :) точнее он будет не полным. потому что половина кода останется нераспарсенными бэшками. то есть в результате ASM68K.exe соберет один в один ром, как и оригинал... но это не то :) нужно именно что найти все места со ссылками - и налепить туда метки. вот для этого то и нужны нопы в начале, чтобы вся адресация поплыла и тогда в трассеры попадают адреса-убийцы. вот их ищешь, правишь на метки, выгружаешь асм, добавляешь ноп, собираешь, запускаешь, пишешь трассер, сравниваешь, повторить до пенсии.

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

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

так что пока-что в многоигровке эту игру использовать не получится. два этапа до неё: 1. отловить все адреса и заменить на резиновые метки. это позволит перейти ко второму этапу: 2. правка коротких прыжков на длинные. вот только после этого игра станет доступа для многоигровки... но и то вылезет 3 этап :) нужно будет изобретать костыль, чтобы отслеживать всякие vblank, hblank и что-там еще. видимо надо будет в заголовке ставить адреса на код, который будет читать какой-то адрес в оперативке (его еще надо будет найти среди всех игр во многоигровке, который не будет использоваться всеми играми), в котором будет записываться некий номер игры, чтобы дальше код этих самых вбланк-шбланк понимал какая именно игра сейчас должна играться и запускать соответствующие конкретной игре функции вбланков и шбланков.

прямо сейчас можешь попробывать сам ноп добавить и собрать. звук там не заработает, но демо игра должна запустится (будет сыпать артефактами). раньше даже до этого у меня недоходило :) ноп 1 штука пиши сюда:
        dc.b  $20,$20,$20,$20,$20,$20,$20,$20

                nop ; воооот сюда добавитрь этот ноп. в оригинале тут пусто

label_200:
        move.w    #$100, ($00A11100).l  ; 33FC ; 200
        nop                             ; 4E71 ; 208
        rte 


*вложение будет снесено из-за потери актуальности, когда найду новые адреса.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2885
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
итак... пока думаю концепция будет такая:
1. загружаем трассер
2. жмакаем какую-то строчку
3. жмакаем кнопку mem

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

вот потихоньку начал это изобретать. потихоньку MOVE.w, l, b прикручиваю. типа если второй параметр это (A) и если там FFFFxxxx - значит точно память.



пока правда не совсем понимаю куда это меня приведет :) но надеюсь что поможет.

Добавлено позже:
хаха... только я порадовался, что что-то начало получатся, как судьба наносит ответный удар:
Цитата
* пишем из ($00A10001) в память $FE19
да твою-ж мать! ведь и правда - придется VDP тоже точно так-же складировать, ведь может же быть что запись в оперативку 68К надо сделать из оперативки "видеокарты". значит надо отслеживать что в видео памяти лежит тоже...  :cry:

ну пока видимо забью. мне бы хоть отдаленно воссоздавать то, что хранится в оперативке 68К - чтобы хотя-бы примерно сравнивать два трассера в плане сравнения памяти.
« Последнее редактирование: 06 Апрель 2026, 15:32:26 от SeregaZ »

Оффлайн SeregaZ

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

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

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

Добавлено позже:
еще ссаный мастер провода на термостате перепутал.
« Последнее редактирование: 17 Апрель 2026, 00:27:05 от ghostdog3 »

Оффлайн Yoti

  • Пользователь
  • Сообщений: 4632
  • Пол: Мужской
  • Не тро-гай ме-ня
    • Steam
    • Просмотр профиля
SeregaZ,
заведи себе блог и пиши про свою жизнь туда. Мало того, что это не относится к разделу программирования в общем, так ещё и не относится к созданию одноигровки в частности.

Оффлайн Беларус

  • Модератор
  • Сообщений: 1473
    • ВКонтакте
    • Steam
    • Просмотр профиля
Да вроде подходит: он описывает возможные алгоритмы для решения задачи. А задача, как я понял, как-то с помощью трэйса (разметки эмулятра где данные, а где код) найти все адреса, штобы можно было двигать ром.

Оффлайн SegaMark

  • Пользователь
  • Сообщений: 131
  • Пол: Мужской
    • Просмотр профиля
то есть в результате ASM68K.exe соберет один в один ром, как и оригинал
Чета у меня не запустилось, просто синий экран. ты точно тот дизасм скинул?

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2885
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
а как ты собирал? в архиве я добавил бат файл? а то может провтыкал... пойду сам скачаю архив :) то есть должен собратся ром с помощью ASM68K.exe. он будет 1 в 1 почти как в оригинале, за исключением разве что EXG команды, что приведет к неправильному просчету контрольной суммы и поэтому в архиве приложен фиксер чек суммы. чтобы после сборки пофиксить и тогда синего экрана быть не должно - должна игра запустится.



Добавлено позже:
нет, проверил - все 4 файла на месте. сам асм файл, ASM68K.exe для сборки, чексумфиксер для правки чексуммы и батник, который их запускает в нужном порядке. синий экран по идее вылезет если чексумма не сошлась, а она именно что не сойдется если без фиксера запускать - ибо как я уже говорил EXG собирается ASM68K.exe как ему удобнее, а не как оно в коде идет. то есть по возрастающей A2, A5 к примеру, когда в оригинале могло быть А5, А2. чексумма считалась для оригинального кода и из-за изменения опкода для EXG - после сборки изменится. надо чексуммфиксером поправить.

Оффлайн Yoti

  • Пользователь
  • Сообщений: 4632
  • Пол: Мужской
  • Не тро-гай ме-ня
    • Steam
    • Просмотр профиля
Беларус,
очень старался, но так и не смог соотнести холодильник, релюху и термостат со сборкой картриджа.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2885
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
это просто я в холодильнике разъем для картриджа не нашел. поэтому он и не заработал. а так... как втыкнул бы туда МК3 - как начали бы сыр с яйцами ночами там смертельные битвы устраивать...

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

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

пойду смотреть какие эмули тоже умеют писать трассеры и смотреть что там они рожают в момент этих самых прерываний... (и да, холодильник хоть и завелся с новой реле, но как-то странно работает)
« Последнее редактирование: 13 Апрель 2026, 13:34:20 от Беларус »

Оффлайн Беларус

  • Модератор
  • Сообщений: 1473
    • ВКонтакте
    • Steam
    • Просмотр профиля
Если ты хочеш решыть задачу простым способом, то можно ведь сделать аналог Гличера - антиГличер: сдвигаем всё, што похоже на адрес, и если встречаем баг в игре, то начинаем локализовывать то изменение в роме, которое привело к нему. В твоём случае всё равно тоже надо играть в игру, и тоже желательно задействовать каждый байт рома.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2885
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
итак новости с полей: написал BizHawk'ам, но что-то там тухло повсей видимости. зато werton подсказал заюзать Ares эмулятор. но там система туповатая... со старта запустить трейс нельзя. получается надо запустить ром, зайти в настройки, пометить галки что мне надо в трейсе, нажать сброс игры. только так с начала игры инфа попадет в трейс. после делаем поиск по слову Reset - выдает строчку что-то типа: Reset SR=7 @ 234,3 это и есть место нажатия сброс на приставке эмуляторе. бредятина, но что делать...

вторая муть голубая, портящая всю картину: время от времени вылазят строки типа [Omitted: 26] - то есть что-то типа вырезания повторов. как бы понятно что тем самым пытались сохранить объем трейс файла... но мне то нужен полный лист. так что с этим пока не ясно нифига... зато вижу как раз то место, которое съедалось в трейсе Gens: CPU  003bc6  522e  addq.b  #1,($ffe0d1)  подобной строчки там не было. тут есть и счетчик докручивается до нуля, как полагается. теперь еще надо бы понять как сделать дамп памяти, как паузу ставить. и как сэкономить клики при сохранении файлов. блин... как же в Gens все было понятно... сраный трейс. кто-ж знал что он обрезаный там оказывается :(

Добавлено позже:
BizHawk тоже пишет используй костыли.  :facepalm:

то есть надо сначала загрузить ром, игра начнется, нажать паузу в эмуле (то есть не пауза игры), включить трейс, отметить что тебе надо трейсить в файл, нажать ресет, отпустить паузу. и только тогда трейсить начнет с самого начала. и причем все работает с диким слайдшоу, ибо невывозит. после еще сами файлы трейса пишет по 155 мегабайт примерно, сохраняет, пишет следующий. но, опять таки, судя по логу - те мои данные, что съедает Gens - вроде есть. это слайдшоу бы убрать и было бы идеально, хотя в Ares все-таки прикольная фишка, что там прерывание помечается в трейсе, что тоже может быть удобно. везде свои плюсы, и свои минусы. почему в 2026 до сих пор не сделано что-то адекватное в этом вопросе? страдаю, плачу, колюсь, но продолжаю жрать кактусы. (собрать свой эмуль не предлагать. чужой код - это потёмки.)

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

в оригинале:
происходит вбланк или шбланк, кто их разберет... заканчивается rte
CPU  000f48  4e73  rte                                                d0:00000003 d1:00000000 d2:0000ffff d3:00000000 d4:940d8031 d5:0000000b d6:0000ffff d7:0000ffff a0:00000a12 a1:ffffc09a a2:00000a12 a3:00000000 a4:00000000 a5:00c00004 a6:00000964 a7:00fffdf2 sp:00000000 tS6cvZnx
CPU  000f8c  66fa  bne     $000f88                                    d0:00000003 d1:00000000 d2:0000ffff d3:00000000 d4:940d8031 d5:0000000b d6:0000ffff d7:0000ffff a0:00000a12 a1:ffffc09a a2:00000a12 a3:00000000 a4:00000000 a5:00c00004 a6:00000964 a7:00fffdf8 sp:00000000 tS0cvznx
CPU  000f88  1038  move.b  ($ffc15c),d0                               d0:00000003 d1:00000000 d2:0000ffff d3:00000000 d4:940d8031 d5:0000000b d6:0000ffff d7:0000ffff a0:00000a12 a1:ffffc09a a2:00000a12 a3:00000000 a4:00000000 a5:00c00004 a6:00000964 a7:00fffdf8 sp:00000000 tS0cvznx
[Omitted: 2]

а в роме курильщика:
CPU  000f4a  4e73  rte                                                d0:00000003 d1:00000000 d2:0000ffff d3:00000000 d4:940d8031 d5:0000000b d6:0000ffff d7:0000ffff a0:00000a14 a1:ffffc09a a2:00000a14 a3:00000000 a4:00000000 a5:00c00004 a6:00000966 a7:00fffdf2 sp:00000000 tS6cvZnx
CPU  000f8a  1038  move.b  ($ffc15c),d0                               d0:00000003 d1:00000000 d2:0000ffff d3:00000000 d4:940d8031 d5:0000000b d6:0000ffff d7:0000ffff a0:00000a14 a1:ffffc09a a2:00000a14 a3:00000000 a4:00000000 a5:00c00004 a6:00000966 a7:00fffdf8 sp:00000000 tS0cvznx
CPU  000f8e  66fa  bne     $000f8a                                    d0:00000000 d1:00000000 d2:0000ffff d3:00000000 d4:940d8031 d5:0000000b d6:0000ffff d7:0000ffff a0:00000a14 a1:ffffc09a a2:00000a14 a3:00000000 a4:00000000 a5:00c00004 a6:00000966 a7:00fffdf8 sp:00000000 tS0cvZnx
[Omitted: 1]

в мире эмуляторщиков хоть кто-нибудь делает адекватно работающий софт?!?! чей это косяк? игры или все-таки сраного эмулятора? причем видимо косяк происходит в правильном роме - там адрес в роме, откуда читается опкод сначала 000f8c а потом 000f88. у курильщика все правильно - по возрастающей. бред бредский.


Добавлено позже:

меня кароче уверяют, что все правильно, что все так и должно быть :) я конечно могу налепить костыль, типа если парсер видит RTE - то значит последующие две команды могут быть перепутаны и забить на это... но мой внутренний перфекционист бунтует и требует чьейнибудь крови. ничего-же не изменилось... почему два трассера так отличаются? должны быть одинаковые. да и внутри одного в начале порядок может быть правильный, а потом там сям порядок может скакать как ему вздумается. в Gens все прекрасно - всегда порядок одинаковый. в Ares заскоки. в BizHawk заскоки. BizHawk еще прям ну совсем проигрывает... и слайдшоу во время записи трейса, и может все 155 мегабайт файла родить одну и ту-же пару команд, делая бессмысленным это дело... я ф печали...

Добавлено позже:
ну пока я в трауре с этими трассерами - вернем тему в первоначальное русло: SegaMark, зацени заготовку рома :)
« Последнее редактирование: 19 Апрель 2026, 02:45:21 от Беларус »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2885
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
итак... по Z80, и неработающему звуку. как бы восстанавливать память по трассеру было не обязательно  :blush:. надо было делать трассер 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, а докучи мне ИИ что-то там втирает про четность тоже какой-то нюанс. что-то там надо чтоб банк был нечетным...
0_0 0_0 0_0

хотелось бы минимально влезать в оригинальный ром со своими грязными ногами, но тут видимо только вырезать проблемные места и менять их на что-то попроще и более понятное, чтобы 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. слишком много костылей понадобится.
« Последнее редактирование: 24 Апрель 2026, 20:14:28 от Беларус »

Оффлайн SegaMark

  • Пользователь
  • Сообщений: 131
  • Пол: Мужской
    • Просмотр профиля
ну пока я в трауре с этими трассерами - вернем тему в первоначальное русло: SegaMark, зацени заготовку рома
:thumbup:

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2885
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
когда невезет - то невезет полностью. поискал эмуляторы с сурсами. ии такой: да вот, blastem с открытым кодом. пошел гуглить. нашел гитхаб, написал свои хотелки... внезапно разработчик отозвался, запилил... хотя и предупредил типа это заброшенная херня, пошли отсюда. я такой с утра проснулся, вижу пост: о!!!! сейчас как запилю... а это, ***, какой-то аддон к чему-то там. я думал это обычный ехе бластем, на подобии что я скачивал и пользовался на винде. да что за жопа то такая... а чувак пару часов ковырялся над кодом  :cry: :cry: :cry: а я с утра был весь на позитиве. оказалось я не в тот сурс зашел. а где тот - да хрен его знает.

Оффлайн SegaMark

  • Пользователь
  • Сообщений: 131
  • Пол: Мужской
    • Просмотр профиля
У gens и bizhawk исходники есть, но наврятли ты их сможешь так просто запустить

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2885
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
зато мне там один буржуйский товарищ подсказал сделать для моего мув мейкера переключение режимов картинки с H40 на H32. а экраны с тем меню морем и чайками - как раз по ширине H32. то есть дорисовывать ничего не надо слева и справа. хотя я все-ж считаю Н32 это от лукавого, ибо там пиксели растягивает. лучше все-таки Н40 и дорисовать слева и справа в том-же ИИ или вручную. в общем пока кризис и траур с эмуляторами и трассером из них, то наверное надо сделать манагер для сборщика рома-меню для игр. хоть и игр еще нет...

пока оставлю Н32 для тестов (хотя все равно оригинальные картинки надо будет резать по высоте ибо 224 у нас, а 240 на дендях). пока сделаю наверное рисование картинки заднего фона, и чтоб названия игр рисовало вторым слоем. потом надо будет искать чаек с их анимацей. и думать как сделать анимацию в меню и реакцию на геймпад.

Оффлайн Werton

  • Пользователь
  • Сообщений: 1026
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
в общем... нужен эмуль с сурсами, чтобы поправить там выгрузку трассера. во первых чтобы выгружало все, во вторых сам текст выгрузки хотелось бы перебрать. оставить только адрес обращения, без текста опкода, без текста дизасма, и прилагать текст только тех регистров, какие изменяются в этой конкретной команде. тогда общий объем трассера будет поменьше. сейчас Арес съедает циклы, добавляя omitted и количество циклов, сколько он сожрал.
Так у Ares исходники открыты и есть подробная инструкция как собрать из них даже для винды (что не часто бывает).
Я попробовал, норм собирается, только компилилось минут 10-15 наверное. Но искать, где чего исправлять под это в исходниках я не буду, ты уж извини, на этом мои полномочия как бы всё, у меня на свои проекты времени жёстко не хватает.
Если захочешь собрать с исходников и будут затыки, то подскажу, что смогу 🙂

Добавлено позже:
а где тот - да хрен его знает.
Blastem вообще не хостится на GitHub (там есть по моему только зеркало с исходниками), потому что он не на гите, а на Mercurial и на своём сервере. А вопросы задавать проще в официальном дискорде, ссылки на это всё есть на главной странице оф. сайта.
« Последнее редактирование: 27 Апрель 2026, 12:20:58 от Werton »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2885
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
блин я боюсь этих сурсов... чужой код - потёмки :) тем более не мой язык.

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

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


Добавлено позже:

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


Добавлено позже:

отбой ложной тревоги. я сам дурак :) поиск цвета задал, а загрузку сеговской палитры - нет :) а когда палитры нет, то она CGAшную палитру по дефолту грузит. а я то сидел плевался - что за фигня творится... почему не работает... даже ИИ меня троллит сидит. ты андронный коллайдер создал, а в розетку его включить забыл.
« Последнее редактирование: 28 Апрель 2026, 23:09:49 от SeregaZ »

Оффлайн SegaMark

  • Пользователь
  • Сообщений: 131
  • Пол: Мужской
    • Просмотр профиля
тем более не мой язык
На твоем языке сейчас мало кто пишет, он сейчас не популярен.

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

Добавлено позже:
Z80 помимо своих законных 8 килобайт оперативки еще имеет окно в мир в 32 килобайта.
что-то сомнительно что это так работает. И для чего ему именно 32 килобайта не понятно. Ни в какой документации по Сеги такое не встречал. Насколько знаю можно в Z80 записывать не весь звук, а что то типа драйвера/плейера, а в Z80 просто прописываешь адрес песни в ROM
« Последнее редактирование: 29 Апрель 2026, 10:30:01 от SegaMark »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2885
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
окно в мир это ему :) чтобы без участия 68К мог ром читать. я тоже не знал об этом, когда свой драйвер пытался писать, чтоб 16кбс сэмплы играл. по итогу что-то там заиграло... но что-то я неуверенный совсем. зато теперь зная про это окно в мир - потом обязательно второй заход попробую сделать. этож прям эпически разгрузит 68К, ибо не нужно будет его отвлекать загружать в буферы кусочки сэмпла из рома в память Z80. а просто выставил это окно и пусть Z80 сам фигачит, не отвлекая старшего дядю. это я прям в предвкушении. но потом. может быть. как-нибудь.

просто я хотел к своему мув мейкеру сделать возможность играть звук получше качеством, чем гемсовские 10.4. и 16, думаю, вполне себе достижимая высота.

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

Оффлайн SegaMark

  • Пользователь
  • Сообщений: 131
  • Пол: Мужской
    • Просмотр профиля
и почему именно 32 килобайта - из-за адресации. типа до 32 - это внутренняя память. или даже точнее до 8 килобайт, а начиная там с какой-то... $8000 чтоль адреса - это система понимает, что надо в ром смотреть, а не память Z80. в свою очередь надо еще задать банк откуда именно начинать читать. банк кратен $8000. таким образом при складывании этих параметров (банк * $8000) + (адрес куда обращается Z80 - $8000) и есть реальный адрес в роме.
Да действительно нашел об этом информацию здесь https://md.railgun.works/index.php?title=Zilog_Z80
Похоже это используется только для звуковых драйверов. Только не понятно есть ли какие то ограничения на длину мелодии, или ее можно до конца РОМа пихать.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2885
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
а почему нет то? вовремя переключай банки куда смотреть Z80 и все. будет играть до талого. другое дело квалити-говналити/качество-говначество. 16кбс наверное Z80 может родить, но выше всё. 68К надо будет подключать видимо...