реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> дос запись в видео память
sergey sva
сообщение Oct 1 2011, 19:14
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Нужно засвечивать точки в разных графических режимах, адрес 0,0 (верхний лев угол) соответствует 0xA0000000?
Для разных графических режимов он меняется?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 2 2011, 07:37
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Для VESA режимов эту информацию возвращает BIOS видеоплаты. Чаще всего на A000.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Oct 2 2011, 13:02
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Что то не пойму как вывести картинку например 800+600 если диапазон видео памяти начинается от a0000 до afff если дальше писать то просто изображения не видно. видео режим 800+600 256 линейный 0х103.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 2 2011, 16:55
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(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;


Сообщение отредактировал Genadi Zawidowski - Oct 2 2011, 17:03
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Oct 2 2011, 18:33
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Спасибо разобрался.
сделал функцию которая должна записывать изображение в озу вызываю эту функцию в цикле, картинка должна перемещаться по диагонали.
Но что то не как не получается сделать это вот что получается.

видео 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
}
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 3 2011, 07:11
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



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

Сообщение отредактировал Genadi Zawidowski - Oct 3 2011, 07:17
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Oct 3 2011, 12:13
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Цитата
не вижу описаний scrwidth, altop. Они 16 бит?

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

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

Go to the top of the page
 
+Quote Post
sergey sva
сообщение Oct 3 2011, 16:48
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Вроде бы заработало. Правда есть один момент картинка bmp глубина цвета 8 бит если ее открываю в винде цвета одни а в досе другие?
Можно как то в винде открыть картинку что бы она выглядела как в досе редактор гимп.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 3 2011, 20:06
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



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


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



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

Что печатает моя программа про доступные vesa режимы? Характеристики используемого Вами режима?

Сообщение отредактировал Genadi Zawidowski - Oct 3 2011, 20:12
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Oct 4 2011, 18:29
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Цитата
А что было-то, размер страницы (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]  );
  }

Прикрепленное изображение

Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 4 2011, 21:38
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



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

Сообщение отредактировал Genadi Zawidowski - Oct 4 2011, 21:44
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Oct 5 2011, 11:28
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Цитата
Какого типа переменная palit (намёк на пропущенное приведение типов перед сдвигом) .

в этом проблема была ))
Цвета все равно отличаются синий мягче чем в винде не пойму почему, комп один и тоже.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 5 2011, 16:31
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



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

На остальные мои вопросы можно ответ услышать? Например, на правильное ли количество бит сдвигается байт перед получением значения, загружаемого в решистры палитры?
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Oct 5 2011, 16:47
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



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

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

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

fread(palit,(num_colors*4) , 1, fp); сдвигается на num_colors*4 дальше идет информация о цвете картинки.
Насколько правильно не знаю с досом не работал, может картинка и должна отличаться? что то подсказывает не должно быть отличий.
компилятор watcom.
вот картинка Прикрепленный файл  fon.bmp ( 469.8 килобайт ) Кол-во скачиваний: 3
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 5 2011, 19:46
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(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.
вот картинка Прикрепленный файл  fon.bmp ( 469.8 килобайт ) Кол-во скачиваний: 3


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

Код
0x00bbggrr


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

какой компилятор? - ещё раз.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 01:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01507 секунд с 7
ELECTRONIX ©2004-2016