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