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