/*
 * putch — вывод символа с текущим атрибутом (Turbo-C conio).
 *
 * Применяет g_text_attr; при pc_raw_mode == 1 управляющие символы
 * печатаются как глифы (воркер _putch_wrchar_raw), иначе
 * интерпретируются (_putch_wrchar).  После вывода записывает курсор
 * BIOS один раз (_set_cursor).  Трансляции '\n' → CR LF нет —
 * Turbo-C-конвенция, вызывающий пишет "\r\n" сам.
 * Возвращает выведенный символ.
 */

#include "_conio.h"

/* Стэш символа на время вызовов воркеров (только для putch). */
static uint8_t pc_ch;

char putch(char ch) __naked
{
    (void)ch;
    __asm
        ;; A = ch на входе; возврат char → A.
        ld    (_pc_ch), a               ; спрятать ch (для возврата и перезагрузки)

        ld    a, (_g_text_attr)          ; A = младший байт = attr
        ld    l, a                       ; L = attr

        ld    a, (_pc_raw_mode)
        or    a, a                       ; Z = (mode == 0)
        ld    a, (_pc_ch)                ; A = ch  (`ld a,(nn)` не трогает флаги)
        jr    nz, _putch_use_raw
        call  __putch_wrchar
        jr    _putch_after_raw
    _putch_use_raw:
        call  __putch_wrchar_raw
    _putch_after_raw:
        call  __set_cursor
        ld    a, (_pc_ch)                ; возвращаемое значение
        ret

    __endasm;
}
