diff --git a/src/Home/Telnet/Telnet.ZC b/src/Home/Telnet/Telnet.ZC index fc2097b9..82924aa0 100755 --- a/src/Home/Telnet/Telnet.ZC +++ b/src/Home/Telnet/Telnet.ZC @@ -26,13 +26,15 @@ U0 HandleControlCodes(U8 ch) { case 0: // NUL (Null) - Typically ignored break; case 7: // BEL (Bell) - // Beep; + Beep; break; case 8: // BS (Backspace) - "%c%c%c", 8, ' ', 8; // Move cursor back, erase character, move cursor back again + // "%c%c%c", 8, ' ', 8; // Move cursor back, erase character, move cursor back again + "$$CM,-8,0$$"; break; case 9: // HT (Horizontal Tab) - " "; // 8 spaces + // " "; // 8 spaces + "$$CM,8,0$$"; break; case 10: // LF (Line Feed) "\n"; @@ -117,9 +119,9 @@ U0 InputTask(U0 *args) { TCPSocketSendString(sock, 0x27); break; } - else if (ch == CH_BACKSPACE) { - break; - } + // else if (ch == CH_BACKSPACE) { + // break; + // } else if (ch == 0x0F) { // TAB? TCPSocketSendString(sock, 0x09); break; @@ -366,7 +368,7 @@ U0 Telnet(U8 *host, U16 port=TELNET_PORT) { // Not sure if really should do -1... if (row > window_height) - row = window_heigh-1; + row = window_height-1; if (col > window_width) col = window_width-1; @@ -375,7 +377,7 @@ U0 Telnet(U8 *host, U16 port=TELNET_PORT) { ptr++; break; case 'J': - // SysLog("J code\n"); + // SysLog("J code, %d %d\n", ansi_param_count, ansi_code[0]); // Erase in Display if (ansi_code[0] == 0) { // Erase from cursor to end of display @@ -433,8 +435,16 @@ U0 Telnet(U8 *host, U16 port=TELNET_PORT) { switch (code) { case 25: - // if (*ptr == 'l') SysLog("code 25l\n");// Hide cursor - // if (*ptr == 'h') SysLog("code 25h\n");// Show cursor + if (*ptr == 'l') { + // Hide cursor + // SysLog("code 25l\n"); + DocCursor(OFF); + } + if (*ptr == 'h') { + // Show cursor + // SysLog("code 25h\n"); + DocCursor(ON); + } ptr++; // Move past 'l' or 'h' break; case 47: diff --git a/src/Home/Telnet/TelnetNegotiation.ZC b/src/Home/Telnet/TelnetNegotiation.ZC index 20814422..45f8c0d6 100644 --- a/src/Home/Telnet/TelnetNegotiation.ZC +++ b/src/Home/Telnet/TelnetNegotiation.ZC @@ -1,3 +1,52 @@ +#define IAC 0xFF +#define WILL 0xFB +#define WONT 0xFC +#define DO 0xFD +#define DONT 0xFE +#define ECHO 0x01 +#define SUPPRESS_GO_AHEAD 0x03 +#define TERMINAL_TYPE 0x18 +#define LINEMODE 0x22 +#define NAWS 0x1F // (Negotiate About Window Size) +#define IS 0x00 +#define SB 0xFA +#define SE 0xF0 + +U0 SendWindowSize(I64 sock, U16 rows, U16 cols) { + U8 buf[9]; + + buf[0] = IAC; + buf[1] = SB; + buf[2] = NAWS; + buf[3] = cols >> 8; // High byte of columns + buf[4] = cols & 0xFF; // Low byte of columns + buf[5] = rows >> 8; // High byte of rows + buf[6] = rows & 0xFF; // Low byte of rows + buf[7] = IAC; + buf[8] = SE; + + SysLog("SendWindowSize: %d x %d\n", cols, rows); + TCPSocketSendString(sock, buf); +} + +U0 SendTerminalType(I64 sock, U8 *terminal_type) { + U8 response[256]; + I64 len = StrLen(terminal_type); + + response[0] = IAC; + response[1] = SB; + response[2] = TERMINAL_TYPE; + response[3] = IS; + MemCopy(response + 4, terminal_type, len); + + SysLog("SendTerminalType: %s\n", terminal_type); + + response[len + 4] = IAC; + response[len + 5] = SE; + response[len + 6] = '\0'; + TCPSocketSendString(sock, response); +} + U0 TelnetNegotiate() { U8 negotiation_code = *(ptr + 1);