/* * getenv — значение переменной окружения через ESTEX ENVIRON ($46, subfn 1): * in: HL = имя (ASCIIZ), DE = выходной буфер * out: CF=0 + A != 0 → найдена, значение записано в [DE..end-1] * CF=0 + A == 0 → переменной нет (примечание: это ПРОТИВОПОЛОЖНО * тому, что пишет DiskSyscalls.txt v1.6 — проверено * эмпирически и по solid-c IO.ASM:763-766) * CF=1 → ошибка, A = код * * Возвращает указатель в приватный 128-байтный буфер — скопируй до * следующего вызова getenv(), если значение должно пережить его. * NULL — нет переменной или ошибка (errno). */ #include #include static char env_buf[128]; char *getenv(const char *name) __naked { (void)name; __asm push ix ;; HL = имя на входе; дополнительно DE = env_buf. ld de, #_env_buf ld bc, #0x0146 ; ESTEX ENVIRON; subfn: getenv rst #0x10 pop ix jr c, _getenv_err or a, a jr Z, _getenv_miss ld de, #_env_buf ret _getenv_err: call __errno_set _getenv_miss: ld de, #0 ret __endasm; }