/* * KB interface to Z80 * njm 24 Mar 2021 * Actual version :) * * * AT328-TO-Z80 * Wait for DOUTPEND=0 * Send bits to D3 (MSb first), shift in on rising edge of D2 * When done, pull D4 LOW to set flag * * Z80: Read flag on D0 of port 0xFD * When ready, read char on port 0xFE * * * Z80-TO-AT328 * Read D7; when HIGH, char is available * shift in from D5 (MSb first) on rising edge of D6 * Then pulse D8 (0->1->0) to clear CHAR AVAILABLE flag * * Z80: write char to port 0xFB * then write (anything) to port 0xF7 to set flag * */ // interface to Z80 #define DOUTCLK 2 #define DOUT 3 #define CHARREADY 4 #define DIN 5 #define DINCLK 6 #define INSTATUS 7 #define DINDONE 8 #define DOUTPEND 9 void setup() { Serial.begin(115200); // yeah // set directions pinMode(DOUTCLK,OUTPUT); pinMode(DOUT,OUTPUT); pinMode(CHARREADY,OUTPUT); pinMode(DIN,INPUT); pinMode(DINCLK,OUTPUT); pinMode(INSTATUS,INPUT); pinMode(DINDONE,OUTPUT); pinMode(DOUTPEND,INPUT); // initial values digitalWrite(DOUTCLK,LOW); // pulse high to shift in a bit digitalWrite(CHARREADY,HIGH); // pulse low to indicate a char is ready digitalWrite(DINCLK,LOW); // same as DOUTCLK digitalWrite(DINDONE,LOW); // pulse high after done reading DIN } void loop() { // look for input from KB if (Serial.available()){ // KB char ready char c=Serial.read(); // get char sendToZ80(c); // send this out } // look for char from Z80 if (Z80CharReady()){ char c=Z80CharIn(); //if (c != 0) Serial.print(c); Serial.print(c); } } // Z80 interface code void sendToZ80(char c) { while (digitalRead(DOUTPEND)); // spin here until Z80 has read pending char // shift in the bits for (int i=7;i>=0;i--){ digitalWrite(DOUT,((1<=0;i--){ if (digitalRead(DIN)) c=c|(1<