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

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

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

 
 Ответить  Открыть новую тему 
> Вывод картинки напрямую в видеопамять
Dark
сообщение 13.05.2003 23:39
Сообщение #1


Знаток
****

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

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


Вот, кому интересно, взял я тему Shadow - вывод точки напрямую в видеопамять и немного изменил:

uses crt;
Const color:array[0..12,0..16] of Byte=

(
(4,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,1),
(4,24,15,15,24,24,24,15,15,15,24,15,24,24,24,15,1),
(4,15,24,22,15,24,15,24,24,24,24,15,15,24,15,15,1),
(4,15,22,24,15,24,24,15,15,24,24,15,24,15,24,15,1),
(4,15,15,15,15,24,24,24,24,15,24,15,24,24,24,15,1),
(4,15,24,24,15,24,15,15,15,24,24,15,24,24,24,15,1),
(4,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,1),
(4,15,15,15,24,24,24,15,15,15,24,24,24,15,15,15,1),
(4,15,22,24,15,24,15,24,24,24,15,24,15,24,24,24,1),
(4,15,15,15,24,24,15,15,15,15,15,24,24,15,15,24,1),
(4,15,24,22,24,22,15,24,22,24,15,24,24,24,24,15,1),
(4,15,24,22,22,22,15,24,22,24,15,24,15,15,15,24,1),
(4,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,1)
);

Var
x,y,c,col:Word;

Procedure BlockOut(x,y,mx,my:Word);
Begin

asm
mov ax,0a000h
mov es,ax     {es:di <- screen[0,0]}
lea si,color    {ds:si <- color[0]}
mov cx,y       {cx <- y}
shl cx,6         {cx <- cx * 2^6<=>y*64}
mov di,cx      {di <- y*64}
shl cx,2         {cx <- cx*2^6*2^2<=>y*256}
add di,cx       {di <- di+y*256}
add di,[x]      {di <- di+x}
mov cx,[my]  {kol-vo povtorov po y}
mov dx,[mx]  {kol-vo povtorov po x}
@l1:
push cx          {sohranyaem cx v steke}
mov cx,dx       {pomeshatm v cx kolvo povt. po x}
rep movsb      {es:[di]<-ds:[si]}{vuvodim stroku tochek}
pop cx             {vostanavlivaem cx dla povtorov po y}
add di,320
sub di,mx      {Vuchislaem adres sleduyshei stroki}
loop @l1         {cx<-cx-1; goto @l1}
end;
end;

BEGIN
asm
mov ax,0013h
int 10h
end;

repeat
blockout(random(320-17),random(200-13),17,13);
delay(700);
until keypressed;

asm
mov ah,0
int 16h
end;

end.



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


Профи
****

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

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


директиву Assembler опять не поставил...
Сам просчет смещения остался стандартным, не думаю, что ты бы смог сам догадаться, что 64*y+256*y = 320*y, а там где SHL CX,2 лучше (special for someone: лучше для 8086) два раза SHL CX,1.
Сам цикл вывода реализован хорошо, но это единственное, что радует...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Dark
сообщение 18.05.2003 23:23
Сообщение #3


Знаток
****

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

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


На тему директивы: я тебе уже писал, что не знаю, что она делает!!!! И почему ты уверен, что я недопираю до сдвигов...??? ??? :'(


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


Lonely_Raven
****

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

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


:D
-=-=
моно сказать что SHL ето деление на степени двойки и наоборот SHR уиножен
-=-=-
и ето почти самая быстрая команда ASM вроде
-=-=


--------------------
Программа делает то что вы ей приказали а не то что бы ВАМ хотелось бы.
МЕРФИ
---------------------
RTFM - Read the fucking manual
---------------------
http://www.livejournal.com/users/lonley_raven/
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
___ALex___
сообщение 19.05.2003 8:51
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 282

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


наоборот только
shl - умножение на степени двойки
shr - целочисленное деление на степени двойки
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Shadow
сообщение 19.05.2003 14:06
Сообщение #6


Lonely_Raven
****

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

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


;D
-=-=-=-=-
Бр-р-р-р-р-
точно


--------------------
Программа делает то что вы ей приказали а не то что бы ВАМ хотелось бы.
МЕРФИ
---------------------
RTFM - Read the fucking manual
---------------------
http://www.livejournal.com/users/lonley_raven/
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 19.05.2003 15:40
Сообщение #7


Профи
****

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

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


Цитата
На тему директивы: я тебе уже писал, что не знаю, что она делает!!!! И почему ты уверен, что я недопираю до сдвигов...??? ??? :'(


Ты ничего не подумай, я не имел в виду, что ты не понимаешь, что этот код делает. Я говорю, что сам просчет смещения, реализован не тобой... т.к. этот код я видел уже лет 6 назад и до сих пор он особо не изменялся (в плане перспективы). Или может ты его весь сам придумал ???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 19.05.2003 20:32
Сообщение #8


Профи
****

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

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


А по поводу директивы Assembler, дык меньше кода генерится, не знаю что за процедуру вставляет компилер перед непосредственно кодом процедуры (как- нибудь посмотрю) + не освобождается место для локальных переменных (нет enter/leave)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Dark
сообщение 20.05.2003 1:03
Сообщение #9


Знаток
****

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

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


Ok, я без обид,  ;D а использование shl действительно моно встретить во многих демках и интрах, а мне дал мой наставник...


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


Профи
****

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

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


Глянул, что делает компилер без директивы Assembler; осуществляется проверка стека...
По-поводу SHL я имел ввиду, что эта команда в виде SHL AX,1 (сдвиг всего одного бита), работает много быстрее, чем SHL AX,CL (к примеру если CX=2, то лучше написать SHL AX,1; SHL AX,1). На всякий случай эта тема была актуальна применительно к 8086/80186.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Dark
сообщение 21.05.2003 1:41
Сообщение #11


Знаток
****

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

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


Цитата
Хорошая вещь.  :)
только к процедуре дай комментарий по подробней.  :(


Хорошая вещь.  
только к процедуре дай комментарий по подробней.    

A000 - адрес видеобуфера,

Я просто организую цикл на ассемблере, выводящий точки(записывающий байты) из буфера color(адрес помещен в ds:si)
в видеобуфер.

Cмещение первой выводимой точки вычисляется так:
di=x+y*320.(без коментариев)

cx содержит кол-во строк, dx - столбцов...

вывод строки - rep movsb.

movsb перемещает байт из ds:[si] в es:[di]

Команда movsb сама прибавляет к di и si по 1.

Затем 2 команды -
add di,320
sub di,mx

Корректируют текущий адрес, для получения адреса начала следующей строки рисунка

Вопросы? ;D


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

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

 



- Текстовая версия 28.03.2024 21:32
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"