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