Files
Sprinter-SDCC/libc/conio/putch.c
T
snark13 4a081501d8 libc: сплит «1 функция = 1 модуль» — вся библиотека, wildcard-сборка
- bios/conio/env/errno/gfx/io/mem/mouse/stdio/stdlib/string/sys/time/
  video разложены по модулям: общие статики и helpers — в internal
  _-модулях (_conio.h/_mouse.h/_gfx.h/_palette.h/_atexit.h/_time.h)
- lib/Makefile: LIBC_C = wildcard libc/*/*.c — гранулярность файлов
  = гранулярность DCE линкера
- эффект _CODE: gfx_text 6986→2568 Б, gfx_mous −1745, gfx_demo/d16
  −542; ранее timedir −3270, ls −3098, stattest −2995
- комментарии оставшихся модулей переведены на русский; puts: убран
  мёртвый pchars; videomode_raw разложен на get/set
- docs/libc-split-asm-cases.md — правила asm-связок между модулями;
  docs/libc-roadmap.md — план этапа
- восстановлен examples/mdview/SAMPLE.MD (нужен make floppy)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 16:08:58 +03:00

42 lines
1.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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;
}