Нужна помощь (Borland C 3.1)
От: Gear[B.E.A.R]  
Дата: 11.01.03 09:56
Оценка:
Здравствуйте. Подскажите пожалуйста, как в текстовом режиме C80 можно поставить символ (пробел) в правый нижний угол экрана, но без смещения содержимого вниз, с целью перекраски этого местечка в другой цвет... Заранее спасибо.

11.01.03 16:02: Перенесено модератором из 'C/C++' — ПК
Tremble, mortals and despair! DOOM has come to this world!!!
Re: Нужна помощь (Borland C 3.1)
От: Gadsky Россия  
Дата: 11.01.03 10:20
Оценка: 5 (1)
GBE>Здравствуйте. Подскажите пожалуйста, как в текстовом режиме C80 можно поставить символ (пробел) в правый нижний угол экрана, но без смещения содержимого вниз, с целью перекраски этого местечка в другой цвет... Заранее спасибо.

Если под ДОС то прямым обращением к видеопамяти.
Она начинается не то с 0xA000, не то 0xB800 и располагается
построчно (побайтно): Символ, атрибут, символ, атрибут...
У атрибута первые 5 бит — цвет символа и мерцание символа
остальные 3 бита — цвет фона. Вот вроде и все.

Хотя cpp тут не причем, cpp вообще не в курсе, что такое
"экран", в cpp есть только "поток". И так уж получилось,
что один из потоков это "con".
Re: Нужна помощь (Borland C 3.1)
От: Vampire Россия  
Дата: 11.01.03 10:43
Оценка: 5 (1)
Здравствуйте, Gear[B.E.A.R], Вы писали:

GBE>Здравствуйте. Подскажите пожалуйста, как в текстовом режиме C80 можно поставить символ (пробел) в правый нижний угол экрана, но без смещения содержимого вниз, с целью перекраски этого местечка в другой цвет... Заранее спасибо.


0xB800 — в цвете
0xB000 — моно

0xA000 — это графика на EGA

Пиши прямо в видеопамять.
peek()
poke()

Допустим пишем 0x3420

3 цвет символа (4 bit)
4 цвет фона (4 bit)
20 — пробел (8 bit)

Если есть желание могу скинуть на мыло готовые функции для работы с видеопамятью
Если долго мучиться что нибудь получится
Re[2]: Нужна помощь (Borland C 3.1)
От: Bob Kotl Россия  
Дата: 11.01.03 11:08
Оценка:
Здравствуйте, Vampire, Вы писали:

V>0xB800 — в цвете

V>0xB000 — моно

а если пишешь в защищённом режиме, то для указания сегмента надо использовать специальную инициализированную переменную. На BC 3.1 не помню, как она называется, что-то вроде SegB800 и SegB000...
Re: Нужна помощь (Borland C 3.1)
От: Jenyay http://jenyay.net
Дата: 11.01.03 13:09
Оценка:
Здравствуйте, Gear[B.E.A.R], Вы писали:

GEAR>Здравствуйте. Подскажите пожалуйста, как в текстовом режиме C80 можно поставить символ (пробел) в правый нижний угол экрана, но без смещения содержимого вниз, с целью перекраски этого местечка в другой цвет... Заранее спасибо.


А gotoxy() а потом putch() или putchar() не помогает?
... << RSDN@Home 1.0 beta 4 >>
Софт, исходники и фото
Re[2]: Нужна помощь (Borland C 3.1)
От: mik1  
Дата: 11.01.03 13:35
Оценка:
Здравствуйте, Jenyay, Вы писали:

J>А gotoxy() а потом putch() или putchar() не помогает?


Вроде как нет (давно дело было). Там экран тогда на одну строчку вниз уезжал.
Re[3]: Нужна помощь (Borland C 3.1)
От: Jenyay http://jenyay.net
Дата: 11.01.03 16:51
Оценка:
Здравствуйте, mik1, Вы писали:

J>>А gotoxy() а потом putch() или putchar() не помогает?


M>Вроде как нет (давно дело было). Там экран тогда на одну строчку вниз уезжал.


Точно не уверен, но, кажется, одна из этих функций не переводит курсор.
... << RSDN@Home 1.0 beta 4 >>
Софт, исходники и фото
Re: Нужна помощь (Borland C 3.1)
От: Hacker_Delphi Россия  
Дата: 11.01.03 19:12
Оценка:
Здравствуйте, 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.)
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[2]: Нужна помощь (Borland C 3.1)
От: mik1  
Дата: 12.01.03 06:57
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>Здравствуйте, Gear[B.E.A.R], Вы писали:


H_D>
H_D>asm {
H_D>  PUSH AX
H_D>  PUSH ES
H_D>  MOV AX, 0xB800
H_D>  MOV ES, AX
H_D>  MOV AH, 0x20
H_D>  MOV AL, AttribVal
H_D>  MOV WORD PTR ES:[80*25*2-2], AX
H_D>  POP ES
H_D>  POP AX
H_D>}
H_D>


С адресом ошибка — твой адрес указывает на первый символ ВТОРОЙ страницы видеопамяти в этом режиме.
Re[3]: Нужна помощь (Borland C 3.1)
От: Hacker_Delphi Россия  
Дата: 12.01.03 19:52
Оценка:
Здравствуйте, mik1, Вы писали:

M>С адресом ошибка — твой адрес указывает на первый символ ВТОРОЙ страницы видеопамяти в этом режиме.

ну бывает... я ж принцип показал, а не конкретный код
Enigma — By the Moon (Metamorphosis)
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[2]: Нужна помощь (Borland C 3.1)
От: Gear[B.E.A.R]  
Дата: 22.01.03 15:44
Оценка:
V>Если есть желание могу скинуть на мыло готовые функции для работы с видеопамятью

Извинтюляюсь за тормоз ) Да, пожалуйста, ...

И еще... Если кто помнит, подкиньте пожалуйста ссылочку на какой-нибудь ресурс по работе с видеопамятью.... Я ньюби, ничего в этом деле не рублю.......
Tremble, mortals and despair! DOOM has come to this world!!!
Re[2]: Нужна помощь (Borland C 3.1)
От: _wqwa США  
Дата: 24.01.03 14:29
Оценка:
Здравствуйте, 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
Сорри, не помню формата вызовов библ. функций... Поэтому не приведу код.
... << RSDN@Home 1.0 beta 5 >>
Кто здесь?!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.