STECCY

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Steccy.png
Von Frank M. (ukw)

STECCY - ZX-Spectrum-Emulator mit STM32

Einleitung

STECCY - ZX Spectrum 218K

STECCY emuliert einen ZX-Spectrum 128K oder Spectrum 48K auf einem STM32F407VET-Black-Board, welches für ca. 10 Euro bei eBay oder Aliexpress erstanden werden kann. Außerdem ist STECCY unter QT übersetzbar, so dass STECCY auch unter Windows und Linux genutzt werden kann. Ebenso existiert eine Framebuffer- und X11-Portierung auf Linux, so dass STECCY auch auf einem Raspberry PI in der Console oder auf dem Desktop läuft.

STECCY bildet als Emulator nicht nur den Befehlssatz einer Z80-CPU ab, sondern auch Teile der ZX-Spectrum-Hardware. Das 256x192 große Spectrum-Display wird dabei auf einem TFT-Display mit einer Vergrößerung von 2:1 dargestellt - also mit einer Auflösung von 512x384 Bildpunkten.

Das Laden und Speichern von Programmen geschieht über eine SD-Karte, welche FAT-formatiert ist. Hier werden die Cassettenrecorder-Routinen im virtuellen ROM umgebogen auf Lade- und Speicher-Routinen für SD-Karten. STECCY unterstützt dafür TAP-, TZX- und Snapshot-Dateien. Mittels Snapshots kann jederzeit der aktuelle Zustand des emulierten ZX-Spectrums eingefroren und abgespeichert werden. Dadurch ist es dann zum Beispiel möglich, am nächsten Tag ein Spiel genau zu dem Zeitpunkt weiterzuspielen, wie es als Snapshot gespeichert wurde.

Es wird der ZX-Spectrum 128K oder ZX-Spectrum 48K emuliert. Der virtuelle Spectrum 128K hat ein ROM mit einer Größe von 32KB und RAM mit einer Größe von 128KB, der Spectrum 48K ein ROM mit einer Größe von 16KB und RAM mit einer Größe von 48KB.

Z80-Emulator

Es werden nicht nur die dokumentierten, sondern auch alle undokumentierten Befehle einer Z80-CPU nachgebildet. Dieses ist insbesondere bei Spielen wichtig, da manche ZX-Spectrum-Spiele undokumentierte Instruktionen verwenden.

Über http://clrhome.org/table/ findet man sämtliche möglichen Z80-Instruktionen. Die dokumentierten sind grau hinterlegt, die undokumentierten haben einen roten Hintergrund und bilden den weitaus größeren Teil aller Z80-Instruktionen.

Hardware-Emulator

Folgende ZX-Spectrum-Hardware wird durch STECCY nachgebildet:

  • Z80 durch timinggenaue Emulation einer 3,5MHz getakteten Z80-CPU
  • ULA-Chip für Display und Interrupts
  • ZX-Tastatur durch PS/2-, USB-Tastatur oder ZX-Tastatur-Matrix
  • Cassettenrecorder durch SD-Karte
  • Spectrum-ROM durch Datei auf SD-Karte

Für die Wiedergabe des Spectrum-Screens ist beim Original die Spectrum-ULA zuständig. Diese liest dafür mit einer Rate von 50Hz die erforderlichen 6912 Bytes aus dem RAM des Spectrums. Analog geschieht das durch STECCY: Hier wird ebenso 50 mal pro Sekunde das TFT-Display aktualisiert. Allerdings findet hier eine Optimierung statt: Es werden nur die geänderten Daten neu an das TFT übertragen, um Zeit zu sparen.

Ebenso sorgt der ULA-Chip für den Z80-Interrupt, welcher dafür sorgt, dass die Tastatur-Routinen im RAM angesprungen werden, um die Matrix-Tastatur des Spectrums auszulesen. Auch werden diverse Systemvariablen aktualisiert wie zum Beispiel ein 16-Bit-Uptime-Counter. STECCY verwendet je nach aktuellem Interrupt-Mode (IM0/IM1/IM2) die sich daraus ergebenen Adressen als Interrupt-Sprungadressen und ruft dann die entsprechende Interrupt-Routine auf. Diese Sprungadresse befindet sich standardmäßig im ROM, wird aber von vielen Spielen umgebogen auf eigene Adressen im RAM, um beispielsweise den Spectrum-Screen flickerfrei zu aktualisieren.

Features

Die Features von STECCY kann man mit folgenden Punkte zusammenfassen:

  • Emulation sämtlicher Z80-Instruktionen - auch der undokumentierten.
  • Das Timing gleicht dem einer Z80-CPU bei 3,5MHz
  • Unterstützung von Displays mit SSD1963- oder ILI9341-Controllern
  • Vergrößerte Anzeige des ZX-Spectrum-Displays inkl. "Border" auf TFT mit 800x480 Pixeln
  • Verschiedene ZX-Spectrum-ROMs möglich
  • Laden und Speichern von TAPE-Daten über SD-Karte
  • Simulation der Spectrum-Tastatur durch eine PS/2- oder USB-Tastatur
  • Unterstützung einer Original-ZX-Spectrum Tastatur (Matrix)
  • Joystick-Emulation mit Wii-Nunchuk oder Wii-Gamepad oder über PC-Tastatur
  • Ansteuerung der beiden Board-LEDs über Z80-OUT-Befehle (BASIC oder Assembler)
  • Ansteuerung STM32-USART2 über ZX-Basic PRINT- und INPUT-Befehle
  • Ansteuerung Port-Expander PCF8574 und PCF8574A über OUT- und IN-Befehle
  • Neu: Unterstützung von POK Dateien
  • Neu: Tonausgabe über Mini-Lautsprecher (STM32-Version)
STECCY Boot-Display - QT Version
Simples Basic Programm
Bubble Bobble
Manic Miner
JetSet Willi II
The Hobbit

ROM

Das Sinclair-Betriebssystem, nämlich das ZX-Spectrum 128K oder 48K ROM, besteht aus 16KB bzw. 32KB Daten, welche zum großen Teil Z80-Instruktionen sind. Da der Rechteinhaber Amstrad die Inhalte mittlerweile freigegeben hat, solange die Copyright-Meldung erhalten bleibt, ist es kein Problem, das Original-ROM des ZX-Spectrum 128K oder auch 48K für eine solche Emulation zu nutzen. Ja, man darf die Inhalte sogar weiterverteilen.

Siehe dazu auch Amstrad ROM permissions

Das Original-ROM von Sinclair steht unter Download zur Verfügung. Enthalten sind im ZIP-Archiv "steccy-roms.zip" folgende ROMs:

  • 128.rom - Original Sinclair-ROM 128K
  • 48.rom - Original Sinclair-ROM 48K
  • 48u.rom - Wie 48.rom, jedoch mit zusätzlichem Stream #4 zur Ein-/Ausgabe über STM32-UART2.

Zu 48u.rom siehe auch STM32-Hardware-Erweiterungen.

Modifikationen und Neu-Implementationen der ZX-Spectrum-ROMs sind ebenso lauffähig. Das Original-ROM als auch jede Menge Modifikationen bzw. Erweiterungen findet man unter Philip Kendall - The Spectrum ROMs collection.

Wenn man sich einfach nicht an die exotische Kommando-Eingabe von Basic-Tokens durch einzelne Tasten gewöhnen will, dem sei das "GOSH WONDERFUL ZX Spectrum ROM" für den ZX-Spectrum 48K empfohlen. Hier werden die BASIC-Befehle über Einzeltasten eingegeben. Der Spectrum 128K stellt im 128K-Basic sowieso bereits die Eingabe der Basic-Token über Einzeltasten zur Verfügung.

Das GOSH-ROM kann man hier als Datei gw03.rom herunterladen: The GOSH WONDERFUL ROM

Unter dieser URL sind auch sämtliche Verbesserungen, Bugfixes und Erweiterungen gegenüber dem Original-Sinclair-ROM aufgezählt.

Das Handbuch zum ZX-Spectrum ist ebenso frei verfügbar: World of Spectrum Documentation ZX Spectrum manual

SD-Karte

Zum Start von STECCY sollten zumindest die ROM-Dateien, nämlich 128.rom und 48.rom auf der SD-Karte vorhanden sein. Die SD-Karte formatiert man zuvor auf dem PC als FAT32, kopiert 128.rom und 48.rom darauf und steckt sie anschließend in den SD-Karteneinschub des STM32F407VET-Black-Boards. Zusätzlich kann man auch das oben erwähnte gw03.rom auf der SD-Karte ablegen, um dann über das STECCY-Menü das GOSH-ROM zu laden.

Desweiteren können auf der SD-Karte weitere ZX-Spectrum-Programme abgelegt werden, nämlich als TAP-, TZX- oder Z80-Dateien. Letztere sind Snapshots vom emulierten ZX-Spectrum 128K oder ZX-Spectrum 48K.

Der Aufbau dieser Dateien ist unter anderem hier erklärt:

Das TZX-Dateiformat ist wesentlich flexibler als das TAP-Format. TZX erlaubt auch Komprimierungen und Schnell-Laderoutinen, die es früher für den ZX-Spectrum gab. STECCY unterstützt jedoch nur das Laden über die Standard-ROM-Routinen (komprimiert und unkomprimiert), so dass Schnell-Lader nicht unterstützt werden. Über 95 Prozent der ZX-Spectrum-Programme nutzen die ROM-Routinen, so dass es da keine Probleme gibt.

Findet man im Netz ein Programm/Spiel in beiden Formaten (TAP und TZX), sollte man im Zweifel besser die TAP-Datei verwenden. Wenn das Programm im TZX-Format vorliegt, kann es in seltenen Fällen dazu kommen, dass STECCY diese Datei nicht vollständig laden kann. Die Wahrscheinlichkeit liegt aber unter 5 Prozent. In diesem Fall kann man auch den ZX-Spectrum-Emulator "Fuse", der für Windows und Linux frei erhältlich ist, verwenden, um dort die Schnell-Lader-Datei einzuspielen und dann als Snapshot wieder zu speichern. Die Snapshots können dann problemlos auch für STECCY verwendet werden.

Die Software zur Verwendung der SD-Karte ist FatFs - Generic FAT Filesystem Module. Vielen Dank an ChaN dafür!

Bitte beachten: Der STM32 stellt die Dateinamen im Format 8.3 dar, das heißt, man sollte nicht mehr als 8 Zeichen vor dem Punkt verwenden.

STM32F407VET BlackBoard

Auf dem BlackBoard sind unter anderem folgende Komponenten verbaut:

  • STM32F407VET6
  • FSMC Anschluss für TFT
  • SD-Karten-Einschub
  • USB-Anschluss
  • 8 MHz und 32kHz Quarz
  • SPI Flash W25Q16
  • 2 frei verwendbare LEDs
  • 3 User buttons
  • Fassung für RTC-Batterie
  • Stecksockel für NRF24L01

Kompletter Schaltplan des STM32F407VET6-BlackBoards: STM32_F4VE_SCHEMATIC.PDF

Komplettübersicht Steckerbelegungen: STM32F407VET6 black board

Einzelübersicht Steckerbelegungen:

JTAG und TFT: Black STM32f4VET6-2 Pinouts JTAG-TFT.pdf
Pinouts linke Seite: Black STM32f4VET6-2 Pinouts Left.pdf
Pinouts rechte Seite: Black STM32f4VET6-2 Pinouts Right.pdf
Pinouts linke und rechte Seite: Black STM32f4VET6-2 Pinouts Left-Right.pdf

STM32F407VET6 BlackBoard

Für STECCY benötigt werden der FSMC-Anschluss für das Display und der SD-Karten-Einschub. Desweiteren werden noch ein paar Pins für Tastatur und andere Zwecke verwendet.

Display

3,2-Zoll-TFT-Display

Als kleinstes Display kann das 3,2-Zoll-Display mit ILI9341-Controller und RGB-Interface verwendet werden. Dieses wird ohne weitere Lötarbeiten einfach auf den TFT-Stecker des STM32F407VET6-BlackBoards gesteckt.

Das Display bekommt man ab 11 EUR.

Bezugsquellen:

Allerdings ist das Display mit 3,2 Zoll recht klein. 5"- oder 7"-Displays bereiten da schon mehr Spaß, sie unten.

5-Zoll oder 7-Zoll-TFT-Display

Als Display kann ein 7-Zoll-TFT-Display mit 800x480 Pixeln und SSD1963-Controller verwendet werden. Ein Touchscreen ist nicht erforderlich.

Das TFT-Display ist für ca. 50 EUR unter anderem hier in Deutschland mit kurzer Lieferzeit erhältlich:

https://eckstein-shop.de/70-800x480-TFT-LCD-Display-ohne-Touchscreen-SSD1963-MCU-Arduino-Kompatibel

Das ist das Modell ohne Touchscreen.

Das gleiche findet man auch für einen günstigeren Preis (ca. 30-35 EUR) beim Chinesen um die Ecke, also eBay oder Aliexpress unter dem Stichwort "SSD1963 7" inch TFT LCD Module Display 800x480" - meist sogar mit Touchscreen. Das Touch-Feld wird von STECCY nicht unterstützt, stört aber sonst nicht weiter. Sollte man das gleiche Display auch ohne Touchscreen zu einem günstigeren Preis finden, sollte man einfach dieses verwenden.

Dieses Display gibt es in derselben Auflösung auch als 5-Zoll-Display für unter 30 EUR. Wem das 7-Zoll-Display zu groß ist, kann auch dieses verwenden. Wichtig ist der SSD1963-Controller und die Auflösung von 800x480.

Das Display wird über die parallele FSMC-Schnittstelle des STM32 wie folgt an den TFT-Stiftsockel des STM32F407VET-BlackBoards angeschlossen:

Anschluss TFT
STM32
TFT Pin
FSMC
Name
STM32
Pin
Display
Pin
Display
Name
Bemerkung
1 GND GND 1 GND TFT GND
2 RST RST 33 REST SSD 1963 RESET
3 FSMC D15 PD10 27 DB15 FSMC DB15
4 FSMC D14 PD9 25 DB14 FSMC DB14
5 FSMC D13 PD8 23 DB13 FSMC DB13
6 FSMC D12 PE15 21 DB12 FSMC DB12
7 FSMC D11 PE14 19 DB11 FSMC DB11
8 FSMC D10 PE13 17 DB10 FSMC DB10
9 FSMC D9 PE12 15 DB9 FSMC DB9
10 FSMC D8 PE11 13 DB8 FSMC DB8
11 FSMC D7 PE10 16 DB7 FSMC DB7
12 FSMC D6 PE9 14 DB6 FSMC DB6
13 FSMC D5 PE8 12 DB5 FSMC DB5
14 FSMC D4 PE7 10 DB4 FSMC DB4
15 FSMC D3 PD1 8 DB3 FSMC DB3
16 FSMC D2 PD0 6 DB2 FSMC DB2
17 FSMC D1 PD15 4 DB1 FSMC DB1
18 FSMC D0 PD14 2 DB0 FSMC DB0
19 FSMC NOE PD4 11 RD FSMC /RD
20 FSMC NWE PD5 9 WR FSMC /WR
21 FSMC A18 PD13 7 RS FSMC /RS
22 FSMC NE1 PD7 29 CS FSMC /CS
23 T_SCK PB13 18 T_CLK Touch (n.u.)
24 T_CS PB12 20 T_CS Touch (n.u.)
25 T_MOSI PB15 22 T_DIN Touch (n.u.)
26 T_MISO PB14 26 T_DO Touch (n.u.)
27 T_PEN PC5 28 T_IRQ Touch (n.u.)
28 LCD BL PB1 -- -- n.c.
29 n.c. -- -- -- n.c.
30 GND GND 1 GND TFT GND
31 3V3 3V3 3 3V3 SSD1963
32 GND GND 1 GND TFT GND
-- 5V 5V 35 5V s. Text

Da die Hintergrundbeleuchtung des Displays ca. 400mA als Strom zieht, sollte die 5V-Versorgung des Displays nicht über das STM32-Board, sondern direkt über ein 5V-Netzteil mit mindestens 1, besser 2 Ampere, erfolgen. Darüber kann dann auch das STM32-Board versorgt werden. Pins für 5V sind auf dem STM32-Board genügend vorhanden. Es muss also nicht der USB-Stecker zur Stromversorgung verwendet werden. Auf keinen Fall sollte man das BlackBoard gleichzeitig über den 5V-Stiftsockel und über den USB-Stecker betreiben!

Für die Stromversorgung der Hintergrundbeleuchtung ist folgendes zu tun:

  • LED_A - Pin 37 NICHT anschließen
  • 5V (Pin daneben) direkt an das 5V-Netzteil anschließen
  • Die Lötbrücke "Always On" auf der Display-Platine schließen
STECCY-Prototyp mit aufgestecktem 3,2-Zoll-TFT (ILI9341 Controller) und PS/2-Adapter
ILI9341-Display mit eingeblendetem STECCY-Menü
STECCY Prototyp mit 7-Zoll-TFT
TFT-Anschlussbelegung STM32
TFT-Anschlussbelegung Display
7-Zoll-TFT an STM32F407VET6 mit nebenstehendem STECCY-Menü

Die Steckerbelegungen des STM32407VET6-BlackBoards kann man hier einsehen: STM32F407VET6 black board
Kompletter Schaltplan des STM32F407VET6-BlackBoards: STM32_F4VE_SCHEMATIC.PDF

Die Steckerbelegung des Displays findet man hier: Schematic.pdf

Die Bezeichnungen sind aber auch direkt neben dem Stiftsockel auf der Display-Platine selbst abgedruckt.

Mit der F1-Taste kann man im Betrieb zwischen 4 Orientierungen wählen:

Orientierung
Mode Orientierung
0 Flip None (Standard)
1 Flip Vertical
2 Flip Horizontal
3 Flip Vertical + Horizontal

Man kann in der INI-Datei "steccy.ini" die Orientierung speichern. Dazu zählt man nach dem Start, wie oft man die F1-Taste drücken musste, um das Bild richtig herum zu sehen.

Diesen Wert trägt man in der INI-Datei als

 ORIENTATION=0   # oder 1, 2, 3

ein.

Ebenso gibt es TFT-Displays, deren RGB-Farbfolge abweichend voneinander verdrahtet sind. Wenn auf dem Display Falschfarben angezeigt werden, kann man mit der Taste F2 die RGB-Farbfolge umstellen.

Auch dieses kann man in der INI-Datei "steccy.ini" speichern.

Hier trägt man ein:

 RGB=0      # Standard-Reihenfolge RGB
 RGB=1      # Nicht-Standard ist GRB

Tastatur

STECCY unterstützt neben einer Original-ZX-Spectrum-Tastatur (Matrix) auch eine PS/2- oder USB-Tastatur zur Zeicheneingabe. Es können sogar alle drei Varianten der Tastaturen gleichzeitig verwendet werden, was für Spiele für 2 Player sinnvoll sein kann. Dabei werden in der PC-Tastatur-Umsetzung diejenigen Tasten, die es auch auf dem ZX-Spectrum gibt, 1:1 abgebildet. Weitere auf der PC-Tastatur vorhandene Tasten werden auf Kombinationen von Spectrum-Tasten abgebildet.

STECCY wandelt dafür Z80-IN-Befehle, welche die Spectrum-Matrix-Tastatur adressieren, auf die entprechenden gemappten Tasten um, welche in regelmäßigen Abständen von der Tastatur ausgelesen werden.

Für die PC-Tastaturen gilt:

  • Die TAB-Taste wechselt ins STECCY-Menü
  • F1 stellt die Orientierung des TFT-Displays ein
  • F2 stellt wechselt das Display zwischen der Farbreihenfolge RGB und GRB um
  • F3 schaltet den Turbo-Modus (ungebremste Emulation) ein und wieder aus
  • F12 beendet STECCY (gilt nur für die Linux-Version)
  • Die linke Shift-Taste entspricht der CapsShift-Taste auf dem ZX-Spectrum
  • Die rechte Shift-Taste entspricht der Shift-Taste auf der verwendeten PC-Tastatur
  • Sowohl die linke als auch die rechte STRG-Taste ensprechen der Symbol-Shift-Taste auf dem ZX-Spectrum
  • Die ESC-Taste entspricht der Tastenkombination CapsShift-Space, erzeugt also "BREAK"
  • Die vier Pfeiltasten erzeugen die Kombinationen CapsShift-5 bis CapsShift-8, entsprechen also den ZX-Spectrum Cursor-Tasten
  • Die Tasten des rechten Nummernfeldes werden für die Joystick-Emulation verwendet, siehe "Joystick-Emulation"
  • Y und Z sind vertauscht, denn es wird möglichst das englische Layout beibehalten

Beispiele:

  • Das Drücken von "j" erzeugt im Basic-Kommando-Modus den Befehl "LOAD"
  • Die Plus-Taste "+" auf der PC-Tastatur erzeugt die Tastenkombination "SymbolShift-K", also "+"
  • Die Plus-Taste "+" zusammen mit der rechten Shift-Taste auf der PC-Tastatur erzeugt die Tastenkombination "SymbolShift-B", also "*"
  • Linke Shift-Taste zusammen mit "5" erzeugt "Cursor-Left"
  • Rechte Shift-Taste zusammen mit "5" erzeugt "%"
  • Pfeil-Links-Taste erzeugt "CapsShift-5", also "Cursor-Left"

Wie oben schon erwähnt, wird versucht, das englische Tastatur-Layout möglichst beizubehalten. Auf der deutschen PC-Tastatur erscheinen daher Y und Z vertauscht. Das ist Absicht, denn manche Spiele verwenden genau diese Tasten. Würde die Emulation diese beiden Tasten wiederum vertauschen, damit sie dem deutschen Layout näherkommen, müsste man unmöglich erscheinende "Affengriffe" durchführen, um das Spiel noch bedienen zu können.

Zur Orientierung: Abbilder von ZX-Spectrum-Keyboards findet man leicht über Google durch die Eingabe von "zx spectrum keyboard layout".

Gutes Beispiel: Sinclair ZX Spectrum keyboard layout

PS/2-Tastatur

Die PS/2-Tastatur wird über ein 4-adriges Kabel folgendermaßen angeschlossen:

PS/2-Tastatur-Anschluss
PS/2 Pin STM32 Bemerkungen
CLOCK 5 PB7 über 4,7K Pullup an 5V
DATA 1 PB6 über 4,7K Pullup an 5V
GND 3 GND
5V 4 5V

Zwischen 5V und CLOCK bzw. 5V und DATA muss dann noch jeweils ein 4,7K Pullup-Widerstand eingebaut werden, um die Pegel auf stabilem Niveau zu halten. Die PS/2-Steckerbelegung findet man im Netz mit den Suchbegriffen "ps/2 stecker belegung". Dabei sind die spiegelbildlichen Abbildungen von Steckern und Buchsen zu beachten.

PS/2 Buchse Frontansicht

USB-Tastatur

Die USB-Tastatur wird über einen Mini-USB-nach-USB-A-Adapter am Mini-USB-Anschluss des STM32F407-Blackboards angeschlossen.

Wichtig:

Da in diesem Fall der STM32 als USB-Host (im HID-Modus) agiert, muss der Pullup-Widerstand R21 (1,5K) auf dem STM32F407VET6-Blackboard mit der Kennzeichnung "V2.0" ausgelötet werden. Sonst wird die USB-Tastatur nicht erkannt.

Mittlerweile gibt es auch Black Boards mit der Kennung "V33" auf der Rückseite. Dort gibt es den im Foto umkreisten Widerstand nicht mehr. Es existiert zwar immer noch ein Widerstand R21 an anderer Stelle, dieser hat jedoch eine andere Funktion. In diesem Fall ist deshalbg kein Eingreifen notwendig.

Das Auslöten ist überhaupt nicht tragisch, da der externe Widerstand bei der STM32F4XX-Familie auch im Betrieb als USB-Device (und nicht USB-Host) sowieso überflüssig ist. Im Falles des Betriebs als USB-Device (und nicht als Host) wird automatisch der dafür vorgesehene interne Pullup des STM32F4XX verwendet.

Wird die USB-Tastatur beim Start von STECCY erkannt, leuchtet die LED D2 (meist rot, manchmal auch grün) auf dem Blackboard auf.

Manchmal wird die USB-Tastatur nicht sofort erkannt. Dann hilft meist ein Druck auf den Reset-Knopf des Boards. Nach dem Grund wird noch gesucht...

R21 auf dem STM32F407VET6-Blackboard

ZX-Tastatur

