Непонятки с 640x480x256, Недоходит до меня |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
Непонятки с 640x480x256, Недоходит до меня |
Archon |
22.03.2005 18:55
Сообщение
#1
|
Профи Группа: Пользователи Сообщений: 618 Пол: Мужской Репутация: 24 |
С режимами 320x200 я разобрался, благо примеров море. Но с 640x480 не могу.
Режим я поставил. Далее точки выводятся, как я понимаю, в окна, которые надо перемещать по экрану... Можно об этом по-подробнее и желательно с примером? PS И ещё вопрос: в этом режиме видео-страниц много? И если больше одной, как их ставить, стандартные процедурки прокатят? -------------------- Close the World...txeN eht nepO
|
Dark |
23.03.2005 7:50
Сообщение
#2
|
Знаток Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: 3 |
Ты работаешь с VESA?
тогда да, там окна =) Итак, что такое окна? 640*480*8bit= 307200 байт, Сегмент же у нас 65536 байт 307200/ 65536 примерно 4.7 - т.е. у нас здесь 4 полных окна и еще чуть чуть =) 5 окон всего. Каждое окно - это просто напросто возможность записать в определенный кусок памяти, т.е. все что я запишу в $A000 будет записано в другой адрес. В принципе правило перехода из окна в окно - если у нас счетчик > 65535 то надо менять окно. В VESA это можно сделать 2мя способами: 1. Использовать функцию 4F05: mov dx,curwin xor bx,bx mov ax,4F05h int 10h и все. Эта функция меняет текущее окно на CurWin НО разработчики VESA говорят что прерывание 10h уж очень торозное =) т.к. на обращение к нему реагируют различные резидентыи компоненты DOS (ну например утилитка KEYRUS) поэтому =) они советуют воспользоваться процедурой VMC [Video Memory Control] которая состоит из 10-15 команд и передвигает окно =) что нам и надо. Где же эту функцию взять? Она записана в Video BIOS'е, именно ее адрес выдается нам когда мы запрашиваем информацию о режиме ( mov ax, 4F01h - функция mov cx, mode - режим mov es,Info - сегмент, по адресу которого запишется инфа о режиме xor di,di - и 0 смещение int 10h - ВПЕРЕД!!! ) вот, 4 байта по смещению [Info:di+0Ch] будут адресом VMC. Здесь я приведу 2 процедуры им моего движка VESA - вычисления VMC и рисования точки =) Код type TModeInfo = record Attributes : word; WinAAttr,WinBAttr : byte; WinGran : word; WinSize : word; WinASeg, WinBSeg : word; [COLOR=blue] VMC : pointer; [/COLOR] BytesPLine : word; Width,Height : word; CharWidth,CharHeight : byte; Planes,BitsPPixel : byte; Banks,MemModel,BankSize : byte; ImagePages : byte; Reserv1 : byte; RedMaskSize : byte; RedFieldPos : byte; GreenMaskSize : byte; GreenFieldPos : byte; BlueMaskSize : byte; BlueFieldPos : byte; ResMaskSize : byte; ResFieldPos : byte; ColorModeInfo : byte; Reserv2 : array [0..225] of byte;{ничего нету - резерв} end; Код var ModeInfo : TModeInfo; Код function TestMode(mode:word):boolean; begin asm cmp [IsVesa],0 je @exit mov ax,seg ModeInfo mov es,ax mov di,offset ModeInfo mov @result,1 mov ax,4f01h mov cx,[mode] int 10h xor ax,4fh je @exit mov @result,0 @exit: end; end; Код var CurWin:word; procedure SetBank;assembler; asm pusha xor bx,bx mov dx,[curwin] call [ModeInfo.VMC] mov [CurWin],dx popa end; Код procedure VPutPixel(x,y:word;col:byte); begin asm cmp [IsVESA],0 je @exit mov ax,[y] mul [ModeInfo.width] add ax,[x] adc dx,0 mov di,ax cmp dx,[curwin] je @next mov [CurWin],dx call SetBank @next: mov ax,0A000h mov es,ax mov al,col stosb @exit: end; end; Вот и все что я могу сказать =) спрашивайте. А на тему видеостраниц - их колво зависит от видеопамяти, т.е. если видеопамяти всего 1 Мб то наша программа будет иметь всеголишь 2 доп окна Специальные функции переключения окон отсутствуют, но программист может переставить адрес начала отображаемой на экран памяти Код xor bx,bx mov cx.basecol mov dx,baserow mov ax.4F07h int 10h Пока что все =) - спроси что еще не понятно я последовательно отвечу. -------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
Archon |
4.05.2005 13:29
Сообщение
#3
|
Профи Группа: Пользователи Сообщений: 618 Пол: Мужской Репутация: 24 |
Мне жутко понадобились видеостраницы, но этот код я не понимаю:
xor bx,bx Прошу прощения, конечно, но асм я знаю неважно... Почему точки вместо запятых и что за переменные basecol и baserow? Что вообще делает функция 4F07h? -------------------- Close the World...txeN eht nepO
|
Dark |
9.05.2005 9:57
Сообщение
#4
|
Знаток Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: 3 |
base col - базовый столбец, на которую ты двигаешь экран
base row - базовая колонка, на которую ты двигаешь экран точки по случайности, замени на запятые -------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
Текстовая версия | 27.04.2024 11:08 |