Подключение GS к Дельте-С. Конструктивные недочёты GS.

Старый спектрумистский форум

Moderator: Shaos

SKV
Writer
Posts: 20
Joined: 06 May 2022 08:39

Подключение GS к Дельте-С. Конструктивные недочёты GS.

Post by SKV »

Подключение 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
01_Двойные байты.jpg
Осциллограмма замороженного WR. Сверху вниз:
1. WR, он же CSD, он же вход S на DD5:1
2. Clock на главном Z80
3. Вход R на DD5:1
4. Выход Q на DD5:1
02_Останов Clock.png
Доработка Дельты.
Вариант 1.
Для устранения замороженных циклов IORQ достаточно ввести в арбитр медленного поля цепочку IORQ+ЛН1+ЛЛ1. Требуется один разрез, свободные элементы есть тут же в Дельте. Обращаю внимание, что IORQ необходимо брать непосредственно с Z80, а не OUT IORQ с выхода арбитра ZX-Bus.
После этой доработки GS начинает работать безупречно.
03_Visio_Арбитр МП 1.jpg
You do not have the required permissions to view the files attached to this post.
SKV
Writer
Posts: 20
Joined: 06 May 2022 08:39

Re: Подключение GS к Дельте-С. Конструктивные недочёты GS.

Post by SKV »

Фото доработки. Разрез отмечен.
04_Доработка Дельты.jpg
Вариант 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 на выходе из диода
06_RAM1 1,4V после диодов.png
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.
SKV
Writer
Posts: 20
Joined: 06 May 2022 08:39

Re: Подключение GS к Дельте-С. Конструктивные недочёты GS.

Post by SKV »

07_Visio_Дешифратор GS.jpg
Итого требуется разместить 3 дополнительных чипа: ЛА2, ЛН1, ЛИ1. Для этого используем макетную плату, т.к. свободных элементов в GS недостаточно:
- ЛН1 DD17:4
- ЛИ1 DD38:3 от IORQGE
- ЛИ1 DD38:4 можно высвободить, используя сигнал RAM1
08_Верхняя сторона GS.jpg
09_Нижняя сторона GS.jpg
You do not have the required permissions to view the files attached to this post.
SKV
Writer
Posts: 20
Joined: 06 May 2022 08:39

Re: Подключение GS к Дельте-С. Конструктивные недочёты GS.

Post by SKV »

5) Размах тактового генератора GS DD17. Сигнал INT.
При использовании в этой позиции 1533ЛН1 размах выходных импульсов 12МГц равен 3,3V. Резистор R38 позволяет приподнять её кверху в диапазон 0,4..3,7V.
10_ Clock 3,3V_1533 (3х470 Ом).png
Если заглянуть в даташит Z80, то он предъявляет особые требования к уровню Clock:
- нижняя точка не выше 0,4V
- верхняя точка не ниже Uпит - 0,6V =4,4V
Итого размах импульсов 4V.

Этот размах можно получить, применив 1531ЛН1 (74F04). Подтягивающий резистор R38 должен быть уменьшен до 180 Ом.
11_Clock 4,3V_74F_187 Ом.png
Также я экспериментировал с 74ACT04 на этой позиции (применённой в реплике ZXM-GS). Она требует и других номиналов резисторов в обвязке. КМОП-серия обеспечивает размах 5V, но вследствии высокого быстродействия чрезвычайно склонна к дребезгу и дополнительным переходным процессам. Поэтому вариант с 74F04 я считаю наилучшим.
You do not have the required permissions to view the files attached to this post.
SKV
Writer
Posts: 20
Joined: 06 May 2022 08:39

Re: Подключение GS к Дельте-С. Конструктивные недочёты GS.

Post by SKV »

Помимо генерации Clock, DD17 является источником импульсов INT 37,5 кГц. Во входной RC-цепи отсутствует обратный диод, из-за чего на вход ЛН1 проходят отрицательные выбросы -1,1V, которые искажают выходной сигнал ЛН1, формируя в нём провалы. Для ТТЛ-серий на входе допускаются отрицательные выбросы -1,2V, а для КМОП (74АСТ04) уже только -0,5V. Поэтому в любом случае параллельно R8 полезно запаять обратный диод, забытый разработчиком GS.
13_Отриц. выбросы после RC.png
14_ Провалы INT.png
Длительность импульса INT (нулевой его уровень) должна составлять 32 такта = 2,7мкс (а в идеале формироваться не RC-цепочкой, а триггером ТМ2+ЛЛ1+IORQ+M1).
Номиналы R8 C18 зависят от применённой серии ЛН1 - чем быстрее серия, тем короче импульс INT при тех же номиналах. Для 1533ЛН1 номиналы 470 Ом 6,8 нФ. Для 74F04 подойдут штатные номиналы 470 Ом 10 нФ.
15_Итоговый INT 1533 2,7мкс.png
You do not have the required permissions to view the files attached to this post.
SKV
Writer
Posts: 20
Joined: 06 May 2022 08:39

Re: Подключение GS к Дельте-С. Конструктивные недочёты GS.

Post by SKV »

От применённой серии зависит ещё и характер обратного фронта импульса INT. Самый лучший он на 1533ЛН1. На 74F04 на этом участке возникает дребезг - многократные переходы, ещё сильнее дребезг в случае 74ACT04. Поэтому в своём GS я оставил DD17 74F04 как тактовый генератор, а сигнал INT вынес на свободный элемент 1533ЛН1 из доработки схемы дешифратора.
16_ Дребезг INT 74F 2,3мкс.png
17_Дребезг INT 74АСТ04 1,8мкс.png
6) Расширитель
В настоящее время доступен только расширитель 2МВ, который требует предварительной доработки GS, описанной Евгением Мучкиным.
18_Visio_Расширитель 2МВ.jpg
Использование такого расширителя уменьшает совместимость, т.к. некоторые программы под 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.