/*
 * read — блочное чтение из файлового хендла ESTEX.
 *
 *   ESTEX READ ($13): A=handle, HL=буфер, DE=число байт
 *      → DE = фактически прочитано, CF=err с кодом в A.
 *
 * SDCC __sdcccall(1) для 3-аргументных int-функций: третий аргумент на
 * стеке снимает callee (паттерн как в _memset из SDCC z80.lib).
 * При ошибке: errno установлен, возврат -1.
 */

#include <unistd.h>

int read(int fd, void *buf, size_t n) __naked
{
    (void)fd; (void)buf; (void)n;
    __asm
        pop   iy                       ; IY = адрес возврата
        pop   bc                       ; BC = n (стековый аргумент)
        ld    a, l                     ; A = handle
        ex    de, hl                   ; HL = buf
        ld    d, b
        ld    e, c                     ; DE = n

        push  ix
        push  iy                       ; сохранить адрес возврата через RST
        ld    c, #0x13                 ; ESTEX READ
        rst   #0x10
        pop   iy
        pop   ix
        jr    c, _read_err
        ;; DE уже держит прочитанное количество.
        jp    (iy)
    _read_err:
        call  __errno_set
        ld    de, #-1
        jp    (iy)
    __endasm;
}
