Эмулятор AY-3-8910/AY-3-8912/YM2149F

Эмулятор AY-3-8910/AY-3-8912/YM2149F

Эмулятор представляет собой прошивку для AVR микроконтроллера Atmega8/48/88/168/328.

 

Текущая версия эмулятора 24.7

Изменения: Исправлена работа генератора шума и других генераторов

Внимание! Данная версия не совместима с AYPlayer версий ниже 6.0!!!

AY_Emul_Version24_7 дата выхода 08.07.2017.

 

 

Предыдущие версии

 

Version 24.6

Изменения: Исправлена работа в параллельном режима, он практически не работал в версиях 24.3-24.5 и никто не сказал 🙂

Поддерживаются: Atmega8/48/88/168/328

Внимание! Данная версия не совместима с AYPlayer версий ниже 6.0!!!

AY_Emul_Version24_6 дата выхода 08.05.2017.

 

 

Version 24.5

Изменения: добавлены таблицы громкости для эмуляции AY/YM, добавлены версии для Atmega48/88/168/328!

Внимание! Данная версия не совместима с AYPlayer версий ниже 6.0!!!

AY_Emul_Version24_5 дата выхода 15.02.2017 (исправленная версия).

 

Version 24.4

Изменения: еще больше оптимизации, а так же оптимизирован параллельный режим!

Внимание! Данная версия не совместима с AYPlayer версий ниже 6.0!!!

AY_Emul_Version24_4 дата выхода 25.09.2016.

AY_Emul_244_m48 дата выхода 13.02.2017 (для Atmega48)

 

Version 24.3

Изменения: проведена большая работа по оптимизации эмулятора.

Внимание! Данная версия не совместима с AYPlayer версий ниже 6.0!!!

AY_Emul_Version24_3 дата выхода 20.09.2016.

 

Version 24.2

Изменения: улучшен генератор шума, улучшено микширование каналов, новая таблица громкости.

Внимание! Данная версия не совместима с AYPlayer версий ниже 6.0!!!

AY_Emul_Version24_2 дата выхода 25.08.2016.

 

 

АРХИВ ДВУХКАНАЛЬНЫХ ВЕРСИЙ

АРХИВ ТРЕХКАНАЛЬНЫХ ВЕРСИЙ

 

Прошивка прошивается с помощью avrdude и USBAsp программатора стандартным способом

Строка для запуска

Для всех кварцев, кроме встроенного

avrdude -b 19200 -p atmega8 -c USBasp -U flash:w:emul25mhz.hex -U lfuse:w:0xCE:m -U hfuse:w:0xC5:m
или
avrdude -b 19200 -p atmega8 -c USBasp -U flash:w:emul25mhz.hex -U lfuse:w:0xCF:m -U hfuse:w:0xC7:m

Для кварцев с частотой до 16MHz включительно (режим энергосбережения)

avrdude -b 19200 -p atmega8 -c USBasp -U flash:w:emul16mhz.hex -U lfuse:w:0xCE:m -U hfuse:w:0xD5:m

Для внутреннего кварца с частотой 8MHZ

avrdude -b 19200 -p atmega8 -c USBasp -U flash:w:emul8mhz.hex -U lfuse:w:0x24:m -U hfuse:w:0xc5:m

AVRDUDE можно скачать здесь avrdude или с сайта разработчика

Схема подключения усилителя к двухканальной версии

outputcircuit2ch

Данные RC фильтры обрезают частоты ниже 20 Гц и выше 48 кГц, так что вы можете спокойно подключить эту схему к звуковой карте или усилителю, в оригинальной схеме RC фильтр был построен неправильно.

Если вы собираетесь прослушивать эмулятор в наушниках, то RC-фильтр не требуется и можно подключать их напрямую к PB1 и PB2.

Схема с подмешиванием бипера (для ZX-Spectrum)

outputcircuit2ch_speaker

EMULATOR PIN MAPPING TO AY-3-8910

pinmap2ch

44 Комментарии “Эмулятор AY-3-8910/AY-3-8912/YM2149F

  1. Вчера подключил эмулятор к реалу (Дельта-С)

    Кварц 25 Мгц. Иногда слышны артефакты (чего не было в последовательном режиме), буду пробовать ставить более высокочастотный кварц.

    Режим чтения, как и в оригинале эмулятора не реализован (в демках индикаторы уровня «стоят»)?

    Схема

    Печатка

    1. Если на 27 будут артефакты (особенно на версии 12.3) — сообщите.
      Насчет режима чтения… в принципе, это можно реализовать на регистре сдвига или может найду какой способ попроще.
      Попробую сделать как вернусь из отпуска (неделя-две), а может и сегодня, если успею.

  2. Удалось на 8 меге сделать всё-таки режим чтения, индикаторы в SUPREME замигали и в других проигрывателях. Отпишитесь по результатам тестов, если будут какие-то проблемы, поправлю как вернусь.

  3. Сегодня-завтра выложу 12.4 версию (не тестовую) в которой будет реализован частичный режим чтения, 6 бит будут выдаваться из 8, но этого вполне достаточно практически для всех приложений, зато никаких проблем с зависаниями, шипением и и.д.

    1. 12.4 проверял в разных режимах на живом железе, всё отлично работало на 27 МГц, если у вас есть еще атмеги, попробуйте другую поставить, может в ней дело, у меня тоже не все хорошо работают, некоторые не тянут нормально 27 МГц.

      PS: да, у меня атмега на место AY подключена напрямую, без всяких конденсаторов по питанию и на RESET, может еще в этом дело.

  4. На 12.3 все нормально работает. Мегу можно и поменять, у меня из старой партии 8 ые остались, но здесь использую из новой партии 8а.
    Еще у меня есть идея заменить 155ЛА3 на что-то более высокочастотное, но с другой стороны частота там в рамках 155 серии.

    1. Подключил, всё отлично работает в версии 12.4, правда RAMDOCTOR не находит AY в тесте, но это наверное потому что он шлет в него 255, а т.к. возвращается всего 6 бит, то он его и не видит, но вроде везде всё играет и откликается.

    1. В галерею закинул картинку, схема исправленная, за основу взял от магик-05 и от ленинграда, после чего исправил неработающий AY в схеме от ленинграда, очень хочется попробовать реализовать эту схему на атмеге на встроенном кварце, может что из этого и получится… получится вся доработка вместе с AY на двух мегах и одной ла3 🙂 заодно и больше бит с шины адреса обработать

    2. Оказывается у меня была 12.4 трехканальная, всё работало хорошо, прошил двухканальную, тоже получил шум, но после ресета всё стало нормально, видимо проблема в начальной инициализации, попробую сейчас поправить.

      Всё, исправил, можно пользоваться 🙂

    1. Отлично что работает, у меня тоже работает хорошо, жалко только одного 7-го бита не хватило на меге 8 чтобы сделать так чтобы в тестах чип нормально определялся, т.к. тесты проверяют 6 бит 0-го регистра AY…. 🙁
      В 12.5 немного улучшена часть обработки данных в параллельном режиме, т.е. работает немного пошустрее.
      Не знаю, есть ли смысл менять местами биты 6 и 5 для нормального определения в тестах или нет.
      Пробовал сделать все 8 бит, но т.к. они на разных портах, а при записи в 2 порта, чтение происходит только по фронту первого, то второй порт не читается, т.е. либо биты 6,7, либо 0-5… а в микроконтроллере регистра позволяющего сделать вывод одновременно в несколько портов нету 🙁 а так было бы замечательно всё ((( еще как вариант приспособить ресет под это дело… но это опасно, если нету FUSE BIT DOCTOR да и ресет придется реализовывать через питание.

    1. Да, там есть такое, самая лучшая сейчас версия 15.0, в ней очень сильно оптимизирована часть генерирующая звук и увеличено время обработки прерываний по BC1/BDIR, так же в связи с исправлением микшера теперь более качественный шум, видимо он в более старых версиях и дает на ваших примерах искажения. Я вчера сверялся с оригинальным чипом AY-3-8910, в нем именно такой шум, как в версии 15.0. А в более ранних было наследие оригинальной версии.

      1. В моих примерах слышно, как МК не успевает обрабатывать поток, шум я не сравнивал. Примерно то же самое было, когда не успевала 25 МГц версия.

        На следующих выходных буду тестировать новые версии, заодно попробую на Вектор 06ц эмулятор подключить (плата уже готова),
        Оригинальная версия на 8515 у меня на Векторе звучала с артефактами.

        1. Я сейчас протестировал на Кворум-Бк04 версию 15.1, вообще никаких артефактов, всё справляется отлично. А в оригинале было много недоработок, вообще удивительно как там работал параллельный режим 🙂 Но, благодаря оригиналу получилось то, что есть сейчас.
          В оригинале с шумом было так, если тон и шум, то амплитуда удваивалась, если в микшере тон и шум и заданы тон или шум, то шла единица в канал, а по информации из надежных источников, например отсюда http://www.cpcwiki.eu/index.php/PSG#07h_-_Mixer_Control_Register должно быть так, что если в микшере тон и шум, то обычная амплитуда, если в канале одновременно тон и шум, и тишина, если не оба сразу.

          PS: тестируйте сразу 15.1, предыдущие смысла особо нет тестировать 🙂

          PPS: мне сейчас даже непривычно слушать некоторые композиции, к которым я уже привык, т.к. они звучат совсем по-другому 🙂 вот что значит небольшая ошибка в микшере…

        2. Сейчас подумал, почему у вас может быть проблема со звуком, проверил на нескольких МК, такая проблема, если МК плохо тянет 27МГц, я то тестирую на МК который тянет 40МГц (правда из 40 штук такой один оказался). Во-общем, версия 15.3 отлично тянет кристаллы 24+МГц, возможно и 20МГц, во всяком случае у меня звучала нормально. Так что рекомендую кристалл 24-25МГц и версию 15.3
          Еще рекомендую, если пойдет, заменить серию 74LS на 74HC, у меня заметно лучше стало работать на ZX

            1. МК не может не успевать, т.к. он тянет даже на 16МГц, скорее всего что-то с сигналами BC1/BDIR или МК не тянет кристалл.
              А какие микросхемы используете для получения BC1/BDIR и кварц? у меня тоже было такое, пока не поставил 74HC вместо 74LS, еще попробуйте другой МК или кварц с частотой поменьше, во-общем, похоже на то что плохо согласуются уровни CMOS/TTL

                  1. Она на Спектруме нормально работает, а на Векторе ненормально. На Векторе стоит ВМ80 (работающий на 3 МГц) и сигнал WRIO формируется с помощью нескольких микросхем и в итоге его длительность много меньше аналогичного у Z80

                    1. Понятно, значит выходит, что сигнал уже пропадает, а данные на шине еще висят и эмулятор их считывает… да… тут тогда или какую-то задержку в прерывание добавлять после пропадания сигнала, или сигнал формировать по-другому… но, я это (первое) сделать не смогу, т.к. у меня нет вектора для экспериментов 🙂

  5. Там еще несколько интересных моментов имеется. На оригинальной версии эмулятора на atmega8515 я в итоге добился нормальной работы (на запись) — взял WRIO немного в другом месте (http://zx-pk.ru/showpost.php?p=754229&postcount=25). На вашем варианте — изменения есть, но они незначительные.
    На чтение не работает не оригинальная версия, ни ваша версия.
    На ZX ваша версия работает замечательно, оригинальную не проверял.

    1. Ну да, потому что генерация (дискретизация) происходит в 2 раза быстрее, чем на предыдущих версиях, т.е. звук более качественный. Так же огибающая теперь генерируется более точно, за счет 32 уровней, ранее нулевой период был в раза медленнее, что в произведениях с быстрой огибающей делало её более низкой по звучанию (хотя, это спорно, т.к. частота всё-равно та же у тона).

  6. Здравствуйте. А можно Вашу прошивку , последнюю например, или какую другую залить в attiny2313. Как я себе понимаю, что в меге, что в тине используются одни и те же регистры, по размеру собственно программы и еепрома то же конфликтов нет. Или может есть какая то тонкость, которую с первого раза не видно?
    С уважением.

    1. Есть тонкость, я уже делал версию под этот контроллер, без поддержки режима чтения никаких проблем нет. Если режим чтения пытаться реализовать, то возникает проблема в том, что на втором порту находятся выводы PWM, в Atmega8 они на отдельном от ввода/вывода данных порту. Плюс пины внешних прерываний расположены так, что они пересекаются с PWM, т.е. нельзя быстро совместить данные с двух портов без дополнительных сдвигов, что приводит к нестабильной работе в параллельном режиме.

  7. Здравствуйте. Скажите, а где можно было бы ознакомиться с проектом под тини? Схема, как я понял, полностью совпадает с исходником. Как я себе понимаю, мне режим поддержки чтения не нужен. Я хочу поставить эмулятор в клон спектрума.
    С уважением.

  8. I have a few more questions (sorry, in English only):

    — The emulator can be found for 1.75 mhz (spectrum, or more precisely, Pentagon, as the spectrum should be 1,77 mhz) and 2 mhz (atari st). Do you think it could be possible to get a version of the emulator for the Amstrad CPC as well? The frequency for this one is 1 mhz, so if we play it on the emulator, it’s too high pitched! Or how could it be generated. I guess with a crystal running at half the speed of the configuration, it won’t work this easily?

    — now it seems the emulator and the configurations for the crystal are on two different files. Is there an advantage to use an external crystal instead of the 8 mhz of the arduino? Or was it less precise? (the same for the power-saving one at 16 mhz)

    1. Evgeniy explained the configuration in one of Russians forum and over the email as follows:

      «About ICR value…
      It is used to limit time period in timer interrupt and as maximal value for Fast PWM.
      ICR value calculated as (AVR_crystal_value/PSG_generator_freq/2-1). Division by 2 is used because for 1Hz wave we need 2 timer interrupts, for set output to 1 and back to 0 with duty cycle 50%. As ICR uses only integer values we need to round it. So for 1.78 is better to use 120.

      Config file consists of 4 bytes.
      1) USART_ENABLE: 0 — disable, 1-enable (if enabled serial mode active)
      2) INT_ENABLE: 0 — disable, 1-enable (if enabled parallel mode active)
      3) ICR_VAL value of ICR calcilated as if formula above
      4) UBRRL_VAL value setting speed of serial interface (according to used crystal value)

      So, you can write binary file with these 4 values and convert using bin2hex utility.»

      In your case using the serial mode, 24MHz crystal and emulating 1MHz AY the config would be as follow:
      4 bits in hex values: 0x 01 00 BF 33

  9. thanks a lot Klaud, it works perfectly according to your values!

    For 1 MHz replay like on Amstrad with a 24 MHz crystal I’ve created a file with this content:

    :050000000100BF33FF09
    :00000001FF

    For the last 2 digit I wasn’t sure what to use, but it looks like it’s some kind of checksum. It found 09 with this hex file so I’ve set it this way to avoid a checksum error!

    For the formula, the numbers are in hz and the psg_generator value is multiplicated by 16 so it will be like this:

    ay serial 24 mhz 1.00 mhz:
    (24000000×(16/2)/1000000)−1
    =191 = BF

    (found original thread on zx-pk.ru but I can’t write the full url here because of spam filter)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *