Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2012, 22:49   #1
Женя_RU
Новичок
Джуниор
 
Регистрация: 01.06.2012
Сообщений: 4
По умолчанию Ассемблер. Эмулятор огня

Помогите пожаулйста, у меня есть программа эмулирующая огонь, нужно добавить:
чтобы можно было регуировать высоту огня, и кто может закоментить эту прогу, коменты можно совсем расчитанные под начинающего програмиста
Код:
	.model small
	.stack 100h
	.data
	red db 0
	green db 0
	blue db 0
	color db 0
	background db 0
	speed dw 1
palette     label   byte
	i=0
	rept    8
	db      0, 0, i*2
	i=i+1
endm
	i=0
	rept    8
	db      i*2, 0, 16-2*i
	i=i+1
endm
	i=0
	rept    16
	db      16+47*i/16, 0, 0
	i=i+1
endm
	i=0
	rept    48
	db      63, 21*i/16, 0
	i=i+1
endm
	i=0
	rept    48
	db      63, 63, 21*i/24
	i=i+1
endm
	db      179*3	dup(63)
buffer	db	320*200	dup(0)
seed	dw	1
exit_msg	db	" the end", 13, 10,'$'
	.code
	.386
start:
;установка видео режима 320*200*256
	mov ax, 0013h
	int 10h
;установка новой палитря
	mov ax, @data               
	mov ds, ax
	mov dx, 03C8h
	xor al,al
	out dx,al
	inc dx
	mov cx, 256*3
	mov si, offset palette
set_pal:
	mov al, [si]
	cmp background,48
	jb vivod
	cmp color,0
	je _red
	cmp color,1
	je _green
	cmp color,2
	je _blue
jmp vivod
_red:
	 add al,red
	 cmp al,64
	 jb @1
	 sub al,64
@1:
	 mov color,1
	 jmp vivod
_green:
	 add al,green
	 cmp al,64
	 jb @2
	 sub al,64
@2:	 mov color,2
	 jmp vivod
_blue:
	 add al, blue
	 cmp al,64
	 jb @3
	 sub al,64
@3:	 
	 mov color,0

vivod:	
	inc background
	out dx, al
	inc si
	dec cx
	jnz set_pal
	mov background,0
	mov ax, 0040h
	mov es, ax
	mov ax, es:[006Ch]
	mov seed, ax
	mov ax, 0A000h
	mov es, ax	
;бегаем до нажатия ESC
main:
;генерация огня
	mov di, offset buffer
	add di, 320*198
	mov dx, 320
gen_fire:
;
	mov ax, seed
	mov cx, 8
new_bit:
	mov bx, ax
	and bx, 002Dh
	xor bh, bl
	clc
	jpe shift
	stc
shift:	rcr ax, 1
	dec cx
	jnz new_bit
	mov seed, ax

	mov [di], ax
	inc di
	dec dx
	jnz gen_fire
;
	mov di, offset buffer
	add di, 320*198+1
	mov dx, 320-2
blur_line:
	xor ax, ax
	xor bx, bx
	mov al, [di-1]
	mov bl, [di]
	add ax, bx
	mov bl, [di+1]
	add ax, bx
	mov bl, [di+2]
	add ax, bx
	shr ax, 2
	mov [di], al
	inc di
	dec dx
	jnz blur_line
	
;
	mov si, offset buffer
	add si, 321
	mov cx, 320*199      
	xor bx, bx
	align 2
blur_fire:
	xor     ax, ax
	add     al, [si+321]
	adc     ah, bl
	add     al, [si+319]
	adc     ah, bl
	add     al, [si-1]
	adc     ah, bl
	add     al, [si+1]
	adc     ah, bl
	ifdef   eight
	add     al, [si-321]
	adc     ah, bl
	add     al, [si+321]
	adc     ah, bl
	add     al, [si-319]
	adc     ah, bl
	add     al, [si+319]
	adc     ah, bl
	shr     ax, 3
	else
	shr     ax, 2
	endif
	test ax, ax
	jz skip
	dec     al
	align   2
skip:
	mov     [si-320], al
	inc     di
	inc     si
	dec     cx
	jnz blur_fire    

;pause
	mov cx, speed 
	mov ah, 86h
	int 15h
	mov dx, 03DAh
