ФТП сменил адресс. ftp://2001:0:d5c7:a2d6:289f:39e1:c173:2f7/ Пример того как можно настроить ipv6 в вин XP и FreeBSD http://ihtiandr.info/unix/1-unix/90-freebsd-ipv6-configuration-guide-manual-how-to.html По просьбе выкладываю и через стандартную сеть. http://narod.ru/disk/12349836000/VESA.rar.html
это все здорово, я тоже много чего нашел. Вопрос (сам пока еще не успел найти), как определить сколько контроллеров, мониторов?
NoName Берем и перебираем все возможные значения cx. Стандарт это не регулирует встречал такое что cx=0 не выдовал значения. А вот cx=1 выдовал, а бывает что и выдает дубликат. Вообщем если хочешь то можно так через PCI находим все видео карты и общаемся к драйверу этого устройства он уже опрашивает устройство.
Непонятка. Детектирую все разрешения монитора и видеоконтроллера. Выбираю из доступных совместимый, обязательно 32-х битный. Пиксель рисую такой тестовой функцией (расчеты на основе http://www.wasm.ru/article.php?article=lfbdos): Код (Text): static void DrawPixel(const WORD PosX, const WORD PosY) { const int ColorComponents = 4; const DWORD RelBideoAddr = (Resolution[HORZ_RESOLUTION] * PosY * ColorComponents) + (PosX * ColorComponents); const BYTE Blue = 0; const BYTE Green = 0; const BYTE Red = 100; const BYTE Alpha = 0; AsmWriteB(LFBAddress + RelBideoAddr + 0, Blue); //Blue AsmWriteB(LFBAddress + RelBideoAddr + 1, Green); //Green AsmWriteB(LFBAddress + RelBideoAddr + 2, Red); //Red AsmWriteB(LFBAddress + RelBideoAddr + 3, Alpha); //Alpha }/* --------------------------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------------------------------- */ Непосредственно вызов приведенной функции осуществляется таким способом: Код (Text): { WORD x, y; for(x = 0; x < Resolution[HORZ_RESOLUTION]; x++) { for(y = 0; y < Resolution[VERT_RESOLUTION]; y++) { DrawPixel(x, y); } } } Экран корректно переключается в новый режим (смотрю через его меню и сопоставлю с тем какой должен быть). а. AsmSetVideoMode(CodeOfVideoMode | VESA_SELECT_LFB | VESA_PRESERVE_VIDEO_MEM); VESA_SELECT_LFB (14) VESA_PRESERVE_VIDEO_MEM (15) На экране появляется сверху красная полоска, а остальная часть с предыдущими данными из видеопамяти. б. с очисткой (без флага VESA_PRESERVE_VIDEO_MEM) На экране появляется сверху такая же красная полоска, остальное черное. Непонимаю почему пиксели выводятся не там где надо. Resolution[HORZ_RESOLUTION] & Resolution[VERT_RESOLUTION] правильные, есть подозрение что в алгаритме чего-то нехватает. LFBAddress тот который дал контроллер (0xD800.0000). Код (Text): _AsmWriteB proc far push bp mov bp,sp push esi push ax mov esi,dword ptr [bp + 6] mov al,byte ptr [bp + 10] mov byte ptr gs:[esi],al pop ax pop esi pop bp ret endp
Resolution[HORZ_RESOLUTION] * ColorComponents может не соотвествовать длине линии. Надо считывать. Попробуй другое разрешение. Бывает так что изоброжение не выравненно на мониторе при одном разрешении, а при другом нормально.
Pavia 1280x1024, два совершенно разных монитора. BytesPerScanLine = LinBytesPerScanLine = 3200 Почему 3200 если должно быть 5120? BytesPerScanLine насколько я понял только для не LFB, а для LFB - LinBytesPerScanLine и он только от VBE 3.0, а она не везде есть. В любом случае полоска остается такой же (на беглый взгляд). Кстати моник второй широкий, выдает по edid низкое разрешение - 1280x1024 когда может держать гораздо больше, это связано как-то с контроллером?
правильно ли я понимаю что "Maximum Resolution" в EDID определяется через STANDARD TIMING IDENTIFICATION?
Наверно 3200/4=800 ты с разрешением напутал. EDID выдает наилучшее разрешение, на который монитор рассщитан я на своем 15" CRT ставил 1600x1200 хотя он рассщитан на 1024х768. Хотя для широко форматных не редкость данные в EDID вшиты не корректные. С контроллером это не связанно. Это контроллер под моник подстраивается.
Сверху полоски такой же толщины что и полоса раньше, повторяются. Это мне напомнило что когда не очищал видеопамять соответствующим флагом там были маленькие подобия окон с искажениями и дос текстом. Код (Text): { WORD x = 0, y = 0; //for(x = 0; x < Resolution[HORZ_RESOLUTION]; x++) { for(y = 0; y < Resolution[VERT_RESOLUTION]; y++) { DrawPixel(x, y); } //} }
Подскажите пожалуйста. 1. Как лучше в случае линейного буффера организовать двойную буферизацию? Проверял простой записью в буфер нескольких изображений, видно что моргает если быстро и если медленно. 2. Сделал по спецификации запросы: и такой. Через код: Код (Text): ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ;DWORD AsmCheckDCC(const WORD ControllerNumber); VESA_DDC_CONTROLLER_NUMBER equ 6 ;see VBEDDC11.pdf _AsmCheckDCC proc far push bp mov bp,sp push es push si ; protection push di ; protection pushf ; protection push cx push bx mov cx,word ptr [bp + VESA_DDC_CONTROLLER_NUMBER] ; Controller unit number (00 = primary) (*) mov ax,4F15h ; VESA VBE/DC (Display Data Channel) - INSTALLATION CHECK / CAPABILITIES mov bx,0 ; Report DDC Capabilities mov es,bx ; must be null pointer, reserved mov di,bx ; must be null pointer, reserved int 10h ; All other registers may be destroyed! ; ignore bh - Approx. time in seconds, rounded up, to transfer one EDID block movzx dx, bl ; DDC level supported ; out dx,ax - ddc version, ddc status pop bx pop cx popf ; protection pop di ; protection pop si ; protection pop es pop bp ret endp ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ;WORD AsmReadEDID(const WORD ControllerNumber, const WORD EDIDBlockNum, EDIDInfo * EdidStructPtr); ;VESA_DDC_CONTROLLER_NUMBER equ 6 VESA_EDID_BLOCK_NUMBER equ 8 VESA_EDID_STRUCTURE_OFFSET equ 10 ;see VBEDDC11.pdf _AsmReadEDID proc far push bp mov bp,sp push es push si ; protection pushf ; protection push di push bx push cx push dx ; cx - monitors, if not availible - 30 sec lacuna; or controllers see get-edid.c ??? mov cx,word ptr [bp + VESA_DDC_CONTROLLER_NUMBER] mov dx,word ptr [bp + VESA_EDID_BLOCK_NUMBER] ; EDID Block Number (additional info) les di,dword ptr [bp + VESA_EDID_STRUCTURE_OFFSET] ; pointer to area with space for EDID mov ax,4F15h ; VESA VBE/DC (Display Data Channel) - READ EDID mov bx,1h ; Read EDID int 10h ; All other registers may be destroyed! ;result in ax pop dx pop cx pop bx pop di popf ; protection pop si ; protection pop es pop bp ret endp ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Код (Text): const WORD GetInfoResult = AsmVesaGetInfo(VESAInfoPtr); CheckResult(__LINE__, GetInfoResult, __FILE__, "CheckVBE(): VESA is not supported"); Код (Text): EDIDInfo * EDIDStructPtr = XCalloc(sizeof(EDIDInfo)); const WORD GetInfoResult = AsmReadEDID(CONTROLLER1, 0, EDIDStructPtr); Работает почему то не на всех модулях. Есть модули которые выдают что поддерживают DDC 1 & 2 по первой функции, а сами по второй функции пишут что вызов неудался, но функция поддерживается. Непонимаю как это так, может где-то ошибка? Перепроверял. При всем этом на этих модулях работает венда.
Это два разных вопроса: 1 и 2. У меня PM без страничной адресации. Предпологаю сделать буферизацию программно.
Проверил под вендой, видимо этой действительно неправильный EDID, поскольку после установки вендой драйвера все становится нормально. Подскажите есть ли нормальные широкоформатные мониторы, может быть это от фирмы зависит?
EDID поддерживаеться даже оооочень старыми мониторами так что даже незнаю что вам подсказать поставте какойто юникс себе и xorg с драйвером vesa там все реализовано и сравните свои вызовы ирезультаты с ним может тогда проясниться