ZX-VGA-JOY is ZX Spectrum interface for connecting any kind of VGA monitors, Kempston joystick and computer reset. It supports 7 screen modes: 640×480 @ 50Hz,  640×480 @ 60Hz, 640×480 @ 75Hz, 640×480 @ 85Hz and 800×600 @ 60Hz with 3 different zooms (paper/border sizes).
This interface is not signal converter, it works in parallel with internal graphics IC(ULA) taking video data directly from CPU and provides crystal clear picture on VGA monitors.
Also, the picture on VGA monitor is precisely synchronized with PAL signal generated from ULA, so games that are relying on ULA timing looks as they should.
ZX-VGA-JOY is compatible with all Sinclair and Amstrad ZX Spectrum models and probably with a number of clones. It is not necessary to do any modification on the original computer as long as the expansion port is functional on pins used by ZX-VGA-JOY.


  • CRT and LCD VGA monitors
  • 7 screen modes :
    640×480 @ 50Hz, 640×480 @ 60Hz, 640×480 @ 75Hz, 640×480 @ 85Hz and 800×600 @ 60Hz with 3 different zooms
  • Synchronized with ULA
  • Kempston Joystick interface (can be disabled/enabled)
  • Computer Reset button
  • Compatibile with all Sinclair and Amstrad models
  • Settings adjusment with icon menu
  • micro USB connector (under top cover) for firmware update
  • Low power consumption

Image Gallery

ZX-VGA-JOY in action
ZX-VGA-JOY: production process

55 thoughts on “Description”

  1. Hello mr. Goran,

    What an incredible add-on for the spectrum!
    I am very interested and will probably buy one of these but I have two questions about it:

    – Is it compatible with NTSC machines (NTSC ULA spectrum or Timex 2048/2068 set to 60Hz)?

    – Can it work with the ‘Scanline Generator SLG3000 v2’ sold at Arcadeforge? I like the idea of adding scanlines but I am unsure the two devices can work safely together?

    Best Regards

    1. Hi João,
      I didn’t check the pinout of the Timex expansion port. If it is the same as Sinclair and Amstrad computers then it will work but not completely right. To make it work completely right I should make some changes in the firmware. Although ZX-VGA-JOY measure frame freq. lines arrangement is different. Also, Timex has some extra graphics modes. It can be done, it is not a big problem, but I don’t have any Timex machine, and it is really hard to be sure that it will work if I can’t try it.
      About Scanline Generator SLG3000 v2, ZX-VGA-JOY has standard VGA output so according to SLG3000 v2 spec. they should work together.
      Best regards Goran

      1. Ok, so I bought one.
        I did some testing and it does not work correctly with true NTSC spectrum, but then again I suppose that was kind of expected.

        However, it seems to work just fine with TC2048@60Hz!!
        Of course I kept VGA video mode 640×480@60Hz and not 50Hz.
        I wasn’t expecting but it is a great “bonus”!!

  2. Hi Goran

    Thanks so much for developing this product, it sounds perfect. And I’m really glad you’ve got distribution in the UK now. Can’t wait to receive mine.

    Is it possible to do something similar with the ZX81? The Chroma seems to be SCART which just means a further adaptor.

    – Shiela

    1. Hi Shiela,
      I shortly looked at the ZX81 schematics and it seems it is possible to support ZX81. I should make a connector adapter and of course make firmware addition to detecting computer type.

  3. On the joystick port, with so many devices including Kempston ports, would it be possible to add an option to make it do something else? I don’t mean Sinclair, as a +2 machine already has Sinclair ports. I mean support the old Fuller standard, or simply change the IN port from IN-31 to IN-55 (see game ‘Bomb Munchies’, the first game to support four simultaneous players on joysticks).

    1. Hi,
      Unfortunately, Kempston joystick port is a separate circuit based on the original schematic, the only connection to the microcontroller is enabling/disabling function.

  4. Does this work by monitoring memory writes on the data bus, and managining it’s own copy of the screen RAM? If so, can I make a suggestion? Have a switch, either menu-controlled or OUT controlled, that lets it display the OPPOSITE video RAM on a 128K machine. That way, a Spectrum can drive two screens at once! (The SPECTRA device can already do this).

    I would like to see it able to support ULA+ colours. But most interesting to me would be to support 8×1 multicolour, with attributes 8K higher in RAM than the pixels, just like a TIMEX machine.

    1. Hi Jason,
      Yes, it is working exactly as you describe. It is a good suggestion to include the option for two screens. This option, multicolor 8×1, gigascreen, … will be included in future firmware. But, next version v1.03 is already concluded, it is in the test phase.
      Best regards Goran

      1. Or, if connected to a 48K machine but the ZX-VGA-JOY is in 128K mode, can the 48K machine send OUT 0x7ffd instructions to manipulate the ZX-VGA-JOY paging so it thinks Bank 7 is paged in at the top of memory, and it should display the screen from Bank 7?

        1. If you force 48k mode on 128k computer, you will not be able to use the second display buffer. Also if you force 128k mode on 48k computer, you will be able to use the second display.
          But in the next version, I will add an option in ZX-VGA-JOY menu, where you can choose which screen will be shown on a VGA monitor.
          So you will be able to show two screens on two VGA monitors with two devices, or one on RGB/comp. and the other on a VGA monitor with one device.

    2. Does an OUT to port 0x7ffd with Bit 5 set disable all future memory page changes on this device (until it is reset), as it does on a real Spectrum 128K?
      If it DOESN’T disable paging on the ZX-VGA-JOY then maybe it is ALREADY possible to make the Spectrum show one screen and the ZX-VGA-JOY show the other..?

      1. Yes, it disables future writes to 7ffd. If not some games do not work properly on 128k.

  5. Hi, very interesting device!
    One specific question: is it compatible with Opus Discovery peripheral thorough connector (no NMI line)? I would know if the device has been really TESTED on that connector (= it’s ok for dimensions & functions) and not only if it is theoretically compatible.

    1. Hi Carlo,
      Thank You for Your comment!
      NMI line is not required for ZX-VGA-JOY but I didn’t really test it on that connector.
      As I see in pictures, there should not be a mechanical problem.
      If there are full address and data bus, WR, IORW, MEMREQ, RESET, INT and (M1, RD only for joystick port) lines, it should work.
      Joystick port can be disabled on ZX-VGA-JOY.

      Best regards Goran

  6. what is joystick connector pinout ? Contain +5V and GND ? Only one fire button support ? All data lines are used during reading joystick port 31 ?

    Best idea is:
    – addressing of port 31 (A7-A0) : 000xxxxx (X = unused). A7-A5=0 is often used on all modern kempston joystick based interfaces. If is decoded only A5=0 then is impossible connect Kempston mouse (K-MOUSE) interface. Best is use full 8bit address decoding 00011111.
    – ideal and often used data layout: D0-D3 = directions, D4=fire1, D5=fire2, D6=fire3 or 0, D7=0
    – if you use +5V on pin 7 and GND on pin 8, fire 1 on pin 6, fire 2 on pin 9,fire 3 on pin 5 and this input pins will contain pull-up resistor 4k7 to +5V then will possible connect real Amiga Mouse for controll games with mouse support. And may work all new chinesse clones of Sega genesis controllers as joystick with 2x fire. If you change pull-up resistor on pin 5 to 200-300 Ohm then may work also original Sega controllers.

    1. Hi,
      Joystick port is embedded in hardware and besides on/off control from the microcontroller is a completely separate circuit.
      Decoder is A7=0, A6=0, A5=0, A4…A0=X, RD=0, IORQ=0, M1=1. Pin arrangement is like you wrote except there is no fire2 and fire 3.
      D6=0,D7=0 when you read port 31. On each pin there is pull-up of 10k and +5V is on pin7 over est. 200mA PTC fuse.
      BTW, I visited your web pages. You have a lot of nice things there! 🙂 Very interesting!

      Thank you for info, it is really helpful!

      Best regards Goran

  7. ZX-VGA is compatible with all ZX 128kB models then must autodetect also paging port 32765. What address decoding is used and is same for all ZX128 models ? IORQ=0, WR=0, A15=0, A14=1, A1=0 ?

    1. Hi,

      ZX-VGA-JOY can listen to all ports (0-FFFF), because address decoding is done by software, not embedded in hardware.
      The same thing is for memory access.
      I decide to use full decode of paging port 32765 (A15=0, A14…A2=1, A1=0, A0=1, IORQ=0, WR=0).
      I think there is no reason to use any other address then 32765.
      But if there is software that for some reason uses a different address to access paging register, I can add an option for different decode scheme.

      Best regards Goran

      1. Yes. Exist some software using LD A,value : OUT 253,A. Value contain D7=0 and D6=1 for use on all 128models. Then is better use this decoding: A15=0, A14=1, A13…A2=ignored, A1=0, A0=ignored, IORQ=0, WR=0 for best compatibility with demos and games. Some demos also write to 128 paging port with A0=0 for change border color in same time.

        1. Hi,

          Thank you for your suggestion!
          I will do something about this in the next firmware since there are games/demos that are taking advantage of partial decoding.

          Best regards Goran

    1. Hi Jonathan
      It is really hard to say right now.
      There is no dedicated hardware for generating VGA signals on ZX-VGA-JOY (it is done by microcontroller’s peripherals and DMA), and this hardware is not so flexible when we are talking about many colors.
      But I had in mind to do some other stuff like sprites, scrolling, colors for each line(8×1), Tiles, …
      I am aware that game developers will probably avoid this due to it is only for ZX-VGA-JOY users, but it is fun to play with those things 🙂
      Best regards Goran

  8. Looks great, Goran 🙂

    I think it’s very nice to have an alternative add-on like this.
    I’d like to ask if it follows the ZXI standard. And how compatible is it with other popular add-ons people already might have such as DivMMC devices and others?


    1. Hi Mike,


      ZX-VGA-JOY is a listener on ZXI with very high impedance on each pin so it can not disturb other interfaces, also other interfaces can not disturb ZX-VGA-JOY if the computer is running correctly.

      An exception is Kempston joystick port, it is not a listener, but it uses the same decode scheme as the original interface.

      In addition, this port can be disabled from the icon menu of ZX-VGA-JOY. So if there is Kempston port present on other interface connected to spectrum user should switch it off on ZX-VGA-JOY.

      Best regards Goran

  9. Hi Goran,

    awesome project !
    Can you please elaborate what does it mean when you say “the picture on VGA monitor is precisely synchronized with PAL signal generated from ULA,” ? How do you translate 50hz video to higher frequency of vga ?

    All the best!

    1. Hi Vladimir,
      Thank You and good question!
      When program or game write in something to video memory of Spectrum, it will appear on the screen at a certain point of time when ULA read it and it will stay on screen until the same time in next frame.
      Changes between that are not visible on the screen. That means ZX-VGA-JOY should create a frame for showing on VGA in a way to get data from video memory at the exact same time as ULA.
      When we have the right frame(the frame that user see on TV) it can be pass to “frame FIFO” which is filled in every 20ms(50Hz). On the other end, VGA gets frames from “frame FIFO” every 16.6ms(60Hz).
      If FIFO is empty it uses last read frame. This will happen because VGA has higher refreshing rate then PAL.
      Hope this is useful.
      Best regards Goran

      1. So…basically you’ll have a lot of judder. Probably the best mode is the one at 75hz, but even with that judder will be noticeable.

        1. Hi Daniel
          Motion picture looks very smoothly on all screen modes, no judder at all, at least I can not see it.
          Each frame from ZX Spectrum is shown on the VGA monitor.
          Best regards Goran

        1. Hopefully this week I will put links to shops where it can be found.
          Best regards, Goran

  10. Hi! Compliments on this great piece of hardware! I’m interested in getting one. Please, let me know when it’s available and tell me how much will it cost. Thank you!

    1. Thank You Javier,
      Hopefully next week I will put links to shops where it can be found.
      Best regards, Goran

  11. Hi Goran
    This looks cool and I think I will buy one, because I have ZX-HD but this changes the colors in nearly all AGD games because of ULAplus support, and this can not be switched off.
    A couple of questions:
    – Can the device run Wolfenstein from 2004 in full color or will it be in b/w ??
    – As there is no through-connector will it then work placed last as interface no. 4-5 ?? Because I have a lot of other interfaces connected.

    1. Thank You Søren!
      ULAplus is currently not supported in this firmware, and AGD games should appear in the normal color arrangement.
      I will test Wolfenstein 2004 and let you know, I haven’t tested that game.
      As long as all connections are pass-through it should work as the last interface even on a 4-5th place.
      Best regards, Goran

      1. Hi Goran
        I’m looking forward to hear about Wolfenstein, because it runs in multicolor with an old TV while it is in b/w with ZX-HD. If you don’t have beta disk it can also run from a devise that uses esxdos.

        1. Hi Søren,
          I tested game Wolfenstein 2004.
          I had trouble to loading it but I found the way, I purchased DivMMC Pro one (nice product).
          I don’t know if there any other version of the game, but this one has no
          the multicolor effect in the gameplay at all.
          It is black and white on TV and on ZX-VGA-JOY.
          On TV look like there are some colors but actually that is an only TV signal
          I attached a picture from TV (left) and ZX-VGA-JOY(right)

          When TV has to show two black vertical lines on white background
          distant only 2 or 3 pixels, some unwanted colors can appear.
          I wrote a small Basic program to show you:

          You can see when two vertical lines are close to each other, blue and yellow colors appear.
          I think you have mistaken this side effects with multicolor.
          Also, I attached some intro multicolor picture from the game, It looks nice on ZX-VGA-JOY and more stable than on TV, but I had to enable interlaced mode.

          In current firmware interlaced mode is disabled permanently. I did that
          because the motion picture on many games looks better if it is disabled.
          But for this and similar interlaced multicolor effect, in next firmware, I
          will put it as an option on the icon menu.

          Best regards Goran

          1. Hi Søren,

            Yes, on this video, the game is running on an emulator with TV signal emulation video filters turned on.
            I take two screenshots on Spectaculator 8.0 emulator with that ability with and without video filters:

            So the game itself does not send any color information in the 3d environment it just uses clever pattern shapes which on TV produces artifact shown as colors.
            There is an article on wiki about that:

            ZX-VGA-JOY cannot run that kind of video filters like some PC emulator, video filters need a lot of math on each pixel.
            This color effect should not be visible on the ZX Spectrum RGB output.

            Best regards Goran

          2. May be interlace setup as: OFF, ON, AUTOMATIC ? I plan add some interlaced effects to ZX games, but on some TV’s is interlace detection different.
            About autodetection – if each zx screen(tv frame) contain different data(during 20 tv frames is detected 20x different screen), then active automatic interlace. As very good feature may be possibility change number of different tv frames before automatic interlace.
            Next feature idea – gigascreen support = mixing colors from both videorams as alternative for interlace.
            Interlaced graphic for ZX Spectrum is on my FB pages or visible on Youtube:
            All pictures and games are free for download.

          3. Hi,
            Sorry for the late reply, These days I do not have time for Spectrum, a lot of obligation at work.
            Interesting ideas about auto interlaced. I should try it.
            About gigascreen, it is not a problem, but it will work only on ZX-VGA-JOY. So rare will be used for new games.
            Nice work on interlaced graphics!
            Hope I will soon have time for firmware updates of ZX-VGA-JOY.

            Best regards Goran

    2. Hi, Søren.
      I’m sorry to hear you are experiencing problems with AGD games.
      I’m one of the admins of the official ULAplus facebook group and I talked with one of the AGD developers.
      It seems that the original developer thought it would be a good idea to give AGD games a palette with non-standard spectrum colours so people could use its effect without doing anything. But (of course) not everyone like that 😉

      So I’m going to figure out how we can create a patcher that will give AGD games the default Spectrum palette.

      I’d like to invite you to the ULAplus facebook group, where I’ll announce more when I have news.

      Or you can contact me directly on facebook @

      1. Hi Mike
        Thanks for your mail! I really find it a bit awkward having to patch every AGD game (there are MANY), and since I have cracked beta disk versions with trainer of most of the games those patches will probably not work on my versions anyway. If the extra ULA colors can not be disabled in the software or the hardware for the ZX-HD I think this is not the right device for me. There is also color problems with the games from Death Squad. It is really a shame there is no on/off switch for the extra ULA colors.

        1. Hi Søren,

          I’m writing an article explaining exactly why people are having this issue, but in short: the AGD development environment sets a non-standard Spectrum ULAplus colour palette by default. And because ULAplus colours are only displayed when there’s actually a ULAplus available (like AY music), and most developers create games in an environment (either real hardware or an emu with ULAplus switched on) that doesn’t have one, they are not seeing that colours will actually be different for ULAplus.

          So developers basically have been creating “trouble” without realizing it. You can compare it to 48k and 128k spectrum models and a development environment that when creating music on a 48k, automatically creates AY music, but in different octaves. Which will sound “strange” when played on a 128k.

          We’re in dialogue with the developers that create the different AGD versions how to fix this and creating awareness among AGD games developers and gamers.

          For games already out there, I developed an app on which you can drop your original game-file, and it creates a copy with the fixed colours next to it. It’s now in beta-test.
          It already supported .tap and .tzx, but after getting feedback from Ben Versteeg about you using .trd files, I looked into it and am also making it compatible with that format.

          I don’t know if you’re in the regular Spectrum groups on Facebook like ‘Spectrum for Everyone’, ‘Spectrum Forever’, or our official ULAplus group ‘ULAplus – Sinclair ZX Spectrum enhanced ULA’ in which further information and the app will be shared, but else Ben will send it to you.

        2. As this page is dedicated to the ZX-VGA-JOY, I think that any further exchange about the subject is best to be continued elsewhere; either through Ben or the channels I wrote earlier.

          Thank you, Goran, for “lending” us your webpage for this exchange until now 😉

Comments are closed.