Подключение 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 Скрин Двойные байты>
Осциллограмма замороженного WR. Сверху вниз:
1. WR, он же CSD, он же вход S на DD5:1
2. Clock на главном Z80
3. Вход R на DD5:1
4. Выход Q на DD5:1
<02 Осц. Замороженный WR>
Доработка Дельты.
Вариант 1.
Для устранения замороженных циклов IORQ достаточно ввести в арбитр медленного поля цепочку IORQ+ЛН1+ЛЛ1. Требуется один разрез, свободные элементы есть тут же в Дельте. Обращаю внимание, что IORQ необходимо брать непосредственно с Z80, а не OUT IORQ с выхода арбитра ZX-Bus.
После этой доработки GS начинает работать безупречно.
<03_Схема Арбитр МП1>
Фото доработки. Разрез отмечен.
<04_Фото доработки>
Вариант 2.
Также я приготовил вариант доработки для полного высвобождения IORQ от остановки Clock, т.е. остановку по условию А14+А15+фронт MREQ. Но этот вариант остался мною непроверен, т.к. требует разреза в недоступной дорожке под брюхом DD30 между пинами 13-2.
Можно обойтись без выпаивания DD30, откусив пин 13 над платой и подпаяв к нему новый проводок сверху.
<05_Схема Арбитр МП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>
<07_Схема Доработки GS>
Итого требуется разместить 3 дополнительных чипа: ЛА2, ЛН1, ЛИ1. Для этого используем макетную плату, т.к. свободных элементов в GS недостаточно:
- ЛН1 DD17:4
- ЛИ1 DD38:3 от IORQGE
- ЛИ1 DD38:4 можно высвободить, используя сигнал RAM1
<08_Фото Верхняя сторона GS>
<09_Фото Нижняя сторона GS>
5) Размах тактового генератора GS DD17. Сигнал INT.
При использовании в этой позиции 1533ЛН1 размах выходных импульсов 12МГц равен 3,3V. Резистор R38 позволяет приподнять её кверху в диапазон 0,4..3,7V.
<10_Осц. Размах 1533ЛН1 + 470 Ом>
Если заглянуть в даташит Z80, то он предъявляет особые требования к уровню Clock:
- нижняя точка не выше 0,4V
- верхняя точка не ниже Uпит - 0,6V =4,4V
Итого размах импульсов 4V.
Этот размах можно получить, применив 1531ЛН1 (74F04). Подтягивающий резистор R38 должен быть уменьшен до 180 Ом.
<11_Осц. Размах 74F04 + 180 Ом>
Также я экспериментировал с 74ACT04 на этой позиции (применённой в реплике ZXM-GS). Она требует и других номиналов резисторов в обвязке. КМОП-серия обеспечивает размах 5V, но вследствии высокого быстродействия чрезвычайно склонна к дребезгу и дополнительным переходным процессам. Поэтому вариант с 74F04 я считаю наилучшим.
<12_Осц. Размах 74ACT04>
Помимо генерации Clock, DD17 является источником импульсов INT 37,5 кГц. Во входной RC-цепи отсутствует обратный диод, из-за чего на вход ЛН1 проходят отрицательные выбросы -1,1V, которые искажают выходной сигнал ЛН1, формируя в нём провалы. Для ТТЛ-серий на входе допускаются отрицательные выбросы -1,2V, а для КМОП (74АСТ04) уже только -0,5V. Поэтому в любом случае параллельно R8 полезно запаять обратный диод, забытый разработчиком GS.
<13_Осц. RC-выбросы>
<14_Осц. Провалы в INT>
Длительность импульса INT (нулевой его уровень) должна составлять 32 такта = 2,7мкс (а в идеале формироваться не RC-цепочкой, а триггером ТМ2+ЛЛ1+IORQ+M1).
Номиналы R8 C18 зависят от применённой серии ЛН1 - чем быстрее серия, тем короче импульс INT при тех же номиналах. Для 1533ЛН1 номиналы 470 Ом 6,8 нФ. Для 74F04 подойдут штатные номиналы 470 Ом 10 нФ.
<15_Осц. Итоговый INT 1533ЛН1 2,7мкс>
От применённой серии зависит ещё и характер обратного фронта импульса INT. Самый лучший он на 1533ЛН1. На 74F04 на этом участке возникает дребезг - многократные переходы, ещё сильнее дребезг в случае 74ACT04. Поэтому в своём GS я оставил DD17 74F04 как тактовый генератор, а сигнал INT вынес на свободный элемент 1533ЛН1 из доработки схемы дешифратора.
<16_Осц. Дребезг INT 74F04 2,3мкс>
<17_Осц. Дребезг INT 74ACT04 1,8мкс>
6) Расширитель
В настоящее время доступен только расширитель 2МВ, который требует предварительной доработки GS, описанной Евгением Мучкиным.
<18_Схема Доработка под расширитель 2МВ>
Использование такого расширителя уменьшает совместимость, т.к. некоторые программы под 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.


Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
поэтому тест определения карты был сделан довольно тупо.
