Здравствуйте. Подскажите пожалуйста, как в текстовом режиме C80 можно поставить символ (пробел) в правый нижний угол экрана, но без смещения содержимого вниз, с целью перекраски этого местечка в другой цвет... Заранее спасибо.
11.01.03 16:02: Перенесено модератором из 'C/C++' — ПК
Tremble, mortals and despair! DOOM has come to this world!!!
GBE>Здравствуйте. Подскажите пожалуйста, как в текстовом режиме C80 можно поставить символ (пробел) в правый нижний угол экрана, но без смещения содержимого вниз, с целью перекраски этого местечка в другой цвет... Заранее спасибо.
Если под ДОС то прямым обращением к видеопамяти.
Она начинается не то с 0xA000, не то 0xB800 и располагается
построчно (побайтно): Символ, атрибут, символ, атрибут...
У атрибута первые 5 бит — цвет символа и мерцание символа
остальные 3 бита — цвет фона. Вот вроде и все.
Хотя cpp тут не причем, cpp вообще не в курсе, что такое
"экран", в cpp есть только "поток". И так уж получилось,
что один из потоков это "con".
Здравствуйте, Gear[B.E.A.R], Вы писали:
GBE>Здравствуйте. Подскажите пожалуйста, как в текстовом режиме C80 можно поставить символ (пробел) в правый нижний угол экрана, но без смещения содержимого вниз, с целью перекраски этого местечка в другой цвет... Заранее спасибо.
0xB800 — в цвете
0xB000 — моно
0xA000 — это графика на EGA
Пиши прямо в видеопамять.
peek()
poke()
Допустим пишем 0x3420
3 цвет символа (4 bit)
4 цвет фона (4 bit)
20 — пробел (8 bit)
Если есть желание могу скинуть на мыло готовые функции для работы с видеопамятью
Здравствуйте, Vampire, Вы писали:
V>0xB800 — в цвете V>0xB000 — моно
а если пишешь в защищённом режиме, то для указания сегмента надо использовать специальную инициализированную переменную. На BC 3.1 не помню, как она называется, что-то вроде SegB800 и SegB000...
Здравствуйте, Gear[B.E.A.R], Вы писали:
GEAR>Здравствуйте. Подскажите пожалуйста, как в текстовом режиме C80 можно поставить символ (пробел) в правый нижний угол экрана, но без смещения содержимого вниз, с целью перекраски этого местечка в другой цвет... Заранее спасибо.
А gotoxy() а потом putch() или putchar() не помогает?
Здравствуйте, mik1, Вы писали:
J>>А gotoxy() а потом putch() или putchar() не помогает?
M>Вроде как нет (давно дело было). Там экран тогда на одну строчку вниз уезжал.
Точно не уверен, но, кажется, одна из этих функций не переводит курсор.
Здравствуйте, Gear[B.E.A.R], Вы писали:
GEAR>Здравствуйте. Подскажите пожалуйста, как в текстовом режиме C80 можно поставить символ (пробел) в правый нижний угол экрана, но без смещения содержимого вниз, с целью перекраски этого местечка в другой цвет... Заранее спасибо.
asm {
PUSH AX
PUSH ES
MOV AX, 0xB800
MOV ES, AX
MOV AH, 0x20
MOV AL, AttribVal
MOV WORD PTR ES:[80*25*2], AX
POP ES
POP AX
}
вот и все если получится какой-то символ черного цвета на зеленом цвете — поменять присвоение регистров AL и AH.
Можно еще создать жесткий указатель PTR (наскока я помню именно это и делает на область памяти 0xB800:0) и прописать два байта (или один, если тока атрибуты) прямо в видеопамять...
Enigma — Back to the Rivers of Belief (MCMXC a. D.)
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, mik1, Вы писали:
M>С адресом ошибка — твой адрес указывает на первый символ ВТОРОЙ страницы видеопамяти в этом режиме.
ну бывает... я ж принцип показал, а не конкретный код
Enigma — By the Moon (Metamorphosis)
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
V>Если есть желание могу скинуть на мыло готовые функции для работы с видеопамятью
Извинтюляюсь за тормоз ) Да, пожалуйста, ...
И еще... Если кто помнит, подкиньте пожалуйста ссылочку на какой-нибудь ресурс по работе с видеопамятью.... Я ньюби, ничего в этом деле не рублю.......
Tremble, mortals and despair! DOOM has come to this world!!!
Здравствуйте, Vampire, Вы писали:
V>Здравствуйте, Gear[B.E.A.R], Вы писали:
GBE>>Здравствуйте. Подскажите пожалуйста, как в текстовом режиме C80 можно поставить символ (пробел) в правый нижний угол экрана, но без смещения содержимого вниз, с целью перекраски этого местечка в другой цвет... Заранее спасибо.
V>0xB800 — в цвете V>0xB000 — моно
V>0xA000 — это графика на EGA
V>Пиши прямо в видеопамять. V>peek() V>poke()
V>Допустим пишем 0x3420
V>3 цвет символа (4 bit) V>4 цвет фона (4 bit) V>20 — пробел (8 bit)
Сорри, Вампир, уточню слегка.
На картах VGA и выше, область адресов экранной памяти текст. режима
0xb8000.
В той области за каждое знакоместо на экране отвечает пара байтов.
В четной позиции -- символ, в след. за ней нечетной -- его атрибуты (цвет фона и цвет символа)
Если ты хошь записать в позицию х=79,у=24 (все нумеруется с нуля) пробел, то ты вычисляешь адрес нужного байта очень просто:
0xb8000+у*80*2+х*2
Сорри, не помню формата вызовов библ. функций... Поэтому не приведу код.