diff --git a/arduino/arduino_terminal/arduino_terminal.ino b/arduino/arduino_terminal/arduino_terminal.ino index b093462..97b4ab5 100644 --- a/arduino/arduino_terminal/arduino_terminal.ino +++ b/arduino/arduino_terminal/arduino_terminal.ino @@ -5,6 +5,12 @@ * The Python Terminal Monitor or the Arduino IDE serial monitor is used to send * and receive commands to/from the Z80. * + * Seen from the PC, the terminal receives two bytes: a command byte and a value byte. + * Commands: + * 0x00 WRITE: The next byte is sent as-is to Pat80. If the terminal interface buffer + * is not empty, the new byte will replace the older one. + * 0x01 BUFFER: The terminal interface returns the number of bytes waiting to be sent. + * * Seen from the Pat80, the terminal interface has two registers: * DATA Register at addr 0x00 (\RS) contains the last received byte from the pc * DATA_AVAILABLE Register at addr 0x01 (RS) contains the number of bytes in the buffer, @@ -17,6 +23,9 @@ // RS 12 // Input, low = DATA register, high = DATA_AVAILABLE register // DATA BUS (Input/Output, active high): 3, 4, 5, 6, 7, 8, 9, 10; +const byte COMMAND_WRITE = 0x00; +const byte COMMAND_BUFFER = 0x01; + byte incomingBuffer = 0; // Incoming from computer, to the Pat80 byte outgoingBuffer = 0; // Outgoing to computer, from the Pat80 byte availableBytes = 0; // Available bytes in the incoming buffer (for the DATA_AVAILABLE register) @@ -33,9 +42,17 @@ void setup() { void loop() { if (Serial.available() > 0) { - incomingBuffer = Serial.read(); - availableBytes = 1; // TODO: Implement a 256 byte buffer and store the avail bytes number in this var + switch (Serial.read()) { + case COMMAND_WRITE: + incomingBuffer = Serial.read(); + availableBytes = 1; // TODO: Implement a 256 byte buffer and store the avail bytes number in this var + break; + case COMMAND_BUFFER: + Serial.write(availableBytes); + break; + } } + if (outgoingBuffer != 0) { if ((outgoingBuffer >= 8 && outgoingBuffer <= 13) || (outgoingBuffer >= 32 && outgoingBuffer <= 127)) { // Printable character