{"id":2983,"date":"2025-01-02T20:51:11","date_gmt":"2025-01-02T20:51:11","guid":{"rendered":"https:\/\/www.robertprice.co.uk\/robblog\/?p=2983"},"modified":"2025-08-02T22:12:33","modified_gmt":"2025-08-02T21:12:33","slug":"generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014","status":"publish","type":"post","link":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/","title":{"rendered":"Generating DTMF Tones Using An AY-3-8910 On A RC2014"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">I have recently built a <a href=\"https:\/\/www.robertprice.co.uk\/robblog\/decoding-dtmf-tones-on-an-rc2014\/\">DTMF decoder module for the RC2014<\/a> computer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now I want to go the opposite way, and have my RC2014 generate DTMF tones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I own one of Ed Brindley&#8217;s excellent <a href=\"https:\/\/z80kits.com\/shop\/ym2149-sound-card\/\">YM2149 Sound Cards for the RC2014<\/a>, so I want to use this to generate the DTMF tones. Mine has Colin Piggot&#8217;s <a href=\"https:\/\/2014.samcoupe.com\/#zxtt\">Quazar ZXTT card<\/a> attached to match the clock speeds used in the ZX Spectrum. This gives a clock speed of 1.7734MHz, which will be important when generating the DTMF tones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">DTMF works by sending two tones for each key. One high frequency, one low frequency. These are mapped to the numbers 0 to 9, characters * and #, and the letters A to D.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><\/td><td><strong>1209 Hz<\/strong><\/td><td><strong>1336 Hz<\/strong><\/td><td><strong>1477 Hz<\/strong><\/td><td><strong>1633 Hz<\/strong><\/td><\/tr><tr><td><strong>697 Hz<\/strong><\/td><td>1<\/td><td>1<\/td><td>3<\/td><td>A<\/td><\/tr><tr><td><strong>770 Hz<\/strong><\/td><td>4<\/td><td>5<\/td><td>6<\/td><td>B<\/td><\/tr><tr><td><strong>852 Hz<\/strong><\/td><td>7<\/td><td>8<\/td><td>9<\/td><td>C<\/td><\/tr><tr><td><strong>941 Hz<\/strong><\/td><td>*<\/td><td>0<\/td><td>#<\/td><td>D<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The AY-3-8910 has 3 channels of sound available, so we only need two of these to generate a DTMF tone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We need to calculate a divider for the based on the clock speed for each tone. This is the clockspeed divided by (16 x the frequency).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So for a 697Hz tone being generated with a clock speed of 1.7734Mhz, the calculation would be 1.7734 \/ ( 16 * 697) = 159. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We can do the same for the other tones, which gives us the following values.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>697 Hz<\/strong><\/td><td>159<\/td><\/tr><tr><td><strong>770 Hz<\/strong><\/td><td>144<\/td><\/tr><tr><td><strong>852 Hz<\/strong><\/td><td>130<\/td><\/tr><tr><td><strong>941 Hz<\/strong><\/td><td>118<\/td><\/tr><tr><td><strong>1209 Hz<\/strong><\/td><td>92<\/td><\/tr><tr><td><strong>1336 Hz<\/strong><\/td><td>83<\/td><\/tr><tr><td><strong>1477 Hz<\/strong><\/td><td>75<\/td><\/tr><tr><td><strong>1633 Hz<\/strong><\/td><td>68<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">We are going to use channels A and B on the AY-3-8910 to generate our DTMF tone. So to play the DTMF tone for &#8220;1&#8221;, we need to play a 697 Hz tone on channel A, and a 1209H Hz tone on channel B. Looking at the table above, this means channel A needs the value 159, and channel B the value 92.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A simple Z80 assembly language program to play these tones would look something like this.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AY_REGISTER_PORT EQU 0xD8\nAY_DATA_PORT    EQU 0xD0\n\nCHANNEL_A       EQU 0x00\nCHANNEL_B       EQU 0x02\n\n\t\tld a, CHANNEL_A\n\t\tout (AY_REGISTER_PORT), a\n\t\tld a, 159\n\t\tout (AY_DATA_PORT), a\n\t\t\n\t\tld a, CHANNEL_B\n\t\tout (AY_REGISTER_PORT), a\n\t\tld a, 92\n\t\tout (AY_DATA_PORT), a<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">We can expand this and write a Z80 assembly language program to play the tones for each key once using the following code. In this example I keep the tone pairs in memory and then look up the values before playing them for a short duration then stopping the sound output before moving to the next pair.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\t\tOUTPUT DTMFAYEncoder.z80\n\t\t\n\t\tORG $9000\n\t\t\nAY_REGISTER_PORT EQU 0xD8\nAY_DATA_PORT    EQU 0xD0\n\nCHANNEL_A       EQU 0x00\nCHANNEL_B       EQU 0x02\nENABLE          EQU 0x07\nAMPLITUDE_A     EQU 0x08\nAMPLITUDE_B     EQU 0x09\n\nVOLUME          EQU 0x0F\n\n; the tones we need for the AY chip\nDIVIDER_697     EQU 159\nDIVIDER_770     EQU 144\nDIVIDER_852     EQU 130\nDIVIDER_941     EQU 118\nDIVIDER_1209    EQU 92\nDIVIDER_1336    EQU 83\nDIVIDER_1477    EQU 75\nDIVIDER_1633    EQU 68\n\t\t\ninit:\t\t\n; set volume on channel A\n\t\tld a, AMPLITUDE_A\n\t\tout (AY_REGISTER_PORT), a\n\t\tld a, VOLUME\n\t\tout (AY_DATA_PORT), a\n\t\t\n; set volume on channel B\n\t\tld a, AMPLITUDE_B\n\t\tout (AY_REGISTER_PORT), a\n\t\tld a, VOLUME\n\t\tout (AY_DATA_PORT), a\n\t\t\n\n\t\t\n; iterate over all the codes we have and play them out\n\t\tld b, tonecodelen\n\t\tld hl, tonecodes\n.loop:\n\t\tld d, (hl)\n\t\tcall playTone\n\t\tcall enableAB\n\t\tcall delay\n\t\tcall stopTone\n\t\tcall shortdelay\n\t\t\n\t\tinc hl\n\t\tdjnz .loop\n\t\t\n; stop the tones\n\t\tcall stopTone\n\t\t\n\t\tret\n\t\t\n\t\t\n\t\t\n; -----------------------------\n; SUBROUTINES\n; -----------------------------\n\t\t\n; a short delay\ndelay:\t\t\n\t\tpush bc\n\t\tld bc, $8888\n\t\tcall dodelay\n\t\tpop bc\n\t\tret\n\t\t\n; an even shorter delay\nshortdelay:\t\n\t\tpush bc\n\t\tld bc, $1500\n\t\tcall dodelay\n\t\tpop bc\n\t\tret\n\t\t\n; dodelay does the actual delaying\n; pass the delay length in BC\ndodelay:\t\n\t\tpush de\n\t\tpush af\n.loop:\t\t\n\t\tdec bc\n\t\tld a, b\n\t\tor c\n\t\tjr nz, .loop\n\t\tpop af\n\t\tpop de\n\t\tret\n\t\t\n; enable channels A and B on the AY chip\nenableAB:\t\n\t\tpush af\n\t\tld a, ENABLE\n\t\tout (AY_REGISTER_PORT), a\n\t\tld a, 0xFC\n\t\tout (AY_DATA_PORT), a\n\t\tpop af\n\t\tret\n\t\t\n; stop tones playing on the AY chip\nstopTone:\t\n\t\tpush af\n\t\tld a, ENABLE\n\t\tout (AY_REGISTER_PORT), a\n\t\tld a, 0x3F \t\t        ; disable all channels\n\t\tout (AY_DATA_PORT), a\n\t\tpop af\n\t\tret\n\t\t\n; play a tone\n; pass the ASCII character for the tone in D\nplayTone:\t\n\t\tpush af\n\t\tpush bc\n\t\tpush de\n\t\t\n\t\tcall getTone\n\t\t\n\t\tld a, CHANNEL_A\n\t\tout (AY_REGISTER_PORT), a\n\t\tld a, b\n\t\tout (AY_DATA_PORT), a\n\t\t\n\t\tld a, CHANNEL_B\n\t\tout (AY_REGISTER_PORT), a\n\t\tld a, c\n\t\tout (AY_DATA_PORT), a\n\t\t\n\t\tpop de\n\t\tpop bc\n\t\tpop af\n\t\tret\n\t\t\n; get the tones two tones for character in D\n; return the two tones in registers BC\ngetTone:\t\n\t\tpush af\n\t\tpush hl\n\t\t\n\t\tld e, 0\n\t\t\n\t\tld hl, tonecodes\n.loop:\t\t\n\t\tld a, (hl)\n\t\tcp d\n\t\tjr z, .gottone\n\t\tinc hl\n\t\tinc e\n\t\tinc e\n\t\tjr .loop\n.gottone:\t\n\t\tld a, e\n\t\tld hl, tones\n\t\t\n; we now need to add A to HL\n\t\tadd a, l\n\t\tld l, a\n\t\tadc a, h\n\t\tsub l\n\t\tld h, a\n; get the first tone in B\n\t\tld b, (hl)\n\t\tinc hl\n; get the second tone in C\n\t\tld c, (hl)\n\t\t\n\t\tpop hl\n\t\tpop af\n\t\tret\n\t\t\n; the tone codes in order. We use this to get\n; the both tone codes from tones\ntonecodes:\tdc '1234567890*#ABCD'\ntonecodelen     EQU $ - tonecodes\n\t\t\ntones:\t\t\ntone1:\t\tdc DIVIDER_697, DIVIDER_1209            ; 1\ntone2:\t\tdc DIVIDER_697, DIVIDER_1336            ; 2\ntone3:\t\tdc DIVIDER_697, DIVIDER_1477            ; 3\ntone4:\t\tdc DIVIDER_770, DIVIDER_1209            ; 4\ntone5:\t\tdc DIVIDER_770, DIVIDER_1336            ; 5\ntone6:\t\tdc DIVIDER_770, DIVIDER_1477            ; 6\ntone7:\t\tdc DIVIDER_852, DIVIDER_1209            ; 7\ntone8:\t\tdc DIVIDER_852, DIVIDER_1336            ; 8\ntone9:\t\tdc DIVIDER_852, DIVIDER_1477            ; 9\ntone0:\t\tdc DIVIDER_941, DIVIDER_1336            ; 0\ntonestar:\tdc DIVIDER_941, DIVIDER_1209            ; *\ntonehash:\tdc DIVIDER_941, DIVIDER_1477            ; #\ntoneA:\t\tdc DIVIDER_697, DIVIDER_1633            ; A\ntoneB:\t\tdc DIVIDER_770, DIVIDER_1633            ; B\ntoneC:\t\tdc DIVIDER_852, DIVIDER_1633            ; C\ntoneD:\t\tdc DIVIDER_941, DIVIDER_1633            ; D\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s easy to test our code as we build the DTMF decoder module. We can simply plug the output from the sound card into the DTMF decoder. We can see the decoded tones showing on the debugging LEDs. <\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Generating DTMF tones on an RC2014\" width=\"840\" height=\"473\" src=\"https:\/\/www.youtube.com\/embed\/ofT--ytW5Y0?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>I have recently built a DTMF decoder module for the RC2014 computer. Now I want to go the opposite way, and have my RC2014 generate DTMF tones. I own one of Ed Brindley&#8217;s excellent YM2149 Sound Cards for the RC2014, so I want to use this to generate the DTMF tones. Mine has Colin Piggot&#8217;s &hellip; <a href=\"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Generating DTMF Tones Using An AY-3-8910 On A RC2014&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":2991,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[157],"tags":[145,161,159,117,119],"class_list":["post-2983","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-rc2014","tag-assembly-language","tag-ay-3-8910","tag-dtmf","tag-rc2014","tag-z80"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Generating DTMF Tones Using An AY-3-8910 On A RC2014 - Robert Price<\/title>\n<meta name=\"description\" content=\"Using the YM2149 soundcard for the RC2014 to generate DTMF tones. I cover how to do this using the AY-3-8910 chip and Z80 assembly language.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Generating DTMF Tones Using An AY-3-8910 On A RC2014 - Robert Price\" \/>\n<meta property=\"og:description\" content=\"Using the YM2149 soundcard for the RC2014 to generate DTMF tones. I cover how to do this using the AY-3-8910 chip and Z80 assembly language.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/\" \/>\n<meta property=\"og:site_name\" content=\"Robert Price\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-02T20:51:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-02T21:12:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.robertprice.co.uk\/robblog\/assets\/RC20140-with-DTMF-decoder-module.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"rob\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"rob\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\\\/\"},\"author\":{\"name\":\"rob\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#\\\/schema\\\/person\\\/fac6d5b076e0e14e1fb13e15b542a6c5\"},\"headline\":\"Generating DTMF Tones Using An AY-3-8910 On A RC2014\",\"datePublished\":\"2025-01-02T20:51:11+00:00\",\"dateModified\":\"2025-08-02T21:12:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\\\/\"},\"wordCount\":400,\"image\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/assets\\\/RC20140-with-DTMF-decoder-module.jpg\",\"keywords\":[\"Assembly Language\",\"AY-3-8910\",\"DTMF\",\"RC2014\",\"Z80\"],\"articleSection\":[\"RC2014\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\\\/\",\"url\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\\\/\",\"name\":\"Generating DTMF Tones Using An AY-3-8910 On A RC2014 - Robert Price\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/assets\\\/RC20140-with-DTMF-decoder-module.jpg\",\"datePublished\":\"2025-01-02T20:51:11+00:00\",\"dateModified\":\"2025-08-02T21:12:33+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#\\\/schema\\\/person\\\/fac6d5b076e0e14e1fb13e15b542a6c5\"},\"description\":\"Using the YM2149 soundcard for the RC2014 to generate DTMF tones. I cover how to do this using the AY-3-8910 chip and Z80 assembly language.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/assets\\\/RC20140-with-DTMF-decoder-module.jpg\",\"contentUrl\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/assets\\\/RC20140-with-DTMF-decoder-module.jpg\",\"width\":800,\"height\":600,\"caption\":\"RC2014 with DTMF Decoder module\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Generating DTMF Tones Using An AY-3-8910 On A RC2014\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#website\",\"url\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/\",\"name\":\"Robert Price\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#\\\/schema\\\/person\\\/fac6d5b076e0e14e1fb13e15b542a6c5\",\"name\":\"rob\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g\",\"caption\":\"rob\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Generating DTMF Tones Using An AY-3-8910 On A RC2014 - Robert Price","description":"Using the YM2149 soundcard for the RC2014 to generate DTMF tones. I cover how to do this using the AY-3-8910 chip and Z80 assembly language.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/","og_locale":"en_GB","og_type":"article","og_title":"Generating DTMF Tones Using An AY-3-8910 On A RC2014 - Robert Price","og_description":"Using the YM2149 soundcard for the RC2014 to generate DTMF tones. I cover how to do this using the AY-3-8910 chip and Z80 assembly language.","og_url":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/","og_site_name":"Robert Price","article_published_time":"2025-01-02T20:51:11+00:00","article_modified_time":"2025-08-02T21:12:33+00:00","og_image":[{"width":800,"height":600,"url":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/RC20140-with-DTMF-decoder-module.jpg","type":"image\/jpeg"}],"author":"rob","twitter_card":"summary_large_image","twitter_misc":{"Written by":"rob","Estimated reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/#article","isPartOf":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/"},"author":{"name":"rob","@id":"https:\/\/www.robertprice.co.uk\/robblog\/#\/schema\/person\/fac6d5b076e0e14e1fb13e15b542a6c5"},"headline":"Generating DTMF Tones Using An AY-3-8910 On A RC2014","datePublished":"2025-01-02T20:51:11+00:00","dateModified":"2025-08-02T21:12:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/"},"wordCount":400,"image":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/#primaryimage"},"thumbnailUrl":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/RC20140-with-DTMF-decoder-module.jpg","keywords":["Assembly Language","AY-3-8910","DTMF","RC2014","Z80"],"articleSection":["RC2014"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/","url":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/","name":"Generating DTMF Tones Using An AY-3-8910 On A RC2014 - Robert Price","isPartOf":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/#primaryimage"},"image":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/#primaryimage"},"thumbnailUrl":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/RC20140-with-DTMF-decoder-module.jpg","datePublished":"2025-01-02T20:51:11+00:00","dateModified":"2025-08-02T21:12:33+00:00","author":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/#\/schema\/person\/fac6d5b076e0e14e1fb13e15b542a6c5"},"description":"Using the YM2149 soundcard for the RC2014 to generate DTMF tones. I cover how to do this using the AY-3-8910 chip and Z80 assembly language.","breadcrumb":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/#primaryimage","url":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/RC20140-with-DTMF-decoder-module.jpg","contentUrl":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/RC20140-with-DTMF-decoder-module.jpg","width":800,"height":600,"caption":"RC2014 with DTMF Decoder module"},{"@type":"BreadcrumbList","@id":"https:\/\/www.robertprice.co.uk\/robblog\/generating-dtmf-tones-using-an-ay-3-8910-on-a-rc2014\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.robertprice.co.uk\/robblog\/"},{"@type":"ListItem","position":2,"name":"Generating DTMF Tones Using An AY-3-8910 On A RC2014"}]},{"@type":"WebSite","@id":"https:\/\/www.robertprice.co.uk\/robblog\/#website","url":"https:\/\/www.robertprice.co.uk\/robblog\/","name":"Robert Price","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.robertprice.co.uk\/robblog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/www.robertprice.co.uk\/robblog\/#\/schema\/person\/fac6d5b076e0e14e1fb13e15b542a6c5","name":"rob","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g","caption":"rob"}}]}},"_links":{"self":[{"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/posts\/2983","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/comments?post=2983"}],"version-history":[{"count":6,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/posts\/2983\/revisions"}],"predecessor-version":[{"id":3057,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/posts\/2983\/revisions\/3057"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/media\/2991"}],"wp:attachment":[{"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/media?parent=2983"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/categories?post=2983"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/tags?post=2983"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}