|
дос запись в видео память |
|
|
|
Oct 2 2011, 16:55
|

Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 2 2011, 18:33
|
Гуру
     
Группа: Свой
Сообщений: 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 }
|
|
|
|
|
Oct 3 2011, 12:13
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Цитата не вижу описаний scrwidth, altop. Они 16 бит? 32 unsigned long Цитата А с чего Вы решили, что в Вашей видеоплате функция установки номера окна предполагает, что окно 64 килобайта? Я про granularity. Переключается проверено, функция 4f05. Диапазон памяти видео адаптера 0x000A0000 0x000c0000 или ошибаюсь? работает только там не картинка а какие то разноцветные квадратики. мигают так должно быть?
|
|
|
|
|
Oct 3 2011, 20:06
|

Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 4 2011, 18:29
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Цитата А что было-то, размер страницы (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] ); }
|
|
|
|
|
Oct 5 2011, 16:47
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Oct 5 2011, 19:46
|

Профессионал
    
Группа: Участник
Сообщений: 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, а не то, что у Вас. какой компилятор? - ещё раз.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|