Плеер музыки ZX-Spectrum на одной микросхеме
Говорят, первый раз запоминается на всю жизнь. Люди запоминают свою первую любовь, первый поцелуй, первый автомобиль, первый брак, первую ипотеку. Вот и я запомнил свой первый компьютер, ZX-Spectrum. Через него у меня произошло первое знакомство с программированием, компьютерными играми и музыкой. И даже сейчас, много лет спустя, глядя на какой-либо алгоритм, я порой вдруг задумываюсь — «А как этот код можно было бы написать для Z-80?» Поэтому, когда я первый раз взял в руки микроконтроллер ATtiny85, то сразу понял, что на нем можно сделать плеер музыки ZX-Spectrum. С тех пор прошло более десяти лет, но то одно, то другое, и до реализации у меня никак не доходили руки. А тут вдруг удалось исполнить свою давнюю мечту, поэтому сегодня я с радостью делюсь с вами тем, что у меня получилось.
Не буду оттягивать время и сразу оставлю ссылку, по которой можно послушать, что у меня в итоге получилось. Возможно, вы даже продолжите чтение статьи под эту прекрасную мелодию (не забудьте снять режим «без звука» в видеоплеере GitHub’а):
github.com/kdekaluga/zx-spectrum-music-player/tree/main/Examples
Почему именно ATtiny85? Прежде всего потому, что он маленький и самодостаточный, может работать полностью автономно без единого внешнего компонента, только подай на него питание. С другой стороны, у него есть два канала высокочастотного ШИМ, которые можно использовать вместо ЦАПов для вывода стереофонического звука, а встроенного ПЗУ объемом 8 КБ должно хватить как для самой мелодии (которые на Спектруме занимали примерно 3-6 КБ), так и для кода эмуляции плеера.
Конечно, сейчас можно найти на эту роль микроконтроллеры и помощнее, и подешевле, тут уж китайские производители постарались, но десять лет назад такого многообразия не было, поэтому ATtiny85 казался идеальным вариантом. А раз так, то и начну с него, благо несколько штук таких контроллеров в запасах еще осталось.
Что же понадобится реализовать?
Достать мелодию – не проблема, огромный архив есть на сайте https://zxart.ee/, где можно не только поискать знакомые названия, но и тут же прослушать выбранные варианты в МР3. Кстати, на этом сайте есть и большой архив демок для ZX-Spectrum, так что если вы раньше имели какое-то отношение к демосцене или же вам просто интересно посмотреть, как оно тогда было – заходите, не пожалеете. Демки смотреть тоже можно прямо на сайте, там есть браузерный эмулятор Спектрума.
Написать программный эмулятор звукового чипа также несложно, ведь он простенький, неплохо документированный, да и лет 25 лет назад я уже разок эмулировал его для процессоров x86, осталось только вспомнить, куда делся тот исходник. А вот что у меня вызывало серьезные опасения, так это плеер и его портирование для платформы AVR. Дело в том, что, во-первых, AVR использует два разных адресных пространства для обращения к ОЗУ и ПЗУ, в то время как во всех обычных процессорах, включая Z-80, и ПЗУ, и ОЗУ доступны из единого общего адресного пространства. А, во-вторых, в те далекие времена для ускорения выполнения программы на Z-80 повсеместно использовался самомодифицирующийся код, что принципиально невозможно реализовать на AVR. В общем, код плеера не получится просто портировать покомандно, лишь заменив регистры одного процессора на регистры другого (как обычно делают в таких случаях), в нем придется разбираться досконально, чтобы переписать его под другую платформу с учетом её особенностей. Поэтому начать я решил именно с плеера – если с ним ничего не выйдет, проект можно будет снова закопать на неопределенный срок без лишних потерь. Если же портировать плеер удастся, с реализацией остальной части задумки проблем не возникнет.

В качестве плеера выбрал относительно простой по возможностям, но достаточно популярный в начале 90-х годов плеер от музыкального редактора Sound Tracker. В те годы музыка, написанная в этом редакторе встречалась во многих демках для Спектрума, включая такие легенды как Lyra II, Shock или Insult. Также большим плюсом Sound Tracker было то, что его скомпилированная музыка (без плеера) не содержала в себе абсолютных адресов, только смещения, что позволяло динамически размещать её в памяти по любому желаемому адресу. Это было редкостью, ведь в то время о вопросах релокации кода и данных на Спектруме никто не задумывался, т.к. многозадачных систем не существовало. Разработчики просто создавали программы, способные работать лишь по строго фиксированному адресу, так как точно знали, что он всегда будет доступен.
То же самое относилось и к музыке – были такие форматы, внутри которых содержались абсолютные адреса, что не позволяло свободно перемещать мелодию по памяти компьютера. Это создавало определенные трудности при написании музыкальных демок – программ, в памяти которых хранилось сразу пару десятков популярных мелодий, и пользователь мог выбирать, какую из них он хотел бы прослушать. Но авторы Sound Tracker пошли другим путем и использовали только смещения, а конечные адреса высчитывали непосредственно в процессе инициализации плеера, что делало перемещение мелодии по памяти тривиальным. За это музыка в данном формате была отдельно любима кодерами. В современном мире скомпилированные и готовые к воспроизведению мелодии Sound Tracker имеют расширение *.STC (Sound Tracker Compiled).
Правильнее всего код плеера было бы взять непосредственно из самого Sound Tracker’а – загрузить какую-либо мелодию, откомпилировать и сохранить на диск вместе с плеером. Однако, для этого нужно настраивать и запускать эмулятор. И тут вдруг я вспомнил про искусственный интеллект – почему бы не дать ему задачу сделать всё сразу – и найти, и дизассемблировать двоичный код? Это бы серьезно сократило время на поиски и изучение формата, а, значит, и на всю разработку.
Начал, традиционно, с ChatGPT и уже через несколько запросов понял, что ничего не выйдет – во-первых, он не знал, какой именно Sound Tracker я имею в виду, пришлось всё равно отдельно самому искать его в интернете и снабжать ChatGPT ссылкой, а, во-вторых, выяснилось, что он не может скачивать файлы с некоторых страниц, т.к. для него заблокирован такой доступ:

Тогда я постарался найти уже готовый байт-код плеера и скормить ChatGPT его. Код удалось найти на гитхабе в виде массива данных в исходнике для С++. Теперь нейросети оставалось лишь перевести его в двоичный файл и дизассемблировать в инструкции Z-80, с чем она вполне должна была справиться. И, на первый взгляд, у неё даже получилось, она выдала вот такой листинг:

Меня сразу насторожило – зачем в плеере бессмысленная последовательность LD A, I; XOR A? В Z-80 регистр I отвечает за адрес таблицы векторов прерываний, плеер не должен её трогать. Я уж было подумал, что исходный код плеера на гитхабе был с ошибками или же ChatGPT каким-то образом неверно перевел массив С++ в двоичный код или даже подменил его содержимое. Но всё оказалось проще – посмотрев таблицу команд Z-80, я понял, что это код команды OUT ( C ), A, которую ChatGPT просто неправильно дизассемблировал. Выяснение правды отняло у меня некоторое время, но это склонило меня к тому, что нейросети нельзя доверять такую ответственную операцию, как дизассемблирование исходного кода, поэтому я принялся искать нормальный дизассемблер Z-80 онлайн.
И такой был найден:

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

По сути, задача была решена, дальше надо было лишь разбираться с кодом и адаптировать его под AVR. Однако, я решил дать нейросети еще один шанс и просто попросил её прокомментировать дизассемблированный код – даже если она частично угадает где что происходит, мне уже будет легче в нем разобраться. ChatGPT снова «не подвел» и выдал прекраснейшие своей информативностью комментарии:

Тогда я вдруг вспомнил про его китайский аналог – DeepSeek, и решил попробовать его. Почему-то у меня не получилось загрузить в него тестовый файл, так что весь дизассемблированный код пришлось вставлять в промпт. Тем не менее, мы оба справились – я смог вставить исходный текст, а он дать более-менее вменяемые комментарии:

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

Дополнительно я нашел описание формата STC-файла, и хоть оно тоже содержало как минимум одну ошибку, всей суммарной информации уже хватило, чтобы переписать код плеера под AVR. Изначально я хотел делать это на ассемблере, но потом вдруг подумал, что высокоуровневый код плеера может оказаться полезным, если в будущем я захочу сделать аналогичный плеер на другом микроконтроллере, поэтому решил сразу переводить его на С++. В целом, это оказалось не так сложно, как я думал, и за вечер плеер был написан. Правда оставался открытым вопрос, каким образом я смогу исправить в нем ошибки, если ни исходный, ни полученный код у меня нет возможности отлаживать? Но тут просто понадеялся, что ошибок в коде не будет :)
Не думаю, что весь код плеера окажется вам интересен, поэтому здесь приведу только кусочек, а с остальным вы можете ознакомиться в репозитории самостоятельно:

Забегая вперед, скажу, что ошибки в коде всё-таки оказались, их было три. И все три пришлось исправлять «на слух», сравнивая звучание мелодии в эмуляторе с оригиналом на сайте. Самой значительной ошибкой было то, что я всегда использовал первый инструмент независимо от выбранного в мелодии – просто написал m_samples->m_points[samplePosition] вместо ch.m_sample->m_points[samplePosition]. А самая «хитрая» была в коде эмуляции звукового чипа, о ней я расскажу чуть позже.
Когда плеер был готов, можно было перейти к эмуляции AY-3-8910. Этот чип имеет в своем составе три генератора прямоугольного тона, однобитный генератор шума, программируемый генератор огибающей и три 4-битных ЦАПа. Частоты всех генераторов настраиваются программно, управление «хозяйством» происходит через 14 8-битных регистров, находящихся внутри чипа:

Первые 6 регистров задают период основного тона трех каналов А, В и С. 6-й регистр задает период генератора шума. 7-й регистр управляет микшером чипа и разрешает включать или выключать генерацию тона и шума в соответствующих каналах. Следующие три регистра определяют громкость звука в каналах А, В и С, а также отвечают за включение или выключение в них огибающей. И, наконец, последние три регистра задают период и форму огибающей. Всего чип поддерживает 8 разных форм:

Поскольку чип достаточно простой и умножения делать не умеет, включение огибающей в каком-либо канале автоматически устанавливает в нем максимальную громкость. Также отдельной особенностью генератора огибающей является то, что любая запись в регистр #13 сбрасывает генератор и огибающая начинает воспроизводиться сначала. То есть, в отличии от других регистров значение в нем следует обновлять только в случае изменения формы огибающей.
В общем, понятно, что эмуляция огибающей будет наиболее сложной задачей, поэтому я решил начать именно с неё. Если посмотреть картинку выше, все огибающие можно разделить на два типа – одиночные, когда после окончания одного периода на выходе поддерживается постоянный низкий или высокий уровень и периодические, когда генератор огибающей генерирует треугольный или пилообразный сигнал. Чтобы не разделять такие типы в эмуляторе, я решил, что каждая огибающая будет представлять собой последовательность из 4-х сэмплов, где первый и второй будут проиграны лишь один раз, а третий и четвертый будут повторяться бесконечно. Различных сэмплов будет тоже четыре – возрастающий, понижающийся, низкий и высокий. Таким образом, комбинируя эти сэмплы в нужные последовательности можно будет представить все доступные в AY формы сигнала.

Непосредственно для эмуляции звуковых сигналов я буду применять метод цифрового синтеза DDS. В этом методе на каждом такте опорного сигнала (частоты дискретизации эмулятора) аккумулятор фазы генерируемого сигнала будет увеличиваться на какое-то заранее заданное постоянное значение, после чего значение фазы будет преобразовываться в амплитуду генерируемого сигнала. Для огибающей это будет делаться с помощью таблиц одного из 4-х возможных семплов, для генератора тона – просто браться старший бит фазы.
Изначально я хотел выбрать частоту дискретизации для эмулятора равной традиционным 44100 Гц, однако, изучив документацию на AY обратил внимание, что базовой частотой для всех генераторов является входная частота чипа, деленная на 16. В российском клоне Спектрума AY тактировался с половинной частотой центрального процессора, то есть, 1.75 МГц, таким образом, базовой частотой генераторов были 109375 Гц. Если поделить это число на 2.5 мы получим 43750 Гц, что весьма близко к 44100, так что я решил сделать частоту дискретизации именно такой – это позволит использовать более «круглые» коэффициенты при расчете приращений фазы для DDS.
Точность DDS напрямую определяется разрядностью аккумулятора фазы и частотой дискретизации. Если при частоте дискретизации 43750 Гц использовать 16-разрядный аккумулятор, единице младшего разряда будет соответствовать 43750/65536 = 0.67 Гц. Если предположить, что приращение фазы определяется с точностью до единицы младшего разряда (типичная ситуация для целочисленных вычислений), мы получим итоговую погрешность генератора до 0.67 Гц. Это будет практически незаметно при генерации высокочастотных сигналов, однако весьма много при генерации низкочастотных. То есть, мне надо использовать 24-разрядный аккумулятор, который при той же частоте дискретизации будет уже обеспечивать точность в 0.003 Гц.
Исходя из изложенных принципов был написал следующий код:

Вначале он увеличивает аккумулятор фазы, хранящийся в переменной g_ayEnvelopePos на значение g_ayEnvelopeAdd. Установка флага переноса после такого приращения означает, что эмуляция текущего периода сигнала огибающей завершена и необходимо перейти к следующему, то есть, выбрать новый сэмпл по таблице последовательности. Выбор семпла производится в соответствии с описанными выше правилами – первый и второй семплы проигрываются лишь однократно, а третий и четвертый повторяются бесконечно. Наконец, 4 старших бита аккумулятора фазы определяют номер точки семпла, которая должна попасть на выход (которым является регистр R0) в данный момент. Весь код эмулятора огибающий в худшем случае занимает 47 тактов процессора.
Следующим шагом происходит эмуляция генератора шума. По сути, генератор шума AY – это однобитный генератор случайных чисел, работающий с заданной частотой. А, значит, его можно реализовать, совместив DDS с LFSR, про который я рассказывал в одной из предыдущих статей. В этой связке LFSR будет генерировать случайные биты, а DDS выдавать их на выход с нужной скоростью. Так как минимальная частота генерируемого шума в AY достаточно высокая и составляет 109375/31 = 3.5 КГц, разрядность аккумулятора фазы можно понизить до 16 бит. LFSR я взял из предыдущих проектов длиной 31 бит.

В работе эмулятора шума есть весьма интересная ситуация – максимальная генерируемая частота шума составляет 109375/1 = 109375 Гц, то есть, в 2.5 раза больше, чем частота дискретизации! Что же делать в этом случае? А ничего, ведь шум – это поток случайных битов. Если он идет с частотой 109375 Гц, а мы будем на него смотреть лишь 43750 раз в секунду, мы будем видеть только 43750 битов из 109375. Но, так как эти биты случайны, то, что мы будем видеть всё равно останется для нас случайной последовательностью. А это значит, что можно смело ограничить максимальную частоту генерации случайных бит до 43750 Гц.
Несмотря на то, что аккумулятор фазы генератора шума имеет разрядность 16 бит, приращение фазы необходимо оставить 24-битным, т.к. его максимальное значение может быть 163840, что не умещается в 16 бит. Для сложения с таким приращением к аккумулятору будет временно добавляться третий байт, изначально равный нулю. Если после сложения его значение станет отличным от нуля, это будет означать, что надо перейти к новому «периоду» шума и, соответственно, сгенерировать новый случайный бит. В худшем случае код эмуляции генератора шума занимает 46 тактов, что дает максимальное общее время в 93 такта.
Завершающим этапом будет происходить эмуляция генераторов тона и микшера для трех каналов. Для генерации тона будет использован такой же DDS с 24-битным аккумулятором фазы, но так как на выходе нужно получить простой меандр, результат будет браться напрямую из 23-го бита аккумулятора. Кстати, каналы тона в чипе AY тоже могут генерировать частоту вплоть до 109375 Гц, но такая частота никогда не применялась на практике в плеерах, ведь она не слышна человеческим ухом. Эмулятор будет в этом случае создавать более низкую частоту, зеркально отраженную на спектре от точки 43750 Гц.

Важным моментом внутренней архитектуры AY является выходной ЦАП – так как он имеет весьма малое количество разрядов, для обеспечения возможности регулировки громкости выходного сигнала в достаточно широких пределах, его передаточная характеристика выбрана обратной логарифмической:

Таким образом, для получения реальной амплитуды выходного сигнала необходимо провести табличное преобразование полученной громкости в требуемый процент заполнения для PWM-выхода МК. Я решил сделать выход монофоническим, чтобы иметь возможность подключить к схеме один звукоизлучатель, поэтому складываю результат всех трех каналов вместе в регистр R21. Однако ничего не мешает переделать код на стереофонический выход, ведь PWM-канала у таймера МК два.
В итоге, общее время работы кода эмулятора AY получилось равным 224-м тактам процессора в худшем случае. Добавим сюда сохранение регистров при входе в прерывание и восстановление при выходе, а также другие накладные расходы, после чего можно считать, что обработчик прерывания занимает порядка 270 тактов из 366 доступных. То есть, вполне укладывается в отведенное ему время, хотя и занимает несколько больше, чем я ожидал.
А что было бы, если бы обработчик не уложился? В принципе, ничего фатального, нужно было бы лишь снизить частоту дискретизации эмулятора до подходящего значения, например, до 25 КГц. Это снизило бы максимальную выходную частоту, которую способен воспроизвести эмулятор, но для мелодий Спектрума это вряд ли так уж критично.
А можно ли ускорить эмуляцию? Да, можно. Эмулятор тратит много тактов процессора на чтение и сохранение данных в оперативную память – аккумуляторов и приращений фазы. Но если за один вызов функции генерировать не одно выходное значение амплитуды, а целую пачку, например, 64 или 128, можно все промежуточные данные держать в регистрах и сэкономить на операциях с памятью. Думаю, за счет такой оптимизации можно было бы постараться ускорить процесс эмуляции практически вдвое. В данном проекте это не нужно, так как здесь у процессора нет каких-либо других задач, но если рассматривать другое применение написанного кода, об оптимизации задуматься определенно стоит.
Ну, и последним «кирпичиком», необходимым, чтобы плеер запустился является расчет приращений фаз всех DDS на основе значений регистров эмулируемого чипа. Он выполняется 50 раз в секунду, после каждого вызова кода плеера и поэтому написан на С++:

В этом коде нет ничего необычного, сначала все значения рассчитываются с помощью 32-битной арифметики, а потом разом устанавливаются нужные глобальные переменные. Чтобы случайно вдруг не получилось, что часть переменных обновится, а часть еще будет содержать старые значения, на время присвоения прерывания МК запрещаются.
И вот теперь можно рассказать о «хитрой» ошибке, закравшийся в код эмуляции AY. По документации минимальное значение, которое можно занести в регистры периода равняется 1. Что будет, если занести туда ноль документация не указывает. На практике же занесение нуля полностью эквивалентно занесению единицы – соответствующий генератор выдает на своем выходе максимальную частоту. И если с генератором тона это не применяется (так как он генерирует сверхзвуковую частоту в этом случае), то с генератором огибающей вполне, ведь его максимальная выходная частота в 16 раз меньше и всегда попадает в звуковой диапазон. Вот именно этот факт я и забыл учесть в своем изначальном коде, где при занесении нуля в регистр периода генератор огибающей просто останавливался. Нашлось это тоже «на слух» в одной из мелодий, которая звучала в эмуляторе неправильно.
На этом можно считать, что программная часть закончена, поэтому перейдем к аппаратной. А её, по сути, и нет – необходимо просто взять запрограммированный чип ATtiny85, подать на него питание и снимать готовый аудиосигнал с выхода PB4 (вывод номер 3). Если вы хотите подключить к «проигрывателю» наушники или динамик, это можно сделать напрямую без дополнительных фильтров, PWM-сигнал усреднится непосредственно на звуковом излучателе. А вот если соберетесь подключать какой-либо усилитель, лучше добавить на выход ФНЧ хотя бы на RC-цепочке, так как не каждому усилителю понравится 250 КГц на входе. Подходящими номиналами могут быть, например, резистор 100 Ом и конденсатор 220 нФ (только не используйте электролитический, он плохо работает на высоких частотах).
Вот так выглядит мой плеер сейчас – он пока что еще остался на макетной плате:

У меня на выход МК добавлен RC-фильтр и делитель, после чего установлен разъем 3.5 мм под наушники, чтобы можно было записать воспроизводимую мелодию на компьютер. Ссылка на пример работы плеера уже была в начале статьи, но повторю её еще раз тут:
github.com/kdekaluga/zx-spectrum-music-player/tree/main/Examples
Теперь настало время подвести итоги. Есть ли у проигрывателя какое-либо реальное применение? Вряд ли. Можно, конечно, дополнить чип USB-штеккером для питания и разъемом для наушников, после чего убрать это в небольшой напечатанный корпус и подарить на день рождения знакомому поклоннику Спектрума, но это единичные случаи. Можно попробовать использовать, например, вместо дверного звонка, но боюсь, одна и та же мелодия быстро надоест. В общем, проект носит скорее развлекательно-демонстрационных характер из раздела «смотрите, как еще можно сделать». Но если вдруг у вас есть идеи, где это можно использовать с пользой – напишите в комментариях, будет очень интересно.
Ах, да, общий объем кода эмулятора и плеера в памяти МК составляет около 2700 байт, то есть, под мелодию остается порядка 5500 байт, и этого хватает для практически всех мелодий в STC-формате, но не для абсолютно всех. Парочка больших мелодий, таких как, например, Laser-Dance требуют немногим больше места. Но решение есть – переписать код плеера на ассемблер, тогда, наверное, можно уместить весь обслуживающий код в 2 или даже 1.5 КБ. Однако, веской причины делать это сейчас нет.
На этом у меня всё, спасибо за внимание. Исходный код можно найти здесь:
github.com/kdekaluga/zx-spectrum-music-player
Не буду оттягивать время и сразу оставлю ссылку, по которой можно послушать, что у меня в итоге получилось. Возможно, вы даже продолжите чтение статьи под эту прекрасную мелодию (не забудьте снять режим «без звука» в видеоплеере GitHub’а):
github.com/kdekaluga/zx-spectrum-music-player/tree/main/Examples
Почему именно ATtiny85? Прежде всего потому, что он маленький и самодостаточный, может работать полностью автономно без единого внешнего компонента, только подай на него питание. С другой стороны, у него есть два канала высокочастотного ШИМ, которые можно использовать вместо ЦАПов для вывода стереофонического звука, а встроенного ПЗУ объемом 8 КБ должно хватить как для самой мелодии (которые на Спектруме занимали примерно 3-6 КБ), так и для кода эмуляции плеера.
Конечно, сейчас можно найти на эту роль микроконтроллеры и помощнее, и подешевле, тут уж китайские производители постарались, но десять лет назад такого многообразия не было, поэтому ATtiny85 казался идеальным вариантом. А раз так, то и начну с него, благо несколько штук таких контроллеров в запасах еще осталось.
Что же понадобится реализовать?
- Эмуляция звукового чипа AY-3-8910.
- Какой-либо плеер музыки, портированный на AVR.
- Непосредственно, сама мелодия.
Достать мелодию – не проблема, огромный архив есть на сайте https://zxart.ee/, где можно не только поискать знакомые названия, но и тут же прослушать выбранные варианты в МР3. Кстати, на этом сайте есть и большой архив демок для ZX-Spectrum, так что если вы раньше имели какое-то отношение к демосцене или же вам просто интересно посмотреть, как оно тогда было – заходите, не пожалеете. Демки смотреть тоже можно прямо на сайте, там есть браузерный эмулятор Спектрума.
Написать программный эмулятор звукового чипа также несложно, ведь он простенький, неплохо документированный, да и лет 25 лет назад я уже разок эмулировал его для процессоров x86, осталось только вспомнить, куда делся тот исходник. А вот что у меня вызывало серьезные опасения, так это плеер и его портирование для платформы AVR. Дело в том, что, во-первых, AVR использует два разных адресных пространства для обращения к ОЗУ и ПЗУ, в то время как во всех обычных процессорах, включая Z-80, и ПЗУ, и ОЗУ доступны из единого общего адресного пространства. А, во-вторых, в те далекие времена для ускорения выполнения программы на Z-80 повсеместно использовался самомодифицирующийся код, что принципиально невозможно реализовать на AVR. В общем, код плеера не получится просто портировать покомандно, лишь заменив регистры одного процессора на регистры другого (как обычно делают в таких случаях), в нем придется разбираться досконально, чтобы переписать его под другую платформу с учетом её особенностей. Поэтому начать я решил именно с плеера – если с ним ничего не выйдет, проект можно будет снова закопать на неопределенный срок без лишних потерь. Если же портировать плеер удастся, с реализацией остальной части задумки проблем не возникнет.

В качестве плеера выбрал относительно простой по возможностям, но достаточно популярный в начале 90-х годов плеер от музыкального редактора Sound Tracker. В те годы музыка, написанная в этом редакторе встречалась во многих демках для Спектрума, включая такие легенды как Lyra II, Shock или Insult. Также большим плюсом Sound Tracker было то, что его скомпилированная музыка (без плеера) не содержала в себе абсолютных адресов, только смещения, что позволяло динамически размещать её в памяти по любому желаемому адресу. Это было редкостью, ведь в то время о вопросах релокации кода и данных на Спектруме никто не задумывался, т.к. многозадачных систем не существовало. Разработчики просто создавали программы, способные работать лишь по строго фиксированному адресу, так как точно знали, что он всегда будет доступен.
То же самое относилось и к музыке – были такие форматы, внутри которых содержались абсолютные адреса, что не позволяло свободно перемещать мелодию по памяти компьютера. Это создавало определенные трудности при написании музыкальных демок – программ, в памяти которых хранилось сразу пару десятков популярных мелодий, и пользователь мог выбирать, какую из них он хотел бы прослушать. Но авторы Sound Tracker пошли другим путем и использовали только смещения, а конечные адреса высчитывали непосредственно в процессе инициализации плеера, что делало перемещение мелодии по памяти тривиальным. За это музыка в данном формате была отдельно любима кодерами. В современном мире скомпилированные и готовые к воспроизведению мелодии Sound Tracker имеют расширение *.STC (Sound Tracker Compiled).
Правильнее всего код плеера было бы взять непосредственно из самого Sound Tracker’а – загрузить какую-либо мелодию, откомпилировать и сохранить на диск вместе с плеером. Однако, для этого нужно настраивать и запускать эмулятор. И тут вдруг я вспомнил про искусственный интеллект – почему бы не дать ему задачу сделать всё сразу – и найти, и дизассемблировать двоичный код? Это бы серьезно сократило время на поиски и изучение формата, а, значит, и на всю разработку.
Начал, традиционно, с ChatGPT и уже через несколько запросов понял, что ничего не выйдет – во-первых, он не знал, какой именно Sound Tracker я имею в виду, пришлось всё равно отдельно самому искать его в интернете и снабжать ChatGPT ссылкой, а, во-вторых, выяснилось, что он не может скачивать файлы с некоторых страниц, т.к. для него заблокирован такой доступ:

Тогда я постарался найти уже готовый байт-код плеера и скормить ChatGPT его. Код удалось найти на гитхабе в виде массива данных в исходнике для С++. Теперь нейросети оставалось лишь перевести его в двоичный файл и дизассемблировать в инструкции Z-80, с чем она вполне должна была справиться. И, на первый взгляд, у неё даже получилось, она выдала вот такой листинг:

Меня сразу насторожило – зачем в плеере бессмысленная последовательность LD A, I; XOR A? В Z-80 регистр I отвечает за адрес таблицы векторов прерываний, плеер не должен её трогать. Я уж было подумал, что исходный код плеера на гитхабе был с ошибками или же ChatGPT каким-то образом неверно перевел массив С++ в двоичный код или даже подменил его содержимое. Но всё оказалось проще – посмотрев таблицу команд Z-80, я понял, что это код команды OUT ( C ), A, которую ChatGPT просто неправильно дизассемблировал. Выяснение правды отняло у меня некоторое время, но это склонило меня к тому, что нейросети нельзя доверять такую ответственную операцию, как дизассемблирование исходного кода, поэтому я принялся искать нормальный дизассемблер Z-80 онлайн.
И такой был найден:

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

По сути, задача была решена, дальше надо было лишь разбираться с кодом и адаптировать его под AVR. Однако, я решил дать нейросети еще один шанс и просто попросил её прокомментировать дизассемблированный код – даже если она частично угадает где что происходит, мне уже будет легче в нем разобраться. ChatGPT снова «не подвел» и выдал прекраснейшие своей информативностью комментарии:

Тогда я вдруг вспомнил про его китайский аналог – DeepSeek, и решил попробовать его. Почему-то у меня не получилось загрузить в него тестовый файл, так что весь дизассемблированный код пришлось вставлять в промпт. Тем не менее, мы оба справились – я смог вставить исходный текст, а он дать более-менее вменяемые комментарии:

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

Дополнительно я нашел описание формата STC-файла, и хоть оно тоже содержало как минимум одну ошибку, всей суммарной информации уже хватило, чтобы переписать код плеера под AVR. Изначально я хотел делать это на ассемблере, но потом вдруг подумал, что высокоуровневый код плеера может оказаться полезным, если в будущем я захочу сделать аналогичный плеер на другом микроконтроллере, поэтому решил сразу переводить его на С++. В целом, это оказалось не так сложно, как я думал, и за вечер плеер был написан. Правда оставался открытым вопрос, каким образом я смогу исправить в нем ошибки, если ни исходный, ни полученный код у меня нет возможности отлаживать? Но тут просто понадеялся, что ошибок в коде не будет :)
Не думаю, что весь код плеера окажется вам интересен, поэтому здесь приведу только кусочек, а с остальным вы можете ознакомиться в репозитории самостоятельно:

Забегая вперед, скажу, что ошибки в коде всё-таки оказались, их было три. И все три пришлось исправлять «на слух», сравнивая звучание мелодии в эмуляторе с оригиналом на сайте. Самой значительной ошибкой было то, что я всегда использовал первый инструмент независимо от выбранного в мелодии – просто написал m_samples->m_points[samplePosition] вместо ch.m_sample->m_points[samplePosition]. А самая «хитрая» была в коде эмуляции звукового чипа, о ней я расскажу чуть позже.
Когда плеер был готов, можно было перейти к эмуляции AY-3-8910. Этот чип имеет в своем составе три генератора прямоугольного тона, однобитный генератор шума, программируемый генератор огибающей и три 4-битных ЦАПа. Частоты всех генераторов настраиваются программно, управление «хозяйством» происходит через 14 8-битных регистров, находящихся внутри чипа:

Первые 6 регистров задают период основного тона трех каналов А, В и С. 6-й регистр задает период генератора шума. 7-й регистр управляет микшером чипа и разрешает включать или выключать генерацию тона и шума в соответствующих каналах. Следующие три регистра определяют громкость звука в каналах А, В и С, а также отвечают за включение или выключение в них огибающей. И, наконец, последние три регистра задают период и форму огибающей. Всего чип поддерживает 8 разных форм:

Поскольку чип достаточно простой и умножения делать не умеет, включение огибающей в каком-либо канале автоматически устанавливает в нем максимальную громкость. Также отдельной особенностью генератора огибающей является то, что любая запись в регистр #13 сбрасывает генератор и огибающая начинает воспроизводиться сначала. То есть, в отличии от других регистров значение в нем следует обновлять только в случае изменения формы огибающей.
В общем, понятно, что эмуляция огибающей будет наиболее сложной задачей, поэтому я решил начать именно с неё. Если посмотреть картинку выше, все огибающие можно разделить на два типа – одиночные, когда после окончания одного периода на выходе поддерживается постоянный низкий или высокий уровень и периодические, когда генератор огибающей генерирует треугольный или пилообразный сигнал. Чтобы не разделять такие типы в эмуляторе, я решил, что каждая огибающая будет представлять собой последовательность из 4-х сэмплов, где первый и второй будут проиграны лишь один раз, а третий и четвертый будут повторяться бесконечно. Различных сэмплов будет тоже четыре – возрастающий, понижающийся, низкий и высокий. Таким образом, комбинируя эти сэмплы в нужные последовательности можно будет представить все доступные в AY формы сигнала.

Непосредственно для эмуляции звуковых сигналов я буду применять метод цифрового синтеза DDS. В этом методе на каждом такте опорного сигнала (частоты дискретизации эмулятора) аккумулятор фазы генерируемого сигнала будет увеличиваться на какое-то заранее заданное постоянное значение, после чего значение фазы будет преобразовываться в амплитуду генерируемого сигнала. Для огибающей это будет делаться с помощью таблиц одного из 4-х возможных семплов, для генератора тона – просто браться старший бит фазы.
Изначально я хотел выбрать частоту дискретизации для эмулятора равной традиционным 44100 Гц, однако, изучив документацию на AY обратил внимание, что базовой частотой для всех генераторов является входная частота чипа, деленная на 16. В российском клоне Спектрума AY тактировался с половинной частотой центрального процессора, то есть, 1.75 МГц, таким образом, базовой частотой генераторов были 109375 Гц. Если поделить это число на 2.5 мы получим 43750 Гц, что весьма близко к 44100, так что я решил сделать частоту дискретизации именно такой – это позволит использовать более «круглые» коэффициенты при расчете приращений фазы для DDS.
Точность DDS напрямую определяется разрядностью аккумулятора фазы и частотой дискретизации. Если при частоте дискретизации 43750 Гц использовать 16-разрядный аккумулятор, единице младшего разряда будет соответствовать 43750/65536 = 0.67 Гц. Если предположить, что приращение фазы определяется с точностью до единицы младшего разряда (типичная ситуация для целочисленных вычислений), мы получим итоговую погрешность генератора до 0.67 Гц. Это будет практически незаметно при генерации высокочастотных сигналов, однако весьма много при генерации низкочастотных. То есть, мне надо использовать 24-разрядный аккумулятор, который при той же частоте дискретизации будет уже обеспечивать точность в 0.003 Гц.
Исходя из изложенных принципов был написал следующий код:

Вначале он увеличивает аккумулятор фазы, хранящийся в переменной g_ayEnvelopePos на значение g_ayEnvelopeAdd. Установка флага переноса после такого приращения означает, что эмуляция текущего периода сигнала огибающей завершена и необходимо перейти к следующему, то есть, выбрать новый сэмпл по таблице последовательности. Выбор семпла производится в соответствии с описанными выше правилами – первый и второй семплы проигрываются лишь однократно, а третий и четвертый повторяются бесконечно. Наконец, 4 старших бита аккумулятора фазы определяют номер точки семпла, которая должна попасть на выход (которым является регистр R0) в данный момент. Весь код эмулятора огибающий в худшем случае занимает 47 тактов процессора.
Следующим шагом происходит эмуляция генератора шума. По сути, генератор шума AY – это однобитный генератор случайных чисел, работающий с заданной частотой. А, значит, его можно реализовать, совместив DDS с LFSR, про который я рассказывал в одной из предыдущих статей. В этой связке LFSR будет генерировать случайные биты, а DDS выдавать их на выход с нужной скоростью. Так как минимальная частота генерируемого шума в AY достаточно высокая и составляет 109375/31 = 3.5 КГц, разрядность аккумулятора фазы можно понизить до 16 бит. LFSR я взял из предыдущих проектов длиной 31 бит.

В работе эмулятора шума есть весьма интересная ситуация – максимальная генерируемая частота шума составляет 109375/1 = 109375 Гц, то есть, в 2.5 раза больше, чем частота дискретизации! Что же делать в этом случае? А ничего, ведь шум – это поток случайных битов. Если он идет с частотой 109375 Гц, а мы будем на него смотреть лишь 43750 раз в секунду, мы будем видеть только 43750 битов из 109375. Но, так как эти биты случайны, то, что мы будем видеть всё равно останется для нас случайной последовательностью. А это значит, что можно смело ограничить максимальную частоту генерации случайных бит до 43750 Гц.
Несмотря на то, что аккумулятор фазы генератора шума имеет разрядность 16 бит, приращение фазы необходимо оставить 24-битным, т.к. его максимальное значение может быть 163840, что не умещается в 16 бит. Для сложения с таким приращением к аккумулятору будет временно добавляться третий байт, изначально равный нулю. Если после сложения его значение станет отличным от нуля, это будет означать, что надо перейти к новому «периоду» шума и, соответственно, сгенерировать новый случайный бит. В худшем случае код эмуляции генератора шума занимает 46 тактов, что дает максимальное общее время в 93 такта.
Завершающим этапом будет происходить эмуляция генераторов тона и микшера для трех каналов. Для генерации тона будет использован такой же DDS с 24-битным аккумулятором фазы, но так как на выходе нужно получить простой меандр, результат будет браться напрямую из 23-го бита аккумулятора. Кстати, каналы тона в чипе AY тоже могут генерировать частоту вплоть до 109375 Гц, но такая частота никогда не применялась на практике в плеерах, ведь она не слышна человеческим ухом. Эмулятор будет в этом случае создавать более низкую частоту, зеркально отраженную на спектре от точки 43750 Гц.

Важным моментом внутренней архитектуры AY является выходной ЦАП – так как он имеет весьма малое количество разрядов, для обеспечения возможности регулировки громкости выходного сигнала в достаточно широких пределах, его передаточная характеристика выбрана обратной логарифмической:

Таким образом, для получения реальной амплитуды выходного сигнала необходимо провести табличное преобразование полученной громкости в требуемый процент заполнения для PWM-выхода МК. Я решил сделать выход монофоническим, чтобы иметь возможность подключить к схеме один звукоизлучатель, поэтому складываю результат всех трех каналов вместе в регистр R21. Однако ничего не мешает переделать код на стереофонический выход, ведь PWM-канала у таймера МК два.
В итоге, общее время работы кода эмулятора AY получилось равным 224-м тактам процессора в худшем случае. Добавим сюда сохранение регистров при входе в прерывание и восстановление при выходе, а также другие накладные расходы, после чего можно считать, что обработчик прерывания занимает порядка 270 тактов из 366 доступных. То есть, вполне укладывается в отведенное ему время, хотя и занимает несколько больше, чем я ожидал.
А что было бы, если бы обработчик не уложился? В принципе, ничего фатального, нужно было бы лишь снизить частоту дискретизации эмулятора до подходящего значения, например, до 25 КГц. Это снизило бы максимальную выходную частоту, которую способен воспроизвести эмулятор, но для мелодий Спектрума это вряд ли так уж критично.
А можно ли ускорить эмуляцию? Да, можно. Эмулятор тратит много тактов процессора на чтение и сохранение данных в оперативную память – аккумуляторов и приращений фазы. Но если за один вызов функции генерировать не одно выходное значение амплитуды, а целую пачку, например, 64 или 128, можно все промежуточные данные держать в регистрах и сэкономить на операциях с памятью. Думаю, за счет такой оптимизации можно было бы постараться ускорить процесс эмуляции практически вдвое. В данном проекте это не нужно, так как здесь у процессора нет каких-либо других задач, но если рассматривать другое применение написанного кода, об оптимизации задуматься определенно стоит.
Ну, и последним «кирпичиком», необходимым, чтобы плеер запустился является расчет приращений фаз всех DDS на основе значений регистров эмулируемого чипа. Он выполняется 50 раз в секунду, после каждого вызова кода плеера и поэтому написан на С++:

В этом коде нет ничего необычного, сначала все значения рассчитываются с помощью 32-битной арифметики, а потом разом устанавливаются нужные глобальные переменные. Чтобы случайно вдруг не получилось, что часть переменных обновится, а часть еще будет содержать старые значения, на время присвоения прерывания МК запрещаются.
И вот теперь можно рассказать о «хитрой» ошибке, закравшийся в код эмуляции AY. По документации минимальное значение, которое можно занести в регистры периода равняется 1. Что будет, если занести туда ноль документация не указывает. На практике же занесение нуля полностью эквивалентно занесению единицы – соответствующий генератор выдает на своем выходе максимальную частоту. И если с генератором тона это не применяется (так как он генерирует сверхзвуковую частоту в этом случае), то с генератором огибающей вполне, ведь его максимальная выходная частота в 16 раз меньше и всегда попадает в звуковой диапазон. Вот именно этот факт я и забыл учесть в своем изначальном коде, где при занесении нуля в регистр периода генератор огибающей просто останавливался. Нашлось это тоже «на слух» в одной из мелодий, которая звучала в эмуляторе неправильно.
На этом можно считать, что программная часть закончена, поэтому перейдем к аппаратной. А её, по сути, и нет – необходимо просто взять запрограммированный чип ATtiny85, подать на него питание и снимать готовый аудиосигнал с выхода PB4 (вывод номер 3). Если вы хотите подключить к «проигрывателю» наушники или динамик, это можно сделать напрямую без дополнительных фильтров, PWM-сигнал усреднится непосредственно на звуковом излучателе. А вот если соберетесь подключать какой-либо усилитель, лучше добавить на выход ФНЧ хотя бы на RC-цепочке, так как не каждому усилителю понравится 250 КГц на входе. Подходящими номиналами могут быть, например, резистор 100 Ом и конденсатор 220 нФ (только не используйте электролитический, он плохо работает на высоких частотах).
Вот так выглядит мой плеер сейчас – он пока что еще остался на макетной плате:

