TangNano20k – Amiga
Tang Nano 20k FPGA
ein „echter Amiga“
Amiga -> Tang Nano 20K: Einkaufsliste
Das alles braucht ihr für den Amiga auf dem Tang Nano 20K. „Produkt“ führt zu genau dem Artikel, den ich verwende. „Suche“ zeigt euch eine Auswahl, denn hier tut es fast jedes Modell.
Das Herzstück
- Sipeed Tang Nano 20K – Suche bei Amazon
- Raspberry Pi Pico (RP2040) – Suche bei Amazon
Wichtig: der erste Pico mit RP2040, nicht der Pico 2. Ohne Löten: „Pico H“ mit fertigen Stiftleisten. - USB-C-Datenkabel – Suche bei Amazon
Muss Daten übertragen können, ein reines Ladekabel funktioniert nicht. - microSD-Karte (32 GB) – Suche bei Amazon
Formatiert als FAT32.
Eingabegeräte
- USB-Tastatur (MediaRange Kompakt-Tastatur) – Produkt bei Amazon
- USB-Maus – Suche bei Amazon
- USB-2.0-Hub mit Schaltern – Produkt bei Amazon
Damit Tastatur, Maus und Gamepad gleichzeitig am Pico hängen.
Joystick-Anschluss
- 9-pol. Sub-D-Stecker (männlich) – Suche bei Amazon
Ohne Löten: Sub-D-Adapter mit Schraubklemmen. Pin 7 (5 V) bleibt frei, der FPGA verträgt nur 3,3 V! - Dazu ein originaler Amiga- oder Atari-Joystick (9-polig)
Verkabelung & Aufbau
- Jumper-/Flachbandkabel (Dupont) – Produkt bei Amazon
- Breadboard-Kit (für den Aufbau ohne Löten) – Produkt bei Amazon
Was ihr sonst noch braucht
- USB-A-Buchse als Platine (Breakout) für Tastatur/Hub am Pico – Suche bei Amazon
- HDMI-Kabel und ein Monitor oder TV (Spielmodus an!) – Suche bei Amazon
- USB-Netzteil 5 V (mind. 1 A) oder einfach den PC
- Optional: Lötkolben, Lötzinn, Stiftleisten und Schrumpfschlauch
Amiga -> Tang Nano 20K: Software & Links
1. Hardware
- Sipeed Tang Nano 20K – offizielles Wiki (Pinout, Datenblätter)
- Raspberry Pi Pico (RP2040) als USB-Companion für Tastatur & Maus
2. Der Amiga-Core
- NanoMig – Amiga-Core (Projektseite & Anleitung)
- NanoMig – Downloads (Releases) – im Video verwendet: v0.15-beta, Datei
NanoMig_1200_v0.15.bin
3. Flash-Werkzeuge (Windows)
- OSS CAD Suite – enthält
openFPGALoaderzum Flashen von Core und Kickstart - openFPGALoader – Projektseite & Doku
- Zadig – WinUSB-Treiber für „USB Debugger (Interface 0)“ (0403:6010)
- Gowin EDA / Programmer – Alternative zum openFPGALoader (Registrierung nötig)
4. Kickstart-ROM (legal)
- Amiga Forever (Cloanto) – legale Kickstart-ROMs. Für Festplatten-Images nötig: Kickstart 3.1 A1200 (40.068), Offset 0x400000.
5. Festplatten-Images (HDF)
- HST-Imager – HDFs mit RDB an Block 0 erstellen und prüfen
- PFS3AIO auf Aminet – Dateisystem für große Partitionen
- WinUAE – zum Vorbereiten und Testen von HDFs am PC
6. Companion-Firmware für den Pico
- FPGA-Companion (MiSTle-Dev) – unter „Releases“ die Datei
fpga_companion.uf2für den RP2040 (im Video: v1.4.27). Achtung: Die .uf2 im NanoMig-Repo ist für den Pico 2 (RP2350)!
FPGA -> Tang Nano 20K: Befehle zum Testen und Flashen
Alle Befehle laufen unter Windows in der Eingabeaufforderung (cmd) mit dem openFPGALoader aus der OSS CAD Suite. Vorher muss der Treiber mit Zadig eingerichtet sein (siehe unten).
1. OSS CAD Suite starten
Eingabeaufforderung öffnen, in den Ordner der OSS CAD Suite wechseln und die Umgebung laden. Den Pfad passt ihr an euren Speicherort an:
cd /d C:\oss-cad-suite
environment.bat
Erst danach kennt Windows den Befehl openFPGALoader. Das muss in jedem neuen Fenster wiederholt werden.
Anschließend in den Ordner wechseln, in dem eure Core- und ROM-Dateien liegen:
cd /d C:\Tang
2. Testen, ob der Tang Nano 20K erkannt wird
openFPGALoader --scan-usb
Zeigt die angeschlossenen Programmier-Adapter. Der Tang erscheint als 0x0403:0x6010.
openFPGALoader -b tangnano20k --detect
Liest den FPGA aus. Alles in Ordnung, wenn dort GW2AR-18 steht (idcode 0x0000081b).
Fehler „ftdi -4“ oder „unable to open“?
- Zadig starten, unter Options „List All Devices“ aktivieren.
- „USB Debugger (Interface 0)“ (USB-ID 0403 6010 00) auswählen und auf WinUSB setzen.
- Genau hinschauen: Nicht versehentlich Maus oder Tastatur umstellen!
- Den Tang immer am selben USB-Port anschließen, denn der Treiber gilt nur für diesen Port.
3. Amiga flashen (NanoMig)
openFPGALoader -b tangnano20k -f NanoMig_1200_v0.15.bin
openFPGALoader -b tangnano20k --external-flash -o 0x400000 Kickstart31A1200.rom
| Kickstart | Adresse |
|---|---|
| 3.1 (A1200, 40.068), nötig für Festplatten-Images (HDF) | 0x400000 |
| 1.3 | 0x700000 oder 0x740000 |
| 3.2 | 0x780000 |
Lötplan Tang Nano20k - Raspberry Pi Pico
Hst Imager
Ein Image-Tool für Windows, macOS und Linux zum Lesen und Schreiben von Festplatten-Images auf bzw. von physischen Laufwerken.
Hst Imager ist ein Festplatten Image Tool zum Lesen und Schreiben von Festplatten-Images auf bzw. von physischen Laufwerken. Es unterstützt das Lesen von komprimierten Image-Dateien im Format .rar, .zip, .gz und .xz beim Schreiben auf ein physisches Laufwerk sowie das Schreiben in komprimierte Image-Dateien im Format .zip und .gz beim Lesen von einem physischen Laufwerk.
Dieses Tool kann verwendet werden, um neue leere Images zu erstellen oder Images von physischen Laufwerken wie Festplatten, SSDs, CF- und MicroSD-Karten für Sicherungszwecke und/oder zur Bearbeitung zu erstellen und diese anschließend auf physische Laufwerke zu schreiben.
AGS-Image auf dem Tang Nano 20K reparieren
So startet der Amiga Game Selector (AGS) auch auf dem NanoMig
Der Amiga Game Selector ist eine fertig eingerichtete Festplatte mit einem Menü, über das ihr Spiele bequem mit dem Joystick startet. Auf dem PC in WinUAE läuft das Image sofort, auf dem Tang Nano 20K mit NanoMig aber erst einmal gar nicht. In diesem Beitrag zeige ich euch, woran das liegt und wie ihr es mit einem kleinen PowerShell-Skript in wenigen Sekunden behebt.
Das komplette Vorgehen zeige ich auch in Teil 3 meiner Tang-Nano-Reihe auf YouTube bei FrankyByte.
Warum startet das AGS-Image nicht?
Jede Amiga-Festplatte hat am Anfang einen Festplatten-Header, den sogenannten Rigid Disk Block, kurz RDB. Er beginnt mit der Kennung RDSK. Darin steht, welche Partitionen es gibt und welches Dateisystem verwendet wird.
Beim AGS-Image steht in Block 0 aber ein PC-Partitionseintrag (MBR). Der RDB liegt erst in Block 2. WinUAE und ein echter Amiga suchen die ersten Blöcke ab und finden ihn trotzdem. Der NanoMig schaut aber nur in Block 0 nach und findet deshalb keine Festplatte.
Die Lösung: Wir kopieren den RDSK-Block (512 Bytes) einfach nach Block 0. Mehr nicht, der Rest der Datei bleibt unverändert.
Was ihr braucht
- Einen Windows-PC mit PowerShell (ist bei Windows schon dabei)
- Euer AGS-Image als
.hdf-Datei, zum BeispielAGS_RHW_AGA_v26.hdf(die AGA-Version passt zum NanoMig-Core mit 1200 im Namen) - Mein Skript
HDF_RDB_nach_Block0.ps1(Download weiter unten) - Eine SD-Karte mit exFAT, denn das Image ist größer als 4 GB. Nur eine Partition, mit MBR, kein GPT.
Schritt 1: Prüfen, ob die Reparatur nötig ist
Öffnet die PowerShell (Startmenü → „PowerShell“ eingeben) und gebt diese drei Zeilen ein. Den Pfad in der ersten Zeile passt ihr an euer Image an:
$p = "H:\AGS_RHW_AGA_v26.hdf" $f=[IO.File]::OpenRead($p); $b=New-Object byte[] 4; $f.Read($b,0,4)|Out-Null; $f.Close() [Text.Encoding]::ASCII.GetString($b)
| Ausgabe | Bedeutung |
|---|---|
RDSK | Alles gut, das Image läuft auf dem Tang. Nichts zu tun. |
| leer oder etwas anderes | Der RDB liegt nicht in Block 0, weiter mit Schritt 2. |
Schritt 2: Reparieren
- Ladet das Skript
HDF_RDB_nach_Block0.ps1herunter. - Öffnet es mit einem Texteditor und passt in der dritten Zeile den Pfad zu eurem Image an:
$p = "H:\AGS_RHW_AGA_v26.hdf" - Öffnet die PowerShell in dem Ordner, in dem das Skript liegt, und startet es mit:
powershell -ExecutionPolicy Bypass -File .\HDF_RDB_nach_Block0.ps1
Der Zusatz-ExecutionPolicy Bypassist nötig, weil Windows heruntergeladene Skripte sonst blockiert. Er gilt nur für diesen einen Aufruf. - Erscheint die Meldung „RDB nach Block 0 kopiert“, hat alles geklappt.
Neben eurem Image liegt jetzt eine Datei mit der Endung .block0.bak. Das ist die Sicherung des alten Block 0.
Das macht das Skript
$p = "H:\AGS_RHW_AGA_v26.hdf"
if (-not (Test-Path $p)) { "Datei nicht gefunden: $p"; return }
$f = [IO.File]::Open($p,'Open','ReadWrite')
try {
$b0 = New-Object byte[] 512; $f.Read($b0,0,512)|Out-Null
if ([Text.Encoding]::ASCII.GetString($b0,0,4) -eq "RDSK") { "Block 0 enthält schon RDSK – nichts zu tun."; return }
[IO.File]::WriteAllBytes("$p.block0.bak", $b0)
$rdb = New-Object byte[] 512; $f.Seek(1024,'Begin')|Out-Null; $f.Read($rdb,0,512)|Out-Null
if ([Text.Encoding]::ASCII.GetString($rdb,0,4) -eq "RDSK") { $f.Seek(0,'Begin')|Out-Null; $f.Write($rdb,0,512); "RDB nach Block 0 kopiert" } else { "Abbruch: Block 2 ist kein RDSK" }
} finally { $f.Close() }
- Es prüft, ob die Datei existiert.
- Steht in Block 0 schon
RDSK, bricht es ab. Man kann es also nicht versehentlich doppelt anwenden. - Es sichert den alten Block 0 als
.block0.bak. - Es liest Block 2 (ab Byte 1024), prüft, ob dort wirklich
RDSKsteht, und schreibt ihn nach Block 0. - Es werden nur 512 Bytes geändert, deshalb dauert es weniger als eine Sekunde.
Schritt 3: Auf dem Tang testen
- Kopiert das reparierte Image auf die SD-Karte (exFAT).
- SD-Karte in den Tang stecken und einschalten.
- Mit F12 ins OSD-Menü, unter Storage das Image als Festplatte auswählen.
- Einstellungen speichern und den Amiga neu starten. Das AGS-Menü erscheint!
Häufige Fragen
| Frage | Antwort |
|---|---|
| Läuft das Image danach noch in WinUAE? | Ja, WinUAE findet den RDB auch in Block 0. |
| „Abbruch: Block 2 ist kein RDSK“ | Euer Image ist anders aufgebaut. Dann passt das Skript nicht, bitte nichts weiter verändern. |
| Kann ich die Änderung rückgängig machen? | Ja, mit der Sicherung .block0.bak. Ihr schreibt die 512 Bytes einfach wieder an den Anfang der Datei. |
| Brauche ich das auch bei eigenen HDFs? | Nein, wenn ihr sie mit dem HST Imager und dem Format „Rigid Disk Block“ erstellt. Dann steht der RDB schon in Block 0. |
Download
PowerShell-Skript, das den RDB nach Block 0 kopiert:
⬇ HDF_RDB_nach_Block0 (ZIP) herunterladen
Viel Spaß mit dem Amiga Game Selector auf eurem Tang!
Euer FrankyByte
Einfache Version
Prüfen schnell ...
$p = "D:\FrankyByteNano20kAmiga\AGS_RHW_AGA_v26.hdf"
$f=[IO.File]::OpenRead($p); $b=New-Object byte[] 4; $f.Read($b,0,4)|Out-Null; $f.Close()
[Text.Encoding]::ASCII.GetString($b)
Prüfen mit Ausgabe
$p = "D:\FrankyByteNano20kAmiga\AGS_RHW_AGA_v26.hdf"
$f=[IO.File]::OpenRead($p); $buf=New-Object byte[] 8192; $f.Read($buf,0,8192)|Out-Null; $f.Close()
for($i=0;$i -lt 16;$i++){ $id=[Text.Encoding]::ASCII.GetString($buf,$i*512,4); $hex=($buf[($i*512)..($i*512+3)]|%{ '{0:X2}' -f $_ }) -join ' '; "Block {0,2}: {1} '{2}'" -f $i,$hex,$id }
RDSK tauschen
$p = "D:\FrankyByteNano20kAmiga\AGS_RHW_AGA_v26.hdf"
$f=[IO.File]::Open($p,'Open','ReadWrite')
$blk=New-Object byte[] 512
$f.Seek(2*512,'Begin')|Out-Null; $f.Read($blk,0,512)|Out-Null
$f.Seek(0,'Begin')|Out-Null; $f.Write($blk,0,512); $f.Close()
$f=[IO.File]::OpenRead($p); $b=New-Object byte[] 4; $f.Read($b,0,4)|Out-Null; $f.Close()
[Text.Encoding]::ASCII.GetString($b)
Comments are closed.
Comments on 'TangNano20k – Amiga' (0)
Kommentar-Feed