Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ Непонятки с 640x480x256

Автор: Archon 22.03.2005 22:55

С режимами 320x200 я разобрался, благо примеров море. Но с 640x480 не могу.
Режим я поставил. Далее точки выводятся, как я понимаю, в окна, которые надо перемещать по экрану... Можно об этом по-подробнее и желательно с примером?
PS И ещё вопрос: в этом режиме видео-страниц много? И если больше одной, как их ставить, стандартные процедурки прокатят?

Автор: Dark 23.03.2005 11:50

Ты работаешь с 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 17:29

Мне жутко понадобились видеостраницы, но этот код я не понимаю:

xor bx,bx
mov cx.basecol
mov dx,baserow
mov ax.4F07h
int 10h


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

Автор: Dark 9.05.2005 13:57

base col - базовый столбец, на которую ты двигаешь экран
base row - базовая колонка, на которую ты двигаешь экран

точки по случайности, замени на запятые