diff --git a/src/conio/cterm.c b/src/conio/cterm.c
index e74d1e63001499b9f80319d4633579528b99dfc0..6f76a208f2e55841dc5af2f768443aa39c8ddf66 100644
--- a/src/conio/cterm.c
+++ b/src/conio/cterm.c
@@ -1126,10 +1126,10 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 							p2=cterm->escbuf+2;
 							GETTEXTINFO(&ti);
 							i=GETVIDEOFLAGS();
-							if(p2>p) {
+							if(!*p2) {
 								/* All the save stuff... */
-								cterm->saved_mode_mask |= (CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_DOORWAY|CTERM_SAVEMODE_ORIGIN);
-								cterm->saved_mode &= ~(CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_DOORWAY|CTERM_SAVEMODE_ORIGIN);
+								cterm->saved_mode_mask |= (CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_ORIGIN);
+								cterm->saved_mode &= ~(CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_ORIGIN);
 								cterm->saved_mode |= (cterm->autowrap)?CTERM_SAVEMODE_AUTOWRAP:0;
 								cterm->saved_mode |= (cterm->cursor==_NORMALCURSOR)?CTERM_SAVEMODE_CURSOR:0;
 								cterm->saved_mode |= (i&CIOLIB_VIDEO_ALTCHARS)?CTERM_SAVEMODE_ALTCHARS:0;
@@ -1137,57 +1137,51 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 								cterm->saved_mode |= (i&CIOLIB_VIDEO_BGBRIGHT)?CTERM_SAVEMODE_BGBRIGHT:0;
 								cterm->saved_mode |= (i&CIOLIB_VIDEO_BLINKALTCHARS)?CTERM_SAVEMODE_BLINKALTCHARS:0;
 								cterm->saved_mode |= (i&CIOLIB_VIDEO_NOBLINK)?CTERM_SAVEMODE_NOBLINK:0;
-								cterm->saved_mode |= (cterm->doorway_mode)?CTERM_SAVEMODE_DOORWAY:0;
 								cterm->saved_mode |= (cterm->origin_mode)?CTERM_SAVEMODE_ORIGIN:0;
 								break;
 							}
 							while((p=strtok(p2,";"))!=NULL) {
 								p2=NULL;
-								if(!strcmp(cterm->escbuf,"?6")) {
+								if(!strcmp(p,"6")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_ORIGIN;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_ORIGIN);
 									cterm->saved_mode |= cterm->origin_mode?CTERM_SAVEMODE_ORIGIN:0;
 								}
-								if(!strcmp(cterm->escbuf,"?7")) {
+								if(!strcmp(p,"7")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_AUTOWRAP;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT);
 									cterm->saved_mode |= cterm->autowrap?CTERM_SAVEMODE_AUTOWRAP:0;
 								}
-								if(!strcmp(cterm->escbuf,"?25")) {
+								if(!strcmp(p,"25")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_CURSOR;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_CURSOR);
 									cterm->saved_mode |= (cterm->cursor==_NORMALCURSOR)?CTERM_SAVEMODE_CURSOR:0;
 								}
-								if(!strcmp(cterm->escbuf,"?31")) {
+								if(!strcmp(p,"31")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_ALTCHARS;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_ALTCHARS);
 									cterm->saved_mode |= (i&CIOLIB_VIDEO_ALTCHARS)?CTERM_SAVEMODE_ALTCHARS:0;
 								}
-								if(!strcmp(cterm->escbuf,"?32")) {
+								if(!strcmp(p,"32")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_NOBRIGHT;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_NOBRIGHT);
 									cterm->saved_mode |= (i&CIOLIB_VIDEO_NOBRIGHT)?CTERM_SAVEMODE_NOBRIGHT:0;
 								}
-								if(!strcmp(cterm->escbuf,"?33")) {
+								if(!strcmp(p,"33")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_BGBRIGHT;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_BGBRIGHT);
 									cterm->saved_mode |= (i&CIOLIB_VIDEO_BGBRIGHT)?CTERM_SAVEMODE_BGBRIGHT:0;
 								}
-								if(!strcmp(cterm->escbuf,"?34")) {
+								if(!strcmp(p,"34")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_BLINKALTCHARS;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_BLINKALTCHARS);
 									cterm->saved_mode |= (i&CIOLIB_VIDEO_BLINKALTCHARS)?CTERM_SAVEMODE_BLINKALTCHARS:0;
 								}
-								if(!strcmp(cterm->escbuf,"?35")) {
+								if(!strcmp(p,"35")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_NOBLINK;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_NOBLINK);
 									cterm->saved_mode |= (i&CIOLIB_VIDEO_NOBLINK)?CTERM_SAVEMODE_NOBLINK:0;
 								}
-								if(!strcmp(cterm->escbuf,"=255")) {
-									cterm->saved_mode_mask |= CTERM_SAVEMODE_DOORWAY;
-									cterm->saved_mode &= ~(CTERM_SAVEMODE_DOORWAY);
-									cterm->saved_mode |= (cterm->doorway_mode)?CTERM_SAVEMODE_DOORWAY:0;
-								}
 							}
 						}
 						break;
@@ -1197,7 +1191,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 							p2=cterm->escbuf+2;
 							GETTEXTINFO(&ti);
 							i=GETVIDEOFLAGS();
-							if(p2>p) {
+							if(!*p2) {
 								/* All the save stuff... */
 								if(cterm->saved_mode_mask & CTERM_SAVEMODE_ORIGIN)
 									cterm->origin_mode=(cterm->saved_mode & CTERM_SAVEMODE_ORIGIN) ? true : false;
@@ -1237,32 +1231,26 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 									else
 										i &= ~CIOLIB_VIDEO_BGBRIGHT;
 								}
-								if(cterm->saved_mode_mask & CTERM_SAVEMODE_DOORWAY) {
-									if(cterm->saved_mode & CTERM_SAVEMODE_DOORWAY)
-										cterm->doorway_mode = 1;
-									else
-										cterm->doorway_mode = 0;
-								}
 								SETVIDEOFLAGS(i);
 								break;
 							}
 							while((p=strtok(p2,";"))!=NULL) {
 								p2=NULL;
-								if(!strcmp(cterm->escbuf,"?6")) {
+								if(!strcmp(p,"6")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_ORIGIN)
 										cterm->origin_mode=(cterm->saved_mode & CTERM_SAVEMODE_ORIGIN) ? true : false;
 								}
-								if(!strcmp(cterm->escbuf,"?7")) {
+								if(!strcmp(p,"7")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_AUTOWRAP)
 										cterm->autowrap=(cterm->saved_mode & CTERM_SAVEMODE_AUTOWRAP) ? true : false;
 								}
-								if(!strcmp(cterm->escbuf,"?25")) {
+								if(!strcmp(p,"25")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_CURSOR) {
 										cterm->cursor = (cterm->saved_mode & CTERM_SAVEMODE_CURSOR) ? _NORMALCURSOR : _NOCURSOR;
 										SETCURSORTYPE(cterm->cursor);
 									}
 								}
-								if(!strcmp(cterm->escbuf,"?31")) {
+								if(!strcmp(p,"31")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_ALTCHARS) {
 										if(cterm->saved_mode & CTERM_SAVEMODE_ALTCHARS)
 											i |= CIOLIB_VIDEO_ALTCHARS;
@@ -1271,7 +1259,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 										SETVIDEOFLAGS(i);
 									}
 								}
-								if(!strcmp(cterm->escbuf,"?32")) {
+								if(!strcmp(p,"32")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_NOBRIGHT) {
 										if(cterm->saved_mode & CTERM_SAVEMODE_NOBRIGHT)
 											i |= CIOLIB_VIDEO_NOBRIGHT;
@@ -1280,7 +1268,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 										SETVIDEOFLAGS(i);
 									}
 								}
-								if(!strcmp(cterm->escbuf,"?33")) {
+								if(!strcmp(p,"33")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_BGBRIGHT) {
 										if(cterm->saved_mode & CTERM_SAVEMODE_BGBRIGHT)
 											i |= CIOLIB_VIDEO_BGBRIGHT;
@@ -1289,7 +1277,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 										SETVIDEOFLAGS(i);
 									}
 								}
-								if(!strcmp(cterm->escbuf,"?34")) {
+								if(!strcmp(p,"34")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_BLINKALTCHARS) {
 										if(cterm->saved_mode & CTERM_SAVEMODE_BLINKALTCHARS)
 											i |= CIOLIB_VIDEO_BLINKALTCHARS;
@@ -1298,7 +1286,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 										SETVIDEOFLAGS(i);
 									}
 								}
-								if(!strcmp(cterm->escbuf,"?35")) {
+								if(!strcmp(p,"35")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_NOBLINK) {
 										if(cterm->saved_mode & CTERM_SAVEMODE_NOBLINK)
 											i |= CIOLIB_VIDEO_NOBLINK;
@@ -1307,10 +1295,6 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 										SETVIDEOFLAGS(i);
 									}
 								}
-								if(!strcmp(cterm->escbuf,"=255")) {
-									if(cterm->saved_mode_mask & CTERM_SAVEMODE_DOORWAY)
-										cterm->autowrap=(cterm->saved_mode & CTERM_SAVEMODE_DOORWAY) ? 1 : 0;
-								}
 							}
 						}
 						break;
diff --git a/src/conio/cterm.h b/src/conio/cterm.h
index 62da8dbd3655fd31464bba6898d7c13b076c2054..bce91dc25188c5d152bc59eee2e2ceff533a949c 100644
--- a/src/conio/cterm.h
+++ b/src/conio/cterm.h
@@ -98,7 +98,7 @@ struct cterminal {
 #define	CTERM_SAVEMODE_ALTCHARS			0x004
 #define CTERM_SAVEMODE_NOBRIGHT			0x008
 #define CTERM_SAVEMODE_BGBRIGHT			0x010
-#define CTERM_SAVEMODE_DOORWAY			0x020
+	// 0x010 was CTERM_SAVEMODE_DOORWAY
 #define CTERM_SAVEMODE_ORIGIN			0x040
 #define	CTERM_SAVEMODE_BLINKALTCHARS	0x080
 #define CTERM_SAVEMODE_NOBLINK			0x100
diff --git a/src/conio/cterm.txt b/src/conio/cterm.txt
index 00268e8197a8055ffa29dc28d40acdf303a82dc8..cd258bb39ca839f1c88ab1f44fce28697637c42a 100644
--- a/src/conio/cterm.txt
+++ b/src/conio/cterm.txt
@@ -646,9 +646,13 @@ CSI [ p1 ] n
 CSI ? [ p1 [ pX ... ] ] s
 	NON-STANDARD EXTENSION
 	Save Mode Setting
-	Saves the current mode states as specified by CSI l and CSI h.  If
+	Saves the current mode states as specified by CSI ? l and CSI ? h.  If
 	p1 is omitted, saves all such states.  If pX is included, saves only
-	the specified states (arguments to CSI l/h).
+	the specified states (arguments to CSI ? l/h).
+
+	Note that currently, CSI ? s with no parameters will save the doorway
+        mode state, which can't be specified with a parameter (since it's set
+        using CSI = 255 h, not CSI ? 255 h).
 
 	SOURCE: SyncTERM only
 
@@ -664,9 +668,13 @@ CSI s
 CSI ? [ p1 [ pX ... ] ]  u
 	NON-STANDARD EXTENSION
 	Restore Mode Setting
-	Saves the current mode states as specified by CSI l and CSI h.  If
+	Saves the current mode states as specified by CSI ? l and CSI ? h.  If
 	p1 is omitted, saves all such states.  If pX is included, restores
-	all the specified states (arguments to CSI l/h)
+	all the specified states (arguments to CSI ? l/h)
+
+	Note that currently, CSI ? u with no parameters will restore the
+	doorway mode state, which can't be specified with a parameter (since
+	it's set using CSI = 255 h, not CSI ? 255 h).
 
 	SOURCE: SyncTERM only