diff --git a/Emulator/Components/Paula/UART/UART.cpp b/Emulator/Components/Paula/UART/UART.cpp index b192a1bf7..82b59e5e6 100644 --- a/Emulator/Components/Paula/UART/UART.cpp +++ b/Emulator/Components/Paula/UART/UART.cpp @@ -219,6 +219,19 @@ UART::rxdHasChanged(bool value) } } +void +UART::receiveText(const string &text) +{ + { SYNCHRONIZED + + // Add the text + payload += text; + + // Start the reception process if needed + if (!agnus.hasEvent()) agnus.scheduleImm(RXD_BIT); + } +} + void UART::recordIncomingByte(int byte) { diff --git a/Emulator/Components/Paula/UART/UART.h b/Emulator/Components/Paula/UART/UART.h index 7905b5a92..6e5b5fe70 100644 --- a/Emulator/Components/Paula/UART/UART.h +++ b/Emulator/Components/Paula/UART/UART.h @@ -43,6 +43,9 @@ class UART : public SubComponent { // Bit reception counter u8 recCnt; + // Experimental + string payload; + // // Initializing @@ -153,6 +156,9 @@ class UART : public SubComponent { // Called when the RXD port pin changes it's value void rxdHasChanged(bool value); + // Experimental + void receiveText(const string &text); + private: // Called when a byte has been received diff --git a/Emulator/Components/Paula/UART/UARTEvents.cpp b/Emulator/Components/Paula/UART/UARTEvents.cpp index af65c5571..f55c8b04f 100644 --- a/Emulator/Components/Paula/UART/UARTEvents.cpp +++ b/Emulator/Components/Paula/UART/UARTEvents.cpp @@ -82,6 +82,20 @@ UART::serviceRxdEvent(EventID id) // Check if this was the last bit to receive if (recCnt >= packetLength() + 2) { + if (!payload.empty()) { + + SYNCHRONIZED + + // Overwrite the shift register contents + receiveShiftReg = payload[0]; + + // Remove the character from the buffer + payload.erase(0, 1); + + // Make sure to stop after the last character + rxd = payload.empty(); + } + // Copy shift register contents into the receive buffer copyFromReceiveShiftRegister(); trace(SER_DEBUG, "Received packet %X\n", receiveBuffer); diff --git a/Emulator/Components/Ports/SerialPort.cpp b/Emulator/Components/Ports/SerialPort.cpp index 774f54ecf..3d6361722 100644 --- a/Emulator/Components/Ports/SerialPort.cpp +++ b/Emulator/Components/Ports/SerialPort.cpp @@ -252,6 +252,12 @@ SerialPort::readOutgoingPrintableByte() } } +void +SerialPort::receiveText(const string &text) +{ + uart.receiveText(text); +} + void SerialPort::recordIncomingByte(int byte) { diff --git a/Emulator/Components/Ports/SerialPort.h b/Emulator/Components/Ports/SerialPort.h index 67e8507db..a5e33fbcd 100644 --- a/Emulator/Components/Ports/SerialPort.h +++ b/Emulator/Components/Ports/SerialPort.h @@ -163,6 +163,9 @@ class SerialPort : public SubComponent { int readIncomingPrintableByte(); int readOutgoingPrintableByte(); + // Experimental + void receiveText(const string &text); + private: // Called by the UART when a byte has been received or sent diff --git a/Emulator/Misc/RetroShell/InterpreterCmds.cpp b/Emulator/Misc/RetroShell/InterpreterCmds.cpp index 3e915de07..6d88af848 100644 --- a/Emulator/Misc/RetroShell/InterpreterCmds.cpp +++ b/Emulator/Misc/RetroShell/InterpreterCmds.cpp @@ -1250,6 +1250,14 @@ Interpreter::initCommandShell(Command &root) amiga.configure(OPT_SER_VERBOSE, parseBool(argv[0])); }); + root.add({"serial", "send"}, { "" }, + "Sends a text to the serial port", + [this](Arguments& argv, long value) { + + printf("Sending %s\n", argv[0].c_str()); + amiga.serialPort.receiveText(argv[0]); + }); + // // Df0, Df1, Df2, Df3 diff --git a/Emulator/Misc/RetroShell/RetroShell.cpp b/Emulator/Misc/RetroShell/RetroShell.cpp index 83c206c3c..dc98eddaf 100644 --- a/Emulator/Misc/RetroShell/RetroShell.cpp +++ b/Emulator/Misc/RetroShell/RetroShell.cpp @@ -49,6 +49,9 @@ RetroShell::operator<<(char value) { storage << value; remoteManager.rshServer << value; + if (serialPort.getConfig().device == SPD_COMMANDER) { + serialPort.receiveText(string{value}); + } needsDisplay(); return *this; } @@ -58,6 +61,9 @@ RetroShell::operator<<(const string& value) { storage << value; remoteManager.rshServer << value; + if (serialPort.getConfig().device == SPD_COMMANDER) { + serialPort.receiveText(value); + } needsDisplay(); return *this; } diff --git a/Emulator/Misc/RetroShell/TextStorage.cpp b/Emulator/Misc/RetroShell/TextStorage.cpp index 4120bdbd3..6ae3d6283 100644 --- a/Emulator/Misc/RetroShell/TextStorage.cpp +++ b/Emulator/Misc/RetroShell/TextStorage.cpp @@ -66,6 +66,7 @@ TextStorage::operator<<(char c) case '\n': if (ostream) *ostream << storage.back() << std::endl; + append(""); break; diff --git a/Proxy/AmigaProxy.h b/Proxy/AmigaProxy.h index afd7fafbd..aaf4f63af 100644 --- a/Proxy/AmigaProxy.h +++ b/Proxy/AmigaProxy.h @@ -599,6 +599,8 @@ - (NSInteger)readIncomingPrintableByte; - (NSInteger)readOutgoingPrintableByte; +- (void)receiveText:(NSString *)text; + @end diff --git a/Proxy/AmigaProxy.mm b/Proxy/AmigaProxy.mm index b4ab3ee25..545259fdf 100644 --- a/Proxy/AmigaProxy.mm +++ b/Proxy/AmigaProxy.mm @@ -1203,6 +1203,11 @@ - (NSInteger)readOutgoingPrintableByte return [self serial]->readOutgoingPrintableByte(); } +- (void)receiveText:(NSString *)text +{ + [self serial]->receiveText([text UTF8String]); +} + @end diff --git a/vAmiga.xcodeproj/xcuserdata/hoff.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/vAmiga.xcodeproj/xcuserdata/hoff.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 063e253ee..cfe990925 100644 --- a/vAmiga.xcodeproj/xcuserdata/hoff.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/vAmiga.xcodeproj/xcuserdata/hoff.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -14,16 +14,6 @@ symbolName = "_NSWarnForDrawingImageWithNoCurrentContext" moduleName = ""> - - @@ -189,233 +179,6 @@ endingLineNumber = "387" landmarkName = "Moira::processException(exc)" landmarkType = "7"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -