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

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

 

 

Current version 26.0

Changes: Improved noise generator (it is a mix of 24.7 and noise generator from 25.0)

AY_Emul_Version26_0 16.04.2020.

 

Previous versions

Version 25.0 (Fail version, bad performance!)

Changes: Improved noise generator and mixer

AY_Emul_Version25_0 11.09.2019.

 

Version 24.7

Changes: Improved noise generator and fixed other generators

AY_Emul_Version24_7  08.07.2017 (fixed version).

 

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

 

 

[ad name=”HTML”]

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

[ad name=”HTML”]

66 thoughts to “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)

  11. Добрый день, не могу запустить прошивку, eeprom и flash прошил, выставил на внешний кваррц, кварц стоит 27 мгц, фьюз СКОРТ включил, пробовал разные прошивки и другие контроллеры, иногда слышны шипения и разные звуки, шил через avrdude только оконное приложение не командная строка, ничего не пойму не запускается ничего. контроллер atmega8-16pu рабочий мои программы на нем работаю без проблем, помогите может есть нюанс какойто

    1. atmega8-16pu изначально подразумевает кварц 16 МГЦ, 27МГц это уже разгон контроллера, SMD версии микроконтроллера легко тянут частоту до 24 МГц, дальше идет лотерея, тянет – не тянет, видимо не повезло с конкретным экземпляром. Еще есть момент, в разных ZX клонах реализация AY сделана по-разному, в каких-то грамотно, в каких-то не очень, тогда сигналы BC1/BDIR могут приходить не очень удачно и контроллер не успевает их обрабатывать

  12. I’m sorry to say but I cant get it to work at all.
    What Xtal is needed for a mega88 for 3ch parallel? currently I’m using 27MHz.
    I get sound but it is out of tune and not really possible to recognize the song. Circuit works with an original ym2149.
    25MHz was choppy, but at least you could recognize the tune.

    ./avrdude -p m88 -c avrispmkii -U flash:w:AY_Emul_250_3ch_m88_ym.hex -U eeprom:w:../../Configs/27MHz/Conf_parallel_27MHz_2Mhz.hex -U lfuse:w:0xee:m -U hfuse:w:0xdd:m -U efuse:w:0xff:m

    Do I need a faster Xtal for parallel 3ch?

    The closest I got to get anything resembling a proper output was using an mega328p with 20MHz xtal but flashing the eeprom config to 40MHz. At least I got the tune out, even when the tuning was off. the current 27MHz version on the mega88 just sounds like random noise and square wave sounds :((

    any help welcome!

      1. nope tuning is off. the track sounds an octave oe morw too low with 40MHz xtal 🙁 but tuning in itself seems right.
        ./avrdude -p m88 -c avrispmkii -U flash:w:AY_Emul_250_3ch_m88_ym.hex -U eeprom:w:../../Configs/40MHz/Conf_parallel_40MHz_2Mhz.hex -U lfuse:w:0xee:m -U hfuse:w:0xdd:m -U efuse:w:0xff:m

        any help welcome. I’m about to give up 😉

          1. where to use the capacitor? or just change the value of the 2 load capacitors? I just read to add a resistor.
            I checked with a scope and the 40MHz xtal currently runs at 13MHz :-/
            At least I got a Pointer now.

            Whats the minimum xtal freq so 3ch parallel works? 40 is quite high!

            1. Yes, I mean oscillator load capacitors to start oscillator at appropriate harmonics.
              For parallel mode 24MHz is the lowest value. 40MHz should work well if it is true 40MHz and AVR works at this frequency, but my experience show that only 1 from 40 Atmega8 works at 40MHz, only 1 48A from 10 etc…

              1. hmm, I tried it with 27MHz before and the output was choppy/with artefacts. That’s why I tried a faster XTAL. Sounded like registers not being read fast enough. I’d be happy to go back to 27MHz or even 25MHz (that are the xtals I have)

                1. It works!
                  I tried the 27MHz version with the choppy sound in another host/driver pcb and now it works like a charm.
                  Before I used an arduino to stream .ym files via serial and all I got was choppy audio.
                  Now with a dedicated player PCB the chip suddenly works. An original YM chip worked with both driver/host solutions.

  13. Звучит супер “тепло” и по “лампово”
    На Атмеге 328p u
    И по RX //
    И по полному коннекту //
    На 25-ом кварце.
    Слушаю музон, вспоминаю прошлое ))

  14. На атмеге 328 надо по схеме два плюса и два минуса подключить. Resset (1) нога через 10 Ком на +
    Между ногами 7 и 8 полярный кондер на 22 Мкф

  15. Добрый день, я могу подключить к своему Ленинграду? Какая схема подключения подскажите пожалуйста

  16. На 25Mz работает с ком портом (через AYPlayer_v136) и параллельный режим, на 40Mz только параллельный режим. Запускал на arduino uno c 328p. Версия эмулятора 26.0.

  17. Hi again, I made this video about an issue with the 3-channel firmware: https://www.youtube.com/watch?v=r5fgRy2_kqM
    So the volume of the third channel is a lot lower, although I can’t find a cause for that in the source of the firmware.
    I’m using AVR-AY v26, set to AY levels, with 24MHz clock, and ATMega48. I disconnected the output pins from the application like ZX-AY or Harlequin 128 board, to make sure the cause is not in the analogue mixing on the board where the AVR-AY is on.
    Of course I started with testing on speakers, where I discovered the issue.
    Tried different firmwares: older versions, YM volume levels, with speaker firmware, but nothing helped.
    I’m really curious what could be causing this, could you help maybe?

Leave a Reply

Your email address will not be published.