Emulator AY-3-8910/AY-3-8912/YM2149F

The Emulator is firmware for AVR microcontroller Atmega8/48/88/168/328.

 

 

Current version 24.7

Changes: Improved noise generator and fixed other generators

This version is incompatible with AYPlayer below version 6.0!!!

AY_Emul_Version24_7  08.07.2017 (fixed version).

 

Previous versions

Version 24.6

Changes: fixed HUGE problem in parallel mode (versions 24.3-24.5)

Supported: Atmega8/48/88/168/328

This version is incompatible with AYPlayer below version 6.0!!!

AY_Emul_Version24_6  08.05.2017 (fixed version).

 

Version 24.5

Changes: added 2 volume tables for AY and YM, added versions for Atmega48/88/168/328

This version is incompatible with AYPlayer below version 6.0!!!

AY_Emul_Version24_5  15.02.2017 (fixed version).

 

Version 24.4

Changes: even more optimization! + read mode optimization

This version is incompatible with AYPlayer below version 6.0!!!

AY_Emul_Version24_4  25.09.2016.

AY_Emul_244_m48  13.02.2017 (for Atmega48)

Version 24.3

Changes: super optimization!

This version is incompatible with AYPlayer below version 6.0!!!

AY_Emul_Version24_3  20.09.2016.

Version 24.2

Changes: improved noise generator, better channels mixing, new volume table.

This version is incompatible with AYPlayer below version 6.0!!!

AY_Emul_Version24_2  25.08.2016.

 

TWO CHANNEL VERSIONS ARCHIVE

 

THREE CHANNEL VERSIONS ARCHIVE

 

 

How to upload firmware

Use avrdude & USBAsp

For all oscillators except internal

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

For oscillators with frequency <=16MHz (power save)

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

For internal oscillator 8MHZ

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

 

You can download AVRDUDE here avrdude or from developer site

Output circuit for 2 channel version

outputcircuit2ch

These RC-Filters cuts frequencies below 20 Hz and above 48 kHz, so you can simply connect it to your sound card or amplifier. This circuit generates about 50mV output.

EMULATOR PIN MAPPING TO AY-3-8910

pinmap2ch

44 thoughts on “Emulator 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 да и ресет придется реализовывать через питание.

  5. Прошил 12.5 – в Lyra II во второй части (с индикаторами) индикаторы стали неправильно работать – только изредка дергаются. Отктился обратно на 12.41

    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. На эту же плату с помощью МГТФ и DIP40 панельки был подключен реальный YM, там же был сделан генератор на 3,5 Мгц. Звук нормальный.

                1. А не пробовали ставить кварц с частотой поменьше на эмулятор? может ваша атмега не тянет просто такую частоту, например, 20 МГц

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

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

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

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

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

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

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

    1. Как раз таки он вам и нужен, он нужен именно для работы в спектруме, чтобы работали индикаторы в проигрывателях и демках.

  9. 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

  10. 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)

Leave a Reply

Your email address will not be published. Required fields are marked *