информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[ASM]-smile'y 30.10.01 00:05  Число просмотров: 884
Автор: kar Статус: Незарегистрированный пользователь
<"чистая" ссылка>
а с алгоритмом не подскажешь, имеется в виду реализации effects?
<programming>
[ASM]-Demo's debug. 28.10.01 13:18  
Автор: kar Статус: Незарегистрированный пользователь
<"чистая" ссылка>
вот сталкнулся с таким трабл.
на4инается демка,
настраиваются сег регистры:es=A000h,DS=4000h(!)
загружаетя граф режим 13х,зап-ся палитра,
затем обращаются к окр.пикселям,ну 4то-то
вроде "mov al,byte ptr [si-322]".
вопрос: какого @#$а обращаются к я4ейке(пикселя)
4ерез ds,равный 4000h???

вот фрагмент:
mov ah,0a0h
mov es,ax
add ax,ax
mov ds,ax
mov ax,13h
int 10h

mov dx,3c9h
L1:
mov al,bl
shr al,2
out dx,al
out dx,al
out dx,al
inc bx
jnz L1

Fx1:
xor bx,bx
mov dx,3
mov si,di
Matrix:
inc si
mov al,byte ptr [si-322]
add bx,ax
mov al,byte ptr [si+318]
add bx,ax
mov al,byte ptr [si-2]
add bx,ax
dec dx
jnz Matrix
mov al,byte ptr [di]
sub bx,ax
shl ax,2
sub bx,ax
shr bx,2
mov ax,bx
shr ax,8
sub bx,ax
mov ds:[di],bl
inc di
loop Fx1

и тд..

А оно работает? 28.10.01 14:40  
Автор: Heromantor Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Дык может так надо?
+ как-то странно почему считаеться al=0? По скорости одинаково что mov ahg,0a0h, что mov ax,0a000h
+ Почему не записываеться 0 в порт 3c8h? А то зрен знает че там может быть
+ Вообще не понятно че-за хрень это такая, ну устанавливается палитра ккак-то хитро вычисленая на экран-то ничо не выводится!

+ Че за демка такая может у меня есть?

> вот сталкнулся с таким трабл.
> на4инается демка,
> настраиваются сег регистры:es=A000h,DS=4000h(!)
> загружаетя граф режим 13х,зап-ся палитра,
> затем обращаются к окр.пикселям,ну 4то-то
> вроде "mov al,byte ptr [si-322]".
> вопрос: какого @#$а обращаются к я4ейке(пикселя)
> 4ерез ds,равный 4000h???
>
> вот фрагмент:
> mov ah,0a0h
> mov es,ax
> add ax,ax
> mov ds,ax
> mov ax,13h
> int 10h
>
> mov dx,3c9h
> L1:
> mov al,bl
> shr al,2
> out dx,al
> out dx,al
> out dx,al
> inc bx
> jnz L1
>
> Fx1:
> xor bx,bx
> mov dx,3
> mov si,di
> Matrix:
> inc si
> mov al,byte ptr [si-322]
> add bx,ax
> mov al,byte ptr [si+318]
> add bx,ax
> mov al,byte ptr [si-2]
> add bx,ax
> dec dx
> jnz Matrix
> mov al,byte ptr [di]
> sub bx,ax
> shl ax,2
> sub bx,ax
> shr bx,2
> mov ax,bx
> shr ax,8
> sub bx,ax
> mov ds:[di],bl
> inc di
> loop Fx1
>
> и тд..
>
вот исходник.[обращение к пикс-ям 4ерез 4000h:xxxxh???] 28.10.01 16:47  
Автор: kar Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Дык может так надо?
> + как-то странно почему считаеться al=0? По скорости
> одинаково что mov ahg,0a0h, что mov ax,0a000h
> + Почему не записываеться 0 в порт 3c8h? А то зрен знает че
> там может быть
> + Вообще не понятно че-за хрень это такая, ну
> устанавливается палитра ккак-то хитро вычисленая на
> экран-то ничо не выводится!

;) ни4его страшного в ал=0 нет,все они 'так' пишут.
4то касается 3с8-не разбирался,главное работает.
но суть не в этом,главное DS!
как-то странно обращаются к пикселям 4ерез 4000h:ххххh???
вот исходник:
.286
Code Segment
Assume cs:Code
Org 100h
;-------------------------------------------------------------------------------
Main:
;-------------------------------------------------------------------------------
mov ah,0a0h
mov es,ax
add ax,ax
mov ds,ax
mov ax,13h
int 10h

mov dx,3c9h
L1:
mov al,bl
shr al,2
out dx,al
out dx,al
out dx,al
inc bx
jnz L1

Fx1:
xor bx,bx
mov dx,3
mov si,di
Matrix:
inc si
mov al,byte ptr [si-322]
add bx,ax
mov al,byte ptr [si+318]
add bx,ax
mov al,byte ptr [si-2]
add bx,ax
dec dx
jnz Matrix
mov al,byte ptr [di]
sub bx,ax
shl ax,2
sub bx,ax
shr bx,2
mov ax,bx
shr ax,8
sub bx,ax
mov ds:[di],bl
inc di
loop Fx1

Fx2:
xor bx,bx
mov si,di
inc si
mov al,byte ptr [si-320]
add bx,ax
mov al,byte ptr [si-1]
add bx,ax
mov al,byte ptr [si+1]
add bx,ax
mov al,byte ptr [si+320]
add bx,ax
shr bx,2
mov ds:[di],bl
inc di
loop Fx2

dec cx
rep movsb

in al,60h
dec al
jnz Fx1

mov al,03h
int 10h
ret
;-------------------------------------------------------------------------------
Code EndS
End Main
Не к пикселям 28.10.01 18:29  
Автор: :-) <:-)> Статус: Elderman
Отредактировано 28.10.01 19:46  Количество правок: 1
<"чистая" ссылка>
Через 0x4000 она обращается не к видеопамяти, а к данным. Сделано это, чтобы выгадать 2-3 байта ;) То же самое относится и к использованию значений регисторв ax,si,di по умолчанию.
Все идет хорошо, если запущенно мало ДОС-прог и адреса 4000h:xxxx никем не заняты. Вот у меня свободные адреса начинаются уже с 1414h:
Addr.  Total bytes   Program or device driver
-----  -----------  --------------------------
020Fh     18,048     Device=DISPLAY
0678h      1,152     Device=HIMEM
06C1h      2,848     Device=IFSHLP
0774h        816     Device=SETVER
07A8h        544     IFS=
07CBh        608     IFS=
0DB8h      6,928     KEYB
0F7Ch     13,376     WINICE
12B0h      3,808     win
1391h      4,896     vmm32
1414h    569,008     <largest free area>

---
А если будет запущено больше ДОСовских прог и что-нибудь попадет на 4000h:xxxx, то эта демка мигом все подвесит :)
порты. 28.10.01 20:00  
Автор: kar Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Через 0x4000 она обращается не к видеопамяти, а к данным.
> Сделано это, чтобы выгадать 2-3 байта ;) То же самое
> относится и к использованию значений регисторв ax,si,di по
> умолчанию.
> Все идет хорошо, если запущенно мало ДОС-прог и адреса
> 4000h:xxxx никем не заняты. Вот у меня свободные адреса
> начинаются уже с 1414h...


А как быть с портом 3c8h? туда тоже 0 пихается???
(ina4e s kakogo index'a on dydet 4itat'?)
да, c какого адреса на4инается free memory dos program?
порты. 29.10.01 14:09  
Автор: Heromantor Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> А как быть с портом 3c8h? туда тоже 0 пихается???

Вот чего написано по тому как программить контролер

3C8h (R/W): PEL Address Write Mode (VGA Only)
bit 0-7 The PEL data register (0..255) to be written to 3C9h.
Note: After writing the 3 bytes at 3C9h this register will
increment, pointing to the next data register.

3C9h (R/W): PEL Data Register (VGA Only)
bit 0-5 Color value
Note: Each read or write of this register will cycle through first
the registers for Red, Blue and Green, then increment the
appropriate address register, thus the entire palette can be
loaded by writing 0 to the PEL Address Write Mode register 3C8h
and then writing all 768 bytes of the palette to this register.

Порт 3c8h устанавливает номер цвета кот. хотим менять. 3c9h устанавливает для данного номера RGB компоненты. Как видно в VGA исп. 6 бит на каждую компоненту R,G,B.

Можно установить палитру с помощью INT10h AX=1012h. Красивше ктстати будет если установить градиентную палитру

> да, c какого адреса на4инается free memory dos program?

Сказать однозначно нельзя выделением памяти занимаеться ДОС(INT21h AH=48h,49h,4ah) Чтобы не было проблем надо память выделять

P.S> По моему мнению, это ща не актуально, сделай лучше демку с исп. DirectX прикольней получиться
порты. 28.10.01 23:39  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
> А как быть с портом 3c8h? туда тоже 0 пихается???
> (ina4e s kakogo index'a on dydet 4itat'?)

ХЗ :)
Очень похоже, что этот порт сбрасывается в 0 при установке режима №13. Если очень охота выяснить точно, можешь дизассемблировать обработчик Int 10h :)

> да, c какого адреса на4инается free memory dos program?

Ну каждый раз по-разному, в зависимости от того, какие драйверы/проги загружены. Есть такая команда mem /d/p

Кстати при старте прог не всегда AX == 0. Если запустить эту демку так:
demo.com (:
то верхняя часть экрана не будет прорисовываться :)
[ASM]-кому интересно(в основном smile'y;). 29.10.01 23:45  
Автор: kar Статус: Незарегистрированный пользователь
<"чистая" ссылка>
@#$ перемыл я эту дему и вот:
1.4to касается педположения smile'a о 3с8,то он прав.
так же встретилась ошибка с заполнением палитры - вместо inc dx,нужно inc dl(dh):
mov dx,3c9h
L1:
mov al,bl
shr al,2
out dx,al
out dx,al
out dx,al
inc bx
jnz L1
2.что касается 4000h:xxxx - енто дейсвительно draw-bufer,хотя можно писать и напрямую
(так и не понял Экономию байтов,о которой говорил smile).
3.с осоновными алг-ми(циклами fx1,fx2) вот какая @#$ня:
(Chingachguk вроде прав о @#$не,заносимой после init graph или init palette)
так вот,1-й цикл fx1, чтобы размазать ту самую @#$ню,при4ем рандомно
(читается matrix_3*3 вокруг Каж. пикселя),а
2-ой - для размазать картинку, при4ем красивенько...ну а дальше все понятно.

так вот вопрос с этими х алгоритмами:
допустим мы в цикле,прорисована КАРтинка:),и попадаем на 1-й цикл fx1-
по идее он должен все в говнище перемешать - так нет @#$ он каким-то КАРом:)
перемещает эти ту4ки при4ем о4ень красиво.

... кому не в падло обратите plz внимание.
[ASM]-Более простая демка. 30.10.01 14:31  
Автор: Chingachguk <Chingachguk> Статус: Member
<"чистая" ссылка>
> @#$ перемыл я эту дему и вот:
> ... кому не в падло обратите plz внимание.

Это сложная дема. Я начал изучать такие фишки с алгоритма "жизнь".
(Если в окрестности точки есть три точки, то создать точку, если меньше двух или больше трех - убить точку) Примерный алгоритм таков:
; Населить фигней буффер
; Скажем, ds:di - адрес точки
mov al,[di+1]
add al,[di-1]
add al,[di+319]
add al,[di+320]
add al,[di-319]
add al,[di-320]
add al,[di-321]
add al,[di+321]
shl al,4
or [di],al
; Ну и вывести буфер на экранчик
; Я делал это прямо на экране

Мне кажется, что этот тупой пример(могу выслать весь код) может помочь понять более сложные демки ;)
[ASM]-chinga4kyk'y 30.10.01 18:16  
Автор: kar Статус: Незарегистрированный пользователь
<"чистая" ссылка>
да не пасибо - делал я это уже...вот если есть blomb или plazma
(не сложная) то не откажусь;))
кстати зайди на demoscene ru и посмотри дему T-Rex'a ююю вот это
бля да;)
[ASM]-кому интересно(в основном smile'y;). 29.10.01 23:58  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
> так же встретилась ошибка с заполнением палитры - вместо
> inc dx,нужно inc dl(dh):

Это опять наверное ради эконимии:
inc dx - 1 байт
inc dl - 2 байта

> 2.что касается 4000h:xxxx - енто дейсвительно
> draw-bufer,хотя можно писать и напрямую
> (так и не понял Экономию байтов,о которой говорил smile).

add ax, ax
mov ds, ax
= всего 4 байта
А использовать этот буфер в своем сегменте или аллочить его у ДОС по всем правилам займет гораздо больше байт.

Боролись за каждый байт в ущерб надежности и функциональности :)
[ASM]-smile'y 30.10.01 00:05  
Автор: kar Статус: Незарегистрированный пользователь
<"чистая" ссылка>
а с алгоритмом не подскажешь, имеется в виду реализации effects?
[ASM]-smile'y 30.10.01 13:42  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
> а с алгоритмом не подскажешь, имеется в виду реализации
> effects?

По поводу того, что на fx1: картинка должна размазаться - может так оно и происходит, просто это делается очень быстро и поэтому не бросается в глаза? Мерцание все-таки идет ОЧЕНЬ сильное и мусор какой-то постоянно мелькает. Все это не более чем предположение, вообще я этим никогда не занимался... :)
вот исходник.[обращение к пикс-ям 4ерез 4000h:xxxxh???] 28.10.01 18:24  
Автор: Heromantor Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Че-то мне кажеться что сделали от балды, ибо 4000h < 640Kb => память для программ нужно было-бы выделить память, но не стали, у меня прекрасно работает и с другими значениями 3000h-A000h. По крайней мере в этой области памяти ничо не резервируется соотв. так просто писать туда низя. Вот если бы выше A000 писалось то это можно было понять а так?! + Написана как-то странно? Циклы выполняються 65535 раз хотя надо 64000, 5535 циклов вып. намного дольше чем mov cx,64000. И не понял зачем устанавливают палитру 65535 раз когда надо 256? В общем не смотри на эту демку ;) смотри на папские типа by Iguana(по моему) EarthQuake совсем ничо сделана.
Точно ! хотел добавить... 29.10.01 09:24  
Автор: Chingachguk <Chingachguk> Статус: Member
<"чистая" ссылка>
> Че-то мне кажеться что сделали от балды, ибо 4000h <
> 640Kb => память для программ нужно было-бы выделить

Мне тоже кажется, что это просто буффер...
Хотел вот добавить ...

Мне кажется, хотя я могу быть неправ, что это просто буфер для построения изображения и вывода на экран. Я как-то рисовал подобные штуки - ниже пример рисования как раз в режиме 13h. Я в качестве буффера использовал память своего com-а.
Почему 4000h ? Просто этот сегмент обычно не занят ничем, и располагается где-то между загруженным com-файлом (программой) и 640K.
К тому же для такого рода вещей обычно нужны случайные числа (чем-то заполненный буфер). Я вот заполняю его нулями вначале, а потом населяю довольно произвольными значениями. В твоем примере начальное заполнение буффера, видимо, обеспечивается “мусором” в этом самом сегменте (4000h), оставшимся от прежних программ.

> вот фрагмент:
;…
Fx1:
> Matrix:
> inc si
; используем произвольные значения в буффере.
mov al,byte ptr [si-322]
;…
sub bx,ax
; Изменяем буффер для следующего кадра.
> mov ds:[di],bl
> inc di
> loop Fx1
>
> и тд..

; Программа имитации пламени. Написал Chingachguk ;)
.286
text segment byte public
assume cs:text,ds:text
org 100h
begin: MOV AL,13H
INT 10H
@AGAIN: CLD
MOV CX,320*200
PUSH CX
MOV DI,OFFSET BUFFER
XOR AL,AL
REP STOSB
POP CX
PUSH 0A000H
POP ES
XOR DI,DI
@PAINT: MOV AX,DI
XOR DX,DX
MOV SI,320
DIV SI
MOV BX,AX ; BX=X
MOV SI,DX ; SI=Y
SUB BX,160
SUB SI,100
PUSH CX
MOV CX,123 ; CX=123, BX=MOD(X-160), BP=MOD(Y-100)
@FIND: LEA BP,[BX+SI]
CMP BP,320*200
JAE @N_BOUND
OR BUFFER[BX+SI],CL
JZ @DONE
@N_BOUND: MOV AX,BX
SHR AX,2
ADD BX,AX
MOV AX,SI
SHR AX,2
ADD SI,AX
LOOP @FIND
@DONE: MOV AL,CL
ADD AL,150
POP CX
MOV BUFFER[DI],AL
INC DI
;STOSB
PUSH CX
PUSH DI
XOR DX,DX
MOV AX,DI
MOV SI,320
DIV SI
MUL SI
MOV DI,AX
CMP DI,320*40
JB @N
LEA SI,BUFFER[DI-320*40]
MOV CX,320*40/2
MOV DI,320*160
REP MOVSW
@N: POP DI
POP CX
MOV AH,1
INT 16H
JNZ @ASK
LOOP @PAINT
@ASK: XOR AH,AH
INT 16H
@EXIT: MOV AX,0003H
INT 10H
ret
BUFFER DB 320*200 DUP(?)
text ends
end begin
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach