/*
 * gfx_raw_common.c — W3 page mapping primitives shared by every gfx mode.
 *
 * Composite primitives (gfx_line / gfx_rect / gfx_fill_rect / ...) bracket
 * their inner loop with one `_gfx_w3_video_begin()` / `_gfx_w3_video_end()`
 * pair and call the `*_raw` variants inside, so the W3 dance is paid once
 * per drawing operation instead of once per pixel.  Single-shot wrappers
 * (gfx_putpixel, gfx_hline, ...) wrap the same way for their single call.
 *
 * Begin disables interrupts, saves the current W3 page byte, then maps
 * `_gfx_bank` (the current video bank, 0x50..0x5F).  End restores the
 * saved page and re-enables interrupts.
 *
 * NOT re-entrant — saving the previous W3 byte in a static is safe only
 * because GFX runs with interrupts off between begin and end.
 */

#include <stdint.h>

extern uint8_t _gfx_bank;     /* current W3 video bank (gfx_core.c) */

static uint8_t _gfx_saved_w3;

void _gfx_w3_video_begin(void) __naked
{
    __asm
        di
        in    a, (#0xE2)
        ld    (__gfx_saved_w3), a
        ld    a, (__gfx_bank)
        out   (#0xE2), a
        ret
    __endasm;
}

void _gfx_w3_video_end(void) __naked
{
    __asm
        ld    a, (__gfx_saved_w3)
        out   (#0xE2), a
        ei
        ret
    __endasm;
}
