Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: дос запись в видео память
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
sergey sva
Нужно засвечивать точки в разных графических режимах, адрес 0,0 (верхний лев угол) соответствует 0xA0000000?
Для разных графических режимов он меняется?
Genadi Zawidowski
Для VESA режимов эту информацию возвращает BIOS видеоплаты. Чаще всего на A000.
sergey sva
Что то не пойму как вывести картинку например 800+600 если диапазон видео памяти начинается от a0000 до afff если дальше писать то просто изображения не видно. видео режим 800+600 256 линейный 0х103.
Genadi Zawidowski
Цитата(sergey sva @ Oct 2 2011, 17:02) *
Что то не пойму как вывести картинку например 800+600 если диапазон видео памяти начинается от a0000 до afff если дальше писать то просто изображения не видно. видео режим 800+600 256 линейный 0х103.

Простите, а зачем я, как вы думаете, выложил исходники программ (под дос и под dos extender от zortech 3.1), где вызывается процедура переключения страниц видеопамяти как раз по информации, предоставляемой vesa bios? Запустите - программы рисуют картинки, похожие на BGIDEMO от Borland.

Цитата
800+600 256 линейный

В режиме 16/24/32 бита может оказаться быстрее - да и избавитесь от необходимости палитру загружать.
Пожалуй, 16 бит самое то.


Вот два метода перекючения страницы - через колбэк и медленный - через вызов функции vesa bios. Это для real mode.

Код
static  void
vesa_setpage_bio(unsigned short page, unsigned w)
{
        union REGS r;

        r.x.ax = 0x4f05;        /* 4fh/05h: Page service.       */
        r.h.bh = 0x00;          /* bh = 0: set, bl = window     */
        r.h.bl = w;        /* bh = 0: set, bl = window     */
        r.x.dx = page;          /* In granularity units.        */

        int86(0x10, & r, & r);
        if (r.x.ax != 0x004f)
        {       printf("Error in function 0x4f/0x05\n");
                return;
        }
}

static  void
vesa_setpage_dir(unsigned short page, unsigned w)
{
        _SI = _SI;              /* Force save register variables.       */
        _DI = _DI;

        _DX = page;             /* In granularity units.        */
        _BX = w;           /* bh = 0: set, bl = window     */
        (* gcx.wpos)();
}

void     (* vesa_setpage)(unsigned short, unsigned) = vesa_setpage_bio;
sergey sva
Спасибо разобрался.
сделал функцию которая должна записывать изображение в озу вызываю эту функцию в цикле, картинка должна перемещаться по диагонали.
Но что то не как не получается сделать это вот что получается.

видео 2,5мгб
вот код
Код
void draw_bitmap(BITMAP *bmp,dword alleft, dword altop,dword scrwidth)
{
  dword j;
  dword screen_offset = scrwidth -(scrwidth-alleft);
  dword bitmap_offset = 0;
  dword cor = 0;
  byte resul = 0;

  if( (scrwidth*altop) > 65535){
    resul = (scrwidth*altop)/65536;
    set_video_win(resul);
    screen_offset += (scrwidth*altop)%65536;
  }

  for(j=0;j<bmp->height;j++)
  {
   // memcpy(&VGA[screen_offset],&bmp->data[bitmap_offset],bmp->width);
    for(int icpy = 0; icpy < bmp->width; icpy++)
    {
      VGA[screen_offset] = bmp->data[bitmap_offset];
      screen_offset++;bitmap_offset++;

    } //for
       screen_offset +=  scrwidth-bmp->width;
       if(screen_offset>65535){
        cor =  screen_offset-65536;
        resul++;
        set_video_win(resul);
        screen_offset = scrwidth -(scrwidth-alleft) + cor;

       }

  } //for
}
Genadi Zawidowski
1) не вижу описаний scrwidth, altop. Они 16 бит?
2) А с чего Вы решили, что в Вашей видеоплате функция установки номера окна предполагает, что окно 64 килобайта? Я про granularity.
3) моя программа работает у Вас? Она тоже изображение выводит.
4) Не вижу установки начальной страницы.
sergey sva
Цитата
не вижу описаний scrwidth, altop. Они 16 бит?

32 unsigned long
Цитата
А с чего Вы решили, что в Вашей видеоплате функция установки номера окна предполагает, что окно 64 килобайта? Я про granularity.

Переключается проверено, функция 4f05.
Диапазон памяти видео адаптера 0x000A0000 0x000c0000 или ошибаюсь?
работает только там не картинка а какие то разноцветные квадратики. мигают так должно быть?

sergey sva
Вроде бы заработало. Правда есть один момент картинка bmp глубина цвета 8 бит если ее открываю в винде цвета одни а в досе другие?
Можно как то в винде открыть картинку что бы она выглядела как в досе редактор гимп.
Genadi Zawidowski
Цитата(sergey sva @ Oct 3 2011, 20:48) *
Вроде бы заработало. Правда есть один момент картинка bmp глубина цвета 8 бит если ее открываю в винде цвета одни а в досе другие?
Можно как то в винде открыть картинку что бы она выглядела как в досе редактор гимп.


Где-то надо загрузить ту палитру, в которой Ваш файл сохранён (кажется, она вместе с каритнкой где-то).
Потому я про 16 или 32 (24) бита вам и говорил.



А что было-то, размер страницы (granulation) у Вашего видеоадаптера какой?
Цитата
Диапазон памяти видео адаптера 0x000A0000 0x000c0000 или ошибаюсь?

Что печатает моя программа про доступные vesa режимы? Характеристики используемого Вами режима?
sergey sva
Цитата
А что было-то, размер страницы (granulation) у Вашего видеоадаптера какой?

ошибка в коде неправильно переключались окна сейчас это работает. Режим 256 цветов разрешение 800*600 в этом режиме размер окна 64535 байт. пишу напрямую в память.
сейчас другая проблемка с палитрой. не как не получается что бы совпадал цвет картинки открытой в винде и в досе вот что выходит sad.gif
слева картинка в винде справа в досе в чем может быть проблема дайте мысль sm.gif
Код
  if( (palit = (char*) malloc(num_colors*4)) == NULL){
    fclose(fp);
    set_mode(TEXT_MODE);
    printf("Error allocating memory for palitra %s size %d . \n",file,(num_colors*4) );
    getch();
    exit(1);
  }

  fread(palit,(num_colors*4) , 1, fp);

  for(int i = 0; i < num_colors; i++, palit+=4){
   _remappalette(  i, (palit[2] << 15) | (palit[1]<<7 ) | palit[0]  );
  }

Нажмите для просмотра прикрепленного файла
Genadi Zawidowski
Не видя всего кода, трудно сказать, что там происходит...
вопросы:
1) Какого типа переменная palit (намёк на пропущенное приведение типов перед сдвигом) - см. вопрос 3.
2) Что за функция _remappalette (я про сдвиги на 7 и на 15)?
3) что за компилятор, в каком режиме (real mode? какой размер int?). Visual C 1.52?
sergey sva
Цитата
Какого типа переменная palit (намёк на пропущенное приведение типов перед сдвигом) .

в этом проблема была ))
Цвета все равно отличаются синий мягче чем в винде не пойму почему, комп один и тоже.
Genadi Zawidowski
Цитата(sergey sva @ Oct 5 2011, 15:28) *
в этом проблема была ))
Цвета все равно отличаются синий мягче чем в винде не пойму почему, комп один и тоже.

На остальные мои вопросы можно ответ услышать? Например, на правильное ли количество бит сдвигается байт перед получением значения, загружаемого в решистры палитры?
sergey sva
Цитата
Например, на правильное ли количество бит сдвигается байт перед получением значения, загружаемого в решистры палитры?

Изображение сохраняю как BMP с глубиной цвета 8бит 96пикселей на дюйм.

Сдвигается на длину палитры, палитра храниться после структуры BITMAPINFOHEADER размер байт палитры в поле biClrUsed.
biClrUsed num_colors = biClrUsed

fread(palit,(num_colors*4) , 1, fp); сдвигается на num_colors*4 дальше идет информация о цвете картинки.
Насколько правильно не знаю с досом не работал, может картинка и должна отличаться? что то подсказывает не должно быть отличий.
компилятор watcom.
вот картинка Нажмите для просмотра прикрепленного файла
Genadi Zawidowski
Цитата(sergey sva @ Oct 5 2011, 20:47) *
Изображение сохраняю как BMP с глубиной цвета 8бит 96пикселей на дюйм.

Сдвигается на длину палитры, палитра храниться после структуры BITMAPINFOHEADER размер байт палитры в поле biClrUsed.
biClrUsed num_colors = biClrUsed

fread(palit,(num_colors*4) , 1, fp); сдвигается на num_colors*4 дальше идет информация о цвете картинки.
Насколько правильно не знаю с досом не работал, может картинка и должна отличаться? что то подсказывает не должно быть отличий.
компилятор watcom.
вот картинка Нажмите для просмотра прикрепленного файла


какой компилятор?
Гжде описание формата элемента палитры при передаче в функцию _remappalette я уже не спрашиваю. Нашёл от какого-то компилятлра

Код
0x00bbggrr


Так у Вас неправильное число сдвиго в- надо 16 и 8, а не то, что у Вас.

какой компилятор? - ещё раз.
sergey sva
Цитата
Так у Вас неправильное число сдвиго в- надо 16 и 8, а не то, что у Вас.
какой компилятор? - ещё раз.

Теперь работает, цвета нормальные ))
Код
_remappalette(  i, ( (dwordpolitra[0]>>2) << 16) | ((dwordpolitra[1]>>2)<<8) | (dwordpolitra[2]>>2)  );

Компилятор watcom.
Genadi Zawidowski
А зачем яркость всех цветов уменьшаете (я про сдвиг вправо на 2 разряда)?
Простой вариант
Код
_remappalette( i,  (dwordpolitra [0] << 16) | (dwordpolitra [1] << 8) | dwordpolitra [2]);

не проходит?
sergey sva
Только так удалось получить картинку один в один виндовс дос.
Genadi Zawidowski
А что не так в случае правильного (как я нарисовал) формирования элемента палитры? Может, разобраться стоит с форматом bmp?
ps: можно весь код?
А то, мне кажется, что переделаный Вами на unsigned long * реперь захвыатывает соседние элементы из палитры.
Надо был сделать как я говорил - приводить перед сдвигом.

Код
unsigned char * palitra;

....

const unsigned long pe =
    ((unsigned long) palitra [0] << 16) |
    ((unsigned long) palitra [1] << 8) |
    ((unsigned long) palitra [2] << 0);

Индексы и имена проставьте сами.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.