/*
 * _errno_set — установить `errno` из кода ошибки ESTEX (0..255 в A).
 *
 * Заменяет inline-паттерн
 *      ld    (_errno),    a
 *      xor   a, a
 *      ld    (_errno+1),  a            ; 7 байт на каждый error path
 * одним
 *      call  __errno_set               ; 3 байта на error path
 *
 * Экономит ~4 байта в каждом обработчике ошибок libc, конвертирующем
 * код ESTEX в C-шный errno.  Сам хелпер — 7 байт; при 10+ error path
 * в нашей libc выигрыш по размеру суммарно положительный.
 *
 * ABI:
 *   вход:     A  = код ошибки ESTEX (0..255)
 *   выход:    errno перезаписан целиком, чтобы прежнее большое значение
 *             (например errno = -1) не оставило свой старший байт.
 *   клоббер:  A, флаги.  HL/BC/DE/IX/IY не трогаются.
 *
 * Защитная 16-битная запись — см. чат 2026-06-02: если кто-то присвоит
 * errno из C (`errno = -1`), старший байт станет 0xFF, и частичная
 * 8-битная запись здесь оставила бы этот 0xFF на месте.  Полное слово
 * держит errno честным независимо от того, кто писал последним.
 */

void _errno_set(unsigned char code) __naked
{
    (void)code;
    __asm
        ;; __sdcccall(1): единственный uint8_t-аргумент уже в A.
        ;; Пишем два байта по отдельности, чтобы HL/BC/DE/IX/IY остались
        ;; нетронутыми.  Клобберится только A: это входной регистр, и
        ;; ABI не требует сохранять его через void-вызов.
        ld    (_errno), a            ; младший байт = код
        xor   a, a
        ld    (_errno+1), a          ; старший байт = 0
        ret
    __endasm;
}
