Files
Sprinter-SDCC/libc/io/ffirst.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

44 lines
1.6 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.
/*
* ffirst — начать перебор каталога по шаблону через ESTEX F_FIRST ($19):
* HL = шаблон, DE = буфер, A = маска атрибутов, B = формат (0/1).
* CF = err / A = код ошибки.
*
* Всегда используем формат B=1 — 256-байтный буфер с ASCIIZ DOS-именем
* "name.ext" по смещению 33. Продолжение перебора — fnext() с тем же
* буфером. Возвращает 0 или -1 + errno.
*
* ABI: третий аргумент uint8_t SDCC пушит ОДНИМ байтом (push af; inc
* sp), поэтому callee снимает адрес возврата (2 байта) И съедает байт
* атрибута через `inc sp` — наивный `pop bc` переел бы кадр вызывающего.
*/
#include <dir.h>
int ffirst(const char *pattern, ffblk_t *buf, uint8_t attrib) __naked
{
(void)pattern; (void)buf; (void)attrib;
__asm
;; На входе: HL = шаблон, DE = буфер, [SP+0..1] = ret, [SP+2] = attr.
ld iy, #2
add iy, sp
ld a, 0 (iy) ; A = attr (читаем, не трогая SP)
push ix
ld bc, #0x0119 ; ESTEX F_FIRST; формат 1 = DOS "name.ext"
rst #0x10
pop ix
pop hl ; HL = адрес возврата
inc sp ; съесть 1-байтовый attr
jr c, _ff_err
ld de, #0
jp (hl)
_ff_err:
call __errno_set
ld de, #-1
jp (hl)
__endasm;
}