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