self._upscroll_history += 1
             self._upscroll_wrapped += n_wrapped
 
-    def _calc_upscroll_history(self) -> None:
+    def scroll(self, up=True) -> None:
+        'Scrolls view down by half of display size.'
+        self._upscroll_wrapped = (
+                min(len(self._wrapped[self._display_size.y:]) - 2,
+                    self._upscroll_wrapped + self._y_pgscroll)
+                if up else max(0, self._upscroll_wrapped - self._y_pgscroll))
         self._upscroll_history = 0
         if self._upscroll_wrapped:
             idx_lowest = self._wrapped[-(self._upscroll_wrapped + 1)][0]
             self._upscroll_history = len(self._history) - (idx_lowest + 1)
 
-    def scroll_up(self) -> None:
-        'Scrolls view up by half of display size.'
-        self._upscroll_wrapped = min(
-                len(self._wrapped[self._display_size.y:]) - 2,
-                self._upscroll_wrapped + self._y_pgscroll)
-        self._calc_upscroll_history()
-
-    def scroll_down(self) -> None:
-        'Scrolls view down by half of display size.'
-        self._upscroll_wrapped = max(0,
-                                     self._upscroll_wrapped - self._y_pgscroll)
-        self._calc_upscroll_history()
-
     @property
     def wrapped(self) -> list[str]:
         'Returns display_size/scroll-appropriately wrapped selection of lines.'
         self._draw_prompt()
 
     def _cmd__scroll_up(self) -> None:
-        self._log.scroll_up()
+        self._log.scroll()
         self._draw_log()
 
     def _cmd__scroll_down(self) -> None:
-        self._log.scroll_down()
+        self._log.scroll(up=False)
         self._draw_log()
 
     def _cmd__disconnect(self, quit_msg: str = 'ircplom says bye') -> None: