§ Описание алгоритма

Это — далеко не самый оптимальный алгоритм, но с его помощью экран скроллится красиво. Вообще суть этого алгоритма в том, чтобы пройти слева направо, сверху вниз по всем знакоместам и поднять их наверх, то есть, как бы это было, если бы это был скроллер экрана, который реализован в текстовом режиме для x86 процессоров, ну или VGA адаптеров, если так можно сказать.

§ Код скроллера

scroll:     push    hl
            push    de
            push    bc
            push    af

            ; Перемотка экрана наверх
            ld      hl, $4000
            ld      de, $4020
            ld      a, 3
            ld      c, 0
.n3:        push    af
.n2:        ld      b, 8
            push    de              ; Сохранить DE/HL
            push    hl
.n1:        ld      a, (de)         ; Скопировать букву
            ld      (hl), a
            inc     h
            inc     d
            djnz    .n1
            pop     hl              ; Восстановить HL/DE
            pop     de
            inc     hl
            inc     de
            ld      a, e
            and     a
            jr      nz, .x1
            ld      a, d
            add     7
            ld      d, a
.x1:        dec     c
            jr      nz, .n2
            ld      a, h
            add     7
            ld      h, a
            pop     af
            cp      2
            jr      nz, .x2
            ld      c, $e0
.x2:        dec     a
            jr      nz, .n3

            ; Очистка нижней строки
            xor     a
            ld      h, $50  ; Банк
            ld      c, $08  ; 8 строк
.m2:        ld      l, $e0  ; 7-я строка
            ld      b, $20  ; 32 символа
.m1:        ld      (hl), a ; Удалить область
            inc     hl
            djnz    .m1
            dec     c       ; Здесь будет H++
            jr      nz, .m2

            ; Сдвиг атрибутов
            ld      bc, 768-32
            ld      e, $20
.m3:        ex      de, hl
            ldir
            ex      de, hl

            ; Заполнить нижнюю строку атрибутов
            ld      b, $20
            ld      a, (PTR_COLOR_DEF)
.m4:        ld      (hl), a
            inc     hl
            djnz    .m4

            pop     af
            pop     bc
            pop     de
            pop     hl
            ret