STECCY unterstützt auch externe ZX-Spectrum Matrix-Tastatur. Hier wird die Matrix folgendermaßen angeschlossen:

ZX-Spectrum Tastatur-Matrix
Zeile STM ADDR D0 D1 D2 D3 D4 D4 D3 D2 D1 D0 ADDR STM Zeile
3 PC3 A11 1 2 3 4 5 6 7 8 9 0 A12 PC4 4
2 PC2 A10 Q W E R T Y U I O P A13 PC5 5
1 PC1 A9 A S D F G H J K L CR A14 PC6 6
0 PC0 A8 CS Z X C V B N M SS SP A15 PC7 7
STM PE0 PE1 PE2 PE3 PE4 PE4 PE3 PE2 PE1 PE0

Zusammengefasst:

  • PC0 - PC7: Zeile 0 - 7
  • PE0 - PE4: Spalte 0 - 4

Wenn jemand noch eine Original-ZX-Tastatur hat, dem hilft folgende Belegung der Anschlussfolie weiter:

                      Spalten                                    Zeilen
               ---  ---  ---  ---  ---            ---  ---  ---  ---  ---  ---  ---  ---
   Z80         D0   D1   D2   D3   D4             A11  A10  A9   A12  A13  A8   A14  A15
   STM32F407   PE0  PE1  PE2  PE3  PE4            PC3  PC2  PC1  PC4  PC5  PC0  PC6  PC7

Dabei ist zu beachten, dass die leitende Flächen auf den Folien unterschiedlich aufgebracht sind - einmal oben (Spalten) und einmal unten (Zeilen).

Desweiteren ist eine weitere Spalte 5 (an PE5) vorgesehen, an die man bis zu 8 weitere Tasten für Spezialfunktionen anschließen kann. Bisher wird nur eine zusätzliche Taste unterstützt, nämlich diejenige, welche PC0 mit PE5 verbindet. Diese dient dazu, in das STECCY-Menü zu gelangen. Die Verwendung der verbleibenden Spezialfunktionen-Tasten ist geplant.

Folgende Tasten funktionieren im STECCY-Menü:

   CS 6     - Pfeil runter: Nächster Menüpunkt
   CS 7     - Pfeil hoch:   Vorheriger Menüpunkt
   CS 0     - Backspace:    Löschen rückwärts
   A - Z    - A - Z:        Buchstaben
   0 - 9    - 0 - 9:        Zahlen
   SS J     - SymShift J:   Minus
   ENTER    - ENTER:        Menüpunkt bestätigen
   CS SPACE - BREAK:        Menüpunkt verlassen

ZX-Tastatur als PS/2

Die Variante, die ZX-Spectrum-Tastatur als Matrix über 13 Kabel anzuschließen, hat einen gravierenden Nachteil: Das Display nebst Blackboard kann nicht weit abgesetzt von der ZX-Tastatur angebracht werden.

Aus diesem Grund gibt es eine Alternative dazu: Die ZX-Spectrum-Tastatur wird zur PS/2-Tastatur umgebaut. Dann kann sie über ein längeres dünnes 4-poliges PS/2-Kabel mit dem BlackBoard verbunden werden.

Umbau ZX-Tastatur

Schema:

STECCY ZX-Tastatur an PS/2

Hier werden die Zeilen/Spalten wie folgt an den STM32F103 auf einem BluePill-Board angeschlossen:

                      Spalten                                    Zeilen
               ---  ---  ---  ---  ---            ---  ---  ---  ---  ---  ---  ---  ---
   Z80         D0   D1   D2   D3   D4             A11  A10  A9   A12  A13  A8   A14  A15
   STM32F103   PB3  PB4  PB5  PB6  PB7            PA3  PA2  PA1  PA4  PA5  PA0  PA6  PA7

Der Pin PB8 dient als zusätzliche Spalte für Erweiterungen. Auch hier kann eine zusätzliche Taste zwischen PB8 und PA3 angebracht werden, um das STECCY-Menü zu starten.

Anschluss an PS/2
Funktion Pin
CLK PB12
DATA PB13
+5V +5V
GND GND
PS/2 Buchse Frontansicht

Der Umbau der ZX-Tastatur ist auf GitHub zu finden: STECCY-Keyboard

Joystick-Emulation

PC-Tastatur

STECCY kann mittels des rechten Nummernblocks auf der PC-Tastatur digitale Joysticks simulieren.

Folgende Joysticks werden dabei unterstützt:

  • Sinclair Joystick 1
  • Sinclair Joystick 2
  • Kempston Joystick
  • Cursor Joystick

Dabei bedeuten die Tasten:

Joystick-Tasten
Taste Funktion
0 Feuertaste
1 unten links
2 unten
3 unten rechts
4 links
5 unten, also wie 2!
6 rechts
7 oben links
8 oben
9 oben rechts

Neben der Taste "2" wirkt auch die Taste "5" wie "Joystick-Unten". Grund: Die vier Hauptrichtungen liegen damit näher beeinander und ermöglichen somit bei Jump-And-Run-Games ein schnelleres Spiel.

Wii Nunchuk

Ab der Version V1.5 kann auch ein Wii-Gamepad oder Wii-Nunchuk-Controller als Joystick verwendet werden. Diese sind als Clones für wenige Euro auf eBay erhältlich.

Die beiden Wii-Geräte verwenden das I2C-Protokoll. Für die Verbindung mit dem STM32 sind 4 Verbindungen nötig, nämlich:

  • SCL
  • SDA
  • 3,3V
  • GND

Am besten schneidet man den Stecker ab und verbindet die Kabelenden direkt mit den Pins auf dem STM32-Board. Welche Farben die Kabel haben, ist hier aufgelistet:

Anschluss Nunchuk
Pin Nunchuk Farbe Original Farbe Clone Pin STM32
1 Grün Gelb PB9 (SDA)
2 n.c. Schwarz n.c.
3 Rot Grün 3,3V
4 Weiß Rot GND
5 n.c. n.c. n.c.
6 Gelb Weiß PB8 (SCL)
Nunchuk Controller
Nunchuk-Stecker - Sicht von vorn

Da man in der Regel einen Clone erworben hat, kann man sich auf die Farben nicht verlassen. Besser ist es, den Stecker aufzuschrauben und sich selbst von den Kabelfarben zu überzeugen. Mein Clone hatte die oben angegebene Farbreihenfolge. Alternativ zu der Abschneide-Methode gibt es bei eBay auch Adapter für die Nunchuk-Stecker. Diese können auch für das Wii-Classic-Gamepad verwendet werden.

Der Nunchuk-Controller hat 2 Tasten, nämlich die obere Taste "C" und die untere Taste "Z". Letztere dient als Feuertaste, die Taste "C" als Menütaste, mit der man sowhl das STECCY-Menü betreten als auch wieder verlassen kann. Der Analog-Stick wird als Digital-Joystick abgebildet - nämlich in der jeweils eingestellten Emulation.

Anschluss Nunchuk
Taste ZX-Spectrum STECCY-Menü
"Z" unten Feuer Menüpunkt bestätigen oder Auswahl ändern
"C" oben Start Menü Zurück
Stick oben Joystick oben Menüpunkt nach oben
Stick unten Joystick unten Menüpunkt nach unten
Stick links Joystick links Seite nach oben
Stick rechts Joystick rechts Seite nach unten

Wii Gamepad Pro

Der Gamepad-Controller hat die gleichen Anschlüsse wie der Nunchuk-Controller, siehe oben.

Lediglich die Tastenzuordnungen sind anders, weil der Gamepad-Controller wesentlich mehr Buttons zur Bedienung hat.

Gamepad Funktionen
Taste ZX-Spectrum STECCY-Menü
Select Turbo Modus --
"Home Start Menü Zurück
Start Z80 Reset --
Jede andere Taste Feuer Menüpunkt bestätigen oder Auswahl ändern
Stick oben Joystick oben Menüpunkt nach oben
Stick unten Joystick unten Menüpunkt nach unten
Stick links Joystick links Seite nach oben
Stick rechts Joystick rechts Seite nach unten
Wii Gamepad Pro

Speaker

An PC13 des STM32 kann ein aktiver Lautsprecher oder ein kleiner Audio-Verstärker angeschlossen werden. Aktive PC-Lautsprecher funktionieren zum Beispiel sofort.

Möchte man etwas kleineres in ein STECCY-Gehäuse integrieren, kann auch nebenstehender Verstärker aufgebaut und ein kleiner Lautsprecher angeschlossen werden, z.B. einer mit 0,25W und 27mm Durchmesser. R9 und R10 sind in tatsächlich ein Poti mit 5k zur Lautstärke-Einstellung.

Sauberer wäre noch die Verwendung von 2 zusatzlichen Dioden, damit die BE-Threshold Spannung kompensiert wird und es weniger Verzerrungen gibt. Auf diese Dioden kann jedoch angesichts der minderen Klangqualität, welche auch schon der Original-Spectrum hatte, verzichtet werden.

Diskussion dazu siehe: STECCY - ZX-Spectrum-Emulator mit STM32 ff. - nebst verbessertem Schaltbild.

Einfacher Transistor-Verstärker

Spiele

Viele der ZX-Spectrum Spiele sind mittlerweile Public-Domain. Informationen über Copyrights findet man hier: ARCHIVE - COPYRIGHTS AND DISTRIBUTION PERMISSIONS. Im Zweifel gilt: Ist man Eigentümer des Original-Spiels in Form der Compact-Cassette, ist man auf der sicheren Seite.

Überhaupt sind World of Spectrum Classic, World of Spectrum und Spectrum Computing die Anlaufstellen, um sich allgemein über den ZX-Spectrum zu informieren oder auch Programme/Spiele herunterzuladen. Über das Archiv kann auf Text-Adventures, Utilities und über 10.000 Spiele für den ZX-Spectrum zugegriffen werden. Auf Urheber-Rechte sollte unbedingt geachtet werden!

Folgende beliebte Spiele wurden neben vielen anderen erfolgreich unter STECCY getestet und laufen einwandfrei:

Die Links verweisen auf die Spiele-Beschreibung im Archiv. Dort unter "Files" befinden sich die TZX- bzw. TAP-Dateien.

Sucht man ein bestimmtes Spiel auf World of Spectrum, verwendet man am besten die Suche im Untermenü "Infoseek". Die Treffer verweisen wiederum auf das Archiv. Im Archiv selbst zu suchen ist wesentlich mühseliger angesichts der Menge der Daten.

Bedienung

Viele Spiele bieten gar keine Hilfe zur Bedienung an - gerade was die zu verwendenden Tasten betrifft.

Bei vielen Jump-and-Run-Spielen sind die Tasten oft:

  • o nach links
  • p nach rechts
  • q nach oben
  • a nach unten
  • Leertaste: Feuer oder andere Aktion

Bei Manic-Miner und Jet Set Willy sind es

  • o nach links
  • p nach rechts
  • Leertaste Sprung

Bei anderen Spielen (wie z.B. Bubble Bobble) kann man die Tastenbelegung auch auswählen oder selber einstellen. Oder es gibt am Anfang eine Hilfe. Wenn alles nichts hilft, dann muss man ausprobieren.

Wenn die Spiele Joystick-Bedienung anbieten, sollte man einen Joystick-Typ auswählen, der auch in STECCY einstellbar ist.

Dann kann man das Spiel mit den Nummernblocktasten als Joystick-Simulator spielen. 0 ist Feuer, die Tasten 1-9 sind klar. Viele Spiele funktionieren auch klammheimlich mit Kempston- oder Cursor-Joystick. Hier sollte man das einfach mal im Menü umstellen und ausprobieren, ob die Tasten reagieren.

Hier eine Liste der Tasten der oben genannten Spiele in alphabetischer Reihenfolge:

PS/2-Tastatur-Anschluss
Spiel Links Rechts Oben Unten Sprung Feuer Joystick Simulation Bemerkung
Bubble Bobble * * * * * * Sinclair 1, Kempston, Cursor Kann zu zweit gespielt werden
Chuckie Egg 9 * 0 * 2 * w * z(y) m * * Cursor + '4' = Sprung Läuft nicht mit 48u.rom
Jet Set Willy o p -- -- SPACE -- Kempston, Feuer = Sprung
Jetpac z-m z-m q-p -- -- a-l Kempston Reihe z-m abwechselnd links/rechts
Manic Miner o p -- -- SPACE -- Kempston, Feuer = Sprung
Pac-Man o p q a -- -- Sinclair2, Kempston, Cursor H = Hold, Kempston über Menü
Space Rider * * * * * * Sinclair 1
* = einstellbar über das Spiel.

Speziell auf dem STM32 kann es beim Spiel "Bubble Bobble" vorkommen, dass in der 48K Emulation die Seifenblasen auf dem Screen nicht korrekt dargestellt werden. In diesem Fall sollte "Bubble Bobble" in der 128K Emulation gestartet werden. Hier tritt das Problem nicht auf.

STECCY Menü

Das STECCY-Menü kann man mit der TAB-Taste auf der PC-Tastatur aktivieren. Mit der ESC-Taste kann das Menü wieder verlassen werden.

Folgende Tasten werden verwendet:

Anschluss Nunchuk
Taste Wii Funktion
Tab "C" oben Menu Start
Cursor unten Stick runter Nächster Menüpunkt
Cursor hoch Stick rauf Vorheriger Menüpunkt
Cursor rechts oder Seite runter Stick rechts Bild runter
Cursor links oder Seite hoch Stick hoch Bild hoch
ENTER oder Space Fire ("Z" below) Menüpunkt auswählen oder ändern
ESC oder BREAK (Shift Space) "C" above Menü verlassen

Es stehen folgende Menüpunkte zur Verfügung:

Joystick

Hier kann man einen Joystick auswählen, der über die Nummernfeld-Tastatur simuliert werden soll.

Möglich sind:

  • Sinclair Joystick 1
  • Sinclair Joystick 2
  • Kempston Joystick
  • Cursor Joystick

Zwischen diesen Alternativen kann man mit der Leerzeichen-Taste ("SPACE") wechseln, um den richtigen Joystick-Typen auszuwählen.

STECCY-Menü - QT Version

In der QT-Version existiert der Menü-Eintrag "Joystick" nicht. Hier kann man einfach mit der TAB-Taste zwischen den Joystick-Simulationen wechseln. Die aktuelle Simulation wird unterhalb des Spectrum-Displays angezeigt.

PAUSE

Dieser Menüeintrag existiert nur in der QT-Version. Ein Mausklick lässt den Emulator pausieren. Ein weiterer Klick führt dann die Emulation fort.

In der STM32-Version kann man die Emulation mit der PAUSE-Taste einfrieren. Ein weiterer Druck auf PAUSE führt die Emulation fort.

RESET

RESET emuliert einen Hardware-Reset des ZX-Spectrums. Nach einer kurzen Zeit sollte die Copyright-Meldung des Sinclair-ROMs erscheinen.

ROM

Hier kann das ROM ausgewählt werden, welches beim Start benutzt werden soll. Dafür werden sämtliche Dateien auf der SD-Karte angezeigt, die mit der Dateiendung ".ROM" versehen sind.

Der Name der Standard-ROM-Datei lautet "128.rom". Möchte man den Original-Spectrum 48K emulieren, kann man hier "48.rom" laden. Eine Alternative zum 48K-ROM wäre "gw03.rom", siehe oben.

Empfehlung:

 ROM=128.rom

Autostart

Hier kann eingestellt werden, ob ein BASIC-Programm nach einem LOAD-Befehl direkt gestartet werden soll, damit es weitere Daten nachladen kann. Das ist der Standard-Fall beim ZX-Spectrum, wenn das Basic-Programm entsprechend gespeichert wurde. Daher ist hier auch die Standard-Einstellung "YES".

In der ST-Version wird diese Einstellung mit der Leertaste umgestellt, in der QT-Version mit Mausklick auf das Häkchen.

LOAD

Dieser Menüpunkt entfällt ab Version 1.5.2. Stattdessen wird das Datei-Auswahl-Menü für TAPE-Dateien nun automatisch geladen, wenn man den ZX-Spectrum anweist, eine Datei vom Band zu laden - entweder durch den ZX Spectrum TAPE LOADER oder über die Anweisung LOAD "".

Es wird dann Inhaltsverzeichnis der Dateien auf der SD-Karte angezeigt. Hier kann man nun durch Auswahl der TAPE-Datei diese in den virtuellen Cassetten-Recorder laden.

