95c22be9bd
Скролл региона video->video (неактивная страница -> активная, банк 0x50: копия = скролл + heal цели): - gfx_scroll_h / _bgi_scroll_rows_raw — горизонтальный, построчно без страйдов (~54Т/строку), DI/EI бандами по 16 строк, h=0=>256; - gfx_scroll_v / _bgi_scroll_cols_raw — верт. И/ИЛИ гориз. за один проход без буфера (колонка = accel-burst LD A,A, STOP между read/write делает промежуточный OUT Port_Y безопасным), банды по 16 колонок; - _gfx_addr_shadow_base (адрес неактивной страницы) + gfx_rect_t. Пример examples/scroll. check_banks.py + sprinter-cc: отчёт раскладки памяти для ЛЮБОЙ модели (W1/W2 код/данные, остаток кучи/стека, W3 при --w3, банки при --bank), не только при --bank. Док docs/memory-management.md §10. --w3 (резидентный код окна W3) + сопутствующее: crt0_banked W3_RESIDENT, mkexe -W, tests/w3probe. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
88 lines
3.3 KiB
C
88 lines
3.3 KiB
C
/*
|
|
* 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;
|
|
}
|