Viktor2312, Сейчас объясню
---------- Post added at 22:35 ---------- Previous post was at 22:27 ----------
У Ириши нет текстового экрана
под текстовым я имею в виду экран в котором один байт в памяти отображает 1 байт на экране, это как текстовый режим при старте биоса на IBM
у Ириши есть ТОЛЬКО графические режимы
по этому биос должен "нарисовать" на экране символ который хочет напечатать пользователь
при этом где-то это или 40 или 80 байт в строку
или 1 или 2 бита на пиксель
чтоб не заводить кучу специальных функций для вывода в разные режимы есть только одна но универсальная
биос знает в каком режиме сейчас экран (т.к. он считает что кроме него переключить не может ни кто другой)
и в зависимости от этих знаний он и рисует символы на экране
поэтому когда Вы сменили режим экрана на другой через OUT биос уже не правильно отображает символы, т.к. он думает что все по старому а оно уже не соответсвует реальности
---------- Post added at 22:41 ---------- Previous post was at 22:35 ----------
ESC последовательности это управляющие последовательности при выводе строки
ESC это от название первого символа последовательности с кодом (ASCII decimal 27/hex 0x1B/octal 033)
вызываем функцию печати строки
и если в ней есть последовательность начинающаяся с ESC то делаем некие управляющие действия
в частности для ириши можно управлять режимом экрана
Управляющая последовательность ESC+Q+MODE
mode описан в 9.13
при переключении через последовательности биос ЗНАЕТ как надо скоректировать внутренние переменные и после такого переключения отображение символов происходит нормально
примеры
---------- Post added at 22:43 ---------- Previous post was at 22:41 ----------
эмулятор b2m -> reset
стартуем в первом режиме
можем поменять цвет
O7,D9 -> белые буквы на черном фоне
---------- Post added at 22:55 ---------- Previous post was at 22:43 ----------
заполняем экран -> D0
переключаемся в 3й режим
последовательно нажимаем ESC Q #
наблюдаем призабавную картинку
наш дамп превратился в кашу т.к. теперь старое содержимое экрана интрепретируется уже в соответсвии с другим режимом
ID8 -> 10001010 (0x8A)
заполняем экран -> D0
переключаемся в режим 2
ESC Q "
переключаем цвет на нормальный O2,D9
Id8 -> 10011010 (0x9a)
D0
после этого можно переключиться опять в режим 1
ESC Q !
и видно что в этом режиме строка занимает 40 байт а не 80 как во 2м и 3м (символы на экране через строку)
в общем все в порядке
---------- Post added at 23:17 ---------- Previous post was at 22:55 ----------
собственно вот обработчик ESQ-Q
Код:
RAM:2612 __ESC_Q_CMD: ; DATA XREF: RAM:_ESC_Qo
RAM:2612 and 10h
RAM:2614 ld a, 0
RAM:2616 jp nz, loc_2627
RAM:2619 ld a, c
RAM:261A and 3
RAM:261C ld hl, unk_2630
RAM:261F ld e, a
RAM:2620 ld d, 0
RAM:2622 add hl, de
RAM:2623 ld a, 11101100b
RAM:2625 and c
RAM:2626 or (hl)
RAM:2627
RAM:2627 loc_2627: ; CODE XREF: RAM:2616j
RAM:2627 ld (_ConOut_Mode), a
RAM:262A call __RestoreDefConout
RAM:262D jp _ConOut_FixScreenVar
RAM:262D ; ---------------------------------------------------------------------------
RAM:2630 unk_2630: db 0 ; DATA XREF: RAM:261Co
RAM:2631 db 10h
RAM:2632 db 1
RAM:2633 db 2
т.е. перекодируем 0,1 биты
вставлю в мнемонике i8080
Код:
RAM:2612 __ESC_Q_CMD: ; DATA XREF: RAM:_ESC_Q_SetMODEo
RAM:2612 ani 10h
RAM:2614 mvi a, 0
RAM:2616 jnz loc_2627
RAM:2619 mov a, c
RAM:261A ani 3
RAM:261C lxi h, unk_2630
RAM:261F mov e, a
RAM:2620 mvi d, 0
RAM:2622 dad d
RAM:2623 mvi a, 11101100b
RAM:2625 ana c
RAM:2626 ora m
RAM:2627
RAM:2627 loc_2627: ; CODE XREF: RAM:2616j
RAM:2627 sta _ConOut_Mode
RAM:262A call __RestoreDefConout
RAM:262D jmp _ConOut_FixScreenVar
RAM:262D ; ---------------------------------------------------------------------------
RAM:2630 unk_2630: .db 0 ; DATA XREF: RAM:261Co
RAM:2631 .db 10h
RAM:2632 .db 1
RAM:2633 .db 2