Помощь - Поиск - Пользователи - Календарь
Полная версия: Непонятки с 640x480x256
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
Archon
С режимами 320x200 я разобрался, благо примеров море. Но с 640x480 не могу.
Режим я поставил. Далее точки выводятся, как я понимаю, в окна, которые надо перемещать по экрану... Можно об этом по-подробнее и желательно с примером?
PS И ещё вопрос: в этом режиме видео-страниц много? И если больше одной, как их ставить, стандартные процедурки прокатят?
Dark
Ты работаешь с 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
Мне жутко понадобились видеостраницы, но этот код я не понимаю:
xor bx,bx
mov cx.basecol
mov dx,baserow
mov ax.4F07h
int 10h


Прошу прощения, конечно, но асм я знаю неважно... Почему точки вместо запятых и что за переменные basecol и baserow?
Что вообще делает функция 4F07h?
Dark
base col - базовый столбец, на которую ты двигаешь экран
base row - базовая колонка, на которую ты двигаешь экран

точки по случайности, замени на запятые
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.