Прямой ввод в видопамять.

ogcjm124

1)Нужно вывести символ с кодом 2 (рожица) на экран.Делаю так как ниже.Не вывродит почему? 2)Можно ли каким-то образом записывать значения в необходимые байты средствами c++ или нужны асм вставки.
int main ()
{
    int a=0;
    unsigned char *p;
    void *t;
    
    t=(void*)0xb8000000;
    p=(unsigned char*)t;
 
    *p=(1<<1);
 
    getch ();
}
НУ что,есть варианты?
11 ответов

ogcjm124

Варианты: из-под винды прямой доступ к видеопамяти вы не получите. Максимум - через шестнадцатиразрядную подсистему (типа как в DOS), и то это будет эмуляция.


ogcjm124

Вот задание:Видеопамятью называется область памяти начинающаяся с адреса 0xA0000000. Данные, хранимые в этой области интерпретируются видеокартой как изображение на экране. В текстовом видеорежиме используются только данные, хранящиеся начиная с адреса 0xB8000000. Обратите внимание, что эти адреса действительны толкьо при модели памяти с 32-битной адресацией. Для переключения в режим 32-битной адресации выберите пункт меню Options -> Compiler -> Code Generation и установите параметр Memory model = Huge. Задание 1 Реализовать функцию, принимающую три параметра - цвет фона, цвет тона и код символа и производящую заполнение этим символом всего экрана. Реализовать функцию очистки экрана с использованием созданной функции. Для заполнения видеопамяти воспользуйтесь указателем на беззнаковый символ. Для присвоения ему значения 0хВ8000000 необходимо осуществить явное преобразование типов. Непосредственное значение 0хВ8000000 имеет тип int. Следует сначала привести тип этого значения к void* а затем - к unsigned char* для того, чтобы присовение стало возможным. Для обращения к различным байтам видеопамяти воспользуйтесь этим указателем. Видеопамять организована следующим образом: байт по адресу 0хВ8000000 содержит код символа в левом верхнем углу экрана. Следующий за ним байт содержит цвет фона и цвет тона этого символа. В старшей половине этого байта содержится цвет фона, в младшей - цвет тона.Вроде бы всё делаю так,но на самом деле что то не так?


ogcjm124

Скорее всего, это для ДОСовых компиляторов, которые создают досовый exe-файл. В винде как таковой это не прокатит.


ogcjm124

Я благодарен вам за ваши старанья,но лучше сказать что вы не знаете.Программа выводит если я не ошибаюсь изображение в консоль.


ogcjm124

ogcjm124, повторяю: в MS-DOS видеопамять начинается с адреса 0B800h в 16-bit режиме и с адреса 0B8000000h в 32-bit режиме. В винде это не прокатит. Почитайте и внимательно посмотрите на листинг ассемблерной программы, приведённый на этой страничке.В винде это можно либо через 16-ричную подсистему (сам делал, так что не надо мне рассказывать), либо через DOS-box. В любом случае, вам до этого нужно будет собрать DOS-exe


ogcjm124

ogcjm124, установите Turbo C++ 3.1 и там в справке почитайте о REGPACK, REGS, intr, int86


ogcjm124

1)Нужно вывести символ с кодом 2 (рожица) на экран.Делаю так как ниже.Не вывродит почему? 2)Можно ли каким-то образом записывать значения в необходимые байты средствами c++ или нужны асм вставки.int main () { int a=0; unsigned char *p; void *t;t=(void*)0xb8000000; p=(unsigned char*)t;*p=(1<<1);getch (); }НУ что,есть варианты?
Вы уверены, что вы работаете в текстовом режиме? Вполне возможно, что если у вас оконный вывод из сессии консольного приложения, то используется графический режим консоли, а не текстовый.


ogcjm124

Я бы не хотел показаться настойчивым,но задание всё таки надо сделать на vc++2010Вы уверены, что вы работаете в текстовом режиме? Вполне возможно, что если у вас оконный вывод из сессии консольного приложения, то используется графический режим консоли, а не текстовый.А как это определить?


ogcjm124

Я бы не хотел показаться настойчивым,но задание всё таки надо сделать на vc++2010Вы уверены, что вы работаете в текстовом режиме? Вполне возможно, что если у вас оконный вывод из сессии консольного приложения, то используется графический режим консоли, а не текстовый.А как это определить?
Не знаю. Может быть надо посмотреть свойства экрана и выбрать там соответствующий режм. Либо в программе использовать непосредственно прерывание, если память не изменяет, 10h


ogcjm124

Ладно вы могли бы ответить на лёгкий вопрос: выберите пункт меню Options -> Compiler -> Code Generation и установите параметр Memory model = Huge.Я не могу найти где это)))А вы знаете?


ogcjm124

Ну не в виндовом же режиме! В винде же доступ к прерываниям только из режима ядра. Нужен либо com, либо mz exe.
выберите пункт меню Options -> Compiler -> Code Generation и установите параметр Memory model = Huge.
Это написано, скорее всего, для Turbo C или подобного.