STECCY

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

Von Frank M. (ukw)

STECCY - ZX-Spectrum-Emulator mit STM32

Einleitung

STECCY Boot-Display - QT Version
Simples Basic Programm
Bubble Bobble
Manic Miner
JetSet Willi II
The Hobbit

STECCY emuliert einen ZX-Spectrum 48K auf einem STM32F407VET-Black-Board, welches für ca. 10 Euro bei eBay oder Aliexpress erstanden werden kann. Außerdem ist STECCY auch unter QT übersetzbar, so dass STECCY auch unter Windows und Linux genutzt werden kann.

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 48K emuliert. Der virtuelle Spectrum hat also 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- oder USB-Tastatur
  • 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
  • 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) - ab Version 1.3.3
  • Simulation diverser Joysticks über Tastatur-Nummernblock
  • Ansteuerung der beiden Board-LEDs über Z80-OUT-Befehle (BASIC oder Assembler)
  • Ansteuerung STM32-USART2 über PRINT- und INPUT-Befehle
  • Ansteuerung Port-Expander PCF8574 und PCF8574A über OUT- und IN-Befehle

ROM

Das Sinclair-Betriebssystem, nämlich das ZX-Spectrum ROM, besteht aus 16KB 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 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:

  • 48.rom - Original Sinclair-ROM
  • 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" empfohlen. Hier werden die BASIC-Befehle über Einzeltasten eingegeben.

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 muss zumindest eine Datei, nämlich 48.rom, auf der SD-Karte vorhanden sein. Die SD-Karte formatiert man zuvor auf dem PC als FAT32, kopiert 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.

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!

STM32F407VET BlackBoard

STM32F407VET6 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

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

TFT an STM32F407VET6
STECCY Prototyp
TFT-Anschlussbelegung STM32
TFT-Anschlussbelegung Display

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

Das TFT-Display ist für knapp 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 etwas günstigeren Preis (ca. 40 EUR) beim Chinesen um die Ecke, also eBay oder Aliexpress unter dem Stichwort "SSD1963 7" inch TFT LCD Module Display 800x480" - meist dann aber mit Touchscreen. Dieses wird von STECCY nicht unterstützt, stört aber 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. Wem das 7-Zoll-Display zu groß ist, kann auch dieses verwenden. Wichtig ist der SSD1963-Controller und die Auflösung von 800x480. Allerdings ist das 5-Zoll-Display ungetestet.

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.

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
  • 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 STM32 Bemerkungen
CLOCK PB7 über 4,7K Pullup an 5V
DATA PB6 über 4,7K Pullup an 5V
GND GND
5V 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.

USB-Tastatur

R21 auf dem STM32F407VET6-Blackboard

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 ausgelötet werden. Sonst wird die USB-Tastatur nicht erkannt.

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 rote LED D2 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...

ZX-Tastatur

Die Unterstützung einer externen ZX-Spectrum Matrix-Tastatur ist ab Version 1.3.3 enthalten. Hier muss die Matrix folgendermaßen angeschlossen werden:

- ZX-Spectrum Tastatur-Zeile 0 bis 7 an PC0 bis PC7 - ZX-Spectrum Tastatur-Spalte 0 bis 4 an PE0 bis PE4

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.

Joystick-Emulation

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.

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 ist World of Spectrum diejenige Anlaufstelle, um sich allgemein über den ZX-Spectrum zu informieren oder auch Programme/Spiele herunterzuladen. Über das Archiv World of Spectrum - Archive 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:

  • Manic Miner
  • Jet Set Willy
  • Jet Set Willy II
  • Bubble Bobble (Nur TAP, da TZX Schnell-Laderoutinen verwendet)
  • Chuckie Egg
  • Pac-Man
  • Jetpac
  • Rider

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 Joysick-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 nur mit 48.rom, nicht 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ü
Rider * * * * * * Sinclair 1
* = einstellbar über das Spiel.

Bedienung

STECCY-Menü - QT Version

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

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.

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 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 "48.rom". Eine Alternative wäre "gw03.rom", siehe oben.

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

Nach Auswahl des LOAD-Eintrags per Pfeil-Tasten und Bestätigung mit RETURN wird das Inhaltsverzeichnis der Dateien auf der SD-Karte angezeigt. Hier kann man nun durch Auswahl der Datei diese aktivieren, d.h. 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.

Bei TAP- und TZX-Dateien ist noch eine zusätzliche Aktion notwendig:

Nach Verlassen des Menüs mit ESC kann man nun die vorher ausgewählte TAPE-Datei mittels Eingabe des Basic-Befehls

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

laden und direkt ausgeführen - wenn die Einstellung AUTOSTART auf YES steht. Wurde vorher keine Tape-Datei ausgewählt, wartet nun die Spectrum-Emulation darauf, die Cassetten-Recorder-Wiedergabe über das STECCY-Menü nachzuholen, d.h. eine virtuelle Cassette einzulegen und die Wiedergabe zu starten. Das sollte man dann auch spätestens jetzt durchführen.

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

  • 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: PATH=c:\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 Cassenrecorder geladen wird. Standard ist keine.

Beispiel: AUTOLOAD=manic.tzx

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:

Orientierung
Mode 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.

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)
PATH=c:\steccy
# ROM: Default is 48.rom
ROM=48u.rom
# Autostart: Default is yes
AUTOSTART=yes
# Autoload: Default is none
AUTOLOAD=
# 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

PCF8574 Port-Expander

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

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:

Ports für I2C
Port Hex Port Dez Port Bin Typ A2 A1 A0 7-Bit I2C
Adresse
Bemerkungen
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

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
  • hello.tap über "LOAD" in den virtuellen Cassetten-Recorder einlegen
  • In STECCY eingeben:
           CLEAR 32000
           LOAD "" CODE
           RANDOMIZE USR 32768

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!"

Weitere Entwicklungen

Die weiteren Planungen sind:

  • Ausgabe von Ton über einen externen Lautsprecher.
  • Unterstützung eines ILI9341-Displays, welches direkt auf das STM32F407VE-BlackBoard aufgesteckt werden kann.

Download

Der QT-Source ist nun im SVN enthalten, Unterverzeichnis steccy-qt.

Aktuelle STM32- und QT-Version: 1.3.3 vom 18.03.2020
EmBitz-Projekt für STM32: Tarball
SVN hier auf µc.net: svn://mikrocontroller.net/steccy/
Repo-Browser: STECCY im SVN
Hex-Datei für STM32F407VET6: Datei:Steccy.hex - Version 1.3.2
ROMs (V1.1): Datei:Steccy-roms.zip

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. Die Unterstützung von ILI9341-Displays ist noch nicht komplett fertiggestellt und folgt in einer nachfolgenden Version.

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

Thread im Forum

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

Historie

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. Mein Dank geht auch an Thomas H. (flaretom) für die ZX-Keyboard-Unterstützung. Vielen Dank auch an die Forumsmitglieder für ihre Anregungen!


Viel Spaß mit STECCY! :-)