Обсуждаем цифровые устройства...
Ответить

Re: Эмулятор магнитофона для ZX-Spectrum

Чт май 07, 2020 13:17:56

Ser1961 писал(а):А подскажите,почему листать файл и блок в разные стороны?

Я тоже, поначалу, менял кнопки местами. Они у меня горизонтально в ряд расположены
Изображение
Собственно сейчас назначение кнопок как на картинке и совпадает с авторской прошивкой. Привык как-то...
А поначалу пробовал и SELECT менять с крайнего левого положения на крайнее правое. И кнопки UP/DOWN местами. В последнем случае тоже приходилось дополнительно файл te.c править.

Re: Эмулятор магнитофона для ZX-Spectrum

Пт май 08, 2020 13:23:23

Кстати! От подобного эмулятора есть еще одна приятная особенность.
Дело в том, что в моей версии платы на входе стоит компаратор TL712. Вернее должен там стоять. Но он в наших краях жутко дефицитный, а с али никак не приедет (хотя по отзывам они там глючные, но я рискнул заказать).
Чтобы был вход магнитофона я собрал схему на К561ЛН2.
А сегодня, чего-то, подумалось, что на выходе эмулятора то TTL сигнал! В общем выкинул я К561ЛН2 совсем и поставил перемычку со входа TL712 на выход. Обвязка на входе собрана, там по сути делитель и конденсатор по постоянному току. В разъем магнитофона подоткнул эмулятор магнитофона и проверил на работоспособность. Все шикарно грузится

Re: Эмулятор магнитофона для ZX-Spectrum

Пт май 08, 2020 18:01:49

В принципе согласуешь уровни и везде работает.

Re: Эмулятор магнитофона для ZX-Spectrum

Пт май 08, 2020 21:35:51

В принципе согласуешь уровни и везде работает.

Так в этом и дело. С настоящего магнитофона еще подбери уровень сигнала. Наша К561ЛН2 там еще и как усилитель работала, в отличии от оригинальных схем с компаратором на входе.
А тут с эмулятором уже получается сигнал нужного уровня

Re: Эмулятор магнитофона для ZX-Spectrum

Пт май 08, 2020 22:14:05

С настоящего магнитофона еще подбери уровень сигнала.


Как не покажется странным, у спектрума к реальному магнитофону было важнейшее требование (при достаточном уровне сигнала, разумеется) - коэффициент детонации. Вот это параметр крайне критичен, ибо порождает сбой при частотной модуляции сигнала. Эмулятор же выдаёт чёткий и точный частотно-модулированный сигнал. Поэтому реальный исправный спектрум с него не загрузиться просто не может. :)

А вообще, мне тоже позавчера было нечем заняться, а "отпуск" плавно подходит к концу, поэтому из интереса (да и пригодится дочкам игры запускать) я решил попробовать загрузить имеющуюся у меня амигу 500 с stm32, а то мой ранее разработанный эмулятор дисковода требует большого времени на передачу данных в 2 МБ динамического ОЗУ. Взял я stm32f103c8t6 - всеми любимую китайскую плату. У него ОЗУ 20 кб, частота 72 МГц. Дорожка у амиги 12800 в MFM. Влезает в ОЗУ целиком. На atmega16 с внешним динамическим ОЗУ у меня когда-то не получилось быстро менять дорожки, но вдруг получится на stm32? Вместо своего модуля чтения FAT16 я взял уже освоенный fatfs. Для вывода дорожки задействовал SPI с DMA. Ну и кубик для разработки для ускорения процесса. Собрал всё это за день. Исправил ошибки платы и наброска программы вчера. А сегодня утром уже ух ты, Dizzy-6 загрузилась сходу! Пробуем Fast Food. Фигу. Вылетает частая ошибка чтения (такая беда для всех игр, показывающих синий экран DOS при загрузке). Боролся весь сегодняшний день, придумывая хитрые алгоритмы вычитывания блоков. Ускорил SPI у карты до нештатного значения (в 2 раза ускорил, поменяв делитель - до 36 МГц). Замерил время смены дорожки - 425 мс! Ого. Поменял карту памяти с 16 Мб ( :) ) на современную. Ого, 125 мс! А меньше, интересно, можно? А что там у меня в модуле SD.C, нет ли пауз? Точно, есть миллисекундные задержки. Выкидываем нафиг. Отлично! Всё грузится без ошибок. :lol: Осталось сделать работу с выбором файлов (сейчас я гружу прямо с заданным именем с карты) на валяющемся у меня китайском экранчике от Nokia 5110 (мда, хреновый экранчик, конечно) и можно выпускать в продакшн и делать статью для желающих. :) Никаких планок памяти, лишь два буфера К561ПУ4 (3.3->5 и 5<-3.3) или импортного аналога HEF4050 (которые у вас стоят), плата с микроконтроллером, экранчик, SD-карта и мелочевка вроде стабилизатора питания.

Re: Эмулятор магнитофона для ZX-Spectrum

Пт май 08, 2020 23:32:16

da-nie, будет интересная версия. Ждем!
Но нутром чую, что придется к этой версии Вам и добавлять чтение других файлов, кроме tap :)
А дисплей 5110 действительно убогий. Во-первых, не регулируется контраст. Во-вторых, постоянный неконтакт с резинкой. И ничем не лечится. С модулем Nokia 1202 c али тоже беда с контрастностью.
Вот и получается, что лепить либо TFT дисплей потом придется, либо недорогой IPS. OLED лучше вообще не рассматривать. За ту же цену IPS 1,6" смотрится выгодней. Благо контроллер позволяет такие дисплеи использовать

Re: Эмулятор магнитофона для ZX-Spectrum

Пт май 08, 2020 23:50:08

Во-первых, не регулируется контраст


Регулируется, но программно.

Re: Эмулятор магнитофона для ZX-Spectrum

Сб май 09, 2020 10:26:43

Да я в курсе, что программно. Но у меня на эту команду не реагировал. Хотя могу и с 1202 путать. Это просто последний монохромник, который я пытался приручить.

Re: Эмулятор магнитофона для ZX-Spectrum

Сб май 09, 2020 10:59:19

Он реагирует. Контраст меняется. Но картинка от этого лучше не становится.

Re: Эмулятор магнитофона для ZX-Spectrum

Сб май 09, 2020 11:34:41

Покопался в памяти, да, скорее всего с 1202 перепутал. Дело в том, что был у меня дисплей такой из магазина Профи. Подключил к МК, вывел текст, а он серый и блёклый. Пробовал контрастность поменять, не реагирует. Купил на али такой же дисплей, но уже на плате в виде модуля. Тоже не реагирует на контрастность. Потом на работе у коллеги случайно увидел оригинальный дисплей, подключил и … небо и земля, короче. Очень контрастное отображение.
А от 5110 у меня стоит в тестере LAN с vrtp. Так с ним я намучался. Несколько дисплеев поменял, у всех одна беда. После включения нет изображения. Для его появления передвключением надо сделать легкий массаж дисплею в районе резинки.

PS. https://aliexpress.ru/item/32969298268.html я вот про такой дисплей говорил. С STM32 стоит его использовать, на мой взгляд. По цене не дороже OLED, но не выгорает хотя бы.

PS2.
da-nie писал(а):Взял я stm32f103c8t6 - всеми любимую китайскую плату.

Тут подумалось, что наверняка можно это все на модулях и собрать. Модуль с МК, модуль с картой микро SD и буфером 74LVC125 на борту. Дисплей, опять же, модулем...
Получится конкурент TzxDuino :))
Вот только не понял, зачем там два буфера К561ПУ4? Один, допустим, для карты. А второй? Да и вообще, STM32 от 3,3 В питается. Там по идее вообще не нужны ни буферы, ни стабилизаторы 5->3.3 V на платах модулей. Дисплей сразу 3,3 В требует

Re: Эмулятор магнитофона для ZX-Spectrum

Сб май 09, 2020 12:33:57

Получится конкурент TzxDuino


Вот только не понял, зачем там два буфера К561ПУ4?


Дело в том, что я писал вовсе не про ZX. И совсем не про магнитофон, а про дисковод (который 5В на линиях). :)
загрузить имеющуюся у меня амигу 500

Re: Эмулятор магнитофона для ZX-Spectrum

Вс июн 28, 2020 00:15:55

Хорошо, вот финальный релиз.
Репозиторий на github обновлён.

1. А тест такой нудный/долгий специально оставили или по ошибке?

2. Ошибка, которая устойчиво воспроизводилась и о которой я сообщал вот здесь

https://radiokot.ru/forum/viewtopic.php ... 2#p3378322

теперь исчезла. Видимо мучения, описанные на последних страницах этой темы не прошли даром и это радует :)

3. Вопрос. Пауза во время воспроизведения по кнопке CENTER, с какой целью сделана? Каково практическое применение этой фичи?

4. Вопрос по логике работы.

    1. Вставляем, пустую карту, включаем эмулятор.
    2. Видим сообщения о поддержке/не поддержке различных FAT.
    3. Предлагается выбрать скорость эмулятора.
    4. И вот тут-то мы увидим сообщение о том, что на карте нет TAP файлов.

По логике это сообщение должно быть между п.2 и п.3. Ну а по большому счету эта фича не имеет особого смысла, ибо если вставить карту хотя бы с одной пустой папкой, то сообщения о том, что на карте нет TAP файлов мы не получим и при этом на карте не будет ни одного TAP файла.

Re: Эмулятор магнитофона для ZX-Spectrum

Вс июн 28, 2020 10:27:16

А тест такой нудный/долгий специально оставили или по ошибке?


Специально. :) Он нужен ровно один раз - сразу после сборки, а там лучше протестировать тщательнее. И больше он не нужен.

Ошибка, которая устойчиво воспроизводилась и о которой я сообщал вот здесь


Это очень хорошо. :)

Пауза во время воспроизведения по кнопке CENTER, с какой целью сделана? Каково практическое применение этой фичи?


Внутри блока? Это побочный эффект.

По логике это сообщение должно быть между п.2 и п.3.


Просто все предыдущие этапы однократные и их сделать проще до момента выяснения, что же там на карте есть.

то сообщения о том, что на карте нет TAP файлов мы не получим и при этом на карте не будет ни одного TAP файла.


Строго говоря, это сообщение правильнее было бы назвать как "На карте вообще нет файлов и папок". Но из последнего логично вытекает, что tap-файлов там тоже нет, поэтому я написал так. Но вы можете изменить надпись на любую другую. :)

Re: Эмулятор магнитофона для ZX-Spectrum

Вс июн 28, 2020 18:35:57

Пауза во время воспроизведения по кнопке CENTER, с какой целью сделана? Каково практическое применение этой фичи?

Внутри блока? Это побочный эффект.

1. Тогда может быть избавится от этого побочного эффекта, а заодно отображать на дисплее изменение состояния эмулятора (Pause/Play)?

2. А заодно удалить кусок кода обрабатывающий нажатие кнопок UP, DOWN во время паузы между блоками? Кстати, какой функционал задумывался на эти нажатия кнопок?

Код:
//----------
// Запуск образа
//----------
void OutputImage(void)
{
 _delay_ms(500);
 // повторяем для каждого блока tap-файла
 uint16_t block=0;
 while(1)
 { 
  if (FAT_WriteBlock(&BlockSize,block)==false) break;   // блоки файла закончились

  // выводим номер блока файла
  sprintf(String,"Block:%u [%u]",block+1,BlockSize);
  WH1602_SetTextUpLine(String);

  // запускаем таймер и регенерируем память   
  TCNT0=0;                  // начальное значение таймера
  LeadToneCounter=6000<<Speed;
  TapeOutMode=TAPE_OUT_LEAD;
  TapeOutVolume=false;   
  DataCounter=0;
  uint16_t dl=0;
  sei();
  while(1)
  {
   cli();
   DRAM_Refresh();
   
   if (TapeOutMode==TAPE_OUT_STOP)
   {
    sprintf(String,"Block:%u [0]",block+1);
    WH1602_SetTextUpLine(String);
    uint16_t new_block=block+1;

    //формируем паузу
    int delay=200;
    if (BlockSize>0x13) delay=500;            // файл передавался
    for(uint16_t n=0;n<delay;n++)
    {
     _delay_ms(10);
     if (BUTTON_SELECT_PIN&(1<<BUTTON_SELECT))         // SELECT - выход
     {   
     TAPE_OUT_PORT&=0xff^(1<<TAPE_OUT);
     return;
     }

     if (BUTTON_CENTER_PIN&(1<<BUTTON_CENTER))         // CENTER - пауза
     {
     _delay_ms(200);
     sprintf(String,"Block:%u [Pause]",block+1);      // [PAUSE]
     WH1602_SetTextUpLine(String);
     while(1)
     {
      // нажатие на CENTER во время PAUSE - продолжить воспроизведение
      if (BUTTON_CENTER_PIN&(1<<BUTTON_CENTER))
      {
        sprintf(String,"Block:%u [Play]",block+1);      // [PLAY]
        WH1602_SetTextUpLine(String);
       break;
      }
     }
     _delay_ms(200);
     }

     /////////////////////////////////////////////////////////////////////////////////////
     // зачем этот код, что делает эмулятор при нажатии UP, DOWN во время паузы?
     /*if (BUTTON_UP_PIN&(1<<BUTTON_UP))         // UP - на блок назад
     {
     _delay_ms(200);
      if (block>0) new_block=block-1;
      break;
     }

     if (BUTTON_DOWN_PIN&(1<<BUTTON_DOWN))         // DOWN - на блок вперёд
     {
     _delay_ms(200);
      new_block=block+1;
      break;
     }*/
     /////////////////////////////////////////////////////////////////////////////////////
    }
   block=new_block;
    break;
   }
   
   uint16_t dc=BlockSize-DataCounter;
   uint16_t tm=TapeOutMode;
   sei();
   if (tm==TAPE_OUT_DATA)
   {       
    if (dl==30000)
   {
    sprintf(String,"Block:%u [%u]",block+1,dc);
     WH1602_SetTextUpLine(String);
    dl=0;
   }
   else dl++;
   }
   _delay_us(10);
   if (BUTTON_SELECT_PIN&(1<<BUTTON_SELECT))         // SELECT - выход
   {
    cli();
   TAPE_OUT_PORT&=0xff^(1<<TAPE_OUT);
   return;
   }

   ////////////////////////////////////////////////////////////////////////////
   // зачем нужна остановка во вреся воспроизведения??
   //
   /*if (BUTTON_CENTER_PIN&(1<<BUTTON_CENTER))         // CENTER - пауза
   {
   cli();
   _delay_ms(200);
   while(1)
   {
    if (BUTTON_CENTER_PIN&(1<<BUTTON_CENTER)) break;  // продолжить воспроизведение
   }
   sei();
   _delay_ms(200);
   }*/
  ////////////////////////////////////////////////////////////////////////////

   if (BUTTON_UP_PIN&(1<<BUTTON_UP))            // UP - на блок назад
   {
    _delay_ms(200);
    if (block>0) block--;
    break;
   }
   if (BUTTON_DOWN_PIN&(1<<BUTTON_DOWN))         // DOWN - на блок вперёд
   {
    _delay_ms(200);
    block++;
    break;
   }
  }
  cli();
 }
 TAPE_OUT_PORT&=0xff^(1<<TAPE_OUT);
}