У меня на выход МК добавлен RC-фильтр и делитель, после чего установлен разъем 3.5 мм под наушники, чтобы можно было записать воспроизводимую мелодию на компьютер. Ссылка на пример работы плеера уже была в начале статьи, но повторю её еще раз тут:
github.com/kdekaluga/zx-spectrum-music-player/tree/main/Examples
Теперь настало время подвести итоги. Есть ли у проигрывателя какое-либо реальное применение? Вряд ли. Можно, конечно, дополнить чип USB-штеккером для питания и разъемом для наушников, после чего убрать это в небольшой напечатанный корпус и подарить на день рождения знакомому поклоннику Спектрума, но это единичные случаи. Можно попробовать использовать, например, вместо дверного звонка, но боюсь, одна и та же мелодия быстро надоест. В общем, проект носит скорее развлекательно-демонстрационных характер из раздела «смотрите, как еще можно сделать». Но если вдруг у вас есть идеи, где это можно использовать с пользой – напишите в комментариях, будет очень интересно.
Ах, да, общий объем кода эмулятора и плеера в памяти МК составляет около 2700 байт, то есть, под мелодию остается порядка 5500 байт, и этого хватает для практически всех мелодий в STC-формате, но не для абсолютно всех. Парочка больших мелодий, таких как, например, Laser-Dance требуют немногим больше места. Но решение есть – переписать код плеера на ассемблер, тогда, наверное, можно уместить весь обслуживающий код в 2 или даже 1.5 КБ. Однако, веской причины делать это сейчас нет.
На этом у меня всё, спасибо за внимание. Исходный код можно найти здесь:
github.com/kdekaluga/zx-spectrum-music-player
Самые обсуждаемые обзоры
| +84 |
3203
68
|
keygenmusic.tk/
но с запретными 3мя буковками смог — прикольно, только не удобно, тогда, воркать и серфить (баны от наших уже)
А так, в кейгенах часто *.mod или *.xm проигрывали, там сильно больше возможностей, хотя принцип такой же — трекер с нотами и инструментами.
Будильник собрать с таким бипером, или к имеющемуся приконтачить. Да и когда паяешь, фон нужен. Недавно мелкую плату делал, в тишине скучно, кино отвлекает, Кукрыниксов включил.
А IDA надо искать и ставить, тут для разовой задачи проще онлайн дизассемблер найти.
Кто помнит ZX-Spectrum Atari 65XE однозначно достойны Уважения.
Я и в 90-е встречал вариант на статическом ОЗУ. 6 штук 6264 там стояло (или что-то подобное). Но это было сильно дорого. Зато, кажется, 7 МГц человек тот добился без особого труда.
Даже лежит недалеко:
Там выскочило
www.wildberries.kg/catalog/91654950/detail.aspx
да и на озоне есть…
https://www.ozon.ru/product/zx-spectrum-leningrad-1-48kb-konstruktor-blue-diy-629419672
понятное дело, что молодёжи это нафих не надо, на них и не расчитано
а вот «старички» — к этому времени уже должны располагать такими суммами)
Ленинград плата (почти) в сборе 4.5к
Потом была большая любовь — Commodore Amiga, отдельная Вселенная.
В те времена круче графики и звука не было ни каких других платформах.
Потом конечно же IBM PC вытеснил всех…
по тем временам, я, пожалуй, был единственным энтузиастом в нашем городке
а вот когда появились схемы и платы Специалиста — тут уж заинтересованного народу стало гораздо больше)
А Z80 я «полюбил» с первого взгляда — и одно напряжение питания (+5 В), и один тактовый сигнал, и даже встроенный регенератор динамической памяти. На нём собирал потом несколько разных устройств, типа таких, какие сейчас на одном МК можно сделать. Помню, всё хотел свой АОН сделать с большим 16-разрядным экраном. Но потом перешел на ПК.
А еще у Z80 команд и возможностей было сильно больше, чем у i8080, писать под него было легче.
Он же был полностью обратно совместим с 8080, а для допкоманд были задействованы несколько неиспользованных байт, вот где у 8080 прочерки:
Реальное значение для самоделок имела сильно более высокая тактовая, экземпляры некоторых производителей устойчиво работали на 8МГц, вот это был настоящий отрыв))
Регенерация DRAM от него обычно не требовалась, оно и так непрерывно регенерировалось выводом на экран, а вот одно питание и одна тактовая — да, добавляли удобства…
Только тактовый вход у него был не совсем ТТЛ, требовалась подтяжка к плюсу, я так вообще обычно ставил на это отдельный корпус к531 с открытым коллектором, иначе на 8МГц можно было устать хвосты по задержкам ловить.
clrhome.org/table/
И ведь казалось бы, что стоило такую штуку сделать?
Это только если этот экран есть. А если вы собираете контроллер какой-нибудь железки? На Z80 это можно было сделать без какой-либо внешней логики, и это сильно упрощало схему.
Это у вас был Z80 по какой технологии? Просто ни разу с таким не сталкивался — ставили обычный кварцевый генератор на двух инверторах и с его выхода подавали на тактовый вход. Работало без каких-либо сбоев.
Я собирал «тестовую схему» из Z80, ПЗУ (без ОЗУ вообще) и какого-то сдвигового регистра в качестве порта, она (если правильно помню) до 10 МГц разогналась. Правда, Z80 уже прилично грелся на такой частоте.
Я собирал, наоборот, отдельную платку с только процессором, ОЗУ и параллельным портом, ПЗУ работало только на этапе начальной загрузки, потом отключалось, в качестве всех устройств ввода/вывода был Специалист через параллельный порт, так её тоже примерно до 10МГц разгонял, да.
Цифромолку делал)))
Понятно, что там регенерация памяти была на проце, но это был такой… исключительный случай.
А в компах тактовая обычно привязана к выводу на экран для упрощения схемотехники — битва за количество корпусов…
Мой вариант спектрума был на 40 корпусах, с кварцем на 16МГц и турбо-режимом, пошёл в мелкую серию, я успел пусконаладить десяток экземпляров, которые не запустились сразу после пайки, потом уехал и не в курсе дальнейших событий.
Ну нет)
Генератор был на 14Мгц на спектрумах, его еще делили на 4 перед подачей на проц.
Резистор подтяжки на плюс на тактовом входе был оговорен в документации на Z80, это вполне точно. Возможно, и без него бы работало, я не проверял.
Но учитывать задержки было необходимо, иначе какой-нибудь RAS мог прийти на RAM раньше, чем процессор успел выставить адресные данные, к примеру.
Так это на Спектрумах, там делили на 4. А в АОНах, например, был генератор на 4 МГц и ничего уже не делили. Я в своих поделках тоже не ставил никаких резисторов подтяжки, обходился простым генератором.
При турбо-режиме, если цикл обращения процессора попадает на занятое экраном время, вешаем его в WAIT.
По результатам тестов, при физической частоте 8МГц реальное быстродействие получается примерно как на 6,7МГЦ, если не путаю, опять же, всё-таки уже… 30+ лет прошло, и было очень много других всяких железок)
У Спектрума тактовая частота пикселей составляет 7 МГц (448 пикселей в полной строке). Таким образом, на 8 пикселей приходится 4 такта ЦПУ. И за эти 4 такта видеоконтроллеру нужно считать два байта — собственно, байт пикселей и байт атрибутов. Вот и получается, что ему нужно 2 чтения на 4 такта или чтение каждый второй такт.
Понятно. Ну, если так, то это весьма неплохой результат.
Как раз собирался написать, что слегка соврал, а тут уже и не надо )))
Если обращение процессора приходится на его очередь доступа к памяти, то результат будет уже в первом такте и защёлкнется в регистр, память ушла обслуживать экран, а процессор заберёт результат из регистра только на следующем такте.
ПЗУ, ОЗУ, таймер (если не ошибаюсь — один канал на NMI), I/O и даже компаратор, ADC разве что не было штатно. На нём и учился прогать. Сначала РФ2 портил (не на много хватало), потом если не ложная память — РУ10 научился таскать с конденсатором.
Я прошибку дизассемблировал, разобрался в алгоритме декодера АОН и потом на его базе делал декодер ДТМФ. После перешел на 8031, он меньше жрет, 128 ОЗУ внутри, встроенные таймеры и порты, больше 8-битных регистров.
en.wikipedia.org/wiki/Goertzel_algorithm
В общем, в АОНе считались именно компоненты ДПФ, т.к. была таблица синусов и косинусов. Да и при 1-битной арифметике алгоритм Герцеля вряд ли будет устойчивым. Точнее, он принципиально невозможен.
Я себе делал Спеца на Z80 по собственной схеме, с переключателем частоты на 8 МГц, приятель слабал такой же Орион, а Спектрумы только на продажу собирали.
Эх… были времена )
Я на своем Спектруме вывел «системный разъем» — основные шины процессора, после чего подключал туда разные самодельные устройства. Ведь, по сути, Спектрум был таким же 8-битным компьютером, только с более широкими возможностями, чем компьютеры на базе i8080.
Я все свои годы использования Спектрума просидел на ч/б телевизорах и мониторах :) Цветные мониторы были только в компьютерном кружке, куда я ходил. Поэтому дома использовал цвет как градации яркости.
Убогая архитектура с 16кб ПЗУ с нуля адресного и вшитым бейсиком, крохотный экранчик 256х192 с заточенной под игрушки дебиловатой огранизацией и выделенным ОЗУ сразу после ПЗУ… так себе)
Спец или его наследник Орион были сделаны намного разумнее с т.з. организации, и экран 384х256, и доступное программам ОЗУ с нуля, и простой БИОС (который почему-то назывался МОНИТОР))), я на Орион адаптировал CP/M — вот и полноценный комп. Си, Паскаль, Форт, и даже Фортран был. Для прикладных задач намного более подходящий вариант.
Разумеется, и программаторы тоже были, и принтеры, но не через «системную шину», а через порты 580ВВ55.
Как Вы запустите стандартную программу CP/M на спектруме, если они все работают в абсолютной адресации и с нуля? Физически отключать ПЗУ? А кто будет делать ввод/вывод? А видео-ОЗУ тоже переносить? ))
Экран был небольшой, согласен. Но его размер определялся возможностями процессора, это был компромисс. Конечно, я всегда хотел иметь в Спектруме несколько видеорежимов, но тут уже нужен был бы более сложный видеоконтроллер, а это дорого.
В корне ошибаетесь. Для игрушек такая организация была крайне неудобна. Тем не менее, экран Спектрума — это гениальное решение. Сэр Синклер смог в 7 КБ уместить цветной дисплей размером 256х192! Это невероятно круто. А его адресация, кстати, заточена не под игры, а под вывод текста.
На спектруме тоже были и Си, и Паскаль. Только толку от них? Да, я делал на Паскале крутящийся 3д-кубик, но только компилятор был настолько несуразный, а код настолько большим, что никто всерьез к таким игрушкам не относился — так, побаловаться, задачку решить. То же самое и с Си с его огромным количеством заголовков. К сожалению, надо себе четко представлять, что на таких ПК единственный рабочий язык — это ассемблер.
У меня ВВ55 стояли в каждом устройстве, я потом пришел к выводу, что так лучше, т.к. некоторым (например, 4-х канальному 8 битному ЦАПу) надо было больше 1-й ВВ55.
А зачем? Это не современный многозадачный ПК, не надо пытаться на него наложить такую парадигму. На Спектруме тоже были ОС типа IS-DOS, я пробовал их, но пришел к выводу, что всё это не нужно, проще иметь набор отдельных программ, которые запускать по необходимости. Я больше скажу — я даже сам пытался написать «многозадачную» ОС, но в итоге понял, что это не имеет смысла.
Были и такие проекты. Только не получили большой известности из-за низкой актуальности.
Телевизор дольше прогревался)
А так-то люди делали ПЗУ-диски, там вообще мгновенно.
На всех мне известных серийных компах на 580 проце, который как минимум по тактовой значительно слабее, чем Z80, экран был сильно больше в тексте.
«Компромисс» экрана спектрума определялся исключительно его позиционированием — под игрушки.
Под вывод текста заточен экран Спеца/Ориона. Там линейная организация, и скроллинг делался тупо стеком. А ещё лучше — Радио-86)))
Ну и слегка смешно видеть «под вывод текста» про экран в 32 символа в строке, да.
CP/M был стандартом. Не многозадачным, но массовым.
Не закончила секретарша набор текста на работе на какой-нибудь Искре 1080 или Роботроне 1715 (тоже был на Z80, кстати) — скинула на дискетку, дома свой комп с такой же системой и таким же редактором.
Пришла лаборанту на выходных свежая идея, как лучше обработать массив экспериментальных данных, — сел свой за комп, там такой же Фортран. Вы ведь в курсе, почему он до сих пор никак не помрёт, Фортран этот?))
То есть, по сути, та же отключаемая ПЗУ :)
На сколько сильно? 384 пикселя? Потому как при тактовой частоте пикселей 7 МГц на одну строку попадает всего 448 пикселей с учетом служебных. То есть, в полтора раза — да, больше, но не сильно. Но вы, наверное, не сталкивались с ситуациями, когда криво настроенный телек не показывал на таких ПК крайние символы — вот это веселуха была. Со Спектрумом таких проблем не было.
Он позиционировался как универсальный компьютер для дома. Чем, по сути, и являлся. Опять же, если бы он был заточен только под игрушки, у него бы строки экрана шли подряд.
Где экран чисто текстовый? Извините, но вот это архаизм — даже график нормально не построить.
А что вам мешает на Спектруме файл продолжить редактировать?
Вы путаете назначение бытового компьютера и его стоимость — Спектрум именно позиционировался как невероятно дешевое решение, доступное чуть ли не каждому. Не помню, сколько была оригинальная цена ZX? 100 фунтов?
Отсюда, кстати, и 16 КБ ПЗУ произрастает — когда ОЗУ было всего 16 КБ, никого не волновало, что еще 16 занимает ПЗУ. И встроенный бейсик тогда был невероятно классным решением, превращавший Спектрум в машину, готовую решать задачи прямо из коробки.
Резюмируя — на Спектруме можно было выполнять любые задачи, такие же, как и на любом другом 8-битном ПК. А то, что на нем массово играли — лишь еще одно подтверждение его удачной по тем временам архитектуры. Жаль только, что эта архитектура не развивалась с годами (кроме увеличения объема ОЗУ), вот тогда можно было бы и другой режим экрана прикрутить, и все страницы памяти сделать переключаемыми.
P.S. ПЗУ-диск у меня тоже был. Причем, т.к. был самодельный программатор, код работы с ПЗУ-диском у меня был вшит в основное ПЗУ, достаточно было нужный USR вызвать. Только пользовался им я недолго — как только адаптировал 3.5-дюймовый дисковод, в котором навечно была вставлена одна единственная дискета, ПЗУ-диск оказался не нужен, все важные файлы стал хранить на этой дискете.
Нет, поскольку оно в норме не в адресном, доступ через порты.
Хотя были разные схемы, согласен.
Ровно вдвое по ширине — на Спеце и Орионе было 64 символа в строке.
Правда, достигалось это упаковкой, — символ был шириной 6 бит, что тормозило вывод, — но с т.з. юзера разницы не было, этим занимался БИОС. Итоговый символьный экран был 64х32 — втрое(?) больше спектрумовского.
Ничто не мешало сделать 8МГц, как и делали многие другие )))
Что может помешать редактировать файл Ворд в юниксовом vi или ed… хм… надо подумать )))
Под CP/M был довольно мощный на тот момент текстовый процессор, был суперкалк — предок экселя, была СУБД, не помню названия.
Не… за ту же цену можно было сделать годное решение для приложений, но оно, увы, было бы менее подходящим для игр, и игры победили разум )))
Ваши задачи, следовало бы уточнить)
В символах считать неверно, т.к. это зависит от шрифта. На Спектруме тоже были шрифты шириной 4 пикселя, дающие 64 символа. Правда читать такие было уже сложно. А в точках получается 1.5 раза (по ширине).
А вы точно подключали ПК тех времен к телевизору? Дело в том, что полоса пропускания видеотракта обычных телевизоров ограничена сверху как раз примерно частотой 3.5 МГц, т.к. выше идут уже цветовые поднесущие. Из-за этого даже спектрумовские пиксели на 7 МГц на многих отечественных телевизорах уже размазывались. Помню, что иметь дома монитор/телевизор, на котором можно было отдельные пиксели рассмотреть было круто.
Эммм, txt — простой текст, его можно чем угодно редактировать.
Приложениям тоже бывает нужен цвет. Правильно было бы сделать несколько видеорежимов, это бы закрыло все потребности, но это повышение стоимости. Вот почему это не доделали в 1986-м году, например, другой вопрос.
Не только мои. В те времена все, у кого не было денег на ПК решали свои задачи на Спектруме.
Если ляпать своё ни с чем не совместимое, то без разницы, да.
Верно, если это искаропки и обеспечивается встроенным ПО.
Шрифт на 4 пикселя я тоже делал на Спеце, чтобы получить 96 символов в строке, но он нечитабелен вообще, отказался. Шестипиксельный — вполне норм.
Смешно )))
Других вариантов как бы и не было.
Ууу, куда Вас понесло )
Во-первых, в российском стандарте СЕКАМ звук находится на 6,5МГц, а полоса тракта яркости — 6МГц.
Во-вторых, нам не нужен весь «видеотракт», а только выходные усилители.
Или Вы спектрумы через радиоканал подключали? )))
А в-третьих, я лично ещё на самом первом своём «специалисте» делал физический переключатель 2/2,5МГц, который одной группой коммутировал генератор, второй — счетчики «видеоадаптера», и в режиме 2,5МГц на выходе было 10МГц и 512 точек по горизонтали. В стандартном режиме, как понимаете, 8МГц и 384 точки.
Инет всё ещё доступен, пробегитесь по схемам самоделок того времени, тот же Орион — действующий проект, или даже Радио-86, убедитесь. Ссылку дать? )
Не говоря уже о том, что я в серию запускал спектрум с 16МГц на кварце и, соответственно, 8МГц на видеовыходе. Экран был еще чуть Уже по горизонтали, зато круги были кругами, а не овалами.
И как же оно всё работало, хм… удивительно )
Я где-то писал про «простой текст»?
Ещё раз, в среде CP/M был текстовый процессор, предок Ворда.
Такой цвет, как в спектруме, — один байт на знакоместо 8х8, если не путаю, — почти ничего не занимает дополнительно в памяти и почти ничего не стоит в «видеоадаптере».
Потому что уже выросли и подешевели другие, более удачные конструкции.
Это совершенно необоснованное обобщение)).
В моём окружении, например, «все, у кого не было денег на ПК решали свои задачи» на Специалистах, Орионах, БК-0010 и даже Радио-86РК, а спектрумы считали игровой приставкой и делали только либо как экспериментальные образцы (МГТФом на макетке), либо на продажу)
Впрочем, такие есть и прямо здесь, в комментах.
ЗЫЖ Надеюсь, Вы не воспринимаете эту дискуссию слишком серьёзно? ))
Какое встроенное ПО? Вы же сказали, что там все загружалось. На Спектруме такое было, но только никто не мешает любому софту иметь свой код вывода и свою ширину символов.
Не спорю. На Спектруме тоже был, 42.6 символа вмещалось. Еще был 5-ти пиксельный, тоже норм читался, получался 51 символ. Только выводить было чуть сложней, нужно было 8 версий сдвига, а не 4, как в случае с 6-ти пиксельным.
Да причем тут звук? Я же что написал — выше находились цветовые поднесущие, соответственно, на цветных ящиках фильтр видеосигнала был с полосой где-то до 3.5 МГц. Откройте статью «Секам» в вики, там график есть.
Конечно! А как еще-то? Вы покупаете Спектрум, у вас есть дома телевизор, который никто из родителей не даст вскрывать, а видеовхода нет. Что делать еще? И так очень многие. Уже потом я по-тихому разобрал телевизор когда никого не было дома, нашел место, подключил туда видеосигнал. Но фильтр-то на 3.5 МГц остался.
Ну, если ваш монитор это позволял, хорошо, у меня даже по видеовходу точки различались с трудом (я уж молчу про плавающую картинку). Телевизор ТЕМР-714.
А зачем? Он же не был совместим с остальными по таймингам, соответственно, не всё ПО работало как задумано.
Ну была более замыленная картинка у кого-то, вот так и работало. Я повторю, мы сталкивались с мылом даже на штатных частотах. Понятно, что проблема была в телевизорах, но ведь других не было.
И у него был свой формат файла? Не просто текст? Гугл говорит, что это не так. А если это просто текст, какая разница, чем вы его редактируете с точки зрения файла? Никакой.
Не очень понял мысль. 768 байт ОЗУ и двукратное увеличение требуемой пропускной способности видеоадаптера.
По сути, все эти ПК очень похожи. Все имеют архитектуру 8 бит и 64К адресного пространства. Соответственно, и задачи решать могут они примерно одинаковые. А какой там именно экран — не самое главное. В нашей компании все предпочитали Спектрумы потому, что они мощнее и на них банально больше софта. Это как 486 и 386 — при возможности, вы выбрали бы 486, поэтому и мы выбирали более мощный процессор. А на решение задач это никак не влияло, как бы вы ни пытались доказать обратное) И тексты редактировали, и печатали, и ПЗУ программировали, и графику рисовали.
Я все дискуссии воспринимаю серьезно) Иначе зачем они?
а кому родители запрещали «телек ломать»- их удел был «денди».
В спектруме — Бейсик, в Спеце и Орионе — «Монитор»/БИОС, который содержал необходимые подпрограммы ввода/вывода. В частности, ввода с клавиатуры и вывода символа на экран со знакогенератором, и прикладное ПО не заморачивалось отрисовкой шрифтов на экране.
Насколько помню, цветовые поднесущие вырезались режекторным фильтром, и сам сигнал яркости от этого особо не страдал:
Вы опять необоснованно обобщаете личный опыт))
Во-первых, я никогда не покупал спектрумы, и вообще ни одного восьмиразрядного компа не покупал никогда.
Вот же))) От личного единичного опыта никуда?
Я их подключил несколько десятков самых разных — себе, друзьям, знакомым, куче заказчиков/клиентов, и всегда только на выходные усилители.
Через радиоканал подключал только дендики.
Во-1, кварцы на 14МГЦ были в жутком дефиците и дорогими, как раз из-за массового спроса на спектрумы. А на 16 — много и дёшево. Заказчик просил сделать подешевле и «чтобы круто» ))) Это еще и подавалось как конкурентное преимущество — ни у кого больше не было аж 8МГц! ))) Турбо-версии на рынке были, стоили дорого и в максимуме имели 7МГц тактовой.
Во-2, это слегка упрощало схему «видеоадаптера».
А тайминги при такой небольшой разнице уплывали незначительно, всё работало, просто чуть-чуть быстрее.
Я тоже повторю — посмотрите схемы других массовых компов тех лет, там и 8МГц, и 10МГц были вполне типичной практикой. На ч/б ящиках вообще мыла не помню, на цветных бывало по-разному, там, вроде, и сам кинескоп не всегда обеспечивал нужное разрешение, но тут, повторю, я не спец.
Не помню. Он позволял стили, форматы и закладки, работал в режиме WYSIWYG, обеспечивалось это форматом файла или спецсимволами в тексте — лениво искать. В любом случае, в другом редакторе текст бы выглядел как минимум иначе.
768 байт — это и есть почти ничего. А «двукратное увеличение» — это только при спектрумовской организации. Можно для этих целей воткнуть отдельный корпус ОЗУ на 1кб, например, и не напрягать основную память постоянным дёрганием.
Опять необоснованные обобщения )))
Если бы «все», то откуда бы взялись огромные армии любителей других компьютеров?
А мы вот делали спецы и орионы на Z80 на 8МГц, и они были ещё мощнее, и? ))
Зато на экране нормально помещались панели аналога Нортон Коммандера, который сильно добавлял удобства в работе.
Ну и банально текст редактировать на вдвое бОльшем экране — в разы удобнее.
Главные недостатки спектрума — убогий экранчик и его ОЗУ в самом неудачном месте адресного, «как бы Вы ни пытались доказать обратное».
А так-то да, через пень-колоду работать можно, многие так и делали, я же не отрицаю.
Вот конкретно такие, про древние увлечения и достижения, — по факту никакой практической ценности не имеют, чисто развлечься и ностальгию почесать)
Нет. Цветовые поднесущие занимали всю верхнюю полосу сигнала яркости, начиная где-то от 3.5 МГц. Старые ч/б телевизоры, в принципе, не показывали выше. Более современные ч/б телевизоры уже имели тракт получше, поэтому на них можно было заметить некий муар при приеме цветного сигнала. А в цветных телевизорах уже намеренно стоял ФНЧ 3.5 МГц, чтобы цветовые поднесущие не мешали. Посмотрите типовые характеристики цветного отечественного телевизора — разрешение по горизонтали 450 линий, то есть, те самые 450 пикселей. Поэтому-то большого смысла в частоте пикселей больше 7 МГц при подключению к бытовому телевизору не было.Так это вы необоснованно пытаетесь выдать личный опыт за объективные факты. А я совершенно обоснованно говорю о статистике использования Спектрумов в компьютерном кружке, куда я ходил.
Нифига это не преимущество, а недостаток! Кому нужны эти +14% быстродействия? Зато вы получаете несовместимость с парком ПК, значит, какие-то игры и демки работать правильно не будут, т.к. в то время много графики делалось синхронно с видеосигналом. Вы случайно не в Китае производство делали? А то прямо типичная ситуация)
Чтобы собрать и запустить схему, нужны были неплохие знания в радиоэлектронике. А если они есть, не составляло проблем и подключиться в телевизоре туда и так, как нужно. Я еще раз повторю — Спектрум был массовым компьютером, ориентированным на простого покупателя, который не всегда в состоянии подключить видеосигнал к телевизору. Поэтому и были RF-адаптеры. Оригинал, кстати, со встроенным шел.
Не спец, а спорите — зачем? Я этих спектрумов много людям к телевизорам подключал — и через адаптеры (причем, даже через самодельные), и входы искал, и даже на более поздних телевизорах через SCART. И на старых телевизорах, в основном, было мыло — чтобы прямо пиксели различать, считалось тогда очень круто. И не в кинескопе дело, а в тракте видеосигнала (выше уже подробно описал).
Вы даже формат не помните, но утверждаете, что иначе бы выглядел? )) Ну-ну.
Тогда запись в эту ОЗУ будет в разы медленней, это не подойдет для быстрой графики. Нет, решение в Спектруме было оптимальным для того времени, единственное, надо было предусмотреть битик в порте, чтобы экран переключать в режим 12288, когда один байт цвета на один байт графики. Это было бы практически бесплатно для адаптера.А где эти армии-то были? Я говорю на примере своего города, у нас были единицы, кто собирал Радио-86РК, про Орион я вообще тогда не слышал. А Спектрумов было много. У нас Спектрум был стандарт — и для игр, и для музыки, и для каких-то проектов.
Ну, молодцы. Но в каком городе это было? Когда? Потому как вот простой пример — у нас были Спектрумы 48К, потом 128К, потом кто-то перешел на АТМ Турбо 2, кто-то на Скорпион-256. Но самым распространенным был 128К, поэтому он считался стандартом.
Он был в полтора раза больше, не в два.
Ну, это лишь ваше мнение. Хотя, знаете, в то время я считал так же. А спустя годы понял, что это было гениальное решение, полностью соответствующее вычислительным возможностям Z80. Возможно, когда-нибудь вы тоже поймете)
А что касается расположения, то в 128К уже экран можно было перенести на 49152 или вообще выключить из адресного пространства, если вам он был не нужен в данный момент.
Я, например, большую часть времени писал какой-то код, который даже мог работать потом не на Спектруме, а в устройстве с Z80. Поэтому мне не нужны были 384 пикселя и какие-то навороченные редакторы. Зато мне нужны были дополнительные команды Z-80, а не устаревший i8080.
Я просто не понимаю, что вы пытаетесь сказать всем этим? Есть история, её не перепишешь, и она говорит, что в «батле» домашних ПК того времени победил Спектрум. Да, у него были недостатки, но его архитектура оказалась оптимальной по соотношению цена/качество, что и позволило ему занять позиции лидера. Можно было сделать сильно иначе, сильно лучше и т.д. Но это не получилось бы сильно массово. А у Спектрума получилось.
Любой, кто интересовался подобными вещами, обязательно выписывал или «Радио», или «Моделист-Конструктор», или хотя бы «Юный техник», я выписывал все.
Для этого знакомые научники использовали Фортран.
— при подключении через радиоканал, надо добавлять. Пшт при подключении на выходные усилители никаких ограничений по фильтрам не было.
Так это ВАШ компьютерный кружок и ВАШ опыт, а я рассказываю, что бывало и иначе, не более.
Кадровая была стандартной, само собой, и стандартно подавалась на INT.
Разумеется, я предварительно изучил опыт предшественников. Разных схем аналогов спектрума существовали на тот момент уже десятки, кварцы применялись от 12 до 14МГц — то есть, ничего особо критичного в этом разбросе не было.
И, разумеется, мы тщательно тестировали опытный образец перед запуском в производство — всё доступное для проверки ПО работало корректно.
Какие-то редкие случаи несовместимости были возможны, но это массовый рынок, решают цена и маркетинг.
Это вот Вам лично «Кому нужны эти +14% быстродействия?» а потребитель такие фишки активно хавает, посмотрите хотя бы на гонку мегапикселей в смартфонах, бессмысленную и беспощадную )))
Не спорю, а излагаю известные мне факты, старательно избегая при этом их искажения и мгновенно признавая неправоту, согласитесь))
Думаю, я-то подключил заметно поболе…
А факт, что цветные кинескопы тех времён могли не обеспечивать необходимое разрешение, прямо следует из их конструкции, которая общеизвестна, для его установления не надо быть спецом по телевизорам.
Очевидно же, что плейн-текст не поддерживает такие функции.
Нет.
Запись в это ОЗУ будет прозрачна для процессора, он о нём и знать не будет, оно будет параллельно основной памяти. Это просто. При записи по этому адресу данные попадают и в основное ОЗУ, и в это дополнительное, а на чтение оно доступно только видеоадаптеру.
В период 89-93гг, но важен не город, а студенческая общага — специфический контингент, да )))
Спектрум — 256х192, Спец/Орион — 384х256 в стоке, 512х256 в моде. Это во сколько раз? ))
Да блин))
Для работы в тексте даже вчетверо бОльший экран особо не влиял на производительность. Были же массовые заводские компы и на 8080, и на Z80 с намного бОльшим экраном, работали.
И графики рисовать — тоже не экран определял скорость процессов, а вычисления.
То, что Вы говорите, справедливо для игр, тут согласен.
Это хорошо, да.
А увеличить? )))
Хочу сказать, и уже говорил, что массовость у Спектрума случилась не благодаря удачной для работы конструкции (которая таковой с очевидностью не являлась), а исключительно благодаря ориентации на игроманов.
Ну, блин, неужели Вы будете отрицать простой очевидный факт, что подавляющее большинство пользователей Спектрума, процентов 95, наверное, на нём просто играли, и ничего кроме? )))
Тут ведь в чём между нами глобальная разница, которую Вы, похоже, не осознаёте в полной мере… у Вас был Спектрум, но не было других образцов для сравнения, а у меня они были разные, много, в том числе и Спектрумов в разных вариантах — десятки, и с заводской Искрой на 8080 имел дело, и с Радио-86РК, и с БК-0010, и с ДВК (последние две — ваще удивительное, Вам бы, как программисту, понравилось до восторга, уверен, там такааааая архитектура, там любой из регистров можно сложить с любым другим, каждый из них — как аккумулятор на интеловых процах, жаль, что сдохли))).
Это опыт моего относительно небольшого города, потому что «Спектрумисты» все друг друга знали, обменивались программами и знали кто как живет и чем занимается. Вы же ваш город даже назвать боитесь, из чего может следовать, что ваш опыт сильно необъективен.
Не помню такого. Был стандарт 14 МГц, и все Спектрумы, которые я когда-либо видел были на этом кварце.
Не натягивайте «сову на глобус». В то время 99% ПО для Спектрума было ПО реального времени, и оно работало на стандартном Спектруме 14 МГц. Такому ПО прирост абсолютно ничего не давал. А если где-то, например, ускорялся вывод текста, то +14% на глаз практически не видно.
Какие функции он не поддерживает?
Это вы сейчас архитектуру Специалиста цитируете. С ней тоже не всё так просто, т.к. запись в эту ОЗУ всё равно должна происходить, то есть, есть моменты, когда эта ОЗУ должна параллельно обслуживать и ЦПУ и графику. А если так, то чем она отличается от традиционной, которая делает так постоянно?
Откуда вы знаете, что поболее? Если бы много подключали, знали бы, что в большинстве случаев получается мыло. А на счет кинескопа — вы его видели же? Тогда должны знать, что размер тройки люминофоров был значительно меньше размера пикселя Спектрума. Не в люминофоре дело, а в пропускной способности видеотракта и состоянии телевизора. Многие ч/б телевизоры тех лет просто не имели должной фокусировки, особенно по углам, поэтому там даже спектрумовский текст иногда читался с трудом. Поэтому решение Спектрума с бордюром оказалось удивительно хорошим — и четкость повышало, и позволяло не париться с проблемами, когда часть экрана не видна на телевизоре.
Город тоже важен, потому что он определяет комъюнити.
Да нафиг эти 512 точек нужны были, когда 256 не везде разглядеть было можно? Я видел то ли АТМ-Турбо, то ли Профи (вариант Спектрума с таким разрешением), там на RGB-мониторе уже нифига не было видно. А в нем никаких ФНЧ не было.
Не согласен. При навигации по тексту скорость напрямую зависела от производительности. А еще редактирование длинной строки, когда её всю надо перерисовывать. К сожалению, не помню, в каком редакторе набирал текст я, но, кажется, он имел разрешение 32 символа по горизонтали, потому что так было банально быстрее.
Я увеличивал до 256 по модели Скорпион-256, но сразу же столкнулся с проблемой — ни у кого больше в нашем городе такого не было. Получается, мои «достижения» я даже показать никому не мог. Для работы это было не нужно, не было задач под такой объем памяти (свою ОС хотел написать, но забросил), дисководов уже было тогда 2, не надо было диски переставлять, в общем, основным применением оказался проигрыватель *.mod файлов с PC — там сэмплы и в 256 К не помещались.Для работы, по сути, ни одна 8-битная архитектура не является удачной. А между собой они примерно равны. Популярность Спектрума произошла благодаря его универсальности и оптимальной цены. Вот вы записываете в минусы встроенный Бейсик в ПЗУ, но при этом заявляете, что Спекки был исключительно для игр. Сами не чувствуете противоречия? А оно есть. Спектрум был весьма удобен, например, для решения лабораторных задач в институте — включил, сразу же накидал программу на Бейсике, получил результат. В разы удобней калькулятора. Ваш же Специалист сначала загрузить надо было, и не забывайте, что дисководы были не у всех даже в 90-х.
Вы будете удивлены, но в нашем городе тогда просто играли максимум процентов 20! Все остальные владельцы пытались что-то программировать — демки, игрушки или даже системные программы вроде копировщиков. Но в паузах играли все, конечно. И это был неоспоримый плюс Спектрума — он был универсальный, позволяя и развлекаться, и работать.
Были. Я же ходил в компьютерный кружок, а там были разные ПК, включая 8086 с дисководом. И знаете что, Спектрум был тогда на первом месте по популярности, потому что для него было много разного софта и он был универсален.Это какой процессор?
Скорее потому что он был доступен, и в виде самосбора, и в виде готовых устройств. А тот же БК мало того, что был жутким дефицитом, так еще и стоил от 600 рублей.
И цеплять самолепные внешние устройства при полностью асинхронной организации шины с квитированием — тот ещё гемор…
Зато полный улёт и отрыв для программиста)))
Если он ДО декодера цвета, то на него надо подавать комплексный видеосигнал, который ни в одной из известных мне схем аналогов Спектрумов не формировался.
Я пишу про выходные усилители, куда подавались уже раздельные RGB.
Ничей опыт не объективен.
Если Вы потрудитесь найти схемы существовавших в то время аналогов Спектрума, то с удивлением обнаружите в некоторых из них переключатели в делителях строчной развёртки под разные кварцы. Названий моделей уже не помню, но сам факт — точно был.
Вы не с той стороны смотрите)
Пофиг, давал он что-то или нет, целью было не это.
Что было целью, написано парой сообщений выше — максимально удешевить и сделать «круто», цель была успешно достигнута, остальное — неважно.
Стили, форматы, ссылки и прочие прелести текстовых процессоров, которых в плейн-тексте нет.
В Спеце точно такая же организация доступа к памяти, как и в российских копиях Спектрума, никакой разницы, никакого отдельного ОЗУ под видео.
Да. Но только при записи и только в небольшом диапазоне адресов экрана. При записи в любую другую область и при любом чтении из памяти процессор никак не конфликтует с видео, что позволяет разгонять его как угодно.
Ну как сказать… во-первых, не сильно-то и меньше, отлично было видно невооружённым глазом.
Во-вторых, для отсутствия мыла надо точно попасть в точку экрана пикселем компа.
Не подскажете, как это сделать, если на экране, скажем, 800 триад по горизонтали, а комп выдаёт 512? ))
Да, поэтому работали на ч/б (или ч/з) экранах. С ними проблем не помню.
Вот тут, кстати, да )))
Тоже именно для этого, вспомнил, делали шрифты без упаковки (напомню, в Спецах/Орионах шрифты были 6 бит, что при выводе каждого символа приводило к необходимости перепаковывать и перерисовывать соседние символы тоже) и 10МГц, чтобы было 512 точек на экране и 64 кратных байту полноценных знакоместа, это сильно, в разы ускоряло вывод текста.
Не исключительно, но преимущественно. Нет противоречия.
Впрочем, я уже устал дискутировать аналоговнетность Спектрума.
Позвольте резюмировать:
Спектрум — величайшее достижение человеческой мысли и лучший восьмиразрядный компьютер всех времен и народов, ныне, и присно, и вовеки веков, аминь!
Вы правы, удивлён)))
Пшт почти поголовно все, кому я их подключал, кроме игр ничем не интересовались.
И даже из тех, кому пусконалаживал — тоже… был такой довольно массовый бизнес, возможно, Вы не в курсе… народ покупал или собирал вразнобой комплекты из печатной платы и набора деталей, самостоятельно паял, и оно предсказуемо никогда не запускалось сразу, после чего у нас появлялось немного довольно неплохо оплачиваемой работы)))
Оке, на эту тему я уже всё сказал выше, даже выделил болдом )))
Это не один процессор, это целая серия от DEC. В СССР одна из реализаций была слизана в МК 1801 и серию ПК ДВК.
На них у нас, кстати, делали ЧПУ для станков, ну и научники их очень любили, пшт вот там-то как раз, очень задолго до поделок от Интел, была операционная система реального времени RT-11.
А БК-0010 на той же базе был мелкой персоналкой типа Спектрума.
Если входа не было и залезть внутрь было нельзя, то RF-модулятор, иначе искалась точка входа, и было это сразу после детектора видеосигнала. Картинка получалась снова ч/б. И только в редчайших случаях люди ковырялись со схемой глубже и подключали три отдельных сигнала цвета и отдельно сигнал синхронизации. Таких были единицы. Поэтому еще раз — частота пикселей в 7 МГц была оптимальной.
И каким же образом все эти прелести работали на чисто текстовых ПК, где даже жирный шрифт нельзя было отобразить? Ну, и пример файла можно посмотреть, чтобы точно убедиться, что он не был текстовым.
Перепутал значит. Сейчас погуглил, это было в ПК «Радуга», производном от Специалиста.
Не помню уже деталей, но на телевизоре диагональю 61 см триады были достаточно мелкие, явно мельче спектрумовского пикселя. Все проблемы с мылом там были по другим причинам.
Это у кого возможность была. Я несколько лет работал на телевизоре и только в последние пару лет приобрел себе небольшой ч/б монитор. Знакомые примерно так же — кто-то вообще все время только на телевизоре.
Зачем иронизировать? Все мы прекрасно понимаем, что Спектрум — далеко не идеальный ПК. Со своими текущими знаниями я бы сделал лучше. Так же Z80 далеко не идеальный 8-битный процессор, Zylog мог бы сделать тоже получше. Но Спектрум оказался оптимальным по совокупности характеристик, поэтому и получил наибольшую известность.
Во-первых, назовите всё-таки город. Во-вторых, снова какое-то противоречие — народ пытался сам собрать плату, а потом на ней только играл? Не поверю. У нас люди покупали готовые платы в Митино, а потом всё равно пытались на них программировать, то есть, совсем не только играли. Кто-то изучал асм, кто-то писал на Laser-Basic примитивные программы, но ведь не только играли.
Посмотрел. Интересно. Регистров мало для счастья :) Но подход имхо правильный — увеличить гранулярность до 16 бит и кодировать в команду побольше опций. Если бы я делал свой проц в те годы, я бы также точно поступил, только сделал бы 16 регистров. И, скорее всего, мой проц бы не имел успеха, т.к. проиграл бы более дешевым решениям)
Так делали детишки и НЕспециалисты, извините)
И предсказуемо получали мазню на экране.
и звук ещё, как же без звука )))
Мы так делали просто всегда, пшт за деньги.
Там работы на час-два, если по накатанной. В ящик ставились переключатель и разъём, или из ящика выводился сразу кабель для компа.
Модули цветности были стандартные, точки подключения известные, схемы доступные, никаких проблем для радиотехника.
Хы… чуть позже покупал у моряков за копейки б/у японские ящики, которые они тащили оттуда попутно с машинами, вструмлял туда наши модули цветности и продавал)))
Два таких переделанных, один мелкий Тошиба на 32см, второй Сони Тринитрон… не помню, что-то около 60см… оставил себе, и они благополучно работали дома до середины 2000х, когда были поочерёдно заменены на уже с ЖК-экранами.
Но это был не особо выгодный бизнес, всего переделал… штук 7… или 8…
Возни слишком много… схем нет, схемотехника у всех разная, каждый экземпляр — отдельный квест по поиску точек подключения и согласованию сигналов.
К тому же, некоторые ящики приезжали уже с настолько усаженными кинескопами, что только на свалку, а выяснить это было невозможно до покупки, только «как есть».
Разные бывали «чисто текстовые ПК»… про пример файла — забавный запрос, ага )))
Щас вернусь на 35 лет назад и посмотрю)))
Вот есть статья на Хабре, например:
habr.com/ru/news/834830/
Там есть ссылка на архив со всеми необходимыми материалами, если очень интересно — скачайте и посмотрите, мне лениво и не надо.
Погуглите схему исходного Спектрума-48К заодно, возможно, удивитесь))
Я её в исходнике не видел, но по слухам, там как раз было теневое видеоОЗУ.
Линейка памяти для проца на 64К, и линейка — для экрана, на 16К.
Триады были примерно одинаковые на всех размерах кинескопов, ввиду технологических ограничений, — 0,5-0,65 мм шаг маски.
При этом на 61см кинескоп должно было влезать по горизонтали, навскидку, около 1000 точек, на меньших размерах — пропорционально меньше.
Старые ч/б ящики были доступны по цене мусора или даже даром, замечательно работали в качестве мониторов, но надо было немного знать электронику, да, чтобы починить и правильно настроить. У нас на троих их стояло штук шесть в комнате в общаге, для разных целей разные.
Чтобы закрыть надоевшую беспросветную тему, очевидно же)
У меня там осталось немношк незакрытых обязательств перед некоторыми на тот момент серьёзными людьми, и не хотелось бы словить внезапный флэшбэк )))
Я обычно стараюсь быть максимально точным в формулировках, и такого не писал.
А писал я так: Как понимаете, поскольку я это делал за деньги, моё с ними взаимодействие было очень ограниченным по времени.
Никто не задавал вопросов про программирование, редкие спрашивали про возможность расширения памяти или дисковод, но почти все поголовно — «а есть у вас вот такая игра, а какие вообще есть, а можно переписать?» )))
Допускаю, что потом, уже в моё отсутствие, наигравшись, они резко переключались на изучение Ассемблера)))
Ну так Ваш опыт преимущественно ограничен подобными Вам энтузиастами, а мы предоставляли услуги относительно неограниченному кругу лиц…
Это Вы на его шину не посмотрели, видимо)))
У Z80, как и вообще у интеловых поделок, обмен синхронный — проц выставляет адрес и сигнал чтения и тупо по концу второго такта защёлкивает то, что есть на шине данных. Примерно так же и с записью.
Если по адресу никого нет, заберёт мусор и не заметит.
Если устройство неисправно или не успевает — тоже.
Максимум, что может сделать адресуемое устройство — повесить процессор в WAIT, в котором он рискует остаться навечно.
Никакая «система реального времени» при таких условиях невозможна без очень существенных внешних мер.
А там — полностью асинхронная шина с квитированием.
Не в подробностях, но примерно так:
Процессор выставляет адрес и сигнал «адрес» — ну вот просто считать очередную команду хочет, допустим.
Если по этому адресу есть устройство, оно выдаст сигнал «готов», если нет устройства или оно неисправно — через положенное время процессор сформирует сигнал ошибки.
После этого проц выставит сигнал «чтение».
Если устройство есть и исправно — оно подготовит данные, выставит их на шину и сформирует сигнал «данные готовы». Если за определённый период не выдаст — процессор сформирует сигнал ошибки.
Далее процессор считает данные и выдаст сигнал «чтение завершено», по которому устройство освободит шину.
В результате цикл обмена в минимуме вместо двух тактов растягивается на то ли 8, то ли 10, не помню точно, и… систему реального времени на этом строить очень легко и приятно, да, а вот железо сильно усложняется, ну и меееедленно оно всё )))
Ну, вот расскажите мне про стандартный модуль цветности, например, в моем телевизоре ТЕМП-714. А таких у нас было немало.
Посмотрю вечером, но уже сейчас по скриншоту вижу, что там обычный текстовый формат, а все «навороты» делаются ESC-кодами.
Пусть так. А Спектрум выдавал лишь порядка 360 видимых, то есть, почти по три триады на 1 пиксель. Очевидно же, что проблема мыла не в кинескопе )
Так тоже делали. Но не у всех было место, чтобы поставить отдельный ч/б ящик, да и качество картинки на таком могло быть не очень хорошим.
Так вы сами её открыли необоснованными наездами на Спектрум. А я вам пытаюсь объяснить, что всё на нем делали, в том числе и работали. Кстати, на основе Спектрума был тот же самый АТМ Турбо, где была та же СР/М и (внезапно) дополнительные видеорежимы. Но только распространения он большого не получил. То есть, людям для решения задач это было не очень нужно.
Если человек приобрел болванку платы, микросхемы, запаял это всё, у него определенно есть какие-то навыки по электронике, иначе бы он просто купил собранный ПК. А если есть навыки, то поиграв в игрушки он рано или поздно осознает, что на Спектруме можно решать какие-то задачи — от простого расчета вычислений по формулам до создания своего ПО.
Я же поэтому и спрашивал про ваш город — в нашем небольшом городе большинство спектрумистов знали друг друга, т.к. пересекались в одних и тех же точках (типа радиорынка, где продавали готовые ПК или компьютерного кружка). И у нас Спектрумы покупали, в основном, те, кого вы называете энтузиастами. Да хотя бы потому, что его подключить к ТВ одним антенным кабелем было нельзя. А кто хотел чисто играть чуть позже брали Денди.
Что-то вы путаете теплое с мягким. Система реального времени отличается лишь одной характеристикой — на каждую операцию в ней есть максимальное отведенное время, что позволяет иметь гарантированное время отклика. И ничто не мешает вам собрать такую систему на Z80. Пример тому — телефоны АОН.
Что касается сигнала WAIT — так если устройство поставит его навечно, оно просто неисправно, его надо заменить. Зато этот сигнал позволяет не усложнять логику кода чтения, которая будет одинаково хорошо работать и с быстрыми, и с медленными устройствами.
mysku.club/blog/diy/104694.html#comment4728600
Ну плохо, что я могу сказать… если дядьке влом потратить пару часов ради комфортной работы и игр детям — стыд и позор)))
тоже была в комплекте схема, ну или её можно было найти, а значит, просто подключение заняло бы не час-два, а чуть больше.
И что, эти коды корректно отработаются в любом текстовом редакторе, и на Спектруме получится такая же итоговая картинка, как на Искре?
Это не ирония, я реально не знаю, но сильно сомневаюсь ))
Я пас, уже всё написано выше))
Вот вообще нет, и даже не рядом.
Собранный стоил вдвое дороже, вот и вся причина, многие чуть ли не впервые паяльник в руки брали, это было очевидно по качеству пайки.
Да ну, блин… у нас даже в пределах одного нашего студгородка разные команды типа нашей между собой никак не взаимодействовали, не говоря уже про весь город, их же десятки тысяч были, спектрумистов, как можно всех знать???
Если периферия имеет возможность и право повесить проц в вечное ожидание, то это условие очевидно не соблюдается, а при развитой периферии типа станка с ЧПУ без согласований не обойтись.
В АОНе это мелочь, а в станке Ваше легкомысленное «оно просто неисправно, его надо заменить» может привести к катастрофе с жертвами.
Проц должен понять, что устройство неисправно, тоже в реальном времени, и отключить систему сразу, не дожидаясь, пока суппорт (не мальчик-эникейщик, а часть токарного станка) впечатает оператора в шпиндель ))
Была, конечно. Но я также боялся испортить работающий ТВ. А в последний год его эксплуатации, когда вдруг обнаружилось, что у кинескопа пропал синий цвет, я решился на такое подключение (терять уже было нечего) и обнаружил, что просто подать сигнал не выйдет, за цветами тянулись какие-то шлейфы, в общем, надо было разбираться глубже, я не стал.
А почему нет? Надо было лишь корректно отобразить код 27. По сути, эти коды шли напрямую на принтер, а он сам уже решал, что ему делать. Поэтому редакторы их просто отображали. И, кстати, никакого WYSIWYG тогда не было — редакторы просто отображали текст как «получится», вставляя переносы строки там, где заканчивался экран. А на принтере текст мог быть распечатан иначе. Простой пример — принтер формата А3, у которого символов в строке больше. Помню, на ПК был мощный редактор WD, так у него набор был в текстовом режиме, а для просмотра результата надо было переключаться в отдельный режим просмотра.
Ну, и еще момент. Все эти «навороты» в редакторах были нужны лишь тем, кто имел возможность потом выводить текст на печать. Если вы набирали текст для себя как шпаргалку, или писали текст для какой-то демонстрашки, необходимости в каких-либо принтерных кодах не было. Вот еще одна причина, по которой в массе не нужны были продвинутые текстовые редакторы.
Это у вас так. А у нас была максимум сотня. Посмотрите хотя бы стату на zxart. Многих из этого списка я знал лично, а про других слышал. Конечно, возможно, у нас были пользователи, кто самостоятельно купил ПК в Москве и только сидел дома и играл, но про таких я принципиально не мог узнать. Большую же часть тех, кто ходил на радиорынок я знал. И ходили туда далеко не только за железом, а и за новым софтом тоже.
Если периферия такое право имеет, значит, очевидно, что подключать её напрямую на шину ЦПУ нельзя. Я такие подключения, например, делал через отдельную ВВ55, где вводил биты статуса. Отслеживать состояние медленного устройства прямо на шине ЦПУ — большая архитектурная ошибка, т.к., во-первых, это замедлит работу всего ПК в целом. А, во-вторых, если устройство не имеет четких таймингов, где гарантия, что оно не подаст свои данные на шину позже, испортив тем самым обмен с другим устройством? В общем, возможно, во времена DEC на использование таких методов были веские причины, но даже уже во времена i8080 было принято ставить арбитры шины, которые защищали ПК от подобных проблем. И меня, честно говоря, удивляет, что вы называете не самую удачную архитектуру хорошей.
Школьный друг, когда я привез Спектрум домой, где он был вообще один на весь посёлок, САМ вывел все необходимые сигналы из своего ящика, чтобы цвет был!
И потом забрал у меня Спектрум )))
А он даже не радиотехник, так, по детству слегка паял по-мелочи.
Странные люди… почему я никогда не боялся?
Собсна, я еще школьником их, и не только их, ремонтировал и настраивал родственникам и знакомым.
Изначально речь была, напомню, про секретаршу, которая берёт работу на дом, и для этого как раз важно иметь совместимость по интерфейсу и визуалу, которые может обеспечить тот же Орион с CP/M, но не может Спектрум — просто в силу слабости экрана, кроме неспособности вообще запустить CP/M.
Почему Вы думаете, что в системах DEC их не было?
На этой базе, напомню, делались управляющие системы для станков с ЧПУ, в том числе, и в СССР, и я даже лично слегка в этом поучаствовал, и это продолжалось как минимум до 1993 года, пока я там был.
Возможно, у него был отдельный свой собственный ящик, с которым он мог делать всё, что угодно. Возможно, он вообще достал его неисправным и починил. В любом случае, такое было далеко не у всех. Ну, и молодежь всегда смелее опытных дядек банально из-за отсутствия этого опыта.
Аналогично. Но до первой поломки домашнего телевизора внутрь его мне официально залезть не разрешали. Поэтому я лишь по-тихому вывел ч/б видеовход, просто чтобы не мучиться с модулятором.
Во-первых, даже в 90-е там, где нужно на ПК было работать, уже были IBM/PC (типа 286) или совместимые машины, т.к. на них профессионального софта было уже тогда больше, да и их возможности были сильно шире. Во-вторых, вероятность наличия у секретарши дома игрушечного ПК на i8080 была крайне мала, т.к. это были ПК исключительно для энтузиастов. То есть, даже Спектрум у неё мог быть с большей вероятностью. И, в-третьих, если уж она не успела что-то доделать на работе, скорее всего, она там же и задержится, чтобы это доделать, а не пойдет домой. Отсюда ваш сценарий априори актуален приблизительно для нуля человек. Но даже если предположить, что звезды действительно сошлись и всё так и произошло, ничто не мешает ей продолжить редактировать текст и на Спектруме. Там были текстовые редакторы так же отображающие ^B и другие управляющие символы. Может быть, будет чуть менее удобно из-за размера экрана, но точно возможно.
Мне так показалось из ваших слов. В любом случае, я считаю, что архитектура условного Z80 прекрасно подходит для построения систем реального времени. Более того, построение таких систем — это, по большей части, вопрос софта, а не железа.
Товарищу для Спектрума кто-то из родни отдал Радугу-719, году в 88ом. Вот только она была «немножко неисправна» — маску намагнитили, а какой-то ломастер полез «сведение регулировать». Ну и докрутился до того, что по ней даже программу «Время» смотреть было невозможно. Вот и отдали ее со словами «ты в электронике шаришь, починишь и подключай свои синклеры». Как мы эти 60 кг корячили, два дрища, это отдельная песня. Но размагнитили, настроили сведение. Все по книжкам. Вот уж чего-чего, а по ремонту телеков книжек в библиотеке хватало. Вот справочников по деталям не хватало, если и были такие в районной библиотеке, то часто страницы вырваны. Ну а с подключением это уже не в библиотеку, а на толкучку, где схемы по рублю за страницу ужасного качества копии =)
То есть, неспешный ремонт — это одно, а сломать единственный домашний телевизор, который каждый день смотрят родители — совсем другое.
Да книжки были, конечно. Но информации, в целом, было в разы меньше. Сейчас можно быстро погуглить, завтра сходить в магазин, купить деталей и починить. А тогда даже приборов не было толком. А когда уже нашел неисправность, надо было еще детали требуемые найти.
Вот при бОльшем разрешении бывало по-разному, особенно на экранах помельче.
Вот это же не про Спектрум ващет:
Ну, и я пытаюсь сказать с самого начала — частоты пикселей выше 7 МГц для бытовых телевизоров были слишком высоки.
Да, но не из-за проблем с декодером цвета ))
Собственно, я же сразу и писал, что на 10МГЦ проблем не помню на ч/б ящиках, а на цветных бывало по-разному.
Ну, так там нет декодера цвета и нет ФНЧ на 3.5 МГц.
Нет.
Вы об этом сказали, но никаких подтверждений я не видел.
Я же, напротив, показал спектр сигнала СЕКАМ, где яркостный вполне себе норм вплоть до 6МГц.
Искать схему МЦ мне лениво, — практического смысла никакого, — и только поэтому я не стал продолжать тему.
Но и искусственно ограничивать смысла нет)))
Вы же сами привели картинку спектра цветного сигнала, из которой отлично видно, где там заканчивается полоса именно сигнала яркости и начинаются сигналы цветности. Но если вам этого мало, откройте характеристики цветного телевизора и посмотрите его разрешающую способность, она составляет 400-450 линий. То есть, те самые 3.5 — 4 МГц.
Искусственно ограничивать смысл есть, ведь начиная где-то с 3.5 — 4 МГц в спектре уже присутствуют цветовые поднесущие, то есть, там сигнал яркости никакой полезной нагрузки не несет. По идее, крутизна ФНЧ должна быть сильно больше, чем 6 дБ/октаву, отсюда сделать его на одном реактивном элементе не выйдет. То есть, вполне логично, что и выходной усилитель видеосигнала тоже имеет полосу пропускания на 4 МГц. А сделать это можно разными способами — например, за счет согласования выходного сопротивления усилителя с входной ёмкостью кинескопа.
По яркостному работают, как я выше сразу и писал, режекторные фильты, перестраиваемые на частоту текущей несущей цвета.
«Режекторный фильтр ослабляет на 20дБ содержащийся в ПЦТС сигнал цветности.»
Простое описание тут:
studfile.net/preview/6023439/page:5/
Да просто режекторные фильтры имеют большую крутизну, вот они и используются. Вот тут, например, уже сказано:
Считать лень, опять же, но обычный последовательный LC-контур с глубиной подавления 20Дб на частоте 4МГц никак не будет иметь полосу в 1,5МГц.
Да и не нужна там такая полоса, основная помеха приходится на сами несущие, её и давим, а боковиками можно пренебречь, их уже не видно.
Уважаемый (без иронии) оппонент!
Я же написал выше, что посмотрел несколько схем, ну чего Вы опять начинаете со своим ФНЧ?
Опять во лжи обвиняете облыжно?)))
Вы про него уже тут раз 200 написали, поди кейкэпы эти на клаве уже пора обновлять, неужели рука даже не дёрнулась проверить?
Вот кусок схемы от МЦ-31 (кликабельно):
О!
Да тут же у нас (обвёл кривой красной линией) переключаемый режекторный фильтр!!!
Как же это было внезапно, правда? )))
Который, в зависимости от напряжения на входе (точка X13N) либо отключен, либо включен только VT5, и тогда мы имеем контур L6C28 с частотой режекции 4,67МГц, либо включены VT5 и VT6, и тогда имеем L6(C28+C37) с частотой 4,02МГц.
Расписываю на случай, если у Вас с аналоговой техникой сильно хуже, чем с цифровой, так бывает.
Если они имеют бОльшую крутизну (что справедливо), то никак не могут иметь указанную выше ширину )))
Вы это понимаете же?
Многозвенные могут, но тут контур один.
Да, если вдруг решите пытаться настаивать на продолжении банкета, типа, это вот в МЦ-31 так, а в более ранних версиях был ФНЧ, имейте в виду, что МЦ-2 и МЦ-3 я тоже посмотрел, там тоже режекторные LC.
…
И вообще, как-то я уже подустал от этой темы, извините)
Спасибо, было интересно и ностальгично!
Я вам рассказываю исходя из своего опыта подключения к телевизорам — на большинстве было достаточно смазано. По какой именно причине — мы тогда не разбирались, так как это считалось «нормой». Очень хорошая картинка была на импортных телевизорах, но их были вообще единицы, т.к. среди старшего поколения было распространено мнение, что ПК «сажают трубку», поэтому если такой дома и имелся, то подключать к нему часто банально не разрешали.
Что касается схемы — да, я вижу описанные вами моменты в 3усцт. Однако, какова общая полоса пропускания видеотракта? Например, я попытался найти документацию на ХА17, и нашел такое:
Кстати, что касается кадровой, то у наиболее популярного Спектрума «Пентагон-128» 50 Гц никогда не было, т.к. авторам было лень делать счетчик на 312, они взяли 320 и там получалось 48.8 Гц. И это работало без модификаций на большинстве телевизоров. Иногда приходилось ручку сзади покрутить, которая за кадры отвечала.
Например, плату для запуска в производство своего варианта спектрума я трассировал в P-CAD на 286, правда, это приходилось делать ночами, днём было занято))
А буквально через несколько месяцев я уже гонял Вольфенштайна на новеньком 486, который находился в моём почти полном распоряжении 24/7.
А в применении атрибутов к группам пикселей ничего гениального нет, и вообще тут ноги растут из чисто текстовых режимов.
Экран спектрума (да и весь спектрум) — это набор суровых компромиссов.
Игр всё-таки реально было много, и очень даже замечательных.
Мнение своё я могу тут только озвучить, «навязать» не имею технической возможности.
А остальным, как Вы понимаете, нет абсолютно никакого дела до этих рудиментов.
Спектрумов моих тоже было… четыре, вроде. Или три? Это не считая опытных экземпляров и тех, что изначально делались на продажу.
Разошлись по друзьям/родственникам, ни одного не осталось, потому и брался сделать ещё один, тот на статике, да стало не надо…
Вот только очень большая часть этих игр — мультиплатформа, и если пойти на тот же mobygames и посравнивать скриншоты, становится очень грустно.
Вообще любая фиксированная 16-цветная палитра — отстой, но на C64 хотя бы старались, подбирали.
Кстати, на реальном ТВ она выглядит пободрее, чем в эмуляторах.
Естественно. Потому что будем честными, Z80 — далеко не быстрый процессор. Удобный с точки зрения программирования, но не быстрый.
Только вот вывод текста средствами системы всё равно получился мегатормозной, и в итоге вышло — ни рыба, ни мясо.
В MSX стоял тот же процессор, а сравните графику.
Просто спектрум надо было как можно сильнее удешевить, на этом он, собственно, и выехал, технически он из себя ничего выдающегося не представлял.
Верно, и это был на тот момент правильный ход. Но вот дальше надо было платформу развивать, добавляя нужные возможности.
И поддержу: Спектрум оставался рабочей лошадкой долго. Прикрутить к нему новое железо было просто. Basic + TASM + STM — отличный инструментарий. Я свой забросил только в 1998-м, когда PC купил. На работе тоже использовал до 1998, хотя компы у нас были. С IsDos побаловался, но не оценил. Редактор там крутой был, остальное не столь ценно. Тоже пробовал многозадачную ОС сделать. Писал свою оконную библиотеку, чтобы лучше, чем у Родионова.
Мне хотелось иметь возможность слушать музыку (на AY) во время работы на ПК. А работа, в основном — это было программирование на ассемблере. И я даже «ядро» своей ОС написал, музыка параллельно с XAS (кажется, так назывался ассемблер, которым я пользовался) играла. Но я быстро понял, что любая ошибка в коде, и ПК зависал или «сбрасывался», приходилось всё равно все перезагружать. То есть, проще было на магнитофоне включить запись.
У меня даже был план настоящего многозадачного Спектрума, где переключение задач осуществлялось NMI, тогда бы сбой одной задачи на другие не влиял, но это требовало весьма серьезной аппаратной модификации, поэтому этот план так и остался планом.
Аналогично сделал в «Специалист» — вывел фактически разъем ISA, позже платы расширения подошли в AT.
А, еще модем изобретали :) Без каких-либо серьезных знаний о преобразовании сигналов, пытались просто адаптировать протокол записи на магнитофон к телефонной линии.
У нас не было документации, да и банально разъемов нужного форм-фактора, так что каждый прикручивал свой вариант )
Да, у меня тоже было через ключи, то есть, все настройки программатора были программными. Только БП высокого напряжения был трансформаторным и ЦАП — на резисторах.
но повторить не удалось)
У нас работало более-менее стабильно, причем на разных АТС. Но «проект не пошел» — на тот момент уже были дискеты, такой объем информации передавать было очень долго, проще было доехать и переписать.
zxpress.ru/book_articles.php?id=1568
upd: ко мне мешастик едет :)
Дальше уже затянуло на PC и понеслось…
Первый купленный комп был 486DX4-75 (вроде :)
Чтобы это отслеживать, сначала держали в хозяйстве плату Спектрума, где все микросхемы стояли в кроватках, но расшатывались они быстро и на пятом-шестом комплекте уже непонятно было — контакт в кроватке пропал, или память битая. Ну и то, что практически все приличные кроватки в продаже были с дюймовым шагом выводов, а микросхемы имели метрический, тоже не радовало. Сильно озадачившись, коллега в общаге в конце концов спаял и запрограммировал тестер с чередованием значений для записи во время теста, поставив в него зажимную кроватку с рычажком, чтобы контакт тоже не влиял на результаты. И тут выяснилось что из 100% микросхем, прошедших базовый тест, процентов 15-20 на самом деле не умеют записывать в какие-то пары или группы ячеек разные значения, отсюда и сбои… Вот с этим тестером у нас народ, зарабатывавший на студенческую жизнь сборкой и продажей Спектрумов, и начал ездить закупаться памятью на Тушинский радиорынок, количество проблем при сборке и настройке сразу кратно уменьшилось. Но, я так подозреваю, что микросхемы, которые наш тест не проходили, продавцы в помойку не выбрасывали, а продавали как проверенные, могли даже тестировать при покупателе, но записью подряд одинаковых значений во все ячейки.
и сам такой же тестер делал на одну микросхему — по кругу перебирал данные + делал регенерацию.
Он сперва записывал нечётную последовательность в РУ5, потом читал, и если не совпадало — включал светодиод.
Если правильно помню, ещё и на частоте 4МГц — максимальной для этой серии.
Но для спектрумов было достаточно 3,5, поэтому тестирование делали на 4.
Что касается импортных аналогов, то году в 95-96-м смог достать комплект 41256 на 256 КБит, тогда же и увеличил объем памяти до 256 КБ.
www.youtube.com/watch?v=b-kkzl2foaQ
www.youtube.com/watch?v=ydH8DvSTD7o
www.youtube.com/watch?v=LbPEl4BuC6Q
www.youtube.com/watch?v=P4yaM-WSJC4
www.youtube.com/watch?v=PJ1DDqxyv_4
www.youtube.com/watch?v=dsg4P-e10MQ
Но меня больше всего впечатляют эффекты на «бордюре», а также мультиколор, ведь именно по этим моментам было легко отличить Спектрум от других, более продвинутых компьютеров. Первые требуют невероятно точных таймингов (я сам когда-то писал скролл на бордюре), поэтому (емнип) стали появляться несколько позже, так что, можно сказать, я их тогда не застал.
Спасибо!
Корпус башня, два 5,25 дисковода, музыкальный процессор Yamaha, два джойстика И самая фишка -полноразмерная клавиатура, по моему ATX.
И как в противовес «мне нравится единообразие», в жизни много исключений из правил, в том же русском языке их предостаточно:
1 резистор,
2 резистора,
5 резисторов.
В этом случае от отсутствия единообразия единственного и множественного чисел перфекционизм не рушится? )
В реальной жизни я с ним не взаимодействую :) Но возьмите, например, килобайт, там К большая.
кг — исключение, в нем со строчной буквы пишется сама единица.
Нет :)
Такого исключения пока не существует или приведите, пожалуйста, ссылку на нормативный документ. Исключение составляют единицы измерения информации бит и байт, только там приставка Кило- пишется прописной буквой.
Ну, как же — Гц пишутся с большой буквы, В, А, Ф — с большой, и много других едениц тоже. А вот граммы (г) с маленькой. Вот и исключение. Еще такое исключение — секунды, тоже с маленькой пишутся.
Вроде же выше пояснял этот момент.
В остальном, мне кажется, приставки, степень которых не кратна 3 только путаницу вводят.
Сантиметрами пользуются 100% населения России, линейки и рулетки в этих единицах.
Спасибо за обзор!
Кстати, для любитетелей такой музыки (а там еще и демки были), в свое время был общий сбор DiHalt.
Записи можно поискать в сети. Возможно люди и сейчас собираются, но это не точно, давно уже ушел от темы.
Еще есть проект www.avray.ru, там более интересный код — эмуляция непосредственно микросхемы AY, чтобы её можно было к реальному Z80 подключить. Но там используются тактовые частоты 25-27 МГц, то есть, разгон. Зато там не DDS, а прямо полная эмуляция на счетчиках.
Добавлю ностальжи из своих запасов:
Я собирал Орион 128, и у меня был такой проц с крупной надписью СДЕЛАНО В СССР
Так вот, он не убивался даже если перепутать +12 и -5 вольт, грелся как утюг. У товарищей с кем собирали были процы без этой надписи, даже в керамическом корпусе. Горели на раз.
А второго — уже по своей схеме, на Z80 и с турборежимом.
Напарник спаял Орион на Z80, тоже с турбо, так развлекались))
Вот это реально подарок ностальгии и чиптюну!
А почему сам эмулятор на асме, а не на си? из-за жестких таймингов?Прочитал подробно, интересно, а если вынести его из прерывания в основной поток и гененрирвать, наример, 16 расчетных значений за раз?
Почему про Си говорю — для портируемости.
P.S. сам я на ATTINY + SD делал wav-player (хватает за глаза), бОльшая часть времени ушла чтение FAT сделать )
Да там код весьма простой, его переписать на Си можно за пару часов, если понадобится :)
github.com/djspawnbrest/ESP32AY
А почему использовали аппаратные AY, а не эмуляцию? И непосредственно сами плееры форматов (типа STC) сами писали?
ESP32 отвечает за програмную часть и воспроизведение трековой музыки .mod, .s3m (той самой из кейгенов).
Это проект автора, чйю страничку из гитхаба публиковал.
А эта плата модификация от WireHead. Он мне её предоставил, и помогал при сборке.
Я бы ограничился подключением к ЕСП ЦАПа, там ведь есть I2S. По факту разница с оригинальным AY будет минимальная, а эти AY еще найти надо.
лично мне современные клоны спектрумов с настоящим Z80 тоже больше нравятся.
Спасибо!)
Так это минус для радиолюбителя, особенно тех лет — как такое паять-то?
Для хобби цена далеко не на первом месте.
А где тут кто-то плачет, колется или ест кактус?
мученияизучения. И даже теперь все равно приятнее применять AVR, где не надо на каждом шагу ворочать тонны документации. Для любительских задач производительности AVR хватает с головой, а цена не играет особой роли для единичных поделок.Помимо всего был радиолюбителем, и первое что мне хотелось это приспособить Спектрум к своему hobby, делал программы SSTV, RTTY, CW, Log и т.д., в игры вообще не играл.
А вот Спектрума своего у меня не было никогда, так, иногда чужие починял. Но после КУВТ MSX Спектрум не заходил вообще, так что я и не стремился. Плюс я уже успел поработать на Нейроне и ЕС-1840. И еще меня в Спектруме раздражало, что вместо одной буквы вылазит целая команда и вообще клавиатура жутко перегружена обозначениями.
Клавиатура перегруженная, да. Но это тоже из-за экономии — у Спектрума было всего 40 клавиш. Что же касается ввода сразу целой команды, по мне это было очень крутое решение. Во-первых, это позволяло экономить память, т.к. такая команда занимала 1 байт, во-вторых, увеличивало скорость работы программы, т.к. команду не надо было интерпретировать по буквам. Но так было только в 48К Бейсике, в 128К уже надо было вводить по символам.
Сначала брат собрал балтик, отдал мне.
Но я на тот момент уже заболел компами, решил собирать сам.
Был выбран пентагон48, спаян. Естественно, не заработал. Сидел, разбирался, запустил.
Балтик подарил двоюродному брату, подключил ему к чб(ибо у них был только чб)
У меня комп был подключен к цветному горизонту 51 см, для простоты был 5-метровый шлейф со скартом на конце, естественно, сигналы на скарт для цветного подключения были выведены дополнительно.
Чтобы тут не утверждали некоторые господа, никаких проблем с цветным подключением не было, подключали неоднократно, всего то надо было совсем чуть-чуть разбираться в телевизорах, а схема тогда была в паспорте телека.
Потом(это уже в году 93) собрал себе ес1840, пентагон послужил донором дисковода, валялся, был зачем-то распаян и потом выкинут.
Позывы собрать спектрум после 2020-го были, но быстро гасились ценой наборов для сборки, за эти деньги можно спокойно купить неплохой одноплатник, а спектрум просто эмулировать. Более того, цена некоторых наборов такова, что можно ноут купить. Воистину, человеческая жадность не знает границ.