MCU-loze teletype-terminal met Alphacom-printer

Projectbeschrijving

De RC2014 is een modulaire kitcomputer in de geest van de vroege thuiscomputers. In zijn eenvoudigste vorm beschikt hij over een Z80 CPU, RAM, ROM, een klok en seriële I/O. Een van de makkelijkste manieren om ermee te communiceren is via een terminalemulator op een moderne computer, maar er zijn veel opties om de machine meer standalone te maken met video-output en soms toetsenbordinput.

Veel van deze opties maken gebruik van moderne technologie, zoals microcontrollers. Hoewel ik niets heb tegen een strakke video-output, het gemak van HDMI en USB-toetsenbordinput (ik maak en verkoop zelfs zo'n module), stoort het me een beetje dat de microcontrollers die hiervoor worden gebruikt waarschijnlijk in staat zijn om de Z80, het RAM, de ROM en andere randapparatuur volledig te emuleren. Voor het plezier zou het leuk zijn om terug te keren naar de basis.

Technische details

Technologie uit de juiste periode zou waarschijnlijk een VDU-terminal zijn, of de voorganger daarvan: een teletype-terminal. Dit is in feite een elektrische typemachine die seriële output van het toetsenbord verzendt en seriële input op papier print.

Hier komt de Alphacom-printer in beeld. Deze was compatibel met en tijdgenoot van de ZX81 en was op veel vlakken een betere optie dan de ZX Printer van Sinclair (de ZX-computers hadden ingebouwde line-printer functionaliteiten). Belangrijk is dat er vandaag de dag nog voldoende werkende Alphacoms beschikbaar zijn.

Bij het uitwerken van dit idee zijn enkele bronnen van belang geweest:

  • Dave Curran schreef recentelijk over het testen van een ZX-printer op een ZX81-achtige machine.
  • Dave verwijst naar het project van Rob Price over het gebruik van een ZX-printer op een RC2014.

Ik heb een tijd geleden een van deze printers gekocht (eigenlijk kocht ik een Spectrum Plus om de bijbehorende printer te bemachtigen). Ik heb geverifieerd dat hij werkt. (Of de Alphacom een microcontroller bevat, weet ik niet; mocht dat zo zijn, dan is het technologie uit 1981 en aangezien ik specifiek deze printer wil gebruiken, maak ik mij daar geen zorgen over).

Een andere invloed op dit project is het werk van Roy Templeman (loudscotsbloke) aan turn-based games voor terminal-computers. Roy heeft een turn-based Tetris en een Robots-game gemaakt die beide werken op een RC2014 met seriële terminal-output.

Ik ben bijzonder fond van schaakcomputers en gebruik Sargon II op mijn RC2014. Dit zou perfect werken met een teletype-terminal; de CP/M-versie die ik gebruik heeft de optie om het bord na elke beurt te printen. Dit biedt voordelen, zoals een fysiek record van het spel; eerdere zetten gaan niet verloren wanneer ze van het videoscherm scrollen.

Daarnaast denk ik dat games die ik naar de RC2014 heb geport, zoals 3D Monster Maze en Mazogs, ook leuk zouden zijn als turn-based games. Dit zou enige conversie vereisen en de terminal moet mogelijk het Sinclair-tekenset bevatten.

Wat betreft het toetsenbord wil ik een kwalitatief goed exemplaar gebruiken. Een modern USB-toetsenbord bevat waarschijnlijk een microcontroller en vereist een interface om dit om te zetten naar serieel voor de RC2014. De juiste technologie is hier een matrix-toetsenbord. Mijn plan is om een MSX-toetsenbord te gebruiken. Ik heb een MSX-compatibel toetsenbord gebouwd (via het Omega MSX-project) en beschik over reserveborden voor de RC2014 interface-module van mijn MSX2014-project. De RC2014 kan eenvoudig een matrix-toetsenbord scannen, mits de scanroutine is ingebouwd in het systeem of de software.

Specificaties van het project

Een zelfstandige terminal met de Alphacom-printer die direct communiceert met elke RC2014 via de standaard FTDI-header, of elk ander apparaat dat hetzelfde seriële protocol spreekt. De terminal verzendt seriële data via een eigen MSX-compatibel mechanisch toetsenbord.

Uitdagingen: De printer moet worden aangestuurd en het toetsenbord moet worden gescand. Beiden moeten worden gekoppeld aan de seriële header. Een MCU is uitgesloten en ik ben niet van plan dit met enkel logica op te lossen.

Oplossing: Mijn plan is om een Z80 + ROM/RAM te gebruiken en de drivers in de ROM te schrijven. Een handige manier om dit te doen is door een RC2014-micro te gebruiken (een Z80 met ondersteunende chips in een RC2014-module). Een korte backplane verbindt dit met een interfacebord voor de Alphacom en de MSX-toetsenbordmodule. In feite wordt het een minimale RC2014 die uitsluitend is toegewijd aan het aansturen van de printer en het toetsenbord.

Stretch goals:

  • Implementatie van optionele tekensets, zoals die van Sinclair.
  • De mogelijkheid om grafische data te verzenden.
  • Het geheel stevig bevestigen op een basisplaat.

---

Projectverslagen (Logs)

Log 1: Proof of concept: printer aansturen en toetsenbord scannen

De eerste stap was het controleren van de Alphacom-printer. De printer vereist een 24V AC voeding; ik gebruik hiervoor een adapter voor een Acorn Electron-voeding (19V AC), wat voldoende blijkt te zijn.

De tweede test was het implementeren van de code van Rob Price om het RC2014-logo te printen. Dankzij Rob's Alphacom/RC2014-interface kon ik een specifieke poort kiezen. Hoewel de output er wat rommelig uitzag, was het functioneel.

Vervolgens heb ik getest of ik het MSX-toetsenbord kon uitlezen. Ik heb een eigen MSX PPI-module (Programmable Peripheral Interface) gebouwd. Er was een conflict tussen de poortnummers van de RC2014 seriële module ($80 en $81) en de PPI-module ($A8, A9, AA, AB). Door de poortdecodering van de seriële module aan te scherpen (specifiek door A5 mee te nemen), werd dit conflict opgelost. Nu kan ik toetsaanslagen detecteren en outputten naar digitale I/O.

Log 2: Vooruitgang met toetsenbordscannen en printen

Ik heb me gericht op het optimaliseren van de code voor het scannen van het toetsenbord en het printen.

Toetsenbordscannen en mapping: Ik gebruik MSX BIOS-code voor het scannen van de rijen. De rest van de logica is eigen werk. Er is veel aandacht besteed aan zaken als de 'caps lock' vlag, shift-toetsen en het voorkomen van fouten bij snel typen (overlapping van toetsen). Ik heb arrays gedefinieerd voor de toetsenbordmatrix-rijen en bits om de lookup eenvoudig te maken.

Printen: Bij het printen merkte ik dat de snelheid van de computer een rol speelt. De RC2014 draait op 7.4 MHz, wat ongeveer twee keer zo snel is als de ZX81. Met de standaard code zag de output er rommelig uit. Wanneer ik de klok halveerde naar 3.7 MHz, werd het resultaat veel beter. Omdat ik echter een seriële snelheid van 115200 baud wil behouden (wat 7.4 MHz vereist), is het halveerden van de klok geen permanente oplossing.

Log 3: Werkende seriële communicatie

De seriële communicatie is nu operationeel. Ik heb interrupts ingesteld op de 6850-chip en een interrupt-handler geïnstalleerd die binnenkomende data buffert. De keyboard-scanning routine in de main loop verzendt tekens naar de seriële chip zodra er getypt wordt.

Op dit moment werkt het als volgt: alles wat ik typ in een terminalemulator op mijn Mac komt uit de Alphacom-printer (na een carriage return), en alles wat ik op het MSX-toetsenbord typ, verschijnt in de terminalemulator. De volgende stap is het implementeren van line-wrapping: de printer moet een regel printen en de buffer legen na 32 tekens als er geen carriage return is ontvangen.

Log 4: Regelscherm en eerste verbinding met computer

Omdat de Alphacom niet per teken kan printen, maar alleen volledige regels, moet men vaak "blind" typen. Om dit te verbeteren, heb ik een single-line display toegevoegd. Ik gebruik hiervoor een bubble LED-display (HP 5082-7400), bestaande uit twee groepen van vier 7-segment displays. Hoewel een 7-segment display niet alle tekens perfect weergeeft, is het voldoende om te zien wat er getypt is voordat men op enter drukt. De tekst scrolt horizontaal terwijl er getypt wordt.

Ik heb dit vervolgens getest door een RC2014 Picasso direct te verbinden. Omdat de applicatie nog in RAM stond, moest ik eerst het programma laden via mijn Mac en daarna de kabels omwisselen. Er waren wat garbage-tekens en veel dropped characters bij het verzenden van meerdere regels, waarschijnlijk omdat interrupts worden uitgeschakeld tijdens het printen van een regel.

Log 5: Eén stap vooruit, één stap terug

Het printen van garbage-tekens en het verlies van data bleek te komen door een te kleine buffer en timingproblemen:

  1. Tijdens het printen is de timing kritiek en moeten interrupts worden uitgeschakeld.
  2. De seriële chip (68B50) kan slechts één byte tegelijk vasthouden.

Strategie één: Ik probeerde een kleine vertraging tussen pixels in te voegen om de seriële chip te pollen. Dit leidde echter tot herhaalde of ontbrekende tekens.

Strategie twee: Ik heb de informatiestroom aangepast naar een "walkie-talkie" stijl. In plaats van direct te printen, buffert de terminal alle binnenkomende data totdat er een pauze valt. Daarna wordt alles in één keer geprint. Omdat we 32k RAM hebben, is een grotere buffer geen probleem. Dit werkt veel stabieler voor communicatie met besturingssystemen, monitors en turn-based games.

Log 6: Eindelijk!

Ik wilde de RC2014 direct op de teletype aansluiten zonder tussenkomst van een moderne computer. Om "garbage" te voorkomen bij het hot-swappen van computers, overweeg ik pull-up weerstanden toe te voegen aan de seriële module.

Ik heb de software overgezet naar ROM. Dit bracht uitdagingen met zich mee, zoals het expliciet initialiseren van variabelen in het RAM, aangezien deze bij opstarten ongedefinieerd zijn. Ook merkte ik dat de interrupt-handler niet werd aangeroepen. Het probleem zat in de 'reset 38h' vector van de Z80. Na een opfriscursus over Z80 Interrupt Mode 1 heb ik de code aangepast. Nu is er tweewegcommunicatie met mijn RC2014 Picasso (onder SCM), hoewel er nog steeds wat tekens verloren gaan.

Log 7: Nieuw toetsenbord!

Om esthetische redenen heb ik een nieuw toetsenbord gebouwd. Ik heb Cherry blue switches geoogst van een gaming-toetsenbord en typewriter-stijl keycaps van AliExpress gebruikt.

Daarnaast heb ik diverse functies verbeterd:

  • Het bubble LED-display scrolt nu zijwaarts tijdens het typen.
  • De caps lock LED werkt nu correct via aansturing van de hostcomputer.

Er is echter een klein probleem: de LED in de switch zit aan de voorkant, terwijl de transparante legenda in de keycap aan de bovenkant zit, waardoor het licht niet goed door komt. Ik overweeg een gaatje te boren voor een lightpipe.

Log 8: Tijd voor een potje schaken?

Ik kan nu Sargon II (voor CP/M) spelen op de teletype. Dit bracht enkele kwesties aan het licht:

CR/LF Problematiek: De afhandeling van Carriage Return (CR) en Line Feed (LF) is complex. Voor CP/M is CR-only het meest geschikt voor input. Voor de printerzijde heb ik ontdekt dat het beter is om de LF te gebruiken als trigger om een regel daadwerkelijk te printen, in plaats van de CR.

Sargon II Output: Sargon II is erg tekstueel en gebruikt veel backspaces en CR's om de voortgang van het "denken" van de computer te tonen op een videoscherm. Omdat de thermische printer niet kan overprinten, zou dit resulteren in een enorme verspilling van papier. Ik heb de software zo aangepast dat backspaces en carriage returns worden genegeerd; er wordt pas geprint als er een volledige regel of een LF is bereikt.

Daarnaast filtert de software nu meerdere opeenvolgende linefeeds zonder printbare tekens, zodat er maximaal één lege regel wordt geprint om papier te besparen.

Op hardwareniveau heb ik stabilisatoren gemonteerd op het toetsenbord, wat de typervaring aanzienlijk heeft verbeterd.