Re: Эмулятор магнитофона для ZX-Spectrum

Вт июн 30, 2020 20:18:36

1. Тогда может быть избавится от этого побочного эффекта, а заодно отображать на дисплее изменение состояния эмулятора (Pause/Play)?


А зачем? Этот эффект позволяет когда промотал не на тот уровень и увидел, что уровень отказался грузиться тут же остановить блок и промотать куда надо.

А заодно удалить кусок кода обрабатывающий нажатие кнопок UP, DOWN во время паузы между блоками? Кстати, какой функционал задумывался на эти нажатия кнопок?


Переход к нужным уровням.

Re: Эмулятор магнитофона для ZX-Spectrum

Вт июн 30, 2020 23:26:41

А зачем? Этот эффект позволяет когда промотал не на тот уровень и увидел, что уровень отказался грузиться тут же остановить блок и промотать куда надо.
...
Переход к нужным уровням.

Во время паузы эмулятор не реагирует ни на одну кнопку кроме CENTER (пауза), т.е. снять с паузы.

Re: Эмулятор магнитофона для ZX-Spectrum

Ср июл 01, 2020 10:12:24

Во время паузы эмулятор не реагирует ни на одну кнопку кроме CENTER (пауза), т.е. снять с паузы.


Я уже не помню. :dont_know: Пауза там нужна была для того, чтобы приостановить воспроизведение в любой момент, как на магнитофоне. А работает ли при неё перемотка - не помню.

Re: Эмулятор магнитофона для ZX-Spectrum

Ср июл 01, 2020 13:33:42

da-nie, нет, не работает. Во время паузы ни одна кнопка не работает (в том числе и SELECT) что, в общем-то, и следует из приведенного кода.

Ну и как было сказано выше - пауза бессмысленна во время воспроизведения. Таким образом, можно два куска кода заремарить в целях экономии памяти ATMEGA.

Re: Эмулятор магнитофона для ZX-Spectrum

Сб июл 04, 2020 07:00:49

Легче перейти на atmega32 и не так дорого.Пауза нужна для остановки загрузки следующего блока.MSM514400D-60SJ работать не будет?Сигналы совпадают кроме A9.

Re: Эмулятор магнитофона для ZX-Spectrum

Сб июл 04, 2020 08:29:34

MSM514400D-60SJ


Да, должна подойти - её ёмкость просто в 4 раза больше. А A9 нужно приятнуть либо к GND, либо к питания.
Ответить