Files
Sprinter-SDCC/libbgi/bgi256/_bgi_read_raw.c
T
snark13 38bfabb2ca libbgi: __preserves_regs(d,e) на raw-примитивы (контракт, без эффекта сейчас)
plot/read/hspan/vspan_raw читают D/E (y в DE), но не пишут — аннотация
задокументирована в _bgi.h.  Честное измерение (полная пересборка с/без,
diff всех .asm в common/ и bgi256/): кодогенерация SDCC 4.5 НЕ меняется —
вызывающие держат локали в IX-фрейме и перезагружают DE перед каждым
вызовом, спасений DE вокруг вызовов не было.  Оставлено как контракт на
будущее (изменение вызывающих/компилятора); при правке asm сверять
клоббер-лист.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 19:35:32 +03:00

42 lines
1.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* _bgi_read_raw — прочитать пиксель (x,y), mode 0x81 (register-only asm).
*
* "Raw" = W3-naive: вызывающий уже сделал _bgi_begin (W3 на видеобанке, DI).
* Для блиттинга: getimage/putimage читают тысячи пикселей в одной скобке.
* За пределами экрана возвращает 0.
*
* __sdcccall(1): x→HL, y→DE (E=low); возврат uint8_t в A. Всё в регистрах,
* без статик-скретча (единый стиль с _bgi_plot_raw).
*/
#include "../_bgi.h"
uint8_t _bgi_read_raw(int x, int y) __naked __preserves_regs(d,e)
{
(void)x; (void)y;
__asm
.globl __gfx_addr_base
#ifndef GFX_NOCHECK
ld a, l
sub a, #0x40
ld a, h
sbc a, #0x01
jr NC, rr_zero ; (unsigned)x >= 320
ld a, d
or a, a
jr NZ, rr_zero ; (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 a, (hl) ; A = пиксель (возврат)
ret
#ifndef GFX_NOCHECK
rr_zero:
xor a, a
ret
#endif
__endasm;
}