Подключение General Sound к Дельте-С на 75 микросхемах.
Конструктивные недочёты General Sound.
Содержание:
1) Подключение General Sound к Дельте-С на 75 микросхемах.
2) Обратное вычитывание мода. Ошибки в «Руководстве по программированию GS».
3) Оригинальный GS: закоротки на печатном разъёме, отсутствие дорожки WR на расширитель, отсутствие подтяжки Reset, незадействованные контакты питания.
4) Доработка дешифрации и исключение диодной логики.
5) Размах тактового генератора GS. Сигнал INT.
6) Расширитель.
Благодарю за помощь Black Cat, Евгения Мучкина, Reddie.
***
1) Подключение General Sound к Дельте-С на 75 микросхемах.
Симптомы.
General Sound хаотично ведёт себя при исполнении любых модов, в лучшем случае проигрывая несколько начальных нот, а в остальном издавая скрипы и паузы. При этом он безупречно исполняет сэмплы (Krakout, Saski). Z-Player и любые другие плееры/трекеры хаотично сбоят, зависая в произвольные моменты. Z-Player неверно определяет модель GS и тактовую частоту.
Причина.
Арбитр медленного поля памяти в Дельте-С останавливает Clock процессора по комбинации адреса А14=1 А15=0 (для 128К CAS0=1 CAS1=0), когда такой адрес попадает на момент выхода луча с бордюра, не разделяя, собирается ли процессор исполнять MREQ или IORQ, или он прямо сейчас находится в процессе исполнения IORQ. Последний случай и оказался критическим для работы GS.
При остановке главного Z80 во время исполнения цикла IORQ+RD или IORQ+WR замирает в активном состоянии выход главного дешифратора GS DD6. Он в свою очередь продолжает удерживать включенным R или S вход триггера флагов GS DD5. Поэтому на момент прихода ответной команды от GS на переустановку/сброс флага оба RS-входа в DD5.1 или в DD5.2 оказываются активными и данный триггер принимает неопределённое состояние. Флаг D7 или D0 захватывается процессором GS повторно. Если это исполнение команды CSC/CSD, то повторно захватывается байт из регистра команд/данных. В случае загрузки мода это означает хаотическое вклинивание двойных байтов, т.е. порчу загружаемого файла.
Для предотвращения таких состояний напрашивается использовать триггер, аналогичный ТМ2, но с тактированием RS-входов фронтами, а не уровнями. Однако такого чипа в семействе почему-то не предусмотрено.
Скрин вклинившегося байта в теле мода. Здесь:
HLS - адрес ячейки в Спектруме
HLG - адрес ячейки в GS
DS - cодержимое ячейки в Спектруме
DG - содержимое ячейки в GS
Осциллограмма замороженного WR. Сверху вниз:
1. WR, он же CSD, он же вход S на DD5:1
2. Clock на главном Z80
3. Вход R на DD5:1
4. Выход Q на DD5:1
Доработка Дельты.
Вариант 1.
Для устранения замороженных циклов IORQ достаточно ввести в арбитр медленного поля цепочку IORQ+ЛН1+ЛЛ1. Требуется один разрез, свободные элементы есть тут же в Дельте. Обращаю внимание, что IORQ необходимо брать непосредственно с Z80, а не OUT IORQ с выхода арбитра ZX-Bus.
После этой доработки GS начинает работать безупречно.
Подключение GS к Дельте-С. Конструктивные недочёты GS.
Moderator: Shaos
-
- Writer
- Posts: 20
- Joined: 06 May 2022 08:39
Подключение GS к Дельте-С. Конструктивные недочёты GS.
You do not have the required permissions to view the files attached to this post.
-
- Writer
- Posts: 20
- Joined: 06 May 2022 08:39
Re: Подключение GS к Дельте-С. Конструктивные недочёты GS.
Фото доработки. Разрез отмечен.
Обновление 18.05.2025.
Схемотехника Дельты-С повторяет оригинальный Спектрум:
- Оригинальная ULA останавливает Clock Z80 сразу по выставлению адреса медленного поля (А14=1, А15=0), соответственно перехватываются и обращения к портам с таким адресом, включая порт #7FFD в Спектрум-128.
- Кроме того, ULA останавливает Clock Z80 при обращении к порту #FE (A0=0, /IORQ=0). Эта остановка в Дельте-С не реализована.
Не стоит ли полностью высвободить /IORQ от остановки Clock, т.е. останавливать по условию А14+А15+фронт /MREQ? Это бы освободило порт #7FFD, что должно благотворно сказаться на быстродействии в Дельте, доработанной до 128К.
- Использовав практически все свободные элементы Дельты (7 элементов), я доработал арбитр на А14+А15+ /MREQ, при этом заменив остановку Clock на Wait. Появление W-тактов повлияло на совместимость с в худшую сторону: в Venom рассыпался мультиколор и переместилась бордюрная полоса.
- Немного усложнив схему, возможно перейти от Wait к варианту с новой остановкой Clock - при этом такт надо замораживать в 0, а не в 1, как в исходном арбитре.
Но не получим ли мы ухудшение совместимости с оригинальным обеспечением и в этом случае? Порт 7FFD управляет переключением двух видеостраниц (да и всех страниц). На оригинале порт недоступен, пока луч на растре.
Если разблокировать 7FFD, видеостраницы и страницы будут переключаться независимо от хода луча по растру. Очевидно, это тоже нарушит синхронизацию изображения и прочего кода.
Поэтому полное освобождение /IORQ нельзя считать правильным решением.
Все выложенные ранее предварительные схемы варианта 2 были неработоспособны. Текущий вариант не выкладываю за ненадобностью.
2) Обратное вычитывание мода. Ошибки в «Руководстве по программированию GS» (за авторством Stinger).
В ходе поиска описанной причины мне пришлось написать программу для загрузки тестового мода, обратного вычитывания из GS и побайтного сравнения.
Команда #30 Load Module в руководстве описана верно, но все команды чтения из памяти GS описаны с ошибками.
Команды #15 Get memory block и #17 Peek from address мне оживить не удалось - при чтении из одной и той же ячейки ROM они выдают каждый раз новое значение, то есть читают вообще не ячейку.
В команде #1A Peek from (DE) address ошибку я устранил - она должна завершаться WD, а не WN.
В руководстве нет информации, по какому адресу в GS хранится единственный загружаемый мод. Это страница 2, адрес #8000.
Чтобы произвести обратное вычитывание мода из GS в Спектрум, необходимо:
- Командой #12 OUT to 0 port включить страницу 2. Изначально туда включена страница 0 (ROM).
Цикл:
- Командой #18 Load DE Pair передавать адрес ячейки, начиная с #8000.
- Исправленной командой #1A Peek from (DE) address читать значение ячейки.
3) Оригинальный GS: закоротки на печатном разъёме, отсутствие дорожки /WR на расширитель, отсутствие подтяжки /Reset, незадействованные контакты питания.
- При втыкании платы в ZX-Bus главный Z80 отказался запускаться, выдавая чёрный квадрат.
Причина оказалась в наличии закороток из волосков металлизации на кромке печатного разъёма, в том числе между незадействованным в GS пином +5В и битом адреса. Повезло, что не на пине +12В.
- Второй недочёт оригинальной платы - отсутствие дорожки /WR на пин 34 расширителя от DD15, ножка 27.
- GS изначально позиционировался разработчиком как устройство с раздельным сбросом: «загрузить свой любимый модуль, сбросить Спектрум, загрузить
ассемблер и творить под любимую музыку.» Однако в схеме отсутствует необходимый для раздельного сброса GS резистор 10К, подтягивающий /Reset к +5V, работающий в паре с конденсатором С21А. Если для подтяжки шины данных применяется резисторная сборка с 10 ножками, то можно использовать её свободный резистор.
- на печатном разъёме GS задействован лишь один контакт +5V, также удивляет почти полное отсутствие блокировочных конденсаторов. Полезно подпаять оставшиеся два контакта +5V и один контакт GND. С нижней стороны GS это делается очень просто.
4) Доработка дешифрации и исключение диодной логики.
Решение разработал Black Cat.
- В ZX-Bus с несколькими слотами и арбитром /IORQ на ЛЛ1 за счёт задержек распространения возникает сдвиг между /IORQ и /WR. Этот сдвиг DD6 ошибочно воспринимает как команду на чтение из GS. Поэтому необходимо ввести сюда /RD.
- /IORQGE должен формироваться комбинацией Адрес + Нет /M1, до прихода /IORQ.
Выборка дешифратора = этот же сигнал + /IORQ.
При наличии арбитра на ЛЛ1 третье состояние /IORQGE не требуется. Поэтому лишний элемент в виде транзистора или ЛП8 можно не впаивать.
- Осциллограмма сигнала RAM1 на входе и выходе диодного ИЛИ показывает, что диодная логика не имеет права на жизнь. Она должна быть заменена на ЛА2 и элементы ЛИ1.
Сверху вниз:
3. RAM1=4,6V на входе в диод
1. В1Х=1,4V на выходе из диода
Вариант 2.Обновление 18.05.2025.
Схемотехника Дельты-С повторяет оригинальный Спектрум:
- Оригинальная ULA останавливает Clock Z80 сразу по выставлению адреса медленного поля (А14=1, А15=0), соответственно перехватываются и обращения к портам с таким адресом, включая порт #7FFD в Спектрум-128.
- Кроме того, ULA останавливает Clock Z80 при обращении к порту #FE (A0=0, /IORQ=0). Эта остановка в Дельте-С не реализована.
Не стоит ли полностью высвободить /IORQ от остановки Clock, т.е. останавливать по условию А14+А15+фронт /MREQ? Это бы освободило порт #7FFD, что должно благотворно сказаться на быстродействии в Дельте, доработанной до 128К.
- Использовав практически все свободные элементы Дельты (7 элементов), я доработал арбитр на А14+А15+ /MREQ, при этом заменив остановку Clock на Wait. Появление W-тактов повлияло на совместимость с в худшую сторону: в Venom рассыпался мультиколор и переместилась бордюрная полоса.
- Немного усложнив схему, возможно перейти от Wait к варианту с новой остановкой Clock - при этом такт надо замораживать в 0, а не в 1, как в исходном арбитре.
Но не получим ли мы ухудшение совместимости с оригинальным обеспечением и в этом случае? Порт 7FFD управляет переключением двух видеостраниц (да и всех страниц). На оригинале порт недоступен, пока луч на растре.
Если разблокировать 7FFD, видеостраницы и страницы будут переключаться независимо от хода луча по растру. Очевидно, это тоже нарушит синхронизацию изображения и прочего кода.
Поэтому полное освобождение /IORQ нельзя считать правильным решением.
Все выложенные ранее предварительные схемы варианта 2 были неработоспособны. Текущий вариант не выкладываю за ненадобностью.
2) Обратное вычитывание мода. Ошибки в «Руководстве по программированию GS» (за авторством Stinger).
В ходе поиска описанной причины мне пришлось написать программу для загрузки тестового мода, обратного вычитывания из GS и побайтного сравнения.
Команда #30 Load Module в руководстве описана верно, но все команды чтения из памяти GS описаны с ошибками.
Команды #15 Get memory block и #17 Peek from address мне оживить не удалось - при чтении из одной и той же ячейки ROM они выдают каждый раз новое значение, то есть читают вообще не ячейку.
В команде #1A Peek from (DE) address ошибку я устранил - она должна завершаться WD, а не WN.
В руководстве нет информации, по какому адресу в GS хранится единственный загружаемый мод. Это страница 2, адрес #8000.
Чтобы произвести обратное вычитывание мода из GS в Спектрум, необходимо:
- Командой #12 OUT to 0 port включить страницу 2. Изначально туда включена страница 0 (ROM).
Цикл:
- Командой #18 Load DE Pair передавать адрес ячейки, начиная с #8000.
- Исправленной командой #1A Peek from (DE) address читать значение ячейки.
3) Оригинальный GS: закоротки на печатном разъёме, отсутствие дорожки /WR на расширитель, отсутствие подтяжки /Reset, незадействованные контакты питания.
- При втыкании платы в ZX-Bus главный Z80 отказался запускаться, выдавая чёрный квадрат.
Причина оказалась в наличии закороток из волосков металлизации на кромке печатного разъёма, в том числе между незадействованным в GS пином +5В и битом адреса. Повезло, что не на пине +12В.
- Второй недочёт оригинальной платы - отсутствие дорожки /WR на пин 34 расширителя от DD15, ножка 27.
- GS изначально позиционировался разработчиком как устройство с раздельным сбросом: «загрузить свой любимый модуль, сбросить Спектрум, загрузить
ассемблер и творить под любимую музыку.» Однако в схеме отсутствует необходимый для раздельного сброса GS резистор 10К, подтягивающий /Reset к +5V, работающий в паре с конденсатором С21А. Если для подтяжки шины данных применяется резисторная сборка с 10 ножками, то можно использовать её свободный резистор.
- на печатном разъёме GS задействован лишь один контакт +5V, также удивляет почти полное отсутствие блокировочных конденсаторов. Полезно подпаять оставшиеся два контакта +5V и один контакт GND. С нижней стороны GS это делается очень просто.
4) Доработка дешифрации и исключение диодной логики.
Решение разработал Black Cat.
- В ZX-Bus с несколькими слотами и арбитром /IORQ на ЛЛ1 за счёт задержек распространения возникает сдвиг между /IORQ и /WR. Этот сдвиг DD6 ошибочно воспринимает как команду на чтение из GS. Поэтому необходимо ввести сюда /RD.
- /IORQGE должен формироваться комбинацией Адрес + Нет /M1, до прихода /IORQ.
Выборка дешифратора = этот же сигнал + /IORQ.
При наличии арбитра на ЛЛ1 третье состояние /IORQGE не требуется. Поэтому лишний элемент в виде транзистора или ЛП8 можно не впаивать.
- Осциллограмма сигнала RAM1 на входе и выходе диодного ИЛИ показывает, что диодная логика не имеет права на жизнь. Она должна быть заменена на ЛА2 и элементы ЛИ1.
Сверху вниз:
3. RAM1=4,6V на входе в диод
1. В1Х=1,4V на выходе из диода
You do not have the required permissions to view the files attached to this post.
Last edited by SKV on 18 May 2025 01:40, edited 7 times in total.
-
- Writer
- Posts: 20
- Joined: 06 May 2022 08:39
Re: Подключение GS к Дельте-С. Конструктивные недочёты GS.
Итого требуется разместить 3 дополнительных чипа: ЛА2, ЛН1, ЛИ1. Для этого используем макетную плату, т.к. свободных элементов в GS недостаточно:You do not have the required permissions to view the files attached to this post.
-
- Writer
- Posts: 20
- Joined: 06 May 2022 08:39
Re: Подключение GS к Дельте-С. Конструктивные недочёты GS.
5) Размах тактового генератора GS DD17. Сигнал INT.
При использовании в этой позиции 1533ЛН1 размах выходных импульсов 12МГц равен 3,3V. Резистор R38 позволяет приподнять её кверху в диапазон 0,4..3,7V. Если заглянуть в даташит Z80, то он предъявляет особые требования к уровню Clock:
- нижняя точка не выше 0,4V
- верхняя точка не ниже Uпит - 0,6V =4,4V
Итого размах импульсов 4V.
Этот размах можно получить, применив 1531ЛН1 (74F04). Подтягивающий резистор R38 должен быть уменьшен до 180 Ом. Также я экспериментировал с 74ACT04 на этой позиции (применённой в реплике ZXM-GS). Она требует и других номиналов резисторов в обвязке. КМОП-серия обеспечивает размах 5V, но вследствии высокого быстродействия чрезвычайно склонна к дребезгу и дополнительным переходным процессам. Поэтому вариант с 74F04 я считаю наилучшим.
При использовании в этой позиции 1533ЛН1 размах выходных импульсов 12МГц равен 3,3V. Резистор R38 позволяет приподнять её кверху в диапазон 0,4..3,7V. Если заглянуть в даташит Z80, то он предъявляет особые требования к уровню Clock:
- нижняя точка не выше 0,4V
- верхняя точка не ниже Uпит - 0,6V =4,4V
Итого размах импульсов 4V.
Этот размах можно получить, применив 1531ЛН1 (74F04). Подтягивающий резистор R38 должен быть уменьшен до 180 Ом. Также я экспериментировал с 74ACT04 на этой позиции (применённой в реплике ZXM-GS). Она требует и других номиналов резисторов в обвязке. КМОП-серия обеспечивает размах 5V, но вследствии высокого быстродействия чрезвычайно склонна к дребезгу и дополнительным переходным процессам. Поэтому вариант с 74F04 я считаю наилучшим.
You do not have the required permissions to view the files attached to this post.
-
- Writer
- Posts: 20
- Joined: 06 May 2022 08:39
Re: Подключение GS к Дельте-С. Конструктивные недочёты GS.
Помимо генерации Clock, DD17 является источником импульсов INT 37,5 кГц. Во входной RC-цепи отсутствует обратный диод, из-за чего на вход ЛН1 проходят отрицательные выбросы -1,1V, которые искажают выходной сигнал ЛН1, формируя в нём провалы. Для ТТЛ-серий на входе допускаются отрицательные выбросы -1,2V, а для КМОП (74АСТ04) уже только -0,5V. Поэтому в любом случае параллельно R8 полезно запаять обратный диод, забытый разработчиком GS.
Номиналы R8 C18 зависят от применённой серии ЛН1 - чем быстрее серия, тем короче импульс INT при тех же номиналах. Для 1533ЛН1 номиналы 470 Ом 6,8 нФ. Для 74F04 подойдут штатные номиналы 470 Ом 10 нФ.
Длительность импульса INT (нулевой его уровень) должна составлять 32 такта = 2,7мкс (а в идеале формироваться не RC-цепочкой, а триггером ТМ2+ЛЛ1+IORQ+M1).Номиналы R8 C18 зависят от применённой серии ЛН1 - чем быстрее серия, тем короче импульс INT при тех же номиналах. Для 1533ЛН1 номиналы 470 Ом 6,8 нФ. Для 74F04 подойдут штатные номиналы 470 Ом 10 нФ.
You do not have the required permissions to view the files attached to this post.
-
- Writer
- Posts: 20
- Joined: 06 May 2022 08:39
Re: Подключение GS к Дельте-С. Конструктивные недочёты GS.
От применённой серии зависит ещё и характер обратного фронта импульса INT. Самый лучший он на 1533ЛН1. На 74F04 на этом участке возникает дребезг - многократные переходы, ещё сильнее дребезг в случае 74ACT04. Поэтому в своём GS я оставил DD17 74F04 как тактовый генератор, а сигнал INT вынес на свободный элемент 1533ЛН1 из доработки схемы дешифратора.
В настоящее время доступен только расширитель 2МВ, который требует предварительной доработки GS, описанной Евгением Мучкиным. Использование такого расширителя уменьшает совместимость, т.к. некоторые программы под GS (Saski) отключаются, увидев нестандартное значение страниц RAM (62 вместо 3 или 14).
В отличие от базовых 3 страниц, 62 страницы расширителя чрезвычайно долго проходят стартовый тест. Поэтому с расширителем надо либо использовать прошивку 1.05b, где тест памяти отключен (если работа расширителя полностью отлажена), либо применить светодиодную индикацию о готовности GS после сброса, используя выход триггера DD5.1 и транзистор VT2, оставшийся от IORQGE. DD5.1 всегда принимает определённый уровень по завершении стартового теста.
Если планируется использование GS только с расширителем, то резистор 680 Ом в разрез можно не запаивать. Также можно не запаивать нижний чип RAM DD15, т.к. он исключается из работы битом D2 в переключателе банков.
При наладке расширителя следует иметь в виду, что в отсутствии питания чипы
RAM расширителя просаживают уровни подключенной шины данных до 2,5V, т.е. приводят её в неработоспособность.
Мне свой экземпляр расширителя запустить так и не удалось. При его втыкании стартовый тест GS не находит ни одной страницы RAM, тест завершается выпадением какого-нибудь из разрядов шины данных в 2,5V вместо нормального уровня 4V - явление из предыдущего абзаца.
После напайки на плате GS электролита 470 мкФ и поднятия размаха Clock до нормы (обе эти меры показали результат независимо друг от друга), расширитель начал запускаться, но GS с ним работает крайне нестабильно, запинаясь и зависая. Возможно, перегружается шина данных, и следует отделить расширитель от базовой платы через буфер на 1533АП6 или 1531АП6.
6) РасширительВ настоящее время доступен только расширитель 2МВ, который требует предварительной доработки GS, описанной Евгением Мучкиным. Использование такого расширителя уменьшает совместимость, т.к. некоторые программы под GS (Saski) отключаются, увидев нестандартное значение страниц RAM (62 вместо 3 или 14).
В отличие от базовых 3 страниц, 62 страницы расширителя чрезвычайно долго проходят стартовый тест. Поэтому с расширителем надо либо использовать прошивку 1.05b, где тест памяти отключен (если работа расширителя полностью отлажена), либо применить светодиодную индикацию о готовности GS после сброса, используя выход триггера DD5.1 и транзистор VT2, оставшийся от IORQGE. DD5.1 всегда принимает определённый уровень по завершении стартового теста.
Если планируется использование GS только с расширителем, то резистор 680 Ом в разрез можно не запаивать. Также можно не запаивать нижний чип RAM DD15, т.к. он исключается из работы битом D2 в переключателе банков.
При наладке расширителя следует иметь в виду, что в отсутствии питания чипы
RAM расширителя просаживают уровни подключенной шины данных до 2,5V, т.е. приводят её в неработоспособность.
Мне свой экземпляр расширителя запустить так и не удалось. При его втыкании стартовый тест GS не находит ни одной страницы RAM, тест завершается выпадением какого-нибудь из разрядов шины данных в 2,5V вместо нормального уровня 4V - явление из предыдущего абзаца.
После напайки на плате GS электролита 470 мкФ и поднятия размаха Clock до нормы (обе эти меры показали результат независимо друг от друга), расширитель начал запускаться, но GS с ним работает крайне нестабильно, запинаясь и зависая. Возможно, перегружается шина данных, и следует отделить расширитель от базовой платы через буфер на 1533АП6 или 1531АП6.
You do not have the required permissions to view the files attached to this post.