Files
Sprinter-SDCC/libc/mem/mem_get_page_bios.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

32 lines
1.2 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.
/*
* mem_get_page_bios — перевести пару (блок, индекс страницы) в номер
* физической 16-КБ страницы (годен для OUT в PORT_PAGE_W1/W2/W3 или
* bank_*-хелперов). BIOS EMM_FN4 ($C4, rst 8): A=blk, B=idx → A=page,
* CF=err.
*
* in: blk_id — id от mem_alloc_pages_*; idx — 0..(n-1).
* out: номер физической страницы (1..255); 0 при ошибке (errno).
*/
#include <stdint.h>
#include <sprinter_mem.h>
uint8_t mem_get_page_bios(uint8_t blk_id, uint8_t idx) __naked
{
(void)blk_id; (void)idx;
__asm
;; 2 аргумента uint8/uint8: blk_id A, idx L.
push ix
ld b, l ; BIOS хочет idx в B
;; A всё ещё держит blk_id
ld c, #0xC4 ; BIOS EMM_GETPAGE
rst #0x08
pop ix
ret nc ; CF=0 A = физ. страница (возврат)
;; CF=1 A = код; ставим errno, возвращаем 0 как сигнал.
call __errno_set
xor a, a
ret
__endasm;
}