4a081501d8
- 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>
73 lines
2.4 KiB
C
73 lines
2.4 KiB
C
/*
|
||
* cputs — вывод ASCIIZ-строки с текущим атрибутом (Turbo-C conio).
|
||
*
|
||
* Курсор BIOS читается один раз до строки и записывается один раз
|
||
* после. Три пути:
|
||
* g_text_attr == KEEP_EXIST_ATTR → быстрый ESTEX PCHARS ($5C);
|
||
* pc_raw_mode == 1 → BIOS LP_PRINT_LN5 (глифы с атрибутом);
|
||
* иначе → цикл _putch_wrchar (интерпретация
|
||
* BS/TAB/LF/CR).
|
||
* Трансляции '\n' → CR LF нет — вызывающий пишет "\r\n" сам.
|
||
* cputs(NULL) — no-op. Возвращает 0.
|
||
*/
|
||
|
||
#include "_conio.h"
|
||
|
||
char cputs(const char *s) __naked
|
||
{
|
||
(void)s;
|
||
__asm
|
||
;; HL = s на входе; возврат char → A.
|
||
|
||
;; NULL-check: cputs(NULL) → сразу вернуть 0.
|
||
ld a, h
|
||
or a, l
|
||
ret z
|
||
|
||
push ix
|
||
|
||
call __get_cursor
|
||
|
||
;; KEEP_EXIST_ATTR? старший байт g_text_attr != 0
|
||
ld a, (_g_text_attr + 1)
|
||
or a, a
|
||
jr nz, _cputs_fast
|
||
|
||
ld a, (_pc_raw_mode)
|
||
or a, a
|
||
jr nz, _cputs_bios
|
||
|
||
push hl
|
||
pop de
|
||
|
||
_cputs_wrloop:
|
||
ld a, (_g_text_attr)
|
||
ld l, a
|
||
ld a, (de) ; загрузить байт
|
||
or a ; установить флаг Z, если A == 0
|
||
jr z, _cputs_ex ; завершить подпрограмму (конец строки)
|
||
push de
|
||
call __putch_wrchar ; вывести символ (A передаётся как аргумент)
|
||
pop de
|
||
inc de ; перейти к следующему байту
|
||
jr _cputs_wrloop ; повторить
|
||
|
||
_cputs_bios:
|
||
ld a, (_g_text_attr)
|
||
ld b, #0xFF
|
||
ld d, #0x0
|
||
ld e, a
|
||
ld c, #0x8B ; BIOS LP_PRINT_LN5
|
||
rst #0x08
|
||
jr _cputs_ex
|
||
_cputs_fast:
|
||
ld c, #0x5C ; ESTEX PCHARS
|
||
rst #0x10
|
||
_cputs_ex:
|
||
call __set_cursor
|
||
pop ix ; восстановить IX вызывающего
|
||
xor a, a ; вернуть 0
|
||
ret
|
||
__endasm;
|
||
}
|