IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> Непонятки с 640x480x256, Недоходит до меня
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 618
Пол: Мужской

Репутация: -  24  +


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


--------------------
Close the World...txeN eht nepO
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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


Пока что все =) - спроси что еще не понятно я последовательно отвечу.


--------------------
- Где я?
- Во тьме.
- В какой тьме?
- Во тьме твоего мозга.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 618
Пол: Мужской

Репутация: -  24  +


Мне жутко понадобились видеостраницы, но этот код я не понимаю:
xor bx,bx
mov cx.basecol
mov dx,baserow
mov ax.4F07h
int 10h


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


--------------------
Close the World...txeN eht nepO
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Знаток
****

Группа: Пользователи
Сообщений: 408
Пол: Мужской

Репутация: -  3  +


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

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


--------------------
- Где я?
- Во тьме.
- В какой тьме?
- Во тьме твоего мозга.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.11.2019 3:00
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name