Перейти к содержанию
    

дос запись в видео память

Нужно засвечивать точки в разных графических режимах, адрес 0,0 (верхний лев угол) соответствует 0xA0000000?

Для разных графических режимов он меняется?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для VESA режимов эту информацию возвращает BIOS видеоплаты. Чаще всего на A000.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что то не пойму как вывести картинку например 800+600 если диапазон видео памяти начинается от a0000 до afff если дальше писать то просто изображения не видно. видео режим 800+600 256 линейный 0х103.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что то не пойму как вывести картинку например 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо разобрался.

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

Но что то не как не получается сделать это вот что получается.

 

видео 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
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

3) моя программа работает у Вас? Она тоже изображение выводит.

4) Не вижу установки начальной страницы.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

32 unsigned long

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

Переключается проверено, функция 4f05.

Диапазон памяти видео адаптера 0x000A0000 0x000c0000 или ошибаюсь?

работает только там не картинка а какие то разноцветные квадратики. мигают так должно быть?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде бы заработало. Правда есть один момент картинка bmp глубина цвета 8 бит если ее открываю в винде цвета одни а в досе другие?

Можно как то в винде открыть картинку что бы она выглядела как в досе редактор гимп.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде бы заработало. Правда есть один момент картинка bmp глубина цвета 8 бит если ее открываю в винде цвета одни а в досе другие?

Можно как то в винде открыть картинку что бы она выглядела как в досе редактор гимп.

 

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

Потому я про 16 или 32 (24) бита вам и говорил.

 

 

 

А что было-то, размер страницы (granulation) у Вашего видеоадаптера какой?

Диапазон памяти видео адаптера 0x000A0000 0x000c0000 или ошибаюсь?

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

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что было-то, размер страницы (granulation) у Вашего видеоадаптера какой?

ошибка в коде неправильно переключались окна сейчас это работает. Режим 256 цветов разрешение 800*600 в этом режиме размер окна 64535 байт. пишу напрямую в память.

сейчас другая проблемка с палитрой. не как не получается что бы совпадал цвет картинки открытой в винде и в досе вот что выходит :(

слева картинка в винде справа в досе в чем может быть проблема дайте мысль :)

  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]  );
  }

post-27923-1317752904_thumb.jpg

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не видя всего кода, трудно сказать, что там происходит...

вопросы:

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

2) Что за функция _remappalette (я про сдвиги на 7 и на 15)?

3) что за компилятор, в каком режиме (real mode? какой размер int?). Visual C 1.52?

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

в этом проблема была ))

Цвета все равно отличаются синий мягче чем в винде не пойму почему, комп один и тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в этом проблема была ))

Цвета все равно отличаются синий мягче чем в винде не пойму почему, комп один и тоже.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

biClrUsed num_colors = biClrUsed

 

fread(palit,(num_colors*4) , 1, fp); сдвигается на num_colors*4 дальше идет информация о цвете картинки.

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

компилятор watcom.

вот картинка fon.bmp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

biClrUsed num_colors = biClrUsed

 

fread(palit,(num_colors*4) , 1, fp); сдвигается на num_colors*4 дальше идет информация о цвете картинки.

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

компилятор watcom.

вот картинка fon.bmp

 

какой компилятор?

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

 

0x00bbggrr

 

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

 

какой компилятор? - ещё раз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...