/*
 * mouse_read — снять состояние мыши в *st (RST 30h, fn $03).
 * Возвращает: A=кнопки, HL=x, DE=y — RST портит HL/DE/A, поэтому
 * указатель на структуру не удержать в регистрах: результат идёт через
 * приватный скретч в BSS, потом копируется в *st.
 * Раскладка mouse_state_t: x(2), y(2), buttons(1).
 */

#include <mouse.h>

/* Скретч только для mouse_read. */
static uint16_t mb_x, mb_y;
static uint8_t  mb_buttons;

void mouse_read(mouse_state_t *st) __naked
{
    (void)st;
    __asm
        ;; HL = указатель на структуру на входе.
        push  ix
        push  hl                    ; спрятать указатель через RST
        ld    c, #0x03              ; READ MOUSE STATE
        rst   #0x30                 ; MOUSE
        ;; Возврат: A=кнопки, HL=x, DE=y (CF=err — здесь игнорируем)
        ld    (_mb_x), hl
        ld    (_mb_y), de
        ld    (_mb_buttons), a
        pop   hl                    ; вернуть указатель
        pop   ix

        ;; Скопировать скретч → *st.  Раскладка: x(2), y(2), buttons(1).
        ld    de, (_mb_x)
        ld    (hl), e
        inc   hl
        ld    (hl), d
        inc   hl
        ld    de, (_mb_y)
        ld    (hl), e
        inc   hl
        ld    (hl), d
        inc   hl
        ld    a, (_mb_buttons)
        ld    (hl), a
        ret
    __endasm;
}