vrtl1:
	in al, dx
	test al, 8
	jnz vrtl1
vrtl2:
	in al, dx
	test al, 8
	jnz vrtl2
	mov si, offset buffer
	xor di, di
	mov cx, 320*100
	rep movsw
;проверка на нажатие ESC
	in al, 60h
	cmp al,4eh
	je speed_minus
	cmp al,4Ah
	je speed_plus
	cmp al,13h
	je __red
	cmp al,22h
	je __green
	cmp al,30h
	je __blue
	
	cmp al,14h
	je ___red
	cmp al,23h
	je ___green
	cmp al,31h
	je ___blue
	jmp _esc

speed_minus:
	add speed,5
	jmp main
speed_plus:
	sub speed,5
	jmp main
__red:
	mov al,red
	inc al
	mov red,al
	jmp start
___red:
	mov al,red
	dec al
	mov red,al
	jmp start
__green:
	mov al,green
	inc al
	mov green,al
	jmp start
___green:
	mov al,green
	dec al
	mov green,al
	jmp start
__blue:
	mov al,blue
	inc al
	mov blue,al
	jmp start
___blue:
	mov al,blue
	dec al
	mov blue,al
	jmp start
_esc:
	cmp al, 81h
	jnz main
;возвражение в текстовый режим
	mov ax, 0003h
	int 10h
;сообщение по завершению программы
	mov ah, 9
	mov dx, offset exit_msg
	int 21h
;выход
	mov ax, 4C00h
	int 21h
end start
Женя_RU вне форума Ответить с цитированием
Старый 02.06.2012, 10:14   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

"эмуляция огня" - это, конечно, сильно!
Высоту огня можно регулировать несколькими способами:
- изменить весовые коэффициеты при вычислении следующего ряда,
- изменение вероятности 0 и 1 в ДПСЧ,
- введение "белых" и "черных" отрезков вдоль нижней линии.
s-andriano вне форума Ответить с цитированием
Старый 02.06.2012, 10:32   #3
Женя_RU
Новичок
Джуниор
 
Регистрация: 01.06.2012
Сообщений: 4
По умолчанию

а когда выполняется эта часть кода???
Код:
	ifdef   eight
	add     al, [si-321]
	adc     ah, bl
	add     al, [si+321]
	adc     ah, bl
	add     al, [si-319]
	adc     ah, bl
	add     al, [si+319]
	adc     ah, bl
	shr     ax, 3
	else
	shr     ax, 2
	endif
Женя_RU вне форума Ответить с цитированием
Старый 02.06.2012, 11:06   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Похоже, там условная компиляция.
Нужно смотреть директивы конкретного компилятора.
Смысл в том, что меняется маска - к ней добавляется еще 4 точки.
s-andriano вне форума Ответить с цитированием
Старый 03.06.2012, 12:02   #5
Женя_RU
Новичок
Джуниор
 
Регистрация: 01.06.2012
Сообщений: 4
По умолчанию

А не знаете здесь случайное чисо берется или какое-то определенное связанное с цветом???
Код:
	mov ax, 0040h
	mov es, ax
	mov ax, es:[006Ch]
	mov seed, ax
Женя_RU вне форума Ответить с цитированием
Старый 03.06.2012, 12:40   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Это переменная BIOS. Если мне не изменяет память, в ней хранится текущее время в 1/18.2 долях секунды.
Зачастую именно текущее время используется для инициализации ДПСЧ.
s-andriano вне форума Ответить с цитированием
Старый 03.06.2012, 13:20   #7
Женя_RU
Новичок
Джуниор
 
Регистрация: 01.06.2012
Сообщений: 4
По умолчанию

А вот еще вопрос про ifdef, а что такое "условное ассемблирование"???
это прога под tasm запускается, толком не нашел как работает эта деректива...
Женя_RU вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эмулятор сервера Jagger88 Фриланс 2 08.11.2011 08:39
Эмулятор PSP. VintProg Свободное общение 6 30.09.2011 21:08
Моделирование распространения огня Arugin Помощь студентам 0 25.10.2009 13:28
эмулятор Т9 proga. Общие вопросы C/C++ 6 28.09.2009 18:39
Эмулятор Илья Кибель Операционные системы общие вопросы 7 14.05.2009 09:24