Community project
Zaprojektuj Emulator Rom Dla Zx Spectrum Harlequ
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

Gather all the parts
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"
2. Connections between "addr_buffer_0" and "Raspberry Pi Pico"
3. Connections between "addr_buffer_1" and "Raspberry Pi Pico"
4. Connections between "data_buffer" and "Raspberry Pi Pico"
5. Connections between "decouple_lvc0" and "Raspberry Pi Pico"
6. Connections between "decouple_lvc1" and "Raspberry Pi Pico"
7. Connections between "decouple_ahct" and "Raspberry Pi Pico"
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.




