libbgi: блочные AND/OR/XOR акселератора (блит строками и колонками)
Акселератор умеет не только копировать блок, но и совмещать его с приёмником: опкод `and/or/xor (hl)` между триггерами чтения и записи переводит внутренний автомат из «буфер := память» в «буфер <op>= память». Операция ортогональна направлению (гориз. LD L,L / верт. LD A,A), значит одинаково работает и для row-major картинок, и для column-major спрайтов персонажей с бесплатным флипом. Полный набор, по образцу существующего копирующего: - ядра bgi256/_bgi_blit_rows_op_raw.c и _bgi_blit_cols_op_raw.c; - строками: gfx_blit_op / gfx_blit_part_op (через _gfx_blit_full_op); - колонками: gfx_blit_cols_op / gfx_blit_cols_part_wx_op (skip/rows/ skipw/maxw и flip — как у копирующего близнеца); - putimage(XOR/OR/AND_PUT) переведён на accel, попиксельным остался только NOT_PUT — закрыт пункт 2d-1 docs/TODO.md. Одна функция на три операции: опкод патчится SMC, как размер блока и страйд, — ветвления в цикле нет. Колоночный путь дороже строкового на один OUT Port_Y: вертикальный op-burst шагает Port_Y, и перед записью его надо вернуть на верх колонки (STOP обязателен — иначе fetch операнда OUT перезапустит burst, memory/accel_operand_fetch_retrigger). Две оговорки (в шапках модулей): - операция ЧИТАЕТ ОЗУ-копию экрана, а не видео-ОЗУ, поэтому при банках 0x54/0x5C совмещается с чистым фоном, а не с нарисованным поверх; - аппаратная прозрачность #FF совместима с AND (нейтраль) и OR (#FF|bg = #FF, запись подавляется), но НЕ с XOR: там источник обязан хранить прозрачный пиксель как 0x00. Проверка: tests/accop (новый) — 8/8 PASS в MAME, побайтно, источник с разными значениями по строкам И колонкам + рамка вокруг; tests/bgi_img получил две байтовые самопроверки (COPY==источник, XOR дважды == фон), обе PASS. make size-check: роста нет (эталон принят заново — kbdpoll +63 Б приехал из прошлой сессии, воспроизводится и без этих правок). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -485,7 +485,19 @@ getimage/буфер не нужен. Перерисовка — из главн
|
||||
- **.spr-ресурс**: файловый заголовок-обёртка (магия/версия/hotspot)
|
||||
вокруг getimage-payload + загрузчик + PC-конвертер (PNG→spr, iconv-
|
||||
стиль пайплайн). In-memory формат не меняется.
|
||||
- **XOR/OR/AND_PUT через акселератор** (блочные режимы есть в железе).
|
||||
- ~~**XOR/OR/AND_PUT через акселератор** (блочные режимы есть в железе).~~
|
||||
**СДЕЛАНО 2026-08-11** (tests/accop, tests/bgi_img P1/P2): блочные
|
||||
AND/OR/XOR акселератора подняты в libbgi как полный набор —
|
||||
`_bgi_blit_rows_op_raw`/`_bgi_blit_cols_op_raw` (ядра) →
|
||||
`gfx_blit_op`/`gfx_blit_part_op` (строками) и
|
||||
`gfx_blit_cols_op`/`gfx_blit_cols_part_wx_op` (колонками, с флипом и
|
||||
клип-окном); `putimage(XOR/OR/AND_PUT)` переведён на них, попиксельным
|
||||
остался только NOT_PUT (инверсия источника — у железа такого режима нет).
|
||||
Одна функция на три операции: опкод `and/or/xor (hl)` патчится SMC, как
|
||||
размер блока. Две оговорки — в шапке `common/_gfx_blit_full_op.c`:
|
||||
операция читает ОЗУ-копию экрана (при банках 0x54/0x5C это чистый фон,
|
||||
а не нарисованное поверх), и аппаратная прозрачность #FF совместима с
|
||||
AND/OR, но НЕ с XOR (источнику для XOR нужен прозрачный 0x00).
|
||||
- **RLE-сжатие** (распаковка при загрузке — фича загрузчика).
|
||||
- **Вертикальный блит** (`LD A,A`-режим) — для повёрнутых спрайтов не
|
||||
хватает и его; не тянем.
|
||||
|
||||
Reference in New Issue
Block a user