/*
 * close — закрыть файловый хендл ESTEX CLOSE ($12).
 * Возвращает 0 или -1 + errno.  На успехе декрементирует счётчик
 * открытых манипуляторов (_fd_guard.h — защита от зависания DSS).
 */

#include <unistd.h>
#include "_fd_guard.h"

int close(int fd) __naked
{
    (void)fd;
    __asm
        push  ix
        ld    a, l
        ld    c, #0x12                 ; ESTEX CLOSE
        rst   #0x10
        pop   ix
        jr    c, _oclose_err
        ;; успех — минус один открытый манипулятор
        ld    hl, #__fd_open_count
        dec   (hl)
        ld    de, #0
        ret
    _oclose_err:
        call  __errno_set
        ld    de, #-1
        ret
    __endasm;
}
