In dit artikel legt Dr. Scott M. Baker uit hoe hij een pixel-perfecte HDMI-adapter heeft ontwikkeld voor de TRS-80 Color Computer 2 (CoCo 2). Vanwege de beperkte beschikbaarheid van commerciële oplossingen, koos hij voor een open-source ontwerp dat toegankelijk is voor hobbyisten met basiskennis van solderen.
Technische details:
- Hardware: De oplossing maakt gebruik van een interposer-PCB die tussen het moederbord en de MC6847-videochip wordt geplaatst. Hierdoor blijft de originele RF-uitgang functioneren terwijl de nieuwe adapter gelijktijdig een HDMI-signaal genereert.
- Componenten: Er wordt gebruikgemaakt van een Tang Nano FPGA, level-converters (voor de overstap van 5V naar 3,3V) en een MCP3201 ADC voor de digitale audio-overdracht.
- Software/FPGA: In plaats van een volledige emulatie van de 6847-chip, gebruikt de FPGA een VHDL-core (AtomGodilVideo) als rendering-engine die de datastroom van de echte chip in real-time 'replayt'.
- Uitvoer: Het systeem produceert een stabiel 720×480p HDMI-signaal zonder framebuffer, waarbij een kleine buffer van vier lijnen wordt gebruikt om synchronisatieverschillen op te vangen.
Het project is compatibel met de CoCo 2 (inclusief voorlopige ondersteuning voor de T1-chip), maar werkt niet met de CoCo 3.
HDMI voor de TRS-80 Color Computer 2
Achtergrond
Ongeveer vijf jaar geleden kocht ik via eBay een nieuwe, in de doos zittende CoCo 2 en voerde ik enkele verbeteringen door. Een van de verbeteringen die ik wilde toevoegen was een CoCoVGA, maar deze was uitverkocht. Hoewel ik op de wachtlijst werd geplaatst, kwam mijn naam nooit aan bod. Er waren andere producten, zoals de CocoDV, maar ook die waren uitverkocht toen ik er een wilde kopen.
Zowel de CocoDV als de CocoVGA zijn correcte digitale oplossingen die direct aansluiten op de 6847-chip, in plaats van analoge converters te gebruiken. Mijn probleem was de beschikbaarheid, niet de aanpak. De CoCoVGA geeft VGA-uitvoer en de CocoDV is HDMI, maar ik kon er geen bemachtigen.
Wat ik wilde was een echte, pixel-perfecte HDMI-oplossing op basis van een open-source ontwerp dat iedereen kan bouwen, met gangbare onderdelen die iemand met basiskennis van through-hole solderen kan installeren. De geschatte kosten voor de materialen liggen tussen de $30 en $50: ongeveer $15–$30 voor de Tang Nano, $5 voor de PCB en $10 voor de level shifters, ADC, sockets en passieve componenten. Daarom heb ik mijn eigen adapter gemaakt.
Het project — inclusief Gerbers, broncode, schema's en firmware — is te vinden in de GitHub-repository: https://github.com/sbelectronics/coco-hdmi.
Compatibiliteit
Ik bezit slechts één CoCo, een Koreaanse versie met de horizontale RF-modulator en de non-T1 6847. Omdat ik maar één machine heb, kan ik niet met zekerheid zeggen of dit project op elke machine zal werken. In ieder geval kunnen alternatieve versies van de interposer nodig zijn om verschillende moederbord-lay-outs te ondersteunen.
Sommige machines — met name de Koreaanse "CoCo 2B"-units — werden geleverd met de MC6847T1, die echte kleine letters (lowercase) ondersteunt. De T1 is een wezenlijk andere chip: de pinnen DD0–DD5 zitten in een omgekeerde volgorde in de socket, en hij heeft geen A/S- of INV-pinnen omdat deze functies zijn verplaatst naar de databyte. Er is een jumper op de printplaat om de T1-tekenset te selecteren en het datapad werkt in simulaties, maar ik heb geen T1-machine om dit op te testen. Daarom beschouw ik de T1-ondersteuning als niet-geverifieerd. Houd er rekening mee dat tekens die in inverse video zouden moeten verschijnen, mogelijk als kleine letters worden weergegeven, aangezien de character ROM van de T1 dat databit gebruikt voor de selectie van het lettertype in plaats van voor inversie.
Let op: dit project werkt absoluut niet met een CoCo 3, aangezien deze een andere videochip gebruikt.
De interposer
De TRS-80 Color Computer (versie 1 en 2) gebruikt een MC6847-IC om video te genereren. De 6847 scant het displaygeheugen en stuurt een videosignaal naar een RF-modulator, die het beeld op een tv-kanaal plaatst (bestemd voor televisies uit de jaren '80). Omdat we tegenwoordig nauwelijks nog CRT-monitoren gebruiken en moderne LCD-schermen vaak geen RF of zelfs geen composiet ondersteunen, voegen we een interposer-PCB toe die tussen het moederbord van de CoCo en de 6847 wordt geplaatst. De interposer voedt een Tang Nano, die een FPGA en een HDMI-connector bevat.
Belangrijk is dat het originele videopad blijft functioneren. De echte 6847 wordt niet verwijderd of vervangen; deze wordt opnieuw geplaatst in een socket bovenop de interposer en blijft volledig in het circuit. De chip blijft de RF-modulator aansturen en de HS- en FS-timing genereren waar de rest van de machine afhankelijk van is. De FPGA luistert enkel mee. Er verandert niets aan het gedrag van het moederbord, waardoor je de CRT en de HDMI-monitor gelijktijdig kunt gebruiken om ze te vergelijken.
Ontwerp
Het ontwerp van de interposer was rechttoe rightaan. De CoCo gebruikt 5V-logica en de Tang Nano gebruikt 3,3V, waardoor level-conversie noodzakelijk is. Om geluid via HDMI te versturen, is een ADC nodig om het analoge geluid om te zetten naar digitaal.
Zoals te zien is in het schema, worden er drie 74LVC245 level-converters gebruikt. Hoewel deze bidirectioneel zijn, zijn ze permanent ingesteld als unidirectioneel: de zijde die naar de CoCo is gericht, kan nooit signalen aansturen. We nemen de acht datalijnen (DD0–DD7) van de 6847-socket van de CoCo, evenals CLK, HS, FS en DA0. Daarnaast nemen we verschillende mode-bits: A/G, GM0–GM2 en CSS. Dit zijn in totaal zeventien signalen. Hiermee kunnen we de werkingsmodus van de 6847 bepalen en de timing volgen terwijl de chip uit het geheugen leest. Het audiocircuit maakt gebruik van een MCP3201.
FPGA-software
De voor de hand liggende aanpak — het volledig implementeren van de 6847 in de FPGA — is de moeilijkste weg. Het lastige deel van een 6847 zijn niet de pixels, maar de mode-decodering: vier alphanumeric-modi, twee semigraphics-modi met bit-shuffling per rij, acht graphics-modi met drie verschillende shift-cadansen, en de SG8/SG12/SG24 pseudo-modi die alleen bestaan omdat de SAM en de VDG verschillende instructies over hetzelfde scherm kunnen krijgen.
Daarom heb ik de chip niet volledig gereïmplementeerd. In plaats daarvan draait de FPGA een tweede 6847 — een open-source VHDL-core van https://github.com/hoglet67/AtomGodilVideo — als rendering-engine. Deze wordt gevoed met exact dezelfde bytestroom die de echte chip consumeert. Bytes worden geregistreerd op basis van de ophaalvolgorde (fetch order), geïndexeerd per (lijn, cel), en in diezelfde volgorde teruggegeven. Omdat de replay-core dezelfde logica hanteert als de echte chip, worden er per lijn evenveel fetches in dezelfde volgorde gedaan. Hierdoor is de replay exact, ongeacht welke adressen de SAM daadwerkelijk aanstuurde of welke trucs de software uithaalde. De SAM wordt volledig overgeslagen in dit model.
Het vinden van de fetches is het interessante deel. In plaats van de klokken vanaf de horizontale sync te tellen — wat een kalibratieconstante vereist en faalt wanneer de SAM de videoklok stilzet — gebruikt de capture de DA0 (de LSB van het adres van de VDG) als fetch-strobe. Deze schakelt één keer per fetch en blijft statisch buiten het actieve weergavegebied. Door de flanken hiervan te tellen, wordt de capture automatisch beperkt tot exact het zichtbare beeld, zonder dat er tuning-constantes nodig zijn voor de bovenrand of het begin van de lijn.
De weergavezijde draait op een exact bit-getrouwe 27,000 MHz, direct vanaf het kristal van de Tang Nano. Dit is precies de pixelklok voor 720×480p59.94, een verplicht HDMI-formaat dat door elke monitor wordt geaccepteerd. De replay-core is gekoppeld aan dit raster in plaats van genlocked aan de CoCo. Dit betekent dat er geen PLL nodig is om een 40 jaar oude klok te volgen en er geen framebuffer is; een buffer van vier lijnen vervangt dit volledig. Het kleine verschil in snelheid tussen de 59,92 Hz van de CoCo en de 59,94 Hz van HDMI wordt opgevangen door te roteren tussen vier vastgelegde field-buffers. Hierdoor wordt ongeveer één keer per minuut een field herhaald of overgeslagen, waardoor er nooit screen tearing optreedt.
Het laatste deel van het werk was het meest uitdagend. Een 40 jaar oude NMOS-bus gezien via een interposer is problematisch: de adreslijnen fluctueren legaal gedurende honderden nanoseconden rond elke fetch, de databyte overleeft slechts tientallen nanoseconden na de klokflank (in plaats van de 140 nanoseconden uit het datasheet), en het grootste schakelmoment van de chip koppelt storingen op de kloklijn zelf. Bijna elk filter en elke integrator in de capture-engine is toegevoegd vanwege een specifiek artefact dat ik op het scherm zag en vervolgens in simulaties reproduceerde.
Claude Code heeft geassisteerd bij de implementatie van de FPGA.
Bronnen
De volgende bronnen kunnen nuttig zijn:
HDMI voor de TRS-80 Color Computer 2
Achtergrond
Ongeveer vijf jaar geleden kocht ik via eBay een nieuwe, in de doos zittende CoCo 2 en voerde ik enkele verbeteringen door. Een van de verbeteringen die ik wilde toevoegen was een CoCoVGA, maar deze was uitverkocht. Hoewel ik op de wachtlijst werd geplaatst, kwam mijn naam nooit aan bod. Er waren andere producten, zoals de CocoDV, maar ook die waren uitverkocht toen ik er een wilde kopen.
Zowel de CocoDV als de CocoVGA zijn correcte digitale oplossingen die direct aansluiten op de 6847-chip, in plaats van analoge converters te gebruiken. Mijn probleem was de beschikbaarheid, niet de aanpak. De CoCoVGA geeft VGA-uitvoer en de CocoDV is HDMI, maar ik kon er geen bemachtigen.
Wat ik wilde was een echte, pixel-perfecte HDMI-oplossing op basis van een open-source ontwerp dat iedereen kan bouwen, met gangbare onderdelen die iemand met basiskennis van through-hole solderen kan installeren. De geschatte kosten voor de materialen liggen tussen de $30 en $50: ongeveer $15–$30 voor de Tang Nano, $5 voor de PCB en $10 voor de level shifters, ADC, sockets en passieve componenten. Daarom heb ik mijn eigen adapter gemaakt.
Het project — inclusief Gerbers, broncode, schema's en firmware — is te vinden in de GitHub-repository: https://github.com/sbelectronics/coco-hdmi.
Compatibiliteit
Ik bezit slechts één CoCo, een Koreaanse versie met de horizontale RF-modulator en de non-T1 6847. Omdat ik maar één machine heb, kan ik niet met zekerheid zeggen of dit project op elke machine zal werken. In ieder geval kunnen alternatieve versies van de interposer nodig zijn om verschillende moederbord-lay-outs te ondersteunen.
Sommige machines — met name de Koreaanse "CoCo 2B"-units — werden geleverd met de MC6847T1, die echte kleine letters (lowercase) ondersteunt. De T1 is een wezenlijk andere chip: de pinnen DD0–DD5 zitten in een omgekeerde volgorde in de socket, en hij heeft geen A/S- of INV-pinnen omdat deze functies zijn verplaatst naar de databyte. Er is een jumper op de printplaat om de T1-tekenset te selecteren en het datapad werkt in simulaties, maar ik heb geen T1-machine om dit op te testen. Daarom beschouw ik de T1-ondersteuning als niet-geverifieerd. Houd er rekening mee dat tekens die in inverse video zouden moeten verschijnen, mogelijk als kleine letters worden weergegeven, aangezien de character ROM van de T1 dat databit gebruikt voor de selectie van het lettertype in plaats van voor inversie.
Let op: dit project werkt absoluut niet met een CoCo 3, aangezien deze een andere videochip gebruikt.
De interposer
De TRS-80 Color Computer (versie 1 en 2) gebruikt een MC6847-IC om video te genereren. De 6847 scant het displaygeheugen en stuurt een videosignaal naar een RF-modulator, die het beeld op een tv-kanaal plaatst (bestemd voor televisies uit de jaren '80). Omdat we tegenwoordig nauwelijks nog CRT-monitoren gebruiken en moderne LCD-schermen vaak geen RF of zelfs geen composiet ondersteunen, voegen we een interposer-PCB toe die tussen het moederbord van de CoCo en de 6847 wordt geplaatst. De interposer voedt een Tang Nano, die een FPGA en een HDMI-connector bevat.
Belangrijk is dat het originele videopad blijft functioneren. De echte 6847 wordt niet verwijderd of vervangen; deze wordt opnieuw geplaatst in een socket bovenop de interposer en blijft volledig in het circuit. De chip blijft de RF-modulator aansturen en de HS- en FS-timing genereren waar de rest van de machine afhankelijk van is. De FPGA luistert enkel mee. Er verandert niets aan het gedrag van het moederbord, waardoor je de CRT en de HDMI-monitor gelijktijdig kunt gebruiken om ze te vergelijken.
Ontwerp
Het ontwerp van de interposer was rechttoe rightaan. De CoCo gebruikt 5V-logica en de Tang Nano gebruikt 3,3V, waardoor level-conversie noodzakelijk is. Om geluid via HDMI te versturen, is een ADC nodig om het analoge geluid om te zetten naar digitaal.
Zoals te zien is in het schema, worden er drie 74LVC245 level-converters gebruikt. Hoewel deze bidirectioneel zijn, zijn ze permanent ingesteld als unidirectioneel: de zijde die naar de CoCo is gericht, kan nooit signalen aansturen. We nemen de acht datalijnen (DD0–DD7) van de 6847-socket van de CoCo, evenals CLK, HS, FS en DA0. Daarnaast nemen we verschillende mode-bits: A/G, GM0–GM2 en CSS. Dit zijn in totaal zeventien signalen. Hiermee kunnen we de werkingsmodus van de 6847 bepalen en de timing volgen terwijl de chip uit het geheugen leest. Het audiocircuit maakt gebruik van een MCP3201.
FPGA-software
De voor de hand liggende aanpak — het volledig implementeren van de 6847 in de FPGA — is de moeilijkste weg. Het lastige deel van een 6847 zijn niet de pixels, maar de mode-decodering: vier alphanumeric-modi, twee semigraphics-modi met bit-shuffling per rij, acht graphics-modi met drie verschillende shift-cadansen, en de SG8/SG12/SG24 pseudo-modi die alleen bestaan omdat de SAM en de VDG verschillende instructies over hetzelfde scherm kunnen krijgen.
Daarom heb ik de chip niet volledig gereïmplementeerd. In plaats daarvan draait de FPGA een tweede 6847 — een open-source VHDL-core van https://github.com/hoglet67/AtomGodilVideo — als rendering-engine. Deze wordt gevoed met exact dezelfde bytestroom die de echte chip consumeert. Bytes worden geregistreerd op basis van de ophaalvolgorde (fetch order), geïndexeerd per (lijn, cel), en in diezelfde volgorde teruggegeven. Omdat de replay-core dezelfde logica hanteert als de echte chip, worden er per lijn evenveel fetches in dezelfde volgorde gedaan. Hierdoor is de replay exact, ongeacht welke adressen de SAM daadwerkelijk aanstuurde of welke trucs de software uithaalde. De SAM wordt volledig overgeslagen in dit model.
Het vinden van de fetches is het interessante deel. In plaats van de klokken vanaf de horizontale sync te tellen — wat een kalibratieconstante vereist en faalt wanneer de SAM de videoklok stilzet — gebruikt de capture de DA0 (de LSB van het adres van de VDG) als fetch-strobe. Deze schakelt één keer per fetch en blijft statisch buiten het actieve weergavegebied. Door de flanken hiervan te tellen, wordt de capture automatisch beperkt tot exact het zichtbare beeld, zonder dat er tuning-constantes nodig zijn voor de bovenrand of het begin van de lijn.
De weergavezijde draait op een exact bit-getrouwe 27,000 MHz, direct vanaf het kristal van de Tang Nano. Dit is precies de pixelklok voor 720×480p59.94, een verplicht HDMI-formaat dat door elke monitor wordt geaccepteerd. De replay-core is gekoppeld aan dit raster in plaats van genlocked aan de CoCo. Dit betekent dat er geen PLL nodig is om een 40 jaar oude klok te volgen en er geen framebuffer is; een buffer van vier lijnen vervangt dit volledig. Het kleine verschil in snelheid tussen de 59,92 Hz van de CoCo en de 59,94 Hz van HDMI wordt opgevangen door te roteren tussen vier vastgelegde field-buffers. Hierdoor wordt ongeveer één keer per minuut een field herhaald of overgeslagen, waardoor er nooit screen tearing optreedt.
Het laatste deel van het werk was het meest uitdagend. Een 40 jaar oude NMOS-bus gezien via een interposer is problematisch: de adreslijnen fluctueren legaal gedurende honderden nanoseconden rond elke fetch, de databyte overleeft slechts tientallen nanoseconden na de klokflank (in plaats van de 140 nanoseconden uit het datasheet), en het grootste schakelmoment van de chip koppelt storingen op de kloklijn zelf. Bijna elk filter en elke integrator in de capture-engine is toegevoegd vanwege een specifiek artefact dat ik op het scherm zag en vervolgens in simulaties reproduceerde.
Claude Code heeft geassisteerd bij de implementatie van de FPGA.
Bronnen
De volgende bronnen kunnen nuttig zijn: