/* * _bgi_plot_raw — пиксель (x,y) цветом color, mode 0x81 (register-only asm). * * "Raw" = W3-naive: вызывающий уже сделал _bgi_begin (W3 на видеобанке, DI). * Адресация: CPU _gfx_addr_base + x, Port_Y (0x89) = y. * * __sdcccall(1): x→HL, y→DE (E=low), color→стек (1 байт над ret-адресом). * Всё считается в регистрах — ни статик-скретча, ни round-trip через _DATA * (самый горячий примитив: Брезенхэм в line/circle/fillpoly/draw_scaled). */ #include "../_bgi.h" void _bgi_plot_raw(int x, int y, uint8_t color) __naked __preserves_regs(d,e) { __asm .globl __gfx_addr_base #ifndef GFX_NOCHECK ld a, l sub a, #0x40 ld a, h sbc a, #0x01 jr NC, pp_done ; (unsigned)x >= 320 ld a, d or a, a jr NZ, pp_done ; (unsigned)y >= 256 #endif ld a, e out (#0x89), a ; Port_Y = y ld bc, (__gfx_addr_base) add hl, bc ; HL = base + x ld c, l ld b, h ; BC = dest ld hl, #2 add hl, sp ld a, (hl) ; A = color (со стека, SP+2) ld h, b ld l, c ; HL = dest ld (hl), a ; выстрел #ifndef GFX_NOCHECK pp_done: #endif pop hl ; ret-адрес inc sp ; callee-pop байта color jp (hl) __endasm; }