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