/*
 * _bgi_vspan_raw — вертикальная линия len пикселей от (x,y),
 * mode 0x82.  Вертикального accel-пути нет: байт покрывает два
 * горизонтальных пикселя, Fill затёр бы соседний нибл — поэтому
 * RMW на каждую строку.  W3-naive.
 */

#include "../_bgi.h"

void _bgi_vspan_raw(int x, int y, int len, uint8_t color)
{
    if ((unsigned)x >= GFX_WIDTH_16) return;
    if (y < 0)                   { len += y; y = 0; }
    if (y >= GFX_HEIGHT_16)      return;
    if (y + len > GFX_HEIGHT_16) len = GFX_HEIGHT_16 - y;
    if (len <= 0)                return;

    _gfx_g16_addr = (uint16_t)(_gfx_addr_base + ((unsigned)x >> 1));
    if (x & 1) {
        _gfx_g16_nibble = (uint8_t)(color & 0x0F);
        _gfx_g16_mask   = 0xF0;
    } else {
        _gfx_g16_nibble = (uint8_t)((color & 0x0F) << 4);
        _gfx_g16_mask   = 0x0F;
    }
    for (int i = 0; i < len; i++) {
        _gfx_g16_y = (uint8_t)(y + i);
        _gfx_rmw16_pixel();
    }
}
