Community project

Zaprojektuj Emulator Rom Dla Zx Spectrum Harlequ

Raspberry Pi Pico
Photo of Zaprojektuj Emulator Rom Dla Zx Spectrum Harlequ
Generated with AI

Piotr Chmielecki

Published September 25, 2026

This guide builds a ROM emulator adapter that allows a Raspberry Pi Pico to replace the ROM chip in a ZX Spectrum Harlequin computer. The adapter uses level-shifting buffers to safely bridge the Pico's 3.3V logic to the Spectrum's 5V bus, with separate address buffers for low and high address lines and a data buffer for the eight data lines.

Readers will receive a complete wiring diagram showing all buffer connections, a detailed parts list with buffer IC specifications, step-by-step assembly instructions for building the DIP-28 adapter, and starter firmware that initializes the Pico's GPIO pins for address and data line control. The guide prepares makers to load ROM images and implement the bus-serving logic needed for full emulation.

Wiring diagram

Wiring diagram for Zaprojektuj Emulator Rom Dla Zx Spectrum Harlequ

Gather all the parts

QtyComponent
1

Wtyk DIP-28 do podstawki ROM

DIP-28

Zespół 28 pojedynczych pinów lub męska wtyczka DIP, która wchodzi do pustej podstawki ROM w Harlequinie.

1

74LVC244A, bufor adresów A0–A7

74LVC244A

Ośmiokanałowy bufor z wejściami odpornymi na 5 V, który bezpiecznie obniża osiem sygnałów adresowych do 3,3 V dla Pico.

1

74LVC244A, bufor adresów A8–A13 i ROMCS

74LVC244A

Drugi ośmiokanałowy bufor obniża pozostałe bity adresu i sygnał wyboru ROM do 3,3 V.

1

74AHCT245, bufor danych D0–D7

74AHCT245

Ośmiokanałowy bufor 5 V, który przyjmuje 3,3 V z Pico i podaje dane na magistralę tylko podczas odczytu ROM.

1

Kondensator ceramiczny odsprzęgający

100 nF

Mały kondensator przy układzie scalonym, który tłumi krótkie zakłócenia zasilania.

1

Kondensator ceramiczny odsprzęgający

100 nF

Mały kondensator przy układzie scalonym, który tłumi krótkie zakłócenia zasilania.

1

Kondensator ceramiczny odsprzęgający

100 nF

Mały kondensator przy układzie scalonym, który tłumi krótkie zakłócenia zasilania.

Assemble it in 5 steps

1. Przygotuj adapter poza komputerem

Pracuj przy całkowicie odłączonym Harlequinie. Na małej płytce uniwersalnej zamontuj Raspberry Pi Pico, dwa układy 74LVC244A i układ 74AHCT245; użyj podstawek DIP dla trzech układów logicznych. Dodaj 28 pojedynczych pinów lub wtyk DIP-28, który później wejdzie do podstawki po ROM-ie.

  • Oznacz narożnik pinu 1 każdego układu kropką lub nacięciem, zanim zaczniesz lutować.
  • Nie używaj płytki stykowej: przy sygnałach komputera długie luźne przewody mogą powodować błędy odczytu.
  • Nie wkładaj adaptera do Harlequina podczas lutowania ani gdy komputer jest podłączony do zasilania.

2. Połącz zasilanie i kondensatory

Połącz pin 28 wtyku ROM z szyną 5 V i z pinem VSYS Pico oraz VCC układu 74AHCT245. Połącz pin 14 wtyku z GND Pico i masą wszystkich trzech układów. Z pinu 3V3(OUT) Pico poprowadź osobną szynę 3,3 V tylko do VCC obu 74LVC244A. Przylutuj po jednym kondensatorze 100 nF bezpośrednio między VCC i GND każdego układu: dwa przy 74LVC244A i jeden przy 74AHCT245.

  • Kondensatory ceramiczne 100 nF nie mają biegunowości.
  • Trzymaj przewody 5 V i masy krótkie i grubsze niż przewody sygnałowe.
  • Nie łącz szyny 5 V z pinem 3V3 Pico — 5 V na tym pinie może trwale uszkodzić Pico.
  • Nie zasilaj jednocześnie adaptera z USB Pico i z Harlequina, dopóki nie upewnisz się, że 5 V nie może wracać przewodem USB do komputera.

3. Podłącz adresy przez bufory 3,3 V

Poprowadź A0–A7 z wtyku ROM do wejść IN0–IN7 pierwszego 74LVC244A, a jego wyjścia OUT0–OUT7 do GP0–GP7 Pico w tej samej kolejności. Poprowadź A8–A13 do IN0–IN5 drugiego 74LVC244A, a OUT0–OUT5 odpowiednio do GP8–GP13 Pico. Poprowadź ROMCS z pinu 20 podstawki do IN6 drugiego 74LVC244A, a OUT6 do GP22 Pico.

  • Bufory 74LVC244A są potrzebne dlatego, że sygnały Harlequina mają 5 V, a piny Pico przyjmują najwyżej 3,3 V.
  • Prowadź każdy sygnał możliwie krótko i nie zamieniaj kolejności A0–A13.
  • Podłączenie dowolnego adresu lub ROMCS bezpośrednio do Pico może uszkodzić jego pin napięciem 5 V.

4. Podłącz dane przez bufor 5 V

Połącz GP14–GP21 Pico z IN0–IN7 układu 74AHCT245. Połącz OUT0–OUT7 tego układu odpowiednio z D0–D7 wtyku ROM. Połącz DIR 74AHCT245 na stałe z 5 V, a jego aktywne niskim stanem wejście OE z ROMCS z pinu 20 wtyku ROM. Dzięki temu dane są podawane na D0–D7 tylko wtedy, gdy Harlequin wybiera ROM.

  • 74AHCT245 rozpoznaje 3,3 V z Pico jako pewne logiczne „1”, a sam wystawia poprawne poziomy 5 V dla komputera.
  • Sprawdź miernikiem, czy między 5 V i 3,3 V nie ma zwarcia przed pierwszym zasileniem.
  • Nie podłączaj GP14–GP21 bezpośrednio do D0–D7 — komputer pracuje na 5 V, co może uszkodzić Pico.
  • Odwrócone DIR sprawi, że układ nie poda danych do komputera.

5. Sprawdź wtyk przed włożeniem

Jeszcze bez wkładania Pico do Harlequina sprawdź ciągłość każdego połączenia według numerów wtyku: A0 pin 10, A1 9, A2 8, A3 7, A4 6, A5 5, A6 4, A7 3, A8 25, A9 24, A10 21, A11 23, A12 2, A13 26, D0 11, D1 12, D2 13, D3 15, D4 16, D5 17, D6 18, D7 19, ROMCS 20, masa 14 i 5 V 28. Pin 22 musi być połączony z masą.

  • Wtyk DIP oglądany od góry ma numerację przeciwnie do ruchu wskazówek zegara, zaczynając od zaznaczonego narożnika pinu 1.
  • Zrób zdjęcie adaptera i oznacz kabel lub płytkę przy pinie 1.
  • Włożenie wtyku obróconego o 180 stopni może podać 5 V na niewłaściwe sygnały i uszkodzić adapter albo komputer.

Review all connections

1. Connections between "rom_socket" and "Raspberry Pi Pico"

Functionrom_socketRaspberry Pi Pico
powerVCC5V
groundGNDGND
groundOE_GNDGND
digitalA0 → 74LVC244A, bufor adresów A0–A7 IN0EXT
digitalA1 → 74LVC244A, bufor adresów A0–A7 IN1EXT
digitalA2 → 74LVC244A, bufor adresów A0–A7 IN2EXT
digitalA3 → 74LVC244A, bufor adresów A0–A7 IN3EXT
digitalA4 → 74LVC244A, bufor adresów A0–A7 IN4EXT
digitalA5 → 74LVC244A, bufor adresów A0–A7 IN5EXT
digitalA6 → 74LVC244A, bufor adresów A0–A7 IN6EXT
digitalA7 → 74LVC244A, bufor adresów A0–A7 IN7EXT
digitalA8 → 74LVC244A, bufor adresów A8–A13 i ROMCS IN0EXT
digitalA9 → 74LVC244A, bufor adresów A8–A13 i ROMCS IN1EXT
digitalA10 → 74LVC244A, bufor adresów A8–A13 i ROMCS IN2EXT
digitalA11 → 74LVC244A, bufor adresów A8–A13 i ROMCS IN3EXT
digitalA12 → 74LVC244A, bufor adresów A8–A13 i ROMCS IN4EXT
digitalA13 → 74LVC244A, bufor adresów A8–A13 i ROMCS IN5EXT
digitalROMCS → 74LVC244A, bufor adresów A8–A13 i ROMCS IN6EXT

2. Connections between "addr_buffer_0" and "Raspberry Pi Pico"

Functionaddr_buffer_0Raspberry Pi Pico
powerVCC3V3
groundGNDGND
digitalOUT0GPIO 0
digitalOUT1GPIO 1
digitalOUT2GPIO 2
digitalOUT3GPIO 3
digitalOUT4GPIO 4
digitalOUT5GPIO 5
digitalOUT6GPIO 6
digitalOUT7GPIO 7

3. Connections between "addr_buffer_1" and "Raspberry Pi Pico"

Functionaddr_buffer_1Raspberry Pi Pico
powerVCC3V3
groundGNDGND
digitalOUT0GPIO 8
digitalOUT1GPIO 9
digitalOUT2GPIO 10
digitalOUT3GPIO 11
digitalOUT4GPIO 12
digitalOUT5GPIO 13
digitalOUT6GPIO 22

4. Connections between "data_buffer" and "Raspberry Pi Pico"

Functiondata_bufferRaspberry Pi Pico
powerVCC5V
groundGNDGND
powerDIR_5V5V
digitalOE_ROMCS → Wtyk DIP-28 do podstawki ROM ROMCSEXT
digitalIN0GPIO 14
digitalIN1GPIO 15
digitalIN2GPIO 16
digitalIN3GPIO 17
digitalIN4GPIO 18
digitalIN5GPIO 19
digitalIN6GPIO 20
digitalIN7GPIO 21
digitalOUT0 → Wtyk DIP-28 do podstawki ROM D0EXT
digitalOUT1 → Wtyk DIP-28 do podstawki ROM D1EXT
digitalOUT2 → Wtyk DIP-28 do podstawki ROM D2EXT
digitalOUT3 → Wtyk DIP-28 do podstawki ROM D3EXT
digitalOUT4 → Wtyk DIP-28 do podstawki ROM D4EXT
digitalOUT5 → Wtyk DIP-28 do podstawki ROM D5EXT
digitalOUT6 → Wtyk DIP-28 do podstawki ROM D6EXT
digitalOUT7 → Wtyk DIP-28 do podstawki ROM D7EXT

5. Connections between "decouple_lvc0" and "Raspberry Pi Pico"

Functiondecouple_lvc0Raspberry Pi Pico
powerPLUS3V3
groundMINUSGND

6. Connections between "decouple_lvc1" and "Raspberry Pi Pico"

Functiondecouple_lvc1Raspberry Pi Pico
powerPLUS3V3
groundMINUSGND

7. Connections between "decouple_ahct" and "Raspberry Pi Pico"

Functiondecouple_ahctRaspberry Pi Pico
powerPLUS5V
groundMINUSGND

Deploy the firmware

#include <Arduino.h>
// Hardware bring-up placeholder for the ZX Spectrum ROM adapter.
// It deliberately drives 0xFF on the Pico-to-AHCT data side.
// Do NOT use this sketch as a functioning ROM emulator; the ROM image and
// deterministic RP2040 PIO/DMA bus-serving implementation are added later.

constexpr uint8_t A0_PIN = 0;
constexpr uint8_t A1_PIN = 1;
constexpr uint8_t A2_PIN = 2;
constexpr uint8_t A3_PIN = 3;
constexpr uint8_t A4_PIN = 4;
constexpr uint8_t A5_PIN = 5;
constexpr uint8_t A6_PIN = 6;
constexpr uint8_t A7_PIN = 7;
constexpr uint8_t A8_PIN = 8;
constexpr uint8_t A9_PIN = 9;
constexpr uint8_t A10_PIN = 10;
constexpr uint8_t A11_PIN = 11;
constexpr uint8_t A12_PIN = 12;
constexpr uint8_t A13_PIN = 13;
constexpr uint8_t D0_PIN = 14;
constexpr uint8_t D1_PIN = 15;
constexpr uint8_t D2_PIN = 16;
constexpr uint8_t D3_PIN = 17;
constexpr uint8_t D4_PIN = 18;
constexpr uint8_t D5_PIN = 19;
constexpr uint8_t D6_PIN = 20;
constexpr uint8_t D7_PIN = 21;
constexpr uint8_t ROMCS_PIN = 22;

const uint8_t addressPins[] = {A0_PIN, A1_PIN, A2_PIN, A3_PIN, A4_PIN, A5_PIN, A6_PIN,
                               A7_PIN, A8_PIN, A9_PIN, A10_PIN, A11_PIN, A12_PIN, A13_PIN};
const uint8_t dataPins[] = {D0_PIN, D1_PIN, D2_PIN, D3_PIN, D4_PIN, D5_PIN, D6_PIN, D7_PIN};

void setup() {
  for (uint8_t pin : addressPins) pinMode(pin, INPUT);
  pinMode(ROMCS_PIN, INPUT);
  for (uint8_t pin : dataPins) {
    pinMode(pin, OUTPUT);
    digitalWrite(pin, HIGH);
  }
}

void loop() {
  // The AHCT245 output-enable is controlled in hardware by active-low ROMCS.
  // Keeping Pico's data side at 0xFF is a safe open-bus test condition.
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik