2c414da465
Семантика FSM акселератора вскрыта по драйверу MAME (sprinter.cpp) и подтверждена экспериментами в MAME (tests/accfill): армирование живёт до следующего accel-опкода (мульти-триггер работает); под армированием триггерит ЛЮБОЙ non-M1 доступ к памяти (fetch операнда djnz/out!); вертикальный Fill двигает Port_Y и не возвращает; размер блока переживает LD B,B. Детали: memory/accel_multitrigger_fill. - _bgi_clear_raw: 20 DI-скобок по 16 колонок вместо полного брекета на каждую из 320 колонок; армирование размера один раз на скобку. - _gfx_rectfill256 разделён: диспетчер (проверка ориентации ~160-245Т, break-even |w-h| >= ~4) + leaf'ы _gfx_recthfill256/_gfx_rectvfill256 для прямого вызова, когда форма известна заранее. - Leaf'ы: чанки <=16 линий одной скобкой (~54-56Т/линию против ~250Т у per-line варианта); счётчик чанков precompute'ится в байт-регистр (dec e/jr nz ~46Т/чанк вместо 16-бит арифметики в IX-слотах ~173Т/чанк); хвост — отдельная скобка со своим армированием (CBL-ISR в окне EI армирует акселератор своим размером — не выносить). - getpixel/putpixel/_bgi_read: уборка мёртвого закомментированного кода. - tests/accfill: регресс chunked-заливок (B0 clear, B1 vert 1+3 чанка, B2 horz чанк+хвост, полноширинный bar 320x8 — путь w>=256). Прежние реализации сохранены под #if 0 для отката/сравнения. Проверено в MAME (все PASS); семантика эмуляции — перепроверить на реальном Sprinter. size-baseline: accfill добавлен, gfx_demo +54 Б (обвязка диспетчера), остальные без роста. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
28 lines
1.1 KiB
C
28 lines
1.1 KiB
C
/*
|
|
* putpixel (bgi256) — точка (x,y) цветом color, mode 0x81.
|
|
* ПОЛНОСТЬЬЮ inline: bounds + W3-скобка + запись пикселя в теле, БЕЗ
|
|
* вызовов _bgi_plot / gfx_putpixel256 / _bgi_plot_raw (устранены
|
|
* прокладки старой цепочки putpixel→_bgi_plot→gfx_putpixel256→raw).
|
|
* Адресация: CPU _gfx_addr_base + x, Port_Y (0x89) = y; W3 мапится на
|
|
* _gfx_bank, сейв восстанавливается. Bounds — compile-time GFX_WIDTH/
|
|
* HEIGHT (меньше/быстрее, ≡ runtime _bgi_maxx/_bgi_maxy).
|
|
*/
|
|
#include "../_bgi.h"
|
|
|
|
/* File-static скретч (как в _bgi_plot_raw, но свой — putpixel не должен
|
|
* топтать скретч акселератора/plot_raw, если звать вперемешку). */
|
|
static uint8_t _pp_y;
|
|
static uint16_t _pp_addr;
|
|
static uint8_t _pp_color;
|
|
|
|
void putpixel(int x, int y, color_t color)
|
|
{
|
|
#ifndef GFX_NOCHECK
|
|
if ((unsigned)x >= GFX_WIDTH || (unsigned)y >= GFX_HEIGHT) return;
|
|
#endif
|
|
_bgi_begin();
|
|
_bgi_plot_raw(x, y, color);
|
|
_bgi_end();
|
|
return;
|
|
}
|