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