Files
Sprinter-SDCC/examples/scroll/scroll.c
T
snark13 95c22be9bd libbgi: скролл-примитивы + --w3 + отчёт раскладки памяти
Скролл региона 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>
2026-07-23 19:38:00 +03:00

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;
}