/* * 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 #include #include #include 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; }