Decode UHF TV ZX81 signal with SDR
Decode UHF TV ZX81 signal with SDR
Recently I've been experimenting with decoding the UHF TV signal from a ZX81 using a Software Defined Radio (SDR). This gives a way to display the original ZX81 output without the need for either a composite mod, or an older TV.
I'm at the proof of concept stage, but have been able to get a decent image from ZX81s with both ULAs that generate a back porch, and those that do not.
The radio I used was a HackRF One, available for about £69, including P&P and VAT from AliExpress. This is an Open source design, so clones from China are allowed. It took 8 days from ordering to arrive in the UK. I used this model as it can capture the entire UHF channel width. Less expensive SDR radios cannot manage that, and so give a very blurred display.
The (open source) software I used was SDRAngel (https://www.sdrangel.org/). I had to modify and recompile the Analog TV decoder plugin, due to the "non-standard" ZX81 signal.
Some screen shots
The decoded screen from a ZX81 with a ULA not generating a back porch A scope image, showing a signal from a ZX81 with a ULA not generating a back porch A scope image, showing a signal from a ZX81 with a ULA generating a back porch Hopefully this is useful for people that do not want to open up their ZX81, such as discussed in this threadhttps://www.sinclairzxworld.com/viewtop ... f=7&t=5619
If anyone is interested I can provide more details.
I'm at the proof of concept stage, but have been able to get a decent image from ZX81s with both ULAs that generate a back porch, and those that do not.
The radio I used was a HackRF One, available for about £69, including P&P and VAT from AliExpress. This is an Open source design, so clones from China are allowed. It took 8 days from ordering to arrive in the UK. I used this model as it can capture the entire UHF channel width. Less expensive SDR radios cannot manage that, and so give a very blurred display.
The (open source) software I used was SDRAngel (https://www.sdrangel.org/). I had to modify and recompile the Analog TV decoder plugin, due to the "non-standard" ZX81 signal.
Some screen shots
The decoded screen from a ZX81 with a ULA not generating a back porch A scope image, showing a signal from a ZX81 with a ULA not generating a back porch A scope image, showing a signal from a ZX81 with a ULA generating a back porch Hopefully this is useful for people that do not want to open up their ZX81, such as discussed in this threadhttps://www.sinclairzxworld.com/viewtop ... f=7&t=5619
If anyone is interested I can provide more details.
Re: Decode UHF TV ZX81 signal with SDR
I wonder if this would work with RTL-SDR v3?
The frequency range is a lot less than HackRF One, but it's a capable device and it can do the UHF frequency range.
The frequency range is a lot less than HackRF One, but it's a capable device and it can do the UHF frequency range.
Re: Decode UHF TV ZX81 signal with SDR
I started my experiments with a RTL-SDR v3. The bandwidth of the RTL-SDR v3 (up to 2.4MHz) gives about 128 pixels horizontally, including the hsync etc. That is enough to see that a K prompt exists, but not enough to resolve an on screen listing.I wonder if this would work with RTL-SDR v3?
Since my initial post I've moved on to configure the HackRF One to use a bandwidth of 16 MHz, which does give a very clear image.
Re: Decode UHF TV ZX81 signal with SDR
Thanks for the info.
No way of avoiding shelling out for a HackRF One, then.
I presume 240 x 192 is the screen size.
No way of avoiding shelling out for a HackRF One, then.
I presume 240 x 192 is the screen size.
Re: Decode UHF TV ZX81 signal with SDR
256x192
In theory, there is no difference between theory and practice. But, in practice, there is.
Re: Decode UHF TV ZX81 signal with SDR
With the HackRF One I now use one vertical pixel per field line, so at 16MHz the resolution is approx 768 by 576.
I am able to fully resolve and display maxtxt and maxdemo (https://bodo4all.fortunecity.ws/zx/maxdemo.html) (i.e. 320 by 240). I can also view the 384 rows in https://www.sinclairzxworld.com/viewtop ... 3&start=20
Currently I'm exploring emulation of a CRT (as apposed to a more modern LCD). It appears that modern LCD typically determine that vsync ends when a sync pulse longer than hsync is detected. CRTs hold the beam at the top of the display until the vsync signal ends. This results is different behaviour for QS Defenda. QS Defenda generates a signal that looks like a very long vsync pulse. When I run it on my composite converted ZX81 connected to my LCD TV, this results in a black bar at the top of the screen. Of course, there is no black bar at the top when running QS Defenda on an original ZX81 with a CRT.
The other thing I am working on is correctly detecting the interlaced fields for ilena and the final part of rezurrection.
I'm away from my PC at the moment, but will post pictures and code when I am back.
I am able to fully resolve and display maxtxt and maxdemo (https://bodo4all.fortunecity.ws/zx/maxdemo.html) (i.e. 320 by 240). I can also view the 384 rows in https://www.sinclairzxworld.com/viewtop ... 3&start=20
Currently I'm exploring emulation of a CRT (as apposed to a more modern LCD). It appears that modern LCD typically determine that vsync ends when a sync pulse longer than hsync is detected. CRTs hold the beam at the top of the display until the vsync signal ends. This results is different behaviour for QS Defenda. QS Defenda generates a signal that looks like a very long vsync pulse. When I run it on my composite converted ZX81 connected to my LCD TV, this results in a black bar at the top of the screen. Of course, there is no black bar at the top when running QS Defenda on an original ZX81 with a CRT.
The other thing I am working on is correctly detecting the interlaced fields for ilena and the final part of rezurrection.
I'm away from my PC at the moment, but will post pictures and code when I am back.
Re: Decode UHF TV ZX81 signal with SDR
Sorry, I confused 320 x 240 with 256 x 192.
I get strange displays on cheap chinese monitors with ZX composite mods, the display seems normal for listing or running a program but when running a game the display isn't centred on the screen, the sort of thing you wouldn't get with CRT.Exile wrote: ↑Tue Oct 08, 2024 12:07 pm Currently I'm exploring emulation of a CRT (as apposed to a more modern LCD). It appears that modern LCD typically determine that vsync ends when a sync pulse longer than hsync is detected. CRTs hold the beam at the top of the display until the vsync signal ends. This results is different behaviour for QS Defenda. QS Defenda generates a signal that looks like a very long vsync pulse. When I run it on my composite converted ZX81 connected to my LCD TV, this results in a black bar at the top of the screen. Of course, there is no black bar at the top when running QS Defenda on an original ZX81 with a CRT.
The theory of this project is interesting, I wonder if the display output from the SDR prog could be ported to an Arduino compatible LCD screen, like this one:
Re: Decode UHF TV ZX81 signal with SDR
Here are some screenshots from the latest version. All are images are created from UHF data captured from the ZX81 RF connector, which has been rendered in real time on a Windows PC. The Windows snipping tool was used to capture the images
320x240 display interlacing through offset vsync Iinterlacing without offset vsync Handling the long vsync of QS Defenda As discussed in recent threads, it appears that only ilena.p generates a TV standard interlaced image by generating different vsyncs to identify the odd and even fields. However, other programs that generate an interlaced image without modifying vsync now also display well.
320x240 display interlacing through offset vsync Iinterlacing without offset vsync Handling the long vsync of QS Defenda As discussed in recent threads, it appears that only ilena.p generates a TV standard interlaced image by generating different vsyncs to identify the odd and even fields. However, other programs that generate an interlaced image without modifying vsync now also display well.
The processing required by the SD Radio is far too great to run on an Arduino. In addition OpenGL shaders running on the PC GPU are post-processing each frame. In theory a ST7789 could be driven via a Pi Pico that is attached to either a PC or a Pi5. The data rate to drive 320x240 at 50 Hz is quite high for I2C, I needed custom drivers on picozx81 to achieve this. This is not something I will personally do, I wanted to use my large PC display, and to be able to capture screenshots using PC tools.
Last edited by Exile on Sun Oct 20, 2024 10:52 am, edited 1 time in total.
Re: Decode UHF TV ZX81 signal with SDR
If anyone has a Windows PC and a HackRF One radio and would like to try this, here are some installation instructions:
1) Plug in the HackRF One and install the drivers as described on the HackRF One website (or alternatively at https://recolog.blogspot.com/2018/02/in ... r-and.html
2) Connect the ANT socket to the the UHF cable plugged into the ZX81
3) On a Windows PC Install SDRAngel version 7.22.0 from https://github.com/f4exb/sdrangel/relea ... -win64.exe. The version is important, don't take the latest, as it currently does not work with the HackRF One
4) Unzip demodatv.dll from the attached zip file and copy over the installed version (typically at C:\Program Files\SDRangel\plugins\demodatv.dll)
5) Start SDRAngel, select the HackRF One as the sampling device, add the ATVDemodulator as a channel. You should a windows layout similar to this:
6) Configure the frequency, BBF etc for the sampling device, similar to as shown in the picture above
7) Configure the TV decoder. RF and Video settings should match that in the picture
8) Start the sampler - A TV picture should appear, adjust the frequency as needed
Two display modes have been created for the ZX81. For general use select AllEvenI. This ignores the field information in the vsync signal and displays at 50Hz. For experimenting with interlace effects select GuideI. This combines two interlaces fields to make a full image. This displays at 25Hz.
Some programs (e.g. Rezzurection, QSDefenda, Nova2005) use unusual TV timings. To obtain lock, experiment with adjusting the Min and Max sliders. These effectively change the allowed number of lines in one TV image. They also impact how quickly lock is recovered in FAST mode.
This set-up can also be used to decode signals from other retro computers, however currently it is black and white only.
1) Plug in the HackRF One and install the drivers as described on the HackRF One website (or alternatively at https://recolog.blogspot.com/2018/02/in ... r-and.html
2) Connect the ANT socket to the the UHF cable plugged into the ZX81
3) On a Windows PC Install SDRAngel version 7.22.0 from https://github.com/f4exb/sdrangel/relea ... -win64.exe. The version is important, don't take the latest, as it currently does not work with the HackRF One
4) Unzip demodatv.dll from the attached zip file and copy over the installed version (typically at C:\Program Files\SDRangel\plugins\demodatv.dll)
5) Start SDRAngel, select the HackRF One as the sampling device, add the ATVDemodulator as a channel. You should a windows layout similar to this:
6) Configure the frequency, BBF etc for the sampling device, similar to as shown in the picture above
7) Configure the TV decoder. RF and Video settings should match that in the picture
8) Start the sampler - A TV picture should appear, adjust the frequency as needed
Two display modes have been created for the ZX81. For general use select AllEvenI. This ignores the field information in the vsync signal and displays at 50Hz. For experimenting with interlace effects select GuideI. This combines two interlaces fields to make a full image. This displays at 25Hz.
Some programs (e.g. Rezzurection, QSDefenda, Nova2005) use unusual TV timings. To obtain lock, experiment with adjusting the Min and Max sliders. These effectively change the allowed number of lines in one TV image. They also impact how quickly lock is recovered in FAST mode.
This set-up can also be used to decode signals from other retro computers, however currently it is black and white only.
- Attachments
-
- demodatv.zip
- (61.62 KiB) Downloaded 56 times
Re: Decode UHF TV ZX81 signal with SDR
Hello again Exile
Thanks for your response.
Just a thought, I've got many important priorities currently and I just loved the idea of modulator output to an LCD from a ZX81!
Thanks for your response.
Although the ST7789 is Arduino compatible, I wasn't implying that an Arduino could handle processing display data from a HackRF One, rather that the Arduino compatible screen could be driven from a Linux SBC with more capability than a Pi Pico, e.g. one with over 2GB ram as an SDR application of any capability needs this at least.Exile wrote: ↑Thu Oct 17, 2024 4:51 pm
The processing required by the SD Radio is far too great to run on an Arduino. In addition OpenGL shaders running on the PC GPU are post-processing each frame. In theory a ST7789 could be driven via a Pi Pico that is attached to either a PC or a Pi5. The data rate to drive 320x240 at 50 Hz is quite high for I2C, I needed custom drivers on zxpico to achieve this. This is not something I will personally do, I wanted to use my large PC display, and to be able to capture screenshots using PC tools.
Just a thought, I've got many important priorities currently and I just loved the idea of modulator output to an LCD from a ZX81!