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