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