Image 1 — I have already designed and published a commodore 64 case and the next one will be a ZX Spectrum+ case.
Image 2 — I have already designed and published a commodore 64 case and the next one will be a ZX Spectrum+ case.
Image 3 — I have already designed and published a commodore 64 case and the next one will be a ZX Spectrum+ case.

I have already designed and published a commodore 64 case and the next one will be a ZX Spectrum+ case.

The case won't have any space to mount the original keyboard but I will share .step files so you will be able to modify it to use any modern replacement keyboard you desire.

u/Ready_Rain_2646 — 8 days ago

I am trying to develop a project that will let us connect some modern USB printers to amstrad CPC. But I need help with the coding part because I'm stuck. If you are an experienced coder for pi pico please tell me.

I have finished phase 1, which is getting the amstrad's printer output as text in the serial monitor, that allowed me to develop the circuit . Circuit is some bi-directional logic level shifters between gpio of the raspberry pi and amstrad's printer port, they don't have to be bi-directional but those were cheaper and easier to replace than resistor voltage dividers and a transistor buffer. Now I'm trying to develop the second phase which is controlling a printer over a USB port using the USB host capabilities of the raspberry pi pico. However I can't get pico to print anything to the printer. I'm trying to solve this issue for the last few days, so if you can help me with the coding part of phase 2 I will be more than willing to share every detail. Also this project is just a start because the same methodology can be implemented to other computers such as commodore 64, Amiga and Atari ST.

Here is the working and tested phase 1 code:

// ==========================================

// Amstrad CPC 7-Bit Parallel Printer Capture

// ==========================================

// --- Pin Definitions ---

const int PIN\_STROBE = 1; // GP1 (Physical Pin 2) - CPC Pin 1 (/STROBE)

const int DATA\_PIN\_START = 2; // GP2 to GP8 (Physical Pins 4-11) - CPC Pins 2-8 (D0-D6)

const int PIN\_BUSY = 9; // GP9 (Physical Pin 12) - CPC Pin 10 or 11 (BUSY)

// --- Circular Buffer (FIFO) ---

// Safely passes bytes from the fast hardware interrupt to the main loop

const int BUFFER\_SIZE = 512;

volatile uint8\_t rx\_buffer\[BUFFER\_SIZE\];

volatile int head = 0;

volatile int tail = 0;

volatile bool character\_received = false;

// --- The Hardware Interrupt (The Data Catcher) ---

// Triggers automatically on the falling edge of STROBE

void strobeTriggered() {

// 1. Instantly pull BUSY high to tell the Amstrad CPC to hold

digitalWrite(PIN\_BUSY, HIGH);

// 2. Read the 7-bit data bus instantly.

// Shift right by 2 so GP2 moves to bit 0, then mask the lower 7 bits (0x7F).

uint8\_t incoming\_char = (gpio\_get\_all() >> DATA\_PIN\_START) & 0x7F;

// 3. Calculate the next buffer position

int next\_head = (head + 1) % BUFFER\_SIZE;

// 4. If buffer isn't full, push the character into the queue

if (next\_head != tail) {

rx\_buffer\[head\] = incoming\_char;

head = next\_head;

character\_received = true;

}

}

void setup() {

// Start Serial Monitor communication at 115200 baud

Serial.begin(115200);

// Wait up to 3 seconds for Serial Monitor to open after reset

unsigned long start\_wait = millis();

while (!Serial && (millis() - start\_wait < 3000));

// Configure the 7 data pins (GP2 through GP8) as inputs

for (int i = DATA\_PIN\_START; i < DATA\_PIN\_START + 7; i++) {

pinMode(i, INPUT);

}

// Configure Handshake pins

pinMode(PIN\_STROBE, INPUT\_PULLUP);

pinMode(PIN\_BUSY, OUTPUT);

digitalWrite(PIN\_BUSY, LOW); // Start in "Ready" state

// Attach the interrupt to trigger on STROBE's falling edge

attachInterrupt(digitalPinToInterrupt(PIN\_STROBE), strobeTriggered, FALLING);

Serial.println("=========================================================");

Serial.println(" Amstrad CPC Printerface, Phase 1 ");

Serial.println(" Circuit Design By Ege Ozpalamutcu & Code by Gemini ");

Serial.println(" Listening on GP1 (STROBE) & GP2-GP8 (DATA) & GP9 (BUSY)");

Serial.println("=========================================================");

}

void loop() {

// 1. Process characters from the circular buffer

while (tail != head) {

// Grab the oldest unread character from the queue

uint8\_t c = rx\_buffer\[tail\];

tail = (tail + 1) % BUFFER\_SIZE;

// Handle standard printable ASCII

if (c >= 32 && c <= 126) {

Serial.write(c);

}

// Handle Carriage Return (CR) and Line Feed (LF) for newlines

else if (c == 13 || c == 10) {

Serial.write(c);

}

// Handle the Escape character (used for printer commands)

else if (c == 27) {

Serial.print("<ESC>");

}

// Print everything else as a hex code for debugging

else {

Serial.print("\[0x");

if (c < 0x10) Serial.print("0"); // Leading zero

Serial.print(c, HEX);

Serial.print("\]");

}

}

// 2. Safely release BUSY only after /STROBE has returned HIGH

if (character\_received) {

// Wait until the CPC finishes its strobe pulse

if (digitalRead(PIN\_STROBE) == HIGH) {

delayMicroseconds(10); // Small settling delay for cable stability

character\_received = false;

digitalWrite(PIN\_BUSY, LOW); // Signal to CPC that we are ready for the next byte

}

}

}

u/Ready_Rain_2646 — 9 days ago

I am trying to develop a project that will let us connect some modern USB printers to amstrad CPC. But I need help with the coding part because I'm stuck. If you are an experienced coder for pi pico please tell me.

I have finished phase 1, which is getting the amstrad's printer output as text in the serial monitor, that allowed me to develop the circuit . Circuit is some bi-directional logic level shifters between gpio of the raspberry pi and amstrad's printer port, they don't have to be bi-directional but those were cheaper and easier to replace than resistor voltage dividers and a transistor buffer. Now I'm trying to develop the second phase which is controlling a printer over a USB port using the USB host capabilities of the raspberry pi pico. However I can't get pico to print anything to the printer. I'm trying to solve this issue for the last few days, so if you can help me with the coding part of phase 2 I will be more than willing to share every detail. Also this project is just a start because the same methodology can be implemented to other computers such as commodore 64, Amiga and Atari ST.

Here is the working and tested phase 1 code:

// ==========================================

// Amstrad CPC 7-Bit Parallel Printer Capture

// ==========================================

// --- Pin Definitions ---

const int PIN\_STROBE = 1; // GP1 (Physical Pin 2) - CPC Pin 1 (/STROBE)

const int DATA\_PIN\_START = 2; // GP2 to GP8 (Physical Pins 4-11) - CPC Pins 2-8 (D0-D6)

const int PIN\_BUSY = 9; // GP9 (Physical Pin 12) - CPC Pin 10 or 11 (BUSY)

// --- Circular Buffer (FIFO) ---

// Safely passes bytes from the fast hardware interrupt to the main loop

const int BUFFER\_SIZE = 512;

volatile uint8\_t rx\_buffer\[BUFFER\_SIZE\];

volatile int head = 0;

volatile int tail = 0;

volatile bool character\_received = false;

// --- The Hardware Interrupt (The Data Catcher) ---

// Triggers automatically on the falling edge of STROBE

void strobeTriggered() {

// 1. Instantly pull BUSY high to tell the Amstrad CPC to hold

digitalWrite(PIN\_BUSY, HIGH);

// 2. Read the 7-bit data bus instantly.

// Shift right by 2 so GP2 moves to bit 0, then mask the lower 7 bits (0x7F).

uint8\_t incoming\_char = (gpio\_get\_all() >> DATA\_PIN\_START) & 0x7F;

// 3. Calculate the next buffer position

int next\_head = (head + 1) % BUFFER\_SIZE;

// 4. If buffer isn't full, push the character into the queue

if (next\_head != tail) {

rx\_buffer\[head\] = incoming\_char;

head = next\_head;

character\_received = true;

}

}

void setup() {

// Start Serial Monitor communication at 115200 baud

Serial.begin(115200);

// Wait up to 3 seconds for Serial Monitor to open after reset

unsigned long start\_wait = millis();

while (!Serial && (millis() - start\_wait < 3000));

// Configure the 7 data pins (GP2 through GP8) as inputs

for (int i = DATA\_PIN\_START; i < DATA\_PIN\_START + 7; i++) {

pinMode(i, INPUT);

}

// Configure Handshake pins

pinMode(PIN\_STROBE, INPUT\_PULLUP);

pinMode(PIN\_BUSY, OUTPUT);

digitalWrite(PIN\_BUSY, LOW); // Start in "Ready" state

// Attach the interrupt to trigger on STROBE's falling edge

attachInterrupt(digitalPinToInterrupt(PIN\_STROBE), strobeTriggered, FALLING);

Serial.println("=========================================================");

Serial.println(" Amstrad CPC Printerface, Phase 1 ");

Serial.println(" Circuit Design By Ege Ozpalamutcu & Code by Gemini ");

Serial.println(" Listening on GP1 (STROBE) & GP2-GP8 (DATA) & GP9 (BUSY)");

Serial.println("=========================================================");

}

void loop() {

// 1. Process characters from the circular buffer

while (tail != head) {

// Grab the oldest unread character from the queue

uint8\_t c = rx\_buffer\[tail\];

tail = (tail + 1) % BUFFER\_SIZE;

// Handle standard printable ASCII

if (c >= 32 && c <= 126) {

Serial.write(c);

}

// Handle Carriage Return (CR) and Line Feed (LF) for newlines

else if (c == 13 || c == 10) {

Serial.write(c);

}

// Handle the Escape character (used for printer commands)

else if (c == 27) {

Serial.print("<ESC>");

}

// Print everything else as a hex code for debugging

else {

Serial.print("\[0x");

if (c < 0x10) Serial.print("0"); // Leading zero

Serial.print(c, HEX);

Serial.print("\]");

}

}

// 2. Safely release BUSY only after /STROBE has returned HIGH

if (character\_received) {

// Wait until the CPC finishes its strobe pulse

if (digitalRead(PIN\_STROBE) == HIGH) {

delayMicroseconds(10); // Small settling delay for cable stability

character\_received = false;

digitalWrite(PIN\_BUSY, LOW); // Signal to CPC that we are ready for the next byte

}

}

}

u/Ready_Rain_2646 — 9 days ago
▲ 17 r/Amstrad

I am trying to develop a project that will let us connect some modern USB printers to amstrad CPC. But I need help with the coding part because I'm stuck. If you are an experienced coder for pi pico please tell me.

I have finished phase 1, which is getting the amstrad's printer output as text in the serial monitor, that allowed me to develop the circuit . Circuit is some bi-directional logic level shifters between gpio of the raspberry pi and amstrad's printer port, they don't have to be bi-directional but those were cheaper and easier to replace than resistor voltage dividers and a transistor buffer. Now I'm trying to develop the second phase which is controlling a printer over a USB port using the USB host capabilities of the raspberry pi pico. However I can't get pico to print anything to the printer. I'm trying to solve this issue for the last few days, so if you can help me with the coding part of phase 2 I will be more than willing to share every detail. Also this project is just a start because the same methodology can be implemented to other computers such as commodore 64, Amiga and Atari ST.

Here is the working and tested phase 1 code:

// ==========================================

// Amstrad CPC 7-Bit Parallel Printer Capture

// ==========================================

// --- Pin Definitions ---

const int PIN_STROBE = 1; // GP1 (Physical Pin 2) - CPC Pin 1 (/STROBE)

const int DATA_PIN_START = 2; // GP2 to GP8 (Physical Pins 4-11) - CPC Pins 2-8 (D0-D6)

const int PIN_BUSY = 9; // GP9 (Physical Pin 12) - CPC Pin 10 or 11 (BUSY)

// --- Circular Buffer (FIFO) ---

// Safely passes bytes from the fast hardware interrupt to the main loop

const int BUFFER_SIZE = 512;

volatile uint8_t rx_buffer[BUFFER_SIZE];

volatile int head = 0;

volatile int tail = 0;

volatile bool character_received = false;

// --- The Hardware Interrupt (The Data Catcher) ---

// Triggers automatically on the falling edge of STROBE

void strobeTriggered() {

// 1. Instantly pull BUSY high to tell the Amstrad CPC to hold

digitalWrite(PIN_BUSY, HIGH);

// 2. Read the 7-bit data bus instantly.

// Shift right by 2 so GP2 moves to bit 0, then mask the lower 7 bits (0x7F).

uint8_t incoming_char = (gpio_get_all() >> DATA_PIN_START) & 0x7F;

// 3. Calculate the next buffer position

int next_head = (head + 1) % BUFFER_SIZE;

// 4. If buffer isn't full, push the character into the queue

if (next_head != tail) {

rx_buffer[head] = incoming_char;

head = next_head;

character_received = true;

}

}

void setup() {

// Start Serial Monitor communication at 115200 baud

Serial.begin(115200);

// Wait up to 3 seconds for Serial Monitor to open after reset

unsigned long start_wait = millis();

while (!Serial && (millis() - start_wait < 3000));

// Configure the 7 data pins (GP2 through GP8) as inputs

for (int i = DATA_PIN_START; i < DATA_PIN_START + 7; i++) {

pinMode(i, INPUT);

}

// Configure Handshake pins

pinMode(PIN_STROBE, INPUT_PULLUP);

pinMode(PIN_BUSY, OUTPUT);

digitalWrite(PIN_BUSY, LOW); // Start in "Ready" state

// Attach the interrupt to trigger on STROBE's falling edge

attachInterrupt(digitalPinToInterrupt(PIN_STROBE), strobeTriggered, FALLING);

Serial.println("=========================================================");

Serial.println(" Amstrad CPC Printerface, Phase 1 ");

Serial.println(" Circuit Design By Ege Ozpalamutcu & Code by Gemini ");

Serial.println(" Listening on GP1 (STROBE) & GP2-GP8 (DATA) & GP9 (BUSY)");

Serial.println("=========================================================");

}

void loop() {

// 1. Process characters from the circular buffer

while (tail != head) {

// Grab the oldest unread character from the queue

uint8_t c = rx_buffer[tail];

tail = (tail + 1) % BUFFER_SIZE;

// Handle standard printable ASCII

if (c >= 32 && c <= 126) {

Serial.write(c);

}

// Handle Carriage Return (CR) and Line Feed (LF) for newlines

else if (c == 13 || c == 10) {

Serial.write(c);

}

// Handle the Escape character (used for printer commands)

else if (c == 27) {

Serial.print("<ESC>");

}

// Print everything else as a hex code for debugging

else {

Serial.print("[0x");

if (c < 0x10) Serial.print("0"); // Leading zero

Serial.print(c, HEX);

Serial.print("]");

}

}

// 2. Safely release BUSY only after /STROBE has returned HIGH

if (character_received) {

// Wait until the CPC finishes its strobe pulse

if (digitalRead(PIN_STROBE) == HIGH) {

delayMicroseconds(10); // Small settling delay for cable stability

character_received = false;

digitalWrite(PIN_BUSY, LOW); // Signal to CPC that we are ready for the next byte

}

}

}

u/Ready_Rain_2646 — 9 days ago

After updating cIOS, USB loader GX stopped loading games

I was having problems where my Wii would just freeze up 5 minutes into any kind of disc intensive game. For example the angry birds trilogy was working all fine but manhunt 2 and the need for speed carbon would freeze up around 5 minutes into a game during cutscenes. I was using a new Sandisk 32gb USB stick formatted to fat32 and I was using a USB loader GX directly launched from the main menu.

The story starts here: I was wondering what could be, so I tried to boot into "configurable USB loader" but it gave an error saying "cIOS 249 is a stub" so I did some research and found that I needed to update cIOS. Then I followed an online guide.

I did everything it said, connected my Wii to the internet through my phone's hotspot, installed the d2X cIOS installer on the sd card of my Wii and did an online update of cIOS 249, 250 and 251.

Except in the video it was updating cIOS 249, 250 and 251 into a version called ...V10 beta53, however that version wasn't available in my d2X installer. Btw I got the latest version of the installer from GitHub, called V11 beta3, and updated the cIOS files to the latest possible version called ....V11 beta3 from the d2X app. Everything went smoothly during the install. However after that when I tried to launch any game from USB loader GX it would just freeze on a black screen. When I try to load a game from configurable USB loader it would get stuck in the loading screen.

What could be?

reddit.com
u/Ready_Rain_2646 — 21 days ago

How can I adapt an XT keyboard to ps/2 ?

I have a BTC keyboard that is supposed to be both AT and XT compatibles, but when I plug it into the PS/2 port of my PC via a simple adapter cable there is a 50/50 chance it will go into the AT mode and work. But the rest of the time it stays in the XT mode and doesn't work. How can I ensure it goes into the AT mode so it will be compatible with ps2

reddit.com
u/Ready_Rain_2646 — 1 month ago

Need help with PET8096 and MP32C64

I need to load programs into a PET 8096 with a MP32C64 adapter.

&#x200B;

Are there any programs released for an 80 column PET that is in mp3 or wav format?

&#x200B;

Or is there a way to convert 80 column specific .prg programs to a mp3 format?

reddit.com
u/Ready_Rain_2646 — 2 months ago
▲ 10 r/Amstrad

Have you ever heard about a SCSI interface for the CPC?

I came across this image of a proposed SCSI interface for the amstrad CPC in a forum. This was a while ago and I forgot where was that, but I just wonder is it really possible to connect SCSI devices to the amstrad cpc?

And could someone create a brand new one since the main IC here is still available for cheap amd rest of that looks like just logic IC's.

u/Ready_Rain_2646 — 3 months ago

You basically glue a long stick to the stepper motor prior to loosen the screws, then with help of stick you can make very fine adjustments. You must use hot glue so later you can take it off easily using acetone. Also you need to move the end of the stick very slightly. Technically you are moving a larger circle connected to a smaller circle so the same amount of displacement at the circumference on bigger circle will correspond into a mich smaller angular change in the small circle

u/Ready_Rain_2646 — 4 months ago