Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11653
Последний выпуск: 19.06.2015

Vesa 1.2 (Пример)

program tves_as1; {проверка модуля vesa_as}

uses vesa_as,crt;

var
   LenLineP:word;  {длина строки растра в точках}
   LenLineB:word;  {длина строки растра в байтах}
   MaxLines:word;  {максимальное число строк растра}
   
procedure putpixel(X,Y,Color:word); {вывод точки на экран}
var
   bank,offs:word;
begin
   asm
      xor bx,bx
      mov ax,Y
      mul LenLineB
      add ax,X
      adc dx,bx
      mov bank,dx    {предполагаем (не проверяя), что granularity = 64K}
      mov offs,ax
   end;
   SetVESABank(bank,0);   {вывод осуществляется в окно А}
   Mem[$A000:offs]:=lo(Color);
end;   

Procedure WaitRetrace;  {ожидание вертикального обратного хода луча}
Begin
   While(Port[$3DA]and $08)=0 do;
End;

var
   i,j:word;          {переменные цикла, что ж еще?}
   b1:VesaInfoBlock;  {информационный блок VESA (для 0-й функции)}
   b2:ModeInfoBlock;  {информационный блок видеорежима (для 1-й функции)}
   NBanks:word;       {общее количество банков видеопамяти}
begin
{выясняем наличие VESA и выводим основные параметры}
   if GetVesaInfo(@b1) then begin
      for i := 0 to 3 do write(b1.VesaSignature[i]);
      write(-, Ver -,hi(b1.VESAVersion),-.-,lo(b1.VESAVersion));
      writeln(-, -,b1.TotalMemory*64,-Kb videomemory on board -);
      i := 0;
      while b1.OEMStringPtr^[i]  #0 do begin
         write(b1.OEMStringPtr^[i]);
         inc(i);
      end;
      writeln;
      i := 0;
      writeln(-Modes:-);
      while b1.VideoModePtr^[i]  $FFFF do begin
         write(b1.VideoModePtr^[i],- -); {список видеорежимов}
         inc(i);
      end;
      writeln;
   end else writeln(-Error-);
{получаем характеристики одного из видеорежимов}
   if GetModeInfo($103,@b2) then begin 
      writeln(-Mode 103h, Granularity:-,b2.WinGranularity,-Kb, Window Size:-,
          b2.winsize,-Kb, -,
          b2.XResolution,-x-,
          b2.YResolution,-, -,
          b2.BitsPerPixel,
          - bits per pixel-);
      NBanks := (b1.TotalMemory * 64) div b2.WinGranularity;
   end else writeln(-Error-);
   readkey;
{устанавливаем видеорежим, характеристики которого мы получили}
   if SetVesaMode($103) then begin
      LenLineB := b2.BytesPerScanLine;
{закрашиваем каждый из банков своим цветом}
      for i := 0 to NBanks-1 do begin
         SetVESABank(i,0);
         fillchar(mem[$a000:0],b2.WinGranularity * 512,char(i+1));
         fillchar
            (mem[$a000:
                        b2.WinGranularity * 512],
                        b2.WinGranularity * 512,char(i+1));
               {предполагаем, что сегмент окна А - 0А000h}
      end;
   end else writeln(-Error-);
   readkey;
{поточечно рисуем диагональную многоцветную полосу}
   for i := 0 to 199 do
      for j := 0 to 599 do PutPixel(j+i,j,j);
   readkey;   
   LenLineP := 1024;
{пытаемся изменить логическую длину строки}
   SetVESALenLine(LenLineP,LenLineB,MaxLines);
   readkey;
{снова рисуем полосу}
   for i := 0 to 199 do
      for j := 0 to 1023 do PutPixel(j+i,j,j);
   readkey;
{производим панорамирование ...}
   for i := 0 to (1023-800) do begin
      SetVESAStart(i,0);
      WaitRetrace;
   end;
{... и скроллирование экрана}
   for j := 0 to (1023-600) do begin
      SetVESAStart(i,j);
      WaitRetrace;
   end;
   readkey;
{возвращаем видеоадаптер в текстовый режим}
   asm
      mov ax,3
      int $10
   end;
end.

Сервис VESA

unit vesa_as; {сервис VESA вариант Borland Pascal Real Mode}
Interface

type
   VesaInfoBlock = record
................................{структуру см. в тексте}
   END;
   ModeInfoBlock = record
................................{структуру см. в тексте}
   END;

function GetVESAInfo(Buffer:pointer):boolean; {функция 0, информация о VESA}
function GetModeInfo(Mode:word;Buffer:pointer):boolean; {функция 1, информация о режиме}
function SetVESAMode(Mode:word):boolean; {функция 2, установка видеорежима}
function SetVESABank(Bank,Window:word):boolean; {функция 5, установка банка}
function SetVESALenLine(var PLength,BLength,NLines:word):boolean; 
   {функция 6, установка логической длины линии растра}
function SetVESAStart(XStart,YStart:word):boolean; 
   {функция 7, управление положением экранного окна в видеопамяти}

Implementation

function GetVESAInfo(Buffer:pointer):boolean; {информация о VESA}
var
   RetCode : word;
begin
   asm
      mov ax,$4f00
      les di,Buffer
      int $10
      mov RetCode,ax
   end;
   GetVESAInfo := RetCode = $004F; 
end;

function GetModeInfo(Mode:word;Buffer:pointer):boolean; {информация о режиме}
var
   RetCode : word;
begin
   asm
      mov ax,$4f01
      mov cx,Mode
      les di,Buffer
      int $10
      mov RetCode,ax
   end;
   GetModeInfo := RetCode = $004F; 
end;

function SetVESAMode(Mode:word):boolean;
var RetCode:word;
begin
   asm
      mov ax,$4f02
      mov bx,mode
      int $10
      mov RetCode,ax
   end;
   SetVESAMode := RetCode = $004f;
end;

const NumBank : integer = -1;

function SetVESABank(Bank,Window:word):boolean;
var RetCode:word;
begin
   if Bank = NumBank then
      SetVESABank := TRUE
   else begin
      asm
         mov ax,$4f05
         mov bx,Window
         mov dx,Bank
         int $10
         mov RetCode,ax
      end;
      if RetCode = $004f then begin
         SetVESABank := TRUE;
         NumBank := Bank;
      end
      else SetVESABank := FALSE;
   end;
end;

function SetVESALenLine(var PLength,BLength,NLines:word):boolean;
var RetCode:word;
begin
   asm
      mov ax,$4f06
      les di,Plength
      mov cx,[di]
      xor bx,bx
      int $10
      les di,Plength
      mov [di],cx
      les di,Blength
      mov [di],bx
      les di,Nlines
      mov [di],dx
      mov RetCode,ax
   end;
   SetVESALenLine := RetCode = $004f;
end;

function SetVESAStart(XStart,YStart:word):boolean;
var RetCode:word;
begin
   asm
      mov ax,$4f07
      xor bx,bx
      mov cx,XStart
      mov dx,YStart
      int $10
      mov RetCode,ax
   end;
   SetVESAStart := RetCode = $004f;
end;

end.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог