/*
 * scroll — визуальная проверка скролл-примитивов libbgi (gfx_scroll_h /
 * gfx_scroll_v).  Копирует регион из НЕактивной страницы в активную со
 * сдвигом и переключает страницы.
 *
 * ДИАГНОСТИКА.  Страница 0 — диагональные полосы color=((x+y)>>3)&15
 * (любой сдвиг ломает непрерывность диагоналей; фаза по Y ловит
 * вертикальный «съезд» Port_Y-квирка).  Страница 1 — сплошной серый
 * фон-маркер: после скролла на нём проступают ровно скопированные
 * прямоугольники, по их границам видно корректность (позицию/высоту).
 *
 * Два региона в одном кадре: слева ГОРИЗОНТАЛЬНЫЙ скролл (dx>0 — картинка
 * вправо, открывается серая полоса слева), справа ВЕРТИКАЛЬНЫЙ (dy>0 —
 * вниз, открывается серая полоса сверху).  Если верт. Port_Y-квирк не
 * вылечен — правый прямоугольник съедет вниз/опустеет сверху.  Esc —
 * выход.
 */

#include <graphics.h>
#include <gfx.h>
#include <sprite.h>
#include <conio.h>

static uint8_t egapal[16 * 4];

__sfr __at (0xFE) io_border;

/* Диагональные полосы 16-цветной палитры (8-пиксельные ступени). */
static void draw_diagonals(void)
{
    int bx, by;
    for (by = 0; by < 256; by += 8)
        for (bx = 0; bx < 320; bx += 8) {
            setfillstyle(SOLID_FILL, (((bx + by) >> 3) & 15));
            bar(bx, by, bx + 7, by + 7);
        }
}

/* Регион горизонтального скролла (слева) и вертикального (справа). */
static gfx_rect_t area_h = { 0, 56, 320, 144 };
// static gfx_rect_t area_h = { 16, 48, 80, 80 };
// static gfx_rect_t area_v = { 176, 48, 80, 80 };

int main(void)
{
    uint8_t hidden;

    initgraph();

    /* Палитра страницы 1 = палитре страницы 0 (initgraph грузит EGA
     * только в палитру 0). */
    gfx_pal_get(0, 0, 16, egapal);
    gfx_pal_load(1, 0, 16, egapal);

    /* Страница 0 — диагонали (источник фона). */
    gfx_set_draw_page(0);
    draw_diagonals();

    gfx_set_draw_page(1);
    draw_diagonals();

    gfx_set_visible_page(0);

    /* Рисуем на скрытой странице (1), потом флип. */
    hidden = gfx_get_visible_page() ^ 1;   /* = 1 */
    gfx_set_draw_page(hidden);



    for (;;) {
        if (kbhit() && getch() == 27)
            break;
        io_border = 2;
        gfx_scroll_v(&area_h, 2, 0);             /* вправо на 48 px */
        // gfx_scroll_v(&area_v, 2, 0);           /* вниз  на 48 px  */
        io_border = 0;
        gfx_wait_vsync();
        gfx_wait_vsync();

        hidden = gfx_get_visible_page() ^ 1;
        gfx_set_draw_page(hidden ^ 1);
        gfx_set_visible_page(hidden);
    }

    closegraph();
    return 0;
}