Auswählbar sind TAP-, TZX- oder Z80-Dateien. Bei Snapshots (Endung .Z80) wird die Datei sofort geladen und der ZX-Spectrum in den im Snapshot gespeicherten Zustand gebracht.

Die Tasten-Kombination zum Laden eines Programms für den ZX Spectrum 48K ist

   LOAD "" (Tasten: j STRG-P STRG-P RETURN)

Wenn die Einstellung AUTOSTART auf "YES" steht, wird anschließend das Programm automatisch gestartet.

POKE

Liegt für die geladene TZX- oder TAP-Datei auch eine gleichnamige POK-Datei vor, wird dieser Menüpunkt automatisch aktiviert. In diesem Fall kann man Einträge aus dieser POK-Datei auswählen, um für bestimmte Spiele unsterblich zu werden, in neue Levels zu springen usw.

Eine Unmenge von POK-Dateien für alle erdenklichen Spiele findet man auf https://github.com/ladyeklipse/all-tipshop-pokes

SAVE

Hier kann entweder eine bereits vorhandene TAPE-Datei überschrieben oder eine neue Datei auf der SD-Karte angelegt werden. Nach Eingabe des Dateinamens verlässt man das Menü und gibt in den BASIC-Interpreter ein:

 SAVE "Beispiel" (Tasten: s STRG-P Beispiel STRG-P RETURN).

Der Spectrum gibt dann die bekannte Meldung "Start tape, then press any key." aus. Nach Bestätigen der Meldung mittels RETURN wird dann das Programm in der TAPE-Datei unter dem Namen "Beispiel" im TZX-Format gespeichert.

Soll das Programm automatisch nach dem Laden ab einer bestimmten Zeile (z.B. Zeile 10) gestartet werden, verwendet man den Befehl:

 SAVE "Beispiel" LINE 10 (Tasten: überlasse ich dem geneigten Leser ;-) ).

Man kann nun in der zuivor ausgewählten Tape-Datei auch weitere Daten speichern, die dann angehängt werden, z.B. einen Code-Bereich aus dem RAM. Das Kommando dafür lautet zum Beispiel:

 SAVE name CODE 32768,8192 (Tasten s name CapsShift-SymbolShift i)

Möchte man die Tape-Datei schließen, wählt man im STECCY-Menü den Punkt "Stop Record" aus. Die "Aufnahme" wird dann gestoppt.

SNAPSHOT

Hier wird der aktuelle Zustand des ZX-Spectrums gespeichert. Nach Eingabe des Dateinamens werden RAM-Inhalt und alle Z80-Register in der gewählten Snapshot-Datei abgelegt. Diese kann man später wieder laden, um zum Beispiel ein begonnenes Spiel weiterzuspielen.

INI-Datei

In der INI-Datei steccy.ini können Voreinstellungen gemacht werden. Für die QT-Version muss die INI-Datei dort liegen, wo sich auch steccy.exe befindet. Für die STM32-Version muss die Datei einfach auf die SD-Karte kopiert werden.

PATH

  • Linux- und QT-Version: Hiermit wird der Suchpfad festgelegt, wo die ROM-Datei und die TAPE-Dateien zu finden sind. Standard ist das aktuelle Verzeichnis, wenn weder PATH angegeben wird oder der Eintrag hinter dem Gleichheitszeichen leer ist.
  • STM32: Der Eintrag wird ignoriert

Beispiel für QT unter Windows:

 PATH=c:\steccy

Beispiel für Raspberry-PI-Console oder X11-Desktop:

 PATH=/home/pi/steccy

ROM

Der Name der ROM-Datei, welche beim Start automatisch geladen werden soll. Der Standard ist "48.rom".

Beispiel: ROM=48u.rom

AUTOSTART

gibt an, ob Basic-Programme, die mit Autostart gespeichert wurden, tatsächlich automatisch gestartet werden sollen. Standard ist "yes". Alternative ist "no". Empfohlen wird die Einstellung "yes"

Beispiel: AUTOSTART=yes

AUTOLOAD

Name des TAPE-Datei, die automatisch in den virtuellen Cassettenrecorder geladen wird. Standard ist keine.

Beispiel: AUTOLOAD=manic.tzx

KEYBOARD

Angabe der verwendeten Tastatur.

Mögliche Werte:

 KEYBOARD=PS2
 KEYBOARD=USB
 KEYBOARD=ZX

Dabei sind:

  • PS2: PS/2-PC-Tastatur
  • USB: USB-PC-Tastatur
  • ZX: ZX-Spectrum-Matrix-Tastatur

Es können mehrere Tastaturen angegeben werden, indem man die KEYBOARD-Zeile wiederholt, z.B.

 KEYBOARD=PS2
 KEYBOARD=ZX

In diesem Fall kann man eine PS/2- und eine ZX-Matrix-Tastatur gleichzeitig verwenden. Das kann bei Multi-User-Spielen sinnvoll sein.

Ist kein Wert für KEYBOARD angegeben, ist dies identisch mit der Einstellung:

 KEYBOARD=PS2
 KEYBOARD=USB

Das heißt: Ohne Angabe sind PS/2- und USB-Tastatur aktiv und können auch gleichzeitig verwendet werden.

ORIENTATION

Orientierung auf dem TFT-Display. Standard ist 0. Nur für STM32. In der QT-Version wird dieser Eintrag ignoriert.

Die möglichen Werte sind:

Mode Orientierung
Orientierung
0 Flip None (Standard)
1 Flip Vertical
2 Flip Horizontal
3 Flip Vertical + Horizontal

Beispiel: ORIENTATION=1

Mit der F1-Taste kann man auch im Betrieb die Orientierung umstellen. Am Ende des Kapitels Display ist erklärt, wie man den richtigen Wert für sein Display herausfindet.

RGB

RGB-Farbreihenfolge auf dem TFT-Display. Die meisten TFTs arbeiten mit der Farbfolge RGB, manche mit der Reihenfolge GRB. Die Standard-Einstellung ist daher RGB=0.

Es gilt:

 RGB=0      # Standard-Reihenfolge RGB
 RGB=1      # Nicht-Standard ist GRB

Diesen Wert sollte man nur umstellen, wenn Falschfarben auf dem TFT erscheinen.

Der Basic-Befehl "BORDER 2" sollten einen roten Bildschirmrand erzeugen. Erscheint der Rand in einer anderen Farbe, sollte man den Wert wechseln. Dies kann man leicht mit der F2-Taste testen. Diese wechselt zwischen den beiden Werten.

Kommentare

Kommentare kann man in der INI-Datei mit "#" oder ";" einleiten.

Beispiel für eine komplette INI-Datei:

# PATH: Default is current directory (only QT and Linux), e.g. PATH=/home/pi/steccy
PATH=c:\steccy
# ROM: Default is 48.rom
ROM=128.rom
# Autostart: Default is yes
AUTOSTART=yes
# Autoload: Default is none
AUTOLOAD=
# Keyboard: Default is PS2 and USB. Use ZX for ZX-Spectrum matrix keyboard
KEYBOARD=PS2
# Orientation: Default is 0 (only STM32)
ORIENTATION=1
# RGB Order: Default is 0 (only STM32)
RGB=0

STM32-Hardware-Erweiterungen

Board-LEDs

Die beiden LEDs auf dem BlackBoard können vom emulierten ZX-Spectrum aus angesteuert werden. Sie sind über den I/O-Port 65407 anspechbar. Dabei wird LED2 über das Bit0, LED3 über das Bit1 gesteuert. Da beide LEDs active low angeschlossen sind, gilt folgendes Schema:

Board-LEDs
Bit 1 Bit 0 D3 D2
0 0 an an
0 1 an aus
1 0 aus an
1 1 aus aus

Dabei ergeben sich folgende BASIC-Kommandos, um die LEDs anzusprechen:

 OUT 65407,0                # 00: beide LEDs an
 OUT 65407,1                # 01: D3 an, D2 aus
 OUT 65407,2                # 10: D3 aus, D2 an
 OUT 65407,3                # 11: beide LEDs aus

Oder auch in binärer Schreibweise:

 OUT 65407,BIN 00           # beide LEDs an
 OUT 65407,BIN 01           # D3 an, D2 aus
 OUT 65407,BIN 10           # D3 aus, D2 an
 OUT 65407,BIN 11           # beide LEDs aus

Man kann den Status der LEDs auch wieder einlesen mit

 IN 4223

also zum Beispiel:

 PRINT IN 4223

STM32-UART

Die ROM-Datei 48u.rom ist eine Erweiterung des originalen Sinclair-ROMs. Hierbei ist neben den Standard-Streams #0 bis #3 für Tastatur, Screen und ZX-Printer noch ein weiterer Stream #4 aktiviert, nämlich ein UART-Channel "U".

Damit kann vom ZX-Spectrum-Basic direkt der STM32-UART2 angesprochen werden.

Der Basic-Befehl

 PRINT #4;"Hello, here is STECCY"

führt zur Ausgabe des Strings auf dem UART2 mit 115200 Bd. Dabei wird noch ein CR NL angefügt. Möchte man die Zeilenschaltung vermeiden, muss noch ein Semikolon angefügt werden:

 PRINT #4;"Hello, here is STECCY";

Kommas zwischen den Strings führen zu einer Ausgabe eines TABs auf dem UART:

 PRINT #4;"Hello","here is STECCY";

Ebenso können über den UART auch Zeichenketten empfangen werden. Diese müssen mit CR (Carriabe Return 0x0D) abgeschlossen werden. Dies geht mit dem Basic-Befehl

 INPUT #4;a$

Die empfangene Zeichenkette wird dann in a$ gespeichert.

Schließt man zum Beispiel einen USB-UART-Wandler an UART2 an und startet anschließend auf dem PC PuTTY, dann können sich PC-User und STECCY-User unterhalten.

Der BASIC-Befehl

 PRINT #4;"Hallo"

führt dann zu der Ausgabe von "Hallo" im PuTTY.

Umgekehrt liest

 INPUT #4;a$

eine Eingabe des PC-Users ein. Achtung: Im PuTTY ist standardmäßig kein lokales Echo eingeschaltet. Hier muss man dann "blind" tippen.

Man kann Aus- und Eingabe auch kombinieren.

Der BASIC-Befehl

 INPUT #4;"Huhu!";a$

sendet "Huhu!" und erwartet dann eine Antwort von der Gegenseite.

I2C

An die I2C-Schnittstelle I2C1 des STM32 können I2C-Bausteine wie PCF8574-Portexpander, LM75-Temperatursensoren, PCF8591-AD/DA-Converter und andere angeschlossen werden.

Anschlüsse:

  • SCL an PB8
  • SDA an PB9
  • GND an GND
  • Vcc an 5V oder 3,3V
PCF8574 Port-Expander

Falls man hier nicht bereits fertige Module wie zum Beispiel das nebenstehende verwendet, welches die notwendigen Pull-Up-Widerstände bereits vorgesehen haben, sollten SCL und SDA jeweils über einen Pullup-Widerstand an 5V bzw. 3V angeschlossen werden - je nach gewünschter Betriebsspannung und Pegel für die I2C-Module. Dabei können für einige der I2C-Bausteine über Adress-Jumper die I2C-Adresse angepasst werden, um Konflikte zu vermeiden.

Die I2C-Bausteine sind dann über Z80-IN- bzw OUT-Befehle angesprochen werden. Dabei gilt folgendes Schema:

Ports für I2C
Z80 Port 7-Bit I2C Adresse
0bbb bbbb 01111 1111 0bbb bbbb

Konkrete Beispiele:

Port Hex Port Dez Port Bin Typ A2 A1 A0 7-Bit I2C
Adresse
Bemerkungen
Ports für I2C
20 7F 8139 0010 0000 0111 1111 PCF8574 0 0 0 0x20 Alle Jumper auf 0
21 7F 8575 0010 0001 0111 1111 PCF8574 0 0 1 0x21 A0-Jumper auf 1
38 7F 14463 0010 0000 0111 1111 PCF8574A 0 0 0 0x38 Alle Jumper auf 0
48 7F 18559 0010 0000 0111 1111 LM75 0 0 0 0x48 Alle Jumper auf 0

I2C-Port-Expander

Die Pins der PCF8574-Port-Expander können sowohl für Input als auch für Output verwendet werden, da sie Open-Drain-Ausgänge besitzen. Siehe dazu auch Port-Expander_PCF8574 für weitere Erklärungen.

Beispiel für PCF8574A mit Jumper A2=1 A1=1 A0=1:

I2C Adresse ist dann: 0x3F (Basis-Adresse 0x38 + 0x07 = 0x3F).

Z80-Port ist dann: 0x3F7F, also 16255.

Aktivieren der oberen 4 Bits für Ausgabe:

BASIC-Befehl:

  OUT 16255,BIN 00001111

oder

  OUT 16255,15

Assembler:

  LD  BC,16255  ; Port-Adresse
  LD  A,15      ; Wert
  OUT (C),A     ; Ausgabe

Einlesen des PCF8574A-Ports:

BASIC-Befehl

  LET a = IN 16255

Assembler:

  LD  BC,16255  ; Port-Adresse
  IN  A,(C)     ; Lesen

Turbo-Modus

Der Turbo-Modus kann sowohl mit der Taste F3 oder auch per ZX Spectrum Software eingeschaltet werden.

Dabei läuft die ZX Spectrum ungebremst, also unter voller CPU-Auslastung. Desweiteren gibt es die Möglichkeit, spezielle "ROM-HOOKS" einzuschalten. In diesem Falle werden spezielle ROM-Routinen durch native CPU-Befehle des STM32 oder PCs umgesetzt. Zur Zeit werden bei Einschalten der ROM-Hooks die BASIC Befehle "PLOT" und "DRAW" beschleunigt.

Die OUT-Adresse zum Aktivieren der ROM-Hooks ist 65151.

Durch folgende OUT-Befehle können die einzelnen TURBO-Modi geschaltet werden:

Turbo-Modus
Wert Funktion
254 Turbo-Modus ein
253 ROM-Hooks ein
252 Turbo-Modus + ROM-Hooks ein
0 Alle Optmierungen ein
255 Alle Optmierungen aus

Assembler

Wer ein wenig mit Z80-Assembler herumspielen möchte, dem sei der Online-Assembler https://www.asm80.com/onepage/asmz80.html empfohlen.

Hier kann man Z80-Assembler-Quelltexte direkt übersetzen lassen und das Compilat als TAP-Datei herunterladen. Anschließend kann man das Compilat direkt in STECCY laden und ausprobieren.

Beispiel Assembler-Datei:

CHAN_OPEN   equ  5633                      ; open channel routine in ROM
PRINT       equ  8252                      ; print routine in ROM
            org  32768                     ; program start at 32768
            ld   a, 2                      ; stream number
            call CHAN_OPEN                 ; open channel
            ld   de, text                  ; pointer to text
            ld   bc, textend-text          ; length of text
            jp   PRINT                     ; jump to PRINT in ROM
text        defb 'Hello, this is STECCY!'  ; output string
            defb 13                        ; carriage return
textend     equ  $

Dieses Programm gibt "Hello, this is STECCY!" auf dem ZX-Spectrum-Screen aus.

Vorgehen:

  • https://www.asm80.com/onepage/asmz80.html aufrufen
  • Assember-Quelltext in Textbereich kopieren
  • Button "ASSEMBLE and make .TAP" anklicken
  • Compilat herunterladen und speichern, z.B. unter hello.tap
  • In STECCY eingeben:
           CLEAR 32000
           LOAD "" CODE
           RANDOMIZE USR 32768

Bei der Abfrage der TAPE-Datei hello.tap auswählen.

Anschließend sollte die gewünschte Meldung auf dem Display erscheinen. Wenn man die Meldung jedoch über den UART2 des STM32 ausgeben möchte, ändert man die Zeile

           ld   a, 2

in

           ld   a, 4

um den Stream #4 zu verwenden. Hierfür ist jedoch das ROM 48u.rom notwendig, siehe ROM.

Das Programm entspricht dem BASIC-Befehl

           PRINT "Hello, this is STECCY!"

bzw.

           PRINT #4;"Hello, this is STECCY!"

STECCY unter Linux

STECCY läuft auch im Linux-Desktop (X11) oder Framebuffer einer Linux-Console, zum Beispiel auf einem Raspberry PI.

Installationsanleitung:

Anmeldung als normaler User, z.B. als User "pi". Folgende Befehle in der Console eingeben:

 cd
 sudo apt-get install git-core
 mkdir src
 cd src
 git clone https://github.com/ukw100/STECCY.git
 cd STECCY/steccy-lx
 cp steccy.ini $HOME/.steccy.ini
STECCY auf einem Raspberry PI in Framebuffer-Console

Programm 'steccy' für Linux-Console erstellen:

Sicherstellen, dass Entwicklungs-Umgebung installiert ist:

 sudo apt-get install build-essential

Anschließend Programm 'steccy' erstellen und installieren:

 make steccy
 sudo make steccy-install

Programm 'xsteccy' für Linux-Desktop (X11):

Sicherstellen, dass libx11-dev installiert ist:

 sudo apt-get install libx11-dev

Anschließend Programm 'xsteccy' erstellen und installieren:

 make xsteccy
 sudo make xsteccy-install

STECCY-Desktop Icon installieren (LXDE-Desktop auf Raspberry PI):

 cp steccy.desktop $HOME/Desktop
 cp steccy.desktop $HOME/.local/share/applications/
STECCY auf einem Raspberry PI Desktop inclusive STECCY-Icon

Anschließend sollte das STECCY-ICON sowohl auf dem Desktop als auch im Start-Menü unter "Games" erscheinen.

Damit ist die Installation abgeschlossen. Eventuell sollte man noch die Datei $HOME/.steccy.ini mit dem Editor anpassen. Dort eingetragen ist der Suchpfad, wo sich die ROM- und TAPE-Dateien befinden.

 PATH=/home/pi/steccy

Dieses Verzeichnis legen wir jetzt noch im Home-Verzeichnis an:

 cd
 mkdir steccy

und laden dann die ROM-Dateien herunter und legen sie in dieses Verzeichnis. Auch Tape-Dateien für Spiele etc. sollten ausschließlich in diesem Verzeichnis abgelegt werden.

Möchte man ein abweichendes Verzeichnis für die ROM- und TAPE-Dateien verwenden, muss man die Datei $HOME/.steccy.ini mit dem Editor anpassen.

Start von STECCY als Consolen-Programm

STECCY für Linux läuft nicht nur auf dem Desktop, sondern auch in einer Framebuffer-Console. Wer einen Desktop installiert hat und trotzdem STECCY als Consolen-Programm starten möchte, muss zunächst auf die Text-Console wechseln mit STRG-F1 (Console #1) oder STRG-F2 (Console #2).

Zum Start gibt man dann ein:

 steccy

Mit der Taste F12 kann STECCY wieder beendet werden. Mit F7 gelangt man dann wieder zurück zum Desktop. Das geht aber nur, wenn vorher STECCY beendet wurde!

Normalerweise wird die momentane Console-Auflösung beibehalten. Wenn man STECCY im Vollbild laufen lassen möchte, gibt man ein:

 steccy -g 800x480

für einen 16:9 Monitor. Auf einem 4:3 Monitor benutzt man:

 steccy -g 800x600

Man kann auch noch mit anderen Auflösungen herumspielen. Man sollte jedoch die Breite von 800 nicht unterschreiten.

Start von STECCY auf dem Desktop

Am einfachsten erfolgt der Start über das STECCY-Desktop-Icon oder über Start-Menü -> Games -> STECCY.

Es geht aber auch über die Kommandozeile. Hier gibt man ein:

 xsteccy &

In diesem Fall startet öffnet xsteccy ein Fenster mit der Größe 800x480. Auch hier kann man mit der Option '-g' andere Fenstergrößen wählen. Hier vergrößert sich aber lediglich das Fenster, nicht der emulierte ZX-Spectrum-Screen.

Auch hier wird STECCY mit der Taste F12 beendet.

Weitere Entwicklungen

Zur Zeit sind keine weiteren Erweiterungen geplant.

Download

STECCY ist auf GitHub umgezogen. Hier die Links:

Version 1.5.2 vom 25.04.2021
GitHub Repository STECCY auf GitHub
GitHub Release STECCY V1.5.2
Hex-Datei für STM32F407VET6 und SSD1963 steccy.hex
Hex-Datei für STM32F407VET6 und ILI9341 steccy-ili9341.hex
ROM 128K 128.rom
ROM 48K 48.rom
ROM 48K 48u.rom

Der QT-Source befindet sich im Unterverzeichnis steccy-qt, der Linux-Source im Unterverzeichnis steccy-lx. Anleitung siehe STECCY unter Linux

Zur Inbetriebnahme reicht das Flashen der HEX-Datei auf dem STM32F407VET6.

Wer das Programm selbst übersetzen möchte, kann dafür die IDE EmBitz verwenden, siehe auch https://www.embitz.org/ .

Im EmBitz sind 4 Target-Varianten konfiguriert:

  • ILI9341-Debug
  • ILI9341-Release
  • SSD1963-Debug
  • SSD1963-Release

Hier sollte für das SSD1963-Display dann SSD1963-Release ausgewählt werden. Verwendet man das ILI9341-Display, wählt man ILI9341-Release aus.

Alternativ zu EmBitz muss man ein entsprechendes Projekt bzw. Makefile selbst erstellen. Hierfür sollten neben der Optmierung (-O2 oder -Os) und diversen Warning-Levels folgende Optionen für den Compiler gesetzt werden:

 -DARM_MATH_CM4
 -D__FPU_USED
 -DSTM32F407VE
 -DSTM32F4XX
 -DUSE_STDPERIPH_DRIVER
 -DHSE_VALUE=8000000
 -fno-strict-aliasing
 -DSSD1963

Möchte man die Programmfassung für ILI9341-Displays erstellen, ersetzt man die Option -DSSD1963 durch -DILI9341.

Thread im Forum

Der zu diesem Projekt gehörende Forums-Thread ist STECCY - ZX-Spectrum-Emulator mit STM32

Historie

Version 1.5.1 - 11.04.2021

  • Unterstützung von zu PS/2-Tastaturen umgebauten ZX-Matrix-Tastaturen
  • Anzeige 48K oder 128K Modus

Version 1.5.0 - 21.03.2021

  • Weitere Optimierungen der ZX-Matrix-Tastatur-Routinen
  • Unterstützung Wii Nunchuk als Joystick
  • Unterstützung Wii Gamepad als Joystick
  • Emulation eines ZX Spectrum 128K

Version 1.4.5 - 17.01.2021

  • ZX-Matrix-Tastatur-Routinen komplett überarbeitet
  • Modularisierung und Aufteilung von z80.c in Emulator und I/O-Module

Version 1.4.4 - 02.10.2020

  • Neu: Speaker Support für STM32F4-Variante

Version 1.4.3 - 29.09.2020

  • Bugfix: ZX-Tastatur inaktiv

Version 1.4.2 - 15.04.2020

  • STECCY für Linux-Desktop

Version 1.4.1 - 12.04.2020

  • STECCY für Linux-Frambuffer

Version 1.4.0 - 07.04.2020

  • Unterstützung von ILI9341-Displays mit RGB-Ansteuerung

Version 1.3.4 - 06.04.2020

  • Bug in ZX-Spectrum-Display-Anzeige beseitigt

Version 1.3.3 - 18.03.2020

  • Unterstützung der Original ZX-Spectrum-Tastatur-Matrix
  • Weitere 8 Taster in Verbindung mit ZX-Spectrum-Tastatur für Menü etc.
  • Erweiterung der TZX-Tape-Unterstützung um den Archiv-Block

Version 1.3.2 - 03.03.2020

  • Optimierungen im 50Hz Display-Update
  • Optimierungen im USB-Tastatur-Handling

Version 1.3.1 - 03.03.2020

  • Kleinere Überarbeitungen des USB-Treibers
  • Vereinheitlichung der QT-Version

Version 1.3.0 - 02.03.2020

  • Unterstützung einer USB-Tastatur

Version 1.2.1 - 27.02.2020

  • Verallgemeinerung der I2C-Adressierung

Version 1.2 - 26.02.2020

  • Einstellung der TFT-Orientierung und RGB-Farbfolge
  • Ansteuerung von Port-Expandern PCF8574

Version 1.1 - 22.02.2020

  • Ansteuerung der Board-LEDs
  • Ein-/Ausgabe über UART2

Version 1.0 - 19.20.2020

  • Veröffentlichung

Danksagung

Vielen Dank an ChaN für FATFS. Vielen Dank auch an die Forumsmitglieder für ihre Anregungen!


Viel Spaß mit STECCY! :-)