/*
 * mem_alloc_pages_bios — выделить n смежных 16-КБ физических страниц
 * из EMM-пула через BIOS EMM_FN2 ($C2, rst 8): B=npages → A=blk_id,
 * CF=err.
 *
 *   in:  n — 1..255 (сколько страниц).
 *   out: blk_id (1..255) при успехе; 0 при ошибке (errno установлен).
 *
 * blk_id непрозрачен — отдай его mem_get_page_bios() за номерами
 * физических страниц и mem_free_block_bios() по окончании.  Id
 * начинаются с 1; 0 зарезервирован как сигнал «не выделилось».
 */

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

uint8_t mem_alloc_pages_bios(uint8_t n) __naked
{
    (void)n;
    __asm
        ;; SDCC: единственный uint8-аргумент в A; BIOS хочет n в B.
        push  ix
        ld    b, a
        ld    c, #0xC2              ; BIOS EMM_FN2 (ALLOC)
        rst   #0x08
        pop   ix
        jr    c, _alloc_fail
        ret                         ; CF=0 → A = blk_id (возврат uint8 в A)
    _alloc_fail:
        call  __errno_set           ; CF=1 → A = код ошибки
        xor   a, a                  ; вернуть 0 = сигнал ошибки
        ret
    __endasm;
}
