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

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

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

1scroll:     push    hl
2            push    de
3            push    bc
4            push    af
5
6            ; Перемотка экрана наверх
7            ld      hl, $4000
8            ld      de, $4020
9            ld      a, 3
10            ld      c, 0
11.n3:        push    af
12.n2:        ld      b, 8
13            push    de              ; Сохранить DE/HL
14            push    hl
15.n1:        ld      a, (de)         ; Скопировать букву
16            ld      (hl), a
17            inc     h
18            inc     d
19            djnz    .n1
20            pop     hl              ; Восстановить HL/DE
21            pop     de
22            inc     hl
23            inc     de
24            ld      a, e
25            and     a
26            jr      nz, .x1
27            ld      a, d
28            add     7
29            ld      d, a
30.x1:        dec     c
31            jr      nz, .n2
32            ld      a, h
33            add     7
34            ld      h, a
35            pop     af
36            cp      2
37            jr      nz, .x2
38            ld      c, $e0
39.x2:        dec     a
40            jr      nz, .n3
41
42            ; Очистка нижней строки
43            xor     a
44            ld      h, $50  ; Банк
45            ld      c, $08  ; 8 строк
46.m2:        ld      l, $e0  ; 7-я строка
47            ld      b, $20  ; 32 символа
48.m1:        ld      (hl), a ; Удалить область
49            inc     hl
50            djnz    .m1
51            dec     c       ; Здесь будет H++
52            jr      nz, .m2
53
54            ; Сдвиг атрибутов
55            ld      bc, 768-32
56            ld      e, $20
57.m3:        ex      de, hl
58            ldir
59            ex      de, hl
60
61            ; Заполнить нижнюю строку атрибутов
62            ld      b, $20
63            ld      a, (PTR_COLOR_DEF)
64.m4:        ld      (hl), a
65            inc     hl
66            djnz    .m4
67
68            pop     af
69            pop     bc
70            pop     de
71            pop     hl
72            ret