backspace fixed

This commit is contained in:
y4my4my4m 2023-05-14 04:47:33 +09:00
parent 1fe467a1cf
commit 5862425d45
2 changed files with 146 additions and 39 deletions

View file

@ -20,7 +20,7 @@ Cd(__DIR__);;
// If you're using a custom palette, the colors might not seem right. // If you're using a custom palette, the colors might not seem right.
CBGR24 original_palette[COLORS_NUM]; CBGR24 original_palette[COLORS_NUM];
Bool dark_mode = FALSE; Bool dark_mode = TRUE; // since ZealOS is dark by default
Bool original_colors = FALSE; Bool original_colors = FALSE;
Bool force_disconnect = FALSE; Bool force_disconnect = FALSE;
@ -53,7 +53,7 @@ U0 HandleControlCodes(U8 ch) {
break; break;
case 8: // BS (Backspace) 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
DocPrint(term.doc, "$$CM,-8,0$$"); DocPrint(term.doc, "$$CM,-1,0$$");
break; break;
case 9: // HT (Horizontal Tab) case 9: // HT (Horizontal Tab)
// " "; // 8 spaces // " "; // 8 spaces
@ -66,7 +66,9 @@ U0 HandleControlCodes(U8 ch) {
SysLog("Vertical Tab\n"); SysLog("Vertical Tab\n");
break; break;
case 12: // FF (Form Feed) case 12: // FF (Form Feed)
SysLog("form feed");
DocClear(term.doc); DocClear(term.doc);
// DocPrint(term.doc, "\f");
break; break;
case 13: // CR (Carriage Return) case 13: // CR (Carriage Return)
DocPrint(term.doc, "\r"); DocPrint(term.doc, "\r");
@ -108,7 +110,7 @@ U0 HandleControlCodes(U8 ch) {
default: default:
// some ch make Zeal crash or behave weird because they're commands? // some ch make Zeal crash or behave weird because they're commands?
// SysLog("CC %c happened\n", ch); // SysLog("CC %c happened\n", ch);
SysLog("CC happened\n"); SysLog("CC 0x%X happened\n", ch);
break; break;
} }
} }
@ -487,18 +489,20 @@ U0 ANSIParse()
ptr++; ptr++;
break; break;
} }
// SysLog("H or f AFTER row:%d, col:%d, cnt:%d\n", row, col, ansi_param_count); // row--;
// col--;
SysLog("H or f row:%d, col:%d, cnt:%d\n", row, col, ansi_param_count);
if (row > term.window_height) // if (row > term.window_height)
row = term.window_height-1; // row = term.window_height-1;
if (col > term.window_width) // else if (col > term.window_width)
col = term.window_width-1; // col = term.window_width-1;
// "$$CM,0,0$$"; // "$$CM,0,0$$";
DocPrint(term.doc, "$$CM+LX+TY,LE=%d,RE=%d$$", col-1, row-1); DocPrint(term.doc, "$$CM+LX+TY,LE=%d,RE=%d$$", col-1, row-1);
ptr++; ptr++;
break; break;
case 'J': case 'J':
// SysLog("J code, %d %d\n", ansi_param_count, ansi_code[0]); SysLog("J code, %d %d\n", ansi_param_count, ansi_code[0]);
// Erase in Display // Erase in Display
if (ansi_code[0] == 0) { if (ansi_code[0] == 0) {
// Erase from cursor to end of display // Erase from cursor to end of display
@ -534,6 +538,7 @@ U0 ANSIParse()
break; break;
case 'L': case 'L':
SysLog("L code\n"); SysLog("L code\n");
// DocPrint(term.doc, "\n");
ptr++; ptr++;
break; break;
case 'S': case 'S':
@ -601,13 +606,37 @@ U0 ANSIParse()
SysLog("h or l case \n"); SysLog("h or l case \n");
ptr++; // Skip 'h' or 'l' ptr++; // Skip 'h' or 'l'
break; break;
case 't':
// for (m = 0; m <= ansi_param_count; m++) {
// // SysLog("ansi_code[%d]: %d\n", m, ansi_code[m]);
// }
if (ansi_param_count == 3) {
if (ansi_code[0] == 8) {
term.window_width = ansi_code[1];
term.window_height = ansi_code[2];
Fs->win_width = term.window_width;
WinHorz((TEXT_COLS / 2) - (Fs->win_width / 2),
(TEXT_COLS / 2) - (Fs->win_width / 2) +
(Fs->win_width - 1),
Fs);
Fs->win_height = term.window_height;
WinVert((TEXT_ROWS / 2) - (Fs->win_height / 2),
(TEXT_ROWS / 2) - (Fs->win_height / 2) +
(Fs->win_height - 1),
Fs);
}
}
ptr++;
break;
case '=': case '=':
SysLog("ScreenMode attempt\n"); SysLog("ScreenMode attempt\n");
ptr++; ptr++;
break; break;
default: default:
if(!IsDigit(*ptr)) { // if(!IsDigit(*ptr)) {
SysLog("Unknown code: %c\n", *ptr); if(*ptr > 32) {
SysLog("Unknown code: 0x%X\n", *ptr);
} }
ptr++; ptr++;
break; break;
@ -774,8 +803,32 @@ init_connection:
default: default:
break; break;
} }
case 255:
switch (sc.u8[0])
{
case SC_PAGE_UP: if (term.sock_ready) TCPSocketSendString(term.sock, "\033[V"); break;
case SC_PAGE_DOWN:if (term.sock_ready) TCPSocketSendString(term.sock, "\033[U"); break;
case SC_HOME: if (term.sock_ready) TCPSocketSendString(term.sock, "\033[H"); break;
case SC_END: if (term.sock_ready) TCPSocketSendString(term.sock, "\033[K"); break;
case SC_DELETE: if (term.sock_ready) TCPSocketSendString(term.sock, "\x7F"); break;
case SC_F1: if (term.sock_ready) TCPSocketSendString(term.sock, "\033OP"); break;
case SC_F2: if (term.sock_ready) TCPSocketSendString(term.sock, "\033OQ"); break;
case SC_F3: if (term.sock_ready) TCPSocketSendString(term.sock, "\033OR"); break;
case SC_F4: if (term.sock_ready) TCPSocketSendString(term.sock, "\033OS"); break;
case SC_F5: if (term.sock_ready) TCPSocketSendString(term.sock, "\033Ot"); break;
case SC_F6: if (term.sock_ready) TCPSocketSendString(term.sock, "\033[17~"); break;
case SC_F7: if (term.sock_ready) TCPSocketSendString(term.sock, "\033[18~"); break;
case SC_F8: if (term.sock_ready) TCPSocketSendString(term.sock, "\033[19~"); break;
case SC_F9: if (term.sock_ready) TCPSocketSendString(term.sock, "\033[20~"); break;
case SC_F10: if (term.sock_ready) TCPSocketSendString(term.sock, "\033[21~"); break;
case SC_F11: if (term.sock_ready) TCPSocketSendString(term.sock, "\033[23~"); break;
case SC_F12: if (term.sock_ready) TCPSocketSendString(term.sock, "\033[24~"); break;
default:
break;
}
case CH_BACKSPACE: case CH_BACKSPACE:
if (term.sock_ready) TCPSocketSendString(term.sock, "\x08"); if (term.sock_ready) TCPSocketSendString(term.sock, "\x7F");
break; break;
case CH_ESC: case CH_ESC:
if (term.sock_ready) TCPSocketSendString(term.sock, "\x1B"); if (term.sock_ready) TCPSocketSendString(term.sock, "\x1B");

View file

@ -12,15 +12,33 @@
#define SB 0xFA #define SB 0xFA
#define SE 0xF0 #define SE 0xF0
U0 SendWindowSize(I64 sock, U16 rows, U16 cols) { // #define TELNET_IAC 255 /* 0xff - Interpret as command */
// #define TELNET_DONT 254 /* 0xfe - Don't do option */
// #define TELNET_DO 253 /* 0xfd - Do option */
// #define TELNET_WONT 252 /* 0xfc - Won't do option */
// #define TELNET_WILL 251 /* 0xfb - Will do option */
// #define TELNET_SB 250 /* 0xfa - sub-negotiation */
// #define TELNET_GA 249 /* 0xf9 - Go ahead */
// #define TELNET_EL 248 /* 0xf8 - Erase line */
// #define TELNET_EC 247 /* 0xf7 - Erase char */
// #define TELNET_AYT 246 /* 0xf6 - Are you there? */
// #define TELNET_AO 245 /* 0xf5 - Abort output */
// #define TELNET_IP 244 /* 0xf4 - Interrupt process */
// #define TELNET_BRK 243 /* 0xf3 - Break */
// #define TELNET_SYNC 242 /* 0xf2 - Data mark */
// #define TELNET_NOP 241 /* 0xf1 - No operation */
U0 SendWindowSize(I64 sock, U16 rows, U16 cols)
{
U8 buf[9]; U8 buf[9];
buf[0] = IAC; buf[0] = IAC;
buf[1] = SB; buf[1] = SB;
buf[2] = NAWS; buf[2] = NAWS;
buf[3] = cols >> 8; // High byte of columns buf[3] = cols >> 8; // High byte of columns
buf[4] = cols & 0xFF; // Low byte of columns buf[4] = cols & 0xFF; // Low byte of columns
buf[5] = rows >> 8; // High byte of rows buf[5] = rows >> 8; // High byte of rows
buf[6] = rows & 0xFF; // Low byte of rows buf[6] = rows & 0xFF; // Low byte of rows
buf[7] = IAC; buf[7] = IAC;
buf[8] = SE; buf[8] = SE;
@ -29,7 +47,8 @@ U0 SendWindowSize(I64 sock, U16 rows, U16 cols) {
TCPSocketSendString(sock, buf); TCPSocketSendString(sock, buf);
} }
U0 SendTerminalType(I64 sock, U8 *terminal_type) { U0 SendTerminalType(I64 sock, U8 *terminal_type)
{
U8 response[256]; U8 response[256];
I64 len = StrLen(terminal_type); I64 len = StrLen(terminal_type);
@ -56,49 +75,84 @@ U0 TelnetNegotiate(I64 sock, U8 ptr)
U8 response[4]; U8 response[4];
response[0] = IAC; response[0] = IAC;
if (negotiation_code == DO || negotiation_code == DONT) { if (negotiation_code == DO || negotiation_code == DONT)
if (option_code == ECHO) { {
if (negotiation_code == DO) { if (option_code == ECHO)
{
if (negotiation_code == DO)
{
response[1] = WILL; response[1] = WILL;
} else { }
else
{
response[1] = WONT; response[1] = WONT;
} }
} else if (option_code == SUPPRESS_GO_AHEAD) { }
if (negotiation_code == DO) { else if (option_code == SUPPRESS_GO_AHEAD)
{
if (negotiation_code == DO)
{
response[1] = WILL; response[1] = WILL;
} else { }
else
{
response[1] = WONT; response[1] = WONT;
} }
} else if (option_code == TERMINAL_TYPE) { }
if (negotiation_code == DO) { else if (option_code == TERMINAL_TYPE)
{
if (negotiation_code == DO)
{
response[1] = WILL; response[1] = WILL;
} else { }
else
{
response[1] = WONT; response[1] = WONT;
} }
} else if (option_code == NAWS) { }
if (negotiation_code == DO) { else if (option_code == NAWS)
{
if (negotiation_code == DO)
{
response[1] = WILL; response[1] = WILL;
} else { }
else
{
response[1] = WONT; response[1] = WONT;
} }
} else if (option_code == LINEMODE) { }
if (negotiation_code == DO) { else if (option_code == LINEMODE)
{
if (negotiation_code == DO)
{
response[1] = WILL; response[1] = WILL;
} else { }
else
{
response[1] = WONT; response[1] = WONT;
} }
} else { }
else
{
response[1] = WONT; response[1] = WONT;
} }
} else { }
else
{
response[1] = DONT; response[1] = DONT;
} }
response[2] = option_code; response[2] = option_code;
response[3] = '\0'; response[3] = '\0';
// TCPSocketSendString(sock, response);
// the bugged out SendTerminalType and SendWindowsSize was what crashed the BBS... if (term.sock_ready)
// if (option_code == TERMINAL_TYPE) SendTerminalType(sock, "ANSI-BBS"); {
// else if (option_code == NAWS) SendWindowSize(sock, 25, 80); TCPSocketSendString(sock, response);
// the bugged out SendTerminalType and SendWindowsSize was what crashed the BBS...
if (option_code == TERMINAL_TYPE) SendTerminalType(sock, "ANSI-BBS");
else if (option_code == NAWS) SendWindowSize(sock, 25, 80);
// TCPSocketSendString(term.sock, "\xdb\b \xdb\b \xdb\b[\xdb\b[\xdb\b \xdb\bM\xdb\ba\xdb\bi\xdb\bn\xdb\bt\xdb\be\xdb\bn\xdb\ba\xdb\bn\xdb\bc\xdb\be\xdb\b \xdb\bC\xdb\bo\xdb\bm\xdb\bp\xdb\bl\xdb\be\xdb\bt\xdb\be\xdb\b \xdb\b]\xdb\b]\xdb\b \b\r\n\r\n\x1b[0m\x1b[2J\r\n\r\n\x1b[0;1;30mHX Force retinal scan in progress ... \x1b[0;0;30m");
// TCPSocketSendString(term.sock, "\033[s\033[99B\033[99B\033[99B_\033[99C\033[99C\033[99C_\033[6n\033[u\033[0m_\033[2J\033[H");
}
ptr += 3; ptr += 3;
} }