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

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

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

> Игровая программа, таймер и генерация звука
Rocket
сообщение 9.03.2009 22:56
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

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


Доброго времени суток, уважаемые форумчане! smile.gif Мне нужно написать программу, которая перед началом игры произвольно устанавливает невидимую на экране метку и видимый символ "*", который перемещается по экрану с помощью стрелок. При движении символа генерируются звуковые колебания, частота которых зависит от расстояния до невидимой метки. Если метка не найдена за 4 секунды, метка перемещается в другую точку.
Мне очень эта программа напоминает металлоискатель : )
Пока что я сделал только перемещение символа "*" с помощью букв w,s,a,d.

data segment

	old_cs		dw ?		
	old_ip		dw ?

	symbol		db ?
	Pressed		db 1

	x db ?
	y db ?

	sgn		db '*'
	atr		db 10

data ends

code segment
	assume cs: code, ds: data


new_1c proc far

	
	push ax
	push bx
	push ds
	push es
	
	
	mov  ax, data
	mov  ds, ax
	
	
	mov  ax, 40h		
	mov  es, ax
	mov  ax, es:[1Ch]	
	mov  bx, es:[1Ah]	
	cmp  bx, ax		
	jne  get_char		
	
	
	jmp  go_out

get_char:
	mov  al, es:[bx]	
	mov  es:[1Ch], bx	
	mov symbol, al
	inc Pressed		
	
go_out:
	pop  es
	pop  ds
	pop  bx
	pop  ax
	iret
new_1c endp

start:
	mov  ax, data
	mov  ds, ax
	
	
	mov  ah, 35h
	mov  al, 1Ch
	int  21h
	
	mov  old_ip, bx
	mov  old_cs, es
	
	
	push ds			
	mov  dx, offset new_1c
	mov  ax, seg new_1c
	mov  ds, ax
	mov  ah, 25h
	mov  al, 1Ch
	int  21h		
	pop  ds
	
	mov  ax, data
	mov  es, ax

	mov x,14
	mov y,40	

main_loop:
	
	cmp Pressed, 0		
	je m1


	mov Pressed, 0
	cmp symbol, 30h
	je q
	
	xor ax, ax
	mov al, symbol


m1:	cmp al, 'w'
	jne m2
	dec x
	jmp met

m2:	cmp al, 's'
	jne m3
	inc x
	jmp met

m3:	cmp al, 'a'
	jne m4
	dec y
	jmp met

m4:	cmp al, 'd'
	jne main_loop
	inc y
	

	
met: 	xor bh, bh
	mov ah, 13h		
	mov al, 0d
	mov dh, x
	mov dl, y
	lea  bp, sgn		
	mov  cx, 1		
	mov  bl, atr
	int 10h
			
jmp main_loop

q:

	push ds
	
	mov  dx, old_ip 
	mov  ax, old_cs
	mov  ds, ax
	mov  ah, 25h
	mov  al, 1Ch
	int  21h
	pop  ds
	
	mov  ax, 4C00h	
	int  21h
code ends
end start


Не могу понять, почему "вверх" не срабатывает с первого раза? приходится повторно нажимать "w", в результате мы поднимаеся не на одну позицию, а на две...
И как сделать какую-нибудь очистку экрана? чтоб очищать консоль и на экран выводился только один символ "*" .
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
andriano
сообщение 10.03.2009 8:31
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

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


1. Звук генерится посредством 53 таймера, причем его прохождение на динамик еще надо разрешить. Конкретных номеров портов навскидку не помню - давно не программировал под DOS.
2. х86 процессор не имеет аппаратных средств для генерации случайных чисел. Это ответ на твой вопрос - есть ли в ассемблере рандом. Но можно сделать программно генератор псевдослучайных чисел. Например, конгруэнтный. А инициализировать его (аналог randomize) чем-то, связанным с текущим временем. Хотя бы содержимым ячейки 0040:006c.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 10.03.2009 14:50
Сообщение #3


Злостный любитель
*****

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

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


Цитата(andriano @ 10.03.2009 8:31) *

2. х86 процессор не имеет аппаратных средств для генерации случайных чисел. Это ответ на твой вопрос - есть ли в ассемблере рандом. Но можно сделать программно генератор псевдослучайных чисел. Например, конгруэнтный. А инициализировать его (аналог randomize) чем-то, связанным с текущим временем. Хотя бы содержимым ячейки 0040:006c.


Я приведу дельфийскую реализацию рандома.

procedure       _RandInt;
asm
        PUSH    EBX
        XOR     EBX, EBX
        IMUL    EDX,[EBX].RandSeed,08088405H
        INC     EDX
        MOV     [EBX].RandSeed,EDX
        MUL     EDX
        MOV     EAX,EDX
        POP     EBX
end;



Это для 32х-разрядного проца. Смысл в том, что число RandSeed умножается на спец.константу $08088405, и увеличивается на 1. Так получается новое число RandSeed. А для того, чтобы из этого рандсида извлечь число, этот рандсид умножается на границу. И то, что вылезло за пределы 32 бит (оно автоматически пихается в регистр EDX) - и выдаётся как результат функции.
Для 16-битного проца, думаю, можно сделать аналогично, надо только знать, куда команда MUL пихает результат, а куда - то, что вылезло за пределы. И какова спец.константа для 16-битного случая - я не знаю.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Rocket   Игровая программа   9.03.2009 22:56
volvo   Функция 06h прерывания 10h (прокрутка окна вверх) ...   9.03.2009 23:46
Rocket   Функция 06h прерывания 10h (прокрутка окна вверх)...   10.03.2009 0:33
andriano   1. Звук генерится посредством 53 таймера, причем е...   10.03.2009 8:31
TarasBer   2. х86 процессор не имеет аппаратных средств для ...   10.03.2009 14:50
TarasBer   А турбо-паскальный рандом такой же. Я не нашёл мен...   10.03.2009 16:00
volvo   По поводу генерации звуков - когда-то 7in на одном...   10.03.2009 20:06
Rocket   По поводу генерации звуков - когда-то 7in на одно...   12.03.2009 21:32
andriano   Использую эту процедуру в программе, динамик изда...   12.03.2009 21:52
Rocket   После долго перерыва возвращаюсь к выполнению этог...   14.05.2009 20:26
volvo   Как обычно: функция генерации случайного числа от ...   15.05.2009 0:33
Rocket   Как обычно: функция генерации случайного числа от...   15.05.2009 15:49
Rocket   В интернете как-то мало материала по этой теме, та...   16.05.2009 0:13
Rocket   Что-то вопрос о random'е намертво забуксовал.....   18.05.2009 20:29
volvo   Ничего не забуксовало... Просто до ассемблера надо...   22.05.2009 12:16
volvo   Вероятно, в те моменты, когда звук не нужен, его н...   22.05.2009 14:44
Rocket   Вероятно, в те моменты, когда звук не нужен, его ...   22.05.2009 15:36
volvo   Сомневаюсь... Какие ж варианты еще? А что не нрави...   22.05.2009 15:58
Rocket   Сомневаюсь... Какие ж варианты еще? А что не нрав...   22.05.2009 16:06
volvo   Очень просто... Вот тут есть пример практически то...   22.05.2009 16:23
Rocket   Очень просто... Вот тут есть пример практически т...   22.05.2009 16:43
volvo   Почему я? Кто привел тебе этот код, тот пускай и с...   22.05.2009 17:54
Rocket   Чтобы получить разные последовательности - занеси ...   22.05.2009 18:38
Rocket   Почему я? Кто привел тебе этот код, тот пускай и ...   22.05.2009 22:02
TarasBer   Почему я? Кто привел тебе этот код, тот пускай и ...   23.05.2009 19:35
volvo   То есть, у тебя не отрабатывает вот это (переимено...   22.05.2009 19:05
Rocket   То есть, у тебя не отрабатывает вот это Спасибо...   22.05.2009 21:21
volvo   AL взять и использовать, вот и байт тебе...   23.05.2009 0:16


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

 

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