diff --git a/src/conio/bitmap_con.c b/src/conio/bitmap_con.c
index aca70a59dbdb81cf7549906150a1eca6e00f5bc3..2fb244ccef5d93ba43796844fa360302e9792d7a 100644
--- a/src/conio/bitmap_con.c
+++ b/src/conio/bitmap_con.c
@@ -400,7 +400,7 @@ int bitmap_movetext(int x, int y, int ex, int ey, int tox, int toy)
 	int width=ex-x+1;
 	int height=ey-y+1;
 	struct vstat_vmem *vmem_ptr;
-	size_t sdestoffset;
+	int32_t sdestoffset;
 	size_t ssourcepos;
 	int32_t screeny;
 
@@ -427,19 +427,19 @@ int bitmap_movetext(int x, int y, int ex, int ey, int tox, int toy)
 	pthread_mutex_lock(&screenlock);
 	vmem_ptr = lock_vmem(&vstat);
 	for(cy=(direction==-1?(height-1):0); cy<height && cy>=0; cy+=direction) {
-		sourcepos=((y-1)+cy)*cio_textinfo.screenwidth+(x-1);
 		memmove(&(vmem_ptr->vmem[sourcepos+destoffset]), &(vmem_ptr->vmem[sourcepos]), sizeof(vmem_ptr->vmem[0])*width);
 		memmove(&(vmem_ptr->fgvmem[sourcepos+destoffset]), &(vmem_ptr->fgvmem[sourcepos]), sizeof(vmem_ptr->fgvmem[0])*width);
 		memmove(&(vmem_ptr->bgvmem[sourcepos+destoffset]), &(vmem_ptr->bgvmem[sourcepos]), sizeof(vmem_ptr->bgvmem[0])*width);
+		sourcepos += direction * cio_textinfo.screenwidth;
 	}
-	if (vstat.curs_row >= x && vstat.curs_row <= ex &&
-	    vstat.curs_col >= y && vstat.curs_col <= ey)
+	if (vstat.curs_row >= y && vstat.curs_row <= ey &&
+	    vstat.curs_col >= x && vstat.curs_col <= ex)
 		bitmap_draw_one_char(&vstat, vstat.curs_col, vstat.curs_row);
-	ssourcepos=(y-1)     *cio_textinfo.screenwidth*vstat.charwidth+(x-1)  *vstat.charwidth;
-	sdestoffset=(((toy-1)*cio_textinfo.screenwidth*vstat.charwidth+(tox-1)*vstat.charwidth)-ssourcepos)*vstat.charheight;
+	ssourcepos=(y-1)     *cio_textinfo.screenwidth*vstat.charwidth*vstat.charheight + (x-1)  *vstat.charwidth;
+	sdestoffset=(((toy-1)*cio_textinfo.screenwidth*vstat.charwidth*vstat.charheight + (tox-1)*vstat.charwidth)-ssourcepos);
 	for(screeny=(direction==-1?(height-1)*vstat.charheight:0); screeny<height*vstat.charheight && screeny>=0; screeny+=direction) {
-		ssourcepos=((y-1)*vstat.charheight+screeny)*cio_textinfo.screenwidth*vstat.charwidth+(x-1)*vstat.charwidth;
 		memmove(&(screen[ssourcepos+sdestoffset]), &(screen[ssourcepos]), sizeof(screen[0])*width*vstat.charwidth);
+		ssourcepos += direction * cio_textinfo.screenwidth*vstat.charwidth;
 	}
 
 	unlock_vmem(vmem_ptr);