Магнитофон для ZX Spectrum. Софт

Продолжу свой рассказ о разработке магнитофона для моего персонального компьютера «Мастер», советского клона ZX Spectrum 48К. Для тех кто пропустил, вот ссылка на первую часть:

Мне пришел программатор и теперь я могу перепрошивать Arduino Nano, поэтому отговорок для откладывания работы у меня не осталось. Кстати, шел он ко мне долго, в два захода и, наверное, пешком. Почта РФ, как всегда, на высоте…

Магнитофон для ZX Spectrum. Софт

Первым делом нужно было обновить ядро, так как на свои клоны Nano китайцы ставят старый загрузчик. Протестировал на «чистой» плате, все прошло успешно. Попробовал накатить на ардуинку из магнитофона и... ничего не получилось. Домучал ее до такого состояния, что она на всё перестала реагировать. Кстати напомню как выглядит «магнитофон»:

Оказалось, что пины для подключения программатора (я обвел их оранжевым) дублируются и на основной гребенке. И так получилось, что на этих пинах висела и SD карточка. Пришлось отпаивать контакты обведенные красненьким, прошивать новое ядро и припаивать контакты заново. Урок мне на будущее: все программируемые части макетных плат должны быть в «кроватках», для удобного извлечения и замены.

Я было расстроился, что не смогу работать через программатор (это существенно ускоряет заливку скетчей в ардуинку), но, как оказалось, vscode тоже не умеет с ним работать (никак баг не починят). Так что по итогу, я не так много и потерял.

Для отладки пришлось спаять еще пару приблуд. Первая для человеков, а вторая для "Мастера". Вот и пригодились бесплатные затычки из Сапсана.

Теперь о софте. План был простой и приятный: ищу прошивку, правлю в ней пару моментов под себя, прошиваю и радуюсь жизни. А теперь о том, как все получилось в реальности.

Прошивок для подобных проектов несколько: классический TZXDuino, MAXDuino, ArduiTape, CASDuino и т.п. Вот тут человек посвятил им целый блог:

Я решил остановиться на классическом варианте. Очевидно, что без исправлений не обойдется: у меня четыре кнопки, у них пятикнопочное управление. Но я же у мамы программист, что может пойти не так? 😁

Беспокоиться я начал, когда увидел, что об обновлениях ребята пишут на фейсбуке, а скачивать исходники предлагают с mega.nz. А когда открыл архив, передо мной разверзлась настоящая бездна ада. Человеческое сознание не могло породить такого хаоса и ужаса. И я понял, что застрял всерьез и надолго.

Просто для примера: в проекте TZXDuino есть пятая кнопка, называемая Root. Более того, в ранних версиях в каждой папке должен был лежать пустой файл ROOT. Зачем? Очевидно, для перехода в корневую папку. Почему? Потому что они не смогли написать код для перехода в родительскую папку! Справедливости ради, в последних версиях кнопка Stop умеет переходить в родительскую папку (правда, максимальный уровень вложенности равен трем) и выглядит этот код так:

fileName[0]='\0'; prevSubDir[subdir-1][0]='\0'; subdir--; switch(subdir){ case 1: //sprintf(fileName,"%s%s",prevSubDir[0],prevSubDir[1]); sd.chdir(strcat(strcat(fileName,"/"),prevSubDir[0]),true); break; case 2: //sprintf(fileName,"%s%s/%s",prevSubDir[0],prevSubDir[1],prevSubDir[2]); sd.chdir(strcat(strcat(strcat(strcat(fileName,"/"),prevSubDir[0]),"/"),prevSubDir[1]),true); break; case 3: //sprintf(fileName,"%s%s/%s/%s",prevSubDir[0],prevSubDir[1],prevSubDir[2],prevSubDir[3]); sd.chdir(strcat(strcat(strcat(strcat(strcat(strcat(fileName,"/"),prevSubDir[0]),"/"),prevSubDir[1]),"/"),prevSubDir[2]),true); break; default: //sprintf(fileName,"%s",prevSubDir[0]); sd.chdir("/",true); }

Мое чувство прекрасного не позволит такому работать с моим Cпекки и пришлось работать по настоящему. Я вычистил все, что я хардварно не поддерживаю: кнопку Root и пару видов дисплеев. Язык программирования у Arduino — это С++, но система сборки своя. Из-за этого можно использовать необъявленные переменные и т.п. Я все перевел на нормальный С++, структурировал и разбил код на логические блоки. Переписал всю логику меню, работу с дисплеем, с SD картой и т.п. За обработчик кнопок спасибо AlexGyver Technologies, кстати настоятельно рекомендую ознакомиться с его творчеством на YouTube.

В итоге, без изменений остался только код, отвечающий за чтение и воспроизведение файла. Над ним работает несколько команд и, пока, я не хочу его глобально переделывать. Свою версию TZXDuino, названную «TZXDuino с человеческим лицом», я разместил тут:

Она все еще в стадии интенсивной разработки, но результат мне уже нравится. Лицензия будет MIT’овской, так что пользуйтесь и изменяйте ее как хотите. Позднее я добавлю в репозиторий и хардварную документацию.

Что в планах на будущее? Финальный вариант плеера. Во-первых хочу белый экранчик, он выглядит аутентичнее и поддерживает русский язык. Во-вторых, думаю заказать себе коричневые свитчи Gateron. Блок из четырех таких кнопок займет на плате примерно 8х2 см, но я готов к таким тратам. И я все еще в поиске keycaps’ов для них, никак не могу найти с отпечатанными значками плеера.

Недавно мне пришли модули для SD карт, они стали гораздо меньше. Еще я обзавелся новой ардуинкой с Type-C разъемом, она уже прошита и ждет своего часа. И, конечно, когда определюсь и получу все компоненты, разведу и закажу финальный вариант платы, скорее всего у JLC PCB. С цветом платы, правда, не определился…

Спасибо за внимание!

3535
15 комментариев

Прочитал предыдущую статью и хочу немного помочь с приучиванием спекки к чистому идеальному цифровому сигналу с плеера/телефона:

Проблема чтения как раз-таки в слишком идеальном сигнале источника. Советские клоны ставили простейшие "чистильщики сигнала", основанные на паре инверторов/кондёров/резюков. Мягкий сигнал с майфуна преобразовывался в чёткий 1/0 с нужной частотой и заходил в мультиплексор (КП12, ЕМНИП). Так вот идеальный сигнал с плеера/планшета после преобразования имеет слишком сильную атаку (стартовый импульс) и затем - после дальнейшего преобразования вместо __|—-|__|—-|__ (с равными таймингами 0 и 1) получается ___|-|___|-|___|-|___ ... и тд.
Решается просто - надо пройти по схеме спекки и найти в какую конкретно микруху и ногу заходит сигнал после обработки (в цепи обычно всего один инвертор на 3-4 входа и пара кондеев). И запаять вход с Вашего плеера конкретно в микросхему БЕЗ ОБРАБОТКИ. Подобрав уровень громкости - всё будет работать идеально. Желательно использовать любой подручный осциллограф прямо на ноге.
Отладил так свою Дельту-С, которая 25 лет не могла читать кассеты (из-за умершей обработки), но теперь идеально принимает любые кассеты с компа.
Удачи! :)

3
Ответить

Спасибо за совет! Но, с компа у меня читает идеально. Причем с любого, как и с планшета на чистом андроиде. Я не сомневаюсь в качестве приема сигнала у Мастера. Мне просто доставляет удовольствие разрабатывать свой вариант магнитофона, вот и все. :)

1
Ответить

после преобразования имеет слишком сильную атаку (стартовый импульсТо есть в оригинале сигнала были более заваленные фронты? Спасибо, даже не догадывался. 

Ответить

Мне скоро подгонят Байт, я в этом не особо разбираюсь, но будем посмотреть, может туда тоже такое приделать.
Хотя у меня есть такой кассетник с переделанным шнуром.

2
Ответить

Кассетник выглядит просто отлично! У меня же магнитофон был огромным и неудобным советским монстром.

1
Ответить

Прочитал, как марафон zx spectrum, думал щас двое будут за столом разбирать)

1
Ответить

Жженые регистры на время менять. Или битые РУ-шки.

2
Ответить