Здравствуйте все , я тут приобрел на днях ПЗУ d27128a20 (прошитое) и z80b из некоего клона спектрума (думаю краснодарская схема т.к. там такое ПЗУ. И я бы хотел собрать клон спектрума,но у меня нет микросхем из Ленинграда и других клонов ,но есть куча других микросхем в том числе и ОЗУ hm62256alp-10 на 16 КБ (у меня их 2,но могу приобрести и 3),но мне остаются непонятны некоторые моменты в его сборке такие как вывод на экран и чтение и оперативной памяти (если оно есть),а также подключение клавиатуры (ps2).Может ли кто-нибудь помочь с этим или дать какую-нибудь литературу по этому поводу?
Спойлер
Добавлено after 2 hours 28 minutes 54 seconds: Все с оперативной памятью вроде разобрался ,а с выводом на экран нет ,но по ходу дела буду разбираться,сборку уже начал
Мда.... Изображение в 1,5 Мегапикселя, на котором тем не менее ни пера не видно.... Нужно ну очень не хотеть получить ответ на заданный ТАКИМ макаром вопрос.
Расширю немного вопрос, так как сейчас пишу эмулятор спектрума на контроллере.
Может кто нибудь в общих словах, но точно объяснить как работает спектрум. Как работает процессор и память и так ясно, но вдруг тут есть знатоки портов ВВ и видеоадаптора?
Объясню в чём проблема. Программы в моём эмуляторе запускаются, но некоторые просто очень быстро идут, прямо невозможно пользоваться. Или работают нормально, но бегущая строка прямо мелькает. Вот я и хочу понять взаимодействие компонентов, чтобы понять на какое железо или программные вещи ориентируются эти программы для синхронизации.
Самое странное, что не все программы "летают". И загрузка с кассет работает, так как частоту процессора я стараюсь держать в 3.5 мгц и считаю такты для синхронизации. Понимаю, что есть завязка на прерывание, но что происходит конкретно - темный лес. Не хотелось бы потактово крутить процессор и смотреть, что происходит. Было бы реальное железо - потыкался бы осциллографом, но его нет. Есть подозрение, что видеоадаптор тормозит работу с памятью или как-то обнаруживает своё присутствие процессору, а значит программе, формируя временные метки, но как он это делает нигде не пишут. Вроде через вход прерывания, т.к. ПДП в спектруме нет, но ведь видеопамять читается постоянно, когда тогда процессору работать? К тому же очень странно, что в эмуляции работает считывание кассет, при этом я посылаю только 50 прерываний в секунду для чтения порта клавиатуры. Видеоадаптор в моей реализации вообще невидим процу. Как его более достоверно заэмулировать?
На форумах вся информация размазана, что приходится собирать по крупицам. Ещё бы кто объяснил в чём отличие 128 и 64 к версии, кроме очевидных вещей ПЗУ и памяти. Подозреваю, что кто-то физически переделывал, может что конкретное скажет.
_________________ Спойлерyou gotta do what you gotta do
Да читал я уже. Понимаю, что наверное 100 раз подобное обсуждалось, но я надеялся на радиокоте кто-то будет в теме, чтобы задать текущие вопросы знатоку и не искать в гугле. Там по низкочастотным запросам всякую фигню выдают. А регистрироваться на разных сайтах не хочу. Нет так нет. В общих чертах-то мне всё понятно, но есть нюансы, видимо.Некоторые программы работают не так как надо, ни на 48, ни на 128. Но не все, конечно. Но тут есть ещё вероятность ошибки чтения с аудиовхода. Сейчас пишу загрузчик образов двоичных файлов, а там посмотрю, может наткнусь на правильную мысль.
_________________ Спойлерyou gotta do what you gotta do
У спектрума вроде имела место совмещенная видеопамять на динамических ОЗУ. Доступ что от МП, что от аппаратного контроллера дисплея - как-то там распределялось время доступа с циклами регенерации. Современные варианты частенько на статических ОЗУ - одним кристаллом можно весь объём памяти перекрыть. Но вот фокусы с "двусторонним доступом" в этом случае уже иначе строить придется.
Как я понял такое двухстороннее общение с памятью и регенерация "ворует" 20-30% скорости работы процессора. Но некоторые программы используют какой то другой тормоз, насколько я могу судить. Например игрушка "LODE RUNNER" и одна из версий тетриса запускаются у меня настолько быстро, что 20-30% не спасут. Или реально раньше были такие хардкорные игры? Уже отдельно замедлял обращение к видеопамяти, но всё тщетно. Ощущение, что я что-то не учитываю. Вот бы понять потактово как и когда замедляется цикл процессора при обращении со стороны видеоконтроллера. Реального железа не хватает, а по схеме разбираться долго.
_________________ Спойлерyou gotta do what you gotta do
Там суть в подгонке временных интервалов под требования видеоконтроллера. Компромис между тактовой МП и тем, что требуется для формирования растровой картинки (кадровые и строчные синхроимпульсы). Вроде так... Я спектрумы не строил - так ... почитывал... Может тут чего накопать удастся: http://www.nedopc.org
Убил уже кучу времени читая подобные форумы, а понимания не прибавилось. Как работало всё в первом приближении, так и работает. Видеоконтроллер отдельно, процессор отдельно. Чувствую что ещё что-то должно быть, но видимо пока не судьба. Может и вообще нереально высчитать потактово работу на МК и видеоадапторе так как уже ресурсы поджимают. Видеоадаптором придётся пожертвовать. Но эмулятор на то и эмулятор, чтобы лишь имитировать работу, может найду просто место в программе куда нужно вставить паузы чтобы быстрые игры пошли в нормальном режиме, но и остальные не сломались. Пока есть костыльное решение замедлять весь ЦП после загрузки программы. Звуки правда портятся, что понятно, но зато играбельно.
_________________ Спойлерyou gotta do what you gotta do
может гдето регистр синхронизации есть в оригинале и отсутствует в эмуляторе?, точнее он есть, но находится всегда в разрешающем состоянии? вот, те программы/игры, кто считает такты - идут нормально, а те, кто на него ориентируется - бегут... подозреваю, что этот регистрисвязан с кадровой разверткой... удобно - отрисовал картинку и жди, пока телевизор её не показал... показал - можно рисовать следующую. а может... и даже более вероятно - отслеживается из какой области памяти происходит чтение видеочипом и игра ждёт освобождения нужной области и так замедляется до нужной скорости. а нет видеоадаптера - нет ни синхроимпульса ни занятой оббасти памяти...
_________________ Для тех, кто не учил магию мир полон физики Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
nHz, если я правильно помню, там аппаратное прерывание z80 формировалось вместе с кадровой синхронизацией, непомню точно ровно по кадрам (50Hz) или в 2 или 4 раза чаще, там же еще область делилась на 3+1 полосы - может по ним. или наоборот 25Hz. это прерывание - основной медленный таймер там.
сам же процесс вывода на экран полностью прозрачен для процессора, только обмен по шине подтормаживается через wait или както иначе если обмен выпал на время чтения в видеорегистр. механизм регенерации памяти z80 не используется, память регенерируется видеосчетчиками.
прерывание 50 гц я посылаю, тут всё чётко, правда независимо от видеовывода, т.к. видеовывод на монитор 60гц. Сначала думал посылать 60гц, но это бы всё равно испортило работу программ, пытающихся потактово синхронизироваться с изображением. Они то думают, что развёртка 50 гц. А если увеличить эквивалентную частоту процессора в 60/50=1.2 раза до 4.2Мгц, то поплывут другие тайминги. В том числе испортится загрузка программ, скорее всего. Можно было бы ввести промежуточный видеобуфер, который прорисовывается как 50гц экран, но памяти жалко, её и так еле хватило на 128 кб спектрум. Что весьма странно для ESP32 c 520кб памяти из которых примерно 300 доступно. В общем, надо лезть глубоко в настройки SDK и разбираться что там китайцы понаворотили. Сейчас это на втором плане.
Но наметилось решение "быстрых" программ. Залез вчера в код реализации процессора. Я его не сам писал. Лень было все команды ручками прописывать. Да и хорошей литературы не нашёл, чтобы всё чётко понимать. Так вот там все команды выдают количество необходимых для выполнения тактов. Он влияет на формируемые задержки, чтобы держать эквивалентную частоту ЦПУ в 3.5Мгц. Я сначала сверил по таблице команд - вроде всё верно и успокоился. Но раз такое дело с ускорением, то пристальнее посмотрел и обнаружил пару команд с несоответствием. То есть команда должна выполняться 12 тактов,например, а код процессора запрашивает 4. Моя программа честно формирует задержку эквивалентную 4 тактам. Но если программист использовал такую команду для синхронизации программы, она соответственно будет выполняться значительно быстрее. Видимо придётся все команды перелопачивать, а то и написать программу для тестирования эмуляции z80. То есть вводить его в определённое состояние, и запускать код команды, смотреть на результат и запрошенные такты. Если честно не хочется таким заниматься пока. Планировал шлифовать программу когда уже все функции эмулятора заработают более-менее.
Попробую на текущем этапе бегло пробежаться по коду, чтобы поправить ручками, что обнаружу. Потом запущу "быстрые" программы и проверю.
Если не поможет, прикручу другую реализацию Z80.
_________________ Спойлерyou gotta do what you gotta do
а я не уверен что в оригинале не 25Hz, думаю нужно попробовать этот вариант.
и еще посмотреть что там в векторе прерывания в прошивках оригинальных, он там счетчик в памяти апдэйтит помоему, мож какаято ошибка в симуляции этого?
Было б железо, тыкнулся бы в ногу прерывания осциллографом и всё стало ясно. В своей программе я могу и 25гц поставить, не проблема, только не поменяется ничего, скорее всего, но попробую.
Сейчас допишу недостаюшие такты и попробую. Такое чувство, что человек писавший эмулятор сам запутался. Вначале он прибавляет 4 такта для любой команды, типа самый минимум. Потом во многих местах считает, что добавил 8. На POP и PUSH вообще тактов не набрасывает, оставляя дефолтные 4. А ведь это достаточно частые команды. Короче, где увидел я добавил, но уже понимаю, что где-то не увидел. Нужны тесты, вобщем.
UPD/ В общем, разобрался. Моя программная реализация Z80 не обрабатывала инструкцию HALT, т.е. процессор не останавливался, а шагал дальше, как после NOP. Соответственно у многих программ совершенно пропадала возможность работать синхронно с постоянной скоростью, подпинываясь синхронными прерываниями 50гц и останавливаясь на HALT.
UPD2/Найти бы ещё документацию как работает звуковой чип AY именно на ZX spectrum, т.е. описание портов. Уже час ищу в гугле, а мне подсовывает схему на AVR для проигрывания мелодий и ещё всякую дичь. А ведь я находил не так давно. Всё время они что-то меняют, видимо надо как параноику всё локально сохранять. Для низкочастотных запросов постоянно выдаёт какую то ерунду.
_________________ Спойлерyou gotta do what you gotta do
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения