patch 9.0.0645: CTRL-Y does not stop at line 1

Problem:    CTRL-Y does not stop at line 1. (John Marriott)
Solution:   Stop at line 1 when 'smoothscroll' is not set. (closes #11261)
diff --git a/src/move.c b/src/move.c
index dca77f7..43e3273 100644
--- a/src/move.c
+++ b/src/move.c
@@ -1485,11 +1485,14 @@
 	else
 #endif
 	{
-	    if (curwin->w_topline == 1 && curwin->w_skipcol < width1)
+	    // break when at the very top
+	    if (curwin->w_topline == 1
+			   && (!curwin->w_p_sms || curwin->w_skipcol < width1))
 		break;
 	    if (curwin->w_p_wrap && curwin->w_p_sms
-						  && curwin->w_skipcol >= width1)
+						&& curwin->w_skipcol >= width1)
 	    {
+		// scroll a screen line down
 		if (curwin->w_skipcol >= width1 + width2)
 		    curwin->w_skipcol -= width2;
 		else
@@ -1499,6 +1502,7 @@
 	    }
 	    else
 	    {
+		// scroll a text line down
 		--curwin->w_topline;
 		curwin->w_skipcol = 0;
 #ifdef FEAT_DIFF
diff --git a/src/testdir/test_scroll_opt.vim b/src/testdir/test_scroll_opt.vim
index f034d3a..876ccf2 100644
--- a/src/testdir/test_scroll_opt.vim
+++ b/src/testdir/test_scroll_opt.vim
@@ -37,6 +37,19 @@
   quit!
 endfunc
 
+func Test_CtrlE_CtrlY_stop_at_end()
+  enew
+  call setline(1, ['one', 'two'])
+  set number
+  exe "normal \<C-Y>"
+  call assert_equal(["  1 one   "], ScreenLines(1, 10))
+  exe "normal \<C-E>\<C-E>\<C-E>"
+  call assert_equal(["  2 two   "], ScreenLines(1, 10))
+
+  bwipe!
+  set nonumber
+endfunc
+
 func Test_smoothscroll_CtrlE_CtrlY()
   CheckScreendump
 
diff --git a/src/version.c b/src/version.c
index 32a9851..0cf367e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    645,
+/**/
     644,
 /**/
     643,