/* * mem_info_bios — состояние EMM-аллокатора через BIOS INFOMEM ($C0, * rst 8): HL=всего страниц, BC=свободно. * * *total ← всего 16-КБ физических страниц в системе * *free_pages ← сколько сейчас доступно * * Оба указателя должны быть валидными uint16_t. Ошибок нет — INFOMEM * всегда успешен. */ #include #include void mem_info_bios(uint16_t *total, uint16_t *free_pages) __naked { (void)total; (void)free_pages; __asm ;; HL = total ptr, DE = free_pages ptr на входе. ;; RST портит оба — прячем на стек через вызов. push ix push hl ; потом [SP+2] = total_ptr push de ; TOS [SP+0] = free_pages_ptr ld c, #0xC0 ; BIOS INFOMEM → HL = total, BC = free rst #0x08 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; }