diff --git a/st.c b/st.c
index 034954d..77c3e8a 100644
--- a/st.c
+++ b/st.c
@@ -86,8 +86,8 @@ enum escape_state {
 
 typedef struct {
 	Glyph attr; /* current char attributes */
-	int x;
-	int y;
+	int x; /* terminal column */
+	int y; /* terminal row */
 	char state;
 } TCursor;
 
@@ -2175,12 +2175,16 @@ tstrsequence(uchar c)
 void
 tcontrolcode(uchar ascii)
 {
+	size_t i;
+
 	switch (ascii) {
 	case '\t':   /* HT */
 		tputtab(1);
 		return;
 	case '\b':   /* BS */
-		tmoveto(term.c.x-1, term.c.y);
+		for (i = 1; term.c.x && term.line[term.c.y][term.c.x - i].u == 0; ++i)
+			;
+		tmoveto(term.c.x - i, term.c.y);
 		return;
 	case '\r':   /* CR */
 		tmoveto(0, term.c.y);