SergeyVas 0 1 октября, 2011 Опубликовано 1 октября, 2011 · Жалоба Нужно засвечивать точки в разных графических режимах, адрес 0,0 (верхний лев угол) соответствует 0xA0000000? Для разных графических режимов он меняется? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 2 октября, 2011 Опубликовано 2 октября, 2011 · Жалоба Для VESA режимов эту информацию возвращает BIOS видеоплаты. Чаще всего на A000. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 2 октября, 2011 Опубликовано 2 октября, 2011 · Жалоба Что то не пойму как вывести картинку например 800+600 если диапазон видео памяти начинается от a0000 до afff если дальше писать то просто изображения не видно. видео режим 800+600 256 линейный 0х103. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 2 октября, 2011 Опубликовано 2 октября, 2011 (изменено) · Жалоба Что то не пойму как вывести картинку например 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; Изменено 2 октября, 2011 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 2 октября, 2011 Опубликовано 2 октября, 2011 · Жалоба Спасибо разобрался. сделал функцию которая должна записывать изображение в озу вызываю эту функцию в цикле, картинка должна перемещаться по диагонали. Но что то не как не получается сделать это вот что получается. видео 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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 3 октября, 2011 Опубликовано 3 октября, 2011 (изменено) · Жалоба 1) не вижу описаний scrwidth, altop. Они 16 бит? 2) А с чего Вы решили, что в Вашей видеоплате функция установки номера окна предполагает, что окно 64 килобайта? Я про granularity. 3) моя программа работает у Вас? Она тоже изображение выводит. 4) Не вижу установки начальной страницы. Изменено 3 октября, 2011 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 3 октября, 2011 Опубликовано 3 октября, 2011 · Жалоба не вижу описаний scrwidth, altop. Они 16 бит? 32 unsigned long А с чего Вы решили, что в Вашей видеоплате функция установки номера окна предполагает, что окно 64 килобайта? Я про granularity. Переключается проверено, функция 4f05. Диапазон памяти видео адаптера 0x000A0000 0x000c0000 или ошибаюсь? работает только там не картинка а какие то разноцветные квадратики. мигают так должно быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 3 октября, 2011 Опубликовано 3 октября, 2011 · Жалоба Вроде бы заработало. Правда есть один момент картинка bmp глубина цвета 8 бит если ее открываю в винде цвета одни а в досе другие? Можно как то в винде открыть картинку что бы она выглядела как в досе редактор гимп. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 3 октября, 2011 Опубликовано 3 октября, 2011 (изменено) · Жалоба Вроде бы заработало. Правда есть один момент картинка bmp глубина цвета 8 бит если ее открываю в винде цвета одни а в досе другие? Можно как то в винде открыть картинку что бы она выглядела как в досе редактор гимп. Где-то надо загрузить ту палитру, в которой Ваш файл сохранён (кажется, она вместе с каритнкой где-то). Потому я про 16 или 32 (24) бита вам и говорил. А что было-то, размер страницы (granulation) у Вашего видеоадаптера какой? Диапазон памяти видео адаптера 0x000A0000 0x000c0000 или ошибаюсь? Что печатает моя программа про доступные vesa режимы? Характеристики используемого Вами режима? Изменено 3 октября, 2011 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 4 октября, 2011 Опубликовано 4 октября, 2011 · Жалоба А что было-то, размер страницы (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] ); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 4 октября, 2011 Опубликовано 4 октября, 2011 (изменено) · Жалоба Не видя всего кода, трудно сказать, что там происходит... вопросы: 1) Какого типа переменная palit (намёк на пропущенное приведение типов перед сдвигом) - см. вопрос 3. 2) Что за функция _remappalette (я про сдвиги на 7 и на 15)? 3) что за компилятор, в каком режиме (real mode? какой размер int?). Visual C 1.52? Изменено 4 октября, 2011 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба Какого типа переменная palit (намёк на пропущенное приведение типов перед сдвигом) . в этом проблема была )) Цвета все равно отличаются синий мягче чем в винде не пойму почему, комп один и тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба в этом проблема была )) Цвета все равно отличаются синий мягче чем в винде не пойму почему, комп один и тоже. На остальные мои вопросы можно ответ услышать? Например, на правильное ли количество бит сдвигается байт перед получением значения, загружаемого в решистры палитры? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба Например, на правильное ли количество бит сдвигается байт перед получением значения, загружаемого в решистры палитры? Изображение сохраняю как BMP с глубиной цвета 8бит 96пикселей на дюйм. Сдвигается на длину палитры, палитра храниться после структуры BITMAPINFOHEADER размер байт палитры в поле biClrUsed. biClrUsed num_colors = biClrUsed fread(palit,(num_colors*4) , 1, fp); сдвигается на num_colors*4 дальше идет информация о цвете картинки. Насколько правильно не знаю с досом не работал, может картинка и должна отличаться? что то подсказывает не должно быть отличий. компилятор watcom. вот картинка fon.bmp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба Изображение сохраняю как 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, а не то, что у Вас. какой компилятор? - ещё раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться