{"id":3163,"date":"2025-10-17T15:11:24","date_gmt":"2025-10-17T14:11:24","guid":{"rendered":"https:\/\/www.robertprice.co.uk\/robblog\/?p=3163"},"modified":"2025-10-17T17:29:52","modified_gmt":"2025-10-17T16:29:52","slug":"rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language","status":"publish","type":"post","link":"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/","title":{"rendered":"RC2025 &#8211; Part 4 &#8211; Bit-banging a NES controller using Z80 assembly language"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In my last post, I wrote about using MS-Basic on my RC2014 to bit-bang an NES controller. In this post, I want to use Z80 assembly language to do the same. I want to be able to press a button on the controller and have its name printed on the serial terminal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The first thing we need to do is set up a few things. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The code will need to run at 0x9000, so an ORG statement will tell the assembler to build the code to run from there. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        ORG $9000<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The NES controller module will be located at the Z80 IO port 1. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PORT    EQU $01<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"> The Clock bit is 1, the Latch bit is 2, and the Data bit is 1.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CLOCK   EQU $01\nLATCH   EQU $02\nDATA    EQU $01<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;ll be using <a href=\"https:\/\/smallcomputercentral.com\/small-computer-monitor\/small-computer-monitor-v1-0\/\">Stephen Cousins&#8217; SCM<\/a> on the RC2014. The SCM API provides a routine to print a string, so I&#8217;ll be using that later on. This is API call 0x06.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OUTPUT_LINE EQU $06<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The first thing the code will need to do is to pulse the Latch line low, high, low. This will capture the current state of the buttons being pressed on the NES controller.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>start:\n        ld a, 0\n        out (PORT), a\n        ld a, LATCH\n        out (PORT), a\n        ld a, 0\n        out (PORT), a<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now we need to loop 8 times to capture each of the 8 bits the NES controller is going to be sending us.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        ld b, 8 \nloop:\n        djnz loop<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Inside the loop, we first need to read the Data line to get the current bit. We mask out all but the Data bit and then see if it is 0 or not. If it&#8217;s not zero, skip the next block of code.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        in a, (PORT)\n\n        and DATA\n        jr nz, .skip<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If a button is being pressed, we need to look up the name of the button in a lookup table and print it out using the SCM API. To do this, we get the current iteration minus 1 and store it in the HL register. As this is a 16 bit register, we need to set the L register to the iteration value, and H to 0. We add this value to the address of the lookup table to get the address of the string to print. We then pass this to the SCM API.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        ld de, lookuptable  ; point to the lookup table\n        ld a, b             ; put the current iteration from b into a\n        dec a               ; delete 1 to make it zero based\n        ld l, a             ; place the interation in l\n        ld h, 0             ; zero h, hl should now be value of the iteration\n        add hl, hl          ; multiply by 2 (size of address)\n        add hl, de          ; add to base address of table\n        ld e, (hl)          ; get low byte of string address to use\n        inc hl              ; point to high byte\n        ld d, (hl)          ; get high byte of string address\n        ld c, OUTPUT_LINE   ; SCM output line\n        push bc             ; save the bc registers to the stack\n        rst $30             ; Call SCM API\n        pop bc              ; restore the bc registers from the stack<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>lookuptable:\n        dw right_txt\n        dw left_txt\n        dw down_txt\n        dw up_txt\n        dw start_txt\n        dw select_txt\n        dw b_txt\n        dw a_txt\n\na_txt:      db \"A\",5,0\nb_txt:      db \"B\",5,0\nselect_txt: db \"Select\",5,0\nstart_txt:  db \"Start\",5,0\nup_txt:     db \"Up\",5,0\ndown_txt:   db \"Down\",5,0\nleft_txt:   db \"Left\",5,0\nright_txt:  db \"Right\",5,0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Next, we pulse the CLOCK line high to low before we end the loop.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.skip:\n        ld a, CLOCK\n        out (PORT), a\n        ld a, 0\n        out (PORT), a<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, we loop back to the very start of the program.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        jr start<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">The complete Z80 assembly language program<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s the code as a single program that can be assembled using the sjasmplus assembler.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> ; A simple button reading program for the RC2014 Z80 computer running SCM\n ; Robert Price - 15th October 2025\n\n        ORG $9000\n\n; The Z80 port address to use for the controller interface.\nPORT    EQU $01\n\n; The bit masks for the controller interface lines.\nCLOCK   EQU $01\nLATCH   EQU $02\nDATA    EQU $01\n\n; The SCM API value to output a line.\nOUTPUT_LINE EQU $06\n\nstart:\n; pulse the LATCH line low to high and back to low again.\n        ld a, 0\n        out (PORT), a\n        ld a, LATCH\n        out (PORT), a\n        ld a, 0\n        out (PORT), a\n\n; setup the loop counter to read 8 buttons.\n        ld b, 8             ; 8 buttons to read. This will be decremented to 0.\nloop:\n; read the controller button states\n        in a, (PORT)        ; read the DATA line\n\n        and DATA            ; mask out all but DATA bit\n        jr nz, .skip        ; skip if a button was not pressed\n\n; print out the button pressed using a lookup table.\n        ld de, lookuptable  ; point to the lookup table\n        ld a, b             ; put the current iteration from b into a\n        dec a               ; delete 1 to make it zero based\n        ld l, a             ; place the interation in l\n        ld h, 0             ; zero h, hl should now be value of the iteration\n        add hl, hl          ; multiply by 2 (size of address)\n        add hl, de          ; add to base address of table\n        ld e, (hl)          ; get low byte of string address to use\n        inc hl              ; point to high byte\n        ld d, (hl)          ; get high byte of string address\n        ld c, OUTPUT_LINE   ; SCM output line\n        push bc             ; save the bc registers to the stack\n        rst $30             ; Call SCM API\n        pop bc              ; restore the bc registers from the stack\n\n.skip:\n; pulse the CLOCK line to read the next button.\n        ld a, CLOCK\n        out (PORT), a\n        ld a, 0\n        out (PORT), a\n\n; loop 8 times to read all buttons.\n        djnz loop\n\n; forever loop to read buttons again.\n        jr start\n\n\n\n; the lookup table stores the addresses of the text strings for each button.\nlookuptable:\n        dw right_txt\n        dw left_txt\n        dw down_txt\n        dw up_txt\n        dw start_txt\n        dw select_txt\n        dw b_txt\n        dw a_txt\n\n; The text strings to print for each button.\n; each string is terminated with a CR (5) and a null (0).\na_txt:      db \"A\",5,0\nb_txt:      db \"B\",5,0\nselect_txt: db \"Select\",5,0\nstart_txt:  db \"Start\",5,0\nup_txt:     db \"Up\",5,0\ndown_txt:   db \"Down\",5,0\nleft_txt:   db \"Left\",5,0\nright_txt:  db \"Right\",5,0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once assembled, I convert it to Intel Hex using z88dk-appmake and send it to my RC2014 running SCM. It is then executed using g 9000 .<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is very fast code, so even the slightest tap of a button will register multiple times.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my last post, I wrote about using MS-Basic on my RC2014 to bit-bang an NES controller. In this post, I want to use Z80 assembly language to do the same. I want to be able to press a button on the controller and have its name printed on the serial terminal. The first thing &hellip; <a href=\"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;RC2025 &#8211; Part 4 &#8211; Bit-banging a NES controller using Z80 assembly language&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":3157,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[181,187],"tags":[183,117,185,119],"class_list":["post-3163","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-rc2025","category-retrochallenge","tag-nes-joypad","tag-rc2014","tag-rc2025","tag-z80"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>RC2025 - Part 4 - Bit-banging a NES controller using Z80 assembly language - Robert Price<\/title>\n<meta name=\"description\" content=\"In this article I bit-bang an NES controller from my RC2014 using Z80 assembly language. The results are then sent to the serial terminal.\" \/>\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\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"RC2025 - Part 4 - Bit-banging a NES controller using Z80 assembly language - Robert Price\" \/>\n<meta property=\"og:description\" content=\"In this article I bit-bang an NES controller from my RC2014 using Z80 assembly language. The results are then sent to the serial terminal.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/\" \/>\n<meta property=\"og:site_name\" content=\"Robert Price\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-17T14:11:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-17T16:29:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.robertprice.co.uk\/robblog\/assets\/RC2014-BitBangNes-Working.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\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\\\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\\\/\"},\"author\":{\"name\":\"rob\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#\\\/schema\\\/person\\\/fac6d5b076e0e14e1fb13e15b542a6c5\"},\"headline\":\"RC2025 &#8211; Part 4 &#8211; Bit-banging a NES controller using Z80 assembly language\",\"datePublished\":\"2025-10-17T14:11:24+00:00\",\"dateModified\":\"2025-10-17T16:29:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\\\/\"},\"wordCount\":437,\"image\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/assets\\\/RC2014-BitBangNes-Working.jpg\",\"keywords\":[\"NES Joypad\",\"RC2014\",\"RC2025\",\"Z80\"],\"articleSection\":[\"RC2025\",\"RetroChallenge\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\\\/\",\"url\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\\\/\",\"name\":\"RC2025 - Part 4 - Bit-banging a NES controller using Z80 assembly language - Robert Price\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/assets\\\/RC2014-BitBangNes-Working.jpg\",\"datePublished\":\"2025-10-17T14:11:24+00:00\",\"dateModified\":\"2025-10-17T16:29:52+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#\\\/schema\\\/person\\\/fac6d5b076e0e14e1fb13e15b542a6c5\"},\"description\":\"In this article I bit-bang an NES controller from my RC2014 using Z80 assembly language. The results are then sent to the serial terminal.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/assets\\\/RC2014-BitBangNes-Working.jpg\",\"contentUrl\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/assets\\\/RC2014-BitBangNes-Working.jpg\",\"width\":1024,\"height\":768},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"RC2025 &#8211; Part 4 &#8211; Bit-banging a NES controller using Z80 assembly language\"}]},{\"@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":"RC2025 - Part 4 - Bit-banging a NES controller using Z80 assembly language - Robert Price","description":"In this article I bit-bang an NES controller from my RC2014 using Z80 assembly language. The results are then sent to the serial terminal.","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\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/","og_locale":"en_GB","og_type":"article","og_title":"RC2025 - Part 4 - Bit-banging a NES controller using Z80 assembly language - Robert Price","og_description":"In this article I bit-bang an NES controller from my RC2014 using Z80 assembly language. The results are then sent to the serial terminal.","og_url":"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/","og_site_name":"Robert Price","article_published_time":"2025-10-17T14:11:24+00:00","article_modified_time":"2025-10-17T16:29:52+00:00","og_image":[{"width":1024,"height":768,"url":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/RC2014-BitBangNes-Working.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\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/#article","isPartOf":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/"},"author":{"name":"rob","@id":"https:\/\/www.robertprice.co.uk\/robblog\/#\/schema\/person\/fac6d5b076e0e14e1fb13e15b542a6c5"},"headline":"RC2025 &#8211; Part 4 &#8211; Bit-banging a NES controller using Z80 assembly language","datePublished":"2025-10-17T14:11:24+00:00","dateModified":"2025-10-17T16:29:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/"},"wordCount":437,"image":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/#primaryimage"},"thumbnailUrl":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/RC2014-BitBangNes-Working.jpg","keywords":["NES Joypad","RC2014","RC2025","Z80"],"articleSection":["RC2025","RetroChallenge"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/","url":"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/","name":"RC2025 - Part 4 - Bit-banging a NES controller using Z80 assembly language - Robert Price","isPartOf":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/#primaryimage"},"image":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/#primaryimage"},"thumbnailUrl":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/RC2014-BitBangNes-Working.jpg","datePublished":"2025-10-17T14:11:24+00:00","dateModified":"2025-10-17T16:29:52+00:00","author":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/#\/schema\/person\/fac6d5b076e0e14e1fb13e15b542a6c5"},"description":"In this article I bit-bang an NES controller from my RC2014 using Z80 assembly language. The results are then sent to the serial terminal.","breadcrumb":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/#primaryimage","url":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/RC2014-BitBangNes-Working.jpg","contentUrl":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/RC2014-BitBangNes-Working.jpg","width":1024,"height":768},{"@type":"BreadcrumbList","@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2025-part-4-bit-banging-a-nes-controller-using-z80-assembly-language\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.robertprice.co.uk\/robblog\/"},{"@type":"ListItem","position":2,"name":"RC2025 &#8211; Part 4 &#8211; Bit-banging a NES controller using Z80 assembly language"}]},{"@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\/3163","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=3163"}],"version-history":[{"count":4,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/posts\/3163\/revisions"}],"predecessor-version":[{"id":3173,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/posts\/3163\/revisions\/3173"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/media\/3157"}],"wp:attachment":[{"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/media?parent=3163"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/categories?post=3163"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/tags?post=3163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}