Files
Sprinter-SDCC/libc/mouse/mouse_get_cursor.c
T
snark13 4a081501d8 libc: сплит «1 функция = 1 модуль» — вся библиотека, wildcard-сборка
- bios/conio/env/errno/gfx/io/mem/mouse/stdio/stdlib/string/sys/time/
  video разложены по модулям: общие статики и helpers — в internal
  _-модулях (_conio.h/_mouse.h/_gfx.h/_palette.h/_atexit.h/_time.h)
- lib/Makefile: LIBC_C = wildcard libc/*/*.c — гранулярность файлов
  = гранулярность DCE линкера
- эффект _CODE: gfx_text 6986→2568 Б, gfx_mous −1745, gfx_demo/d16
  −542; ранее timedir −3270, ls −3098, stattest −2995
- комментарии оставшихся модулей переведены на русский; puts: убран
  мёртвый pchars; videomode_raw разложен на get/set
- docs/libc-split-asm-cases.md — правила asm-связок между модулями;
  docs/libc-roadmap.md — план этапа
- восстановлен examples/mdview/SAMPLE.MD (нужен make floppy)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 16:08:58 +03:00

43 lines
1.7 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.
/*
* mouse_get_cursor — прочитать текущую форму курсора в *c (RST 30h,
* fn $0B RETURN CURSOR). Битмап пишется по c->image (указатель уходит
* в IX), поля возвращаются в H/L/D/E и идут в структуру через общий
* скретч (_mouse.h).
*/
#include "_mouse.h"
#include <stdint.h>
/* Припаркованный указатель структуры: SDCC держит `c` в DE вокруг
* inline asm, а RST 30h портит DE (драйвер возвращает hot_y/hot_x в
* D/E) — без парковки записи полей ушли бы по мусорному адресу. */
static mouse_cursor_t *mc_dest;
void mouse_get_cursor(mouse_cursor_t *c)
{
mc_dest = c; /* припарковать в BSS */
_mc_image = (uint16_t)(uintptr_t)c->image;
__asm
push ix
ld ix, (__mc_image) ; IX = буфер битмапа вызывающего
ld c, #0x0B ; RETURN CURSOR
rst #0x30 ; мышиный драйвер, НЕ ESTEX
;; Возврат: H=height, L=width, D=hot_y, E=hot_x.
ld a, h
ld (__mc_height), a
ld a, l
ld (__mc_width), a
ld a, d
ld (__mc_hot_y), a
ld a, e
ld (__mc_hot_x), a
pop ix
__endasm;
/* Перечитать указатель из BSS — DE с `c` испорчен RST'ом выше. */
mouse_cursor_t *p = mc_dest;
p->width = _mc_width;
p->height = _mc_height;
p->hot_x = _mc_hot_x;
p->hot_y = _mc_hot_y;
}