/*
 * mem_info_estex — состояние EMM-аллокатора через ESTEX INFOMEM ($3C):
 * HL=всего страниц, BC=свободно.
 *
 *   *total      ← всего 16-КБ физических страниц в системе
 *   *free_pages ← сколько сейчас доступно
 *
 * Оба указателя должны быть валидными uint16_t.  Ошибок нет.
 */

#include <stdint.h>
#include <sprinter_mem.h>

void mem_info_estex(uint16_t *total, uint16_t *free_pages) __naked
{
    (void)total; (void)free_pages;
    __asm
        ;; HL = total ptr, DE = free_pages ptr на входе.
        ;; RST 10 портит оба — прячем на стек через вызов.
        push  ix
        push  hl                    ; потом [SP+2] = total_ptr
        push  de                    ; TOS   [SP+0] = free_pages_ptr

        ld    c, #0x3C              ; ESTEX INFOMEM → HL = total, BC = free
        rst   #0x10

        pop   de                    ; DE = free_pages_ptr
        ld    a, c
        ld    (de), a
        inc   de
        ld    a, b
        ld    (de), a               ; *free_pages = BC

        pop   de                    ; DE = total_ptr
        ld    a, l
        ld    (de), a
        inc   de
        ld    a, h
        ld    (de), a               ; *total = HL

        pop   ix
        ret
    __endasm;
}
