Assembler: Задача о шарике (в виде нуля)

  • Автор темы JoeQueer
  • Дата начала
Статус
Закрыто для дальнейших ответов.
J

JoeQueer

Гость
#1
Надо написать программу по заданию:
«В правом верхнем углу экрана расположен «шарик». При нажатии на пробел, он начинает двигаться вниз, НЕ оставляя за собой на экране след. При достижении шариком края экрана, он меняет своё направление движения на 90 градусов, описывая при своём движении границы видимой области экрана. При нажатии клавиши «Enter», движение шарика можно приостанавливать и продолжать его движение нажатием пробела.»

Выполнить по примеру:
В центре экрана расположен "шарик". При нажатии любой из 4 клавиш со стрелками он начинает двигаться, оставляя за со¬бой на экране след. Если нажимается другая стрелка - направ¬ление движения изменяется. Если шарик достигает края, он ос¬танавливается. При нажатии пробела цвет оставляемого следа меняется на противоположный.
Прежде всего выберем функции для работы с клавиатурой и экраном. Поскольку требуется, чтобы при отсутствии нажатий программа продолжала перемещать шарик в ранее заданном нап¬равлении, необходимо использовать ввод без ожидания. Это мож¬но выполнить с помощью функции DOS 06h. Что же касается выво¬да на экран, то функций DOS здесь будет недостаточно, так как нужно управлять перемещением курсора. Следует использовать прерывание BIOS 10h. Нам будут нужны следующие функции этого прерывания: 02h - для перемещения курсора, 09h - для выдачи символа и 06h - для очистки экрана. Программа использует те¬кущий видеорежим.
Текст программы:
[codebox]stck SEGMENT para stack 'STACK'
db 100h DUP (?)
stck ENDS
data SEGMENT para public 'DATA'
coord dw ? ; Текущие координаты шарика
vyx label word ; Скорости шарика по Y и X
vx db ? ; Скорость шарика по X
vy db ? ; Скорость шарика по Y
attr db ? ; Текущие атрибуты шарика
data ENDS
code SEGMENT para public 'CODE'
ASSUME cs:code, ds:data , ss:stck
TIME equ 0ffffh ; Величина задержки времени
start: mov ax, data
mov ds, ax ; Загрузить сегм. адрес данных
call clr_scr ; Очистка экрана
mov coord,0c28h ; Строка 12, столбец 40
mov vyx,0 ; Скорость движения - 0 по X, 0 по Y
mov attr,07h ; Атрибуты - белым по черному
lp: mov dl,0ffh ; Начало цикла
mov ah,06h ; Номер ф-ции DOS
int 21h ; Ввод без ожидания
jz newpos ; Если ничего не нажато
or al,al ; al=0?
jnz asckey ; Если символьная клавиша
mov dl,0ffh ; Иначе - вводим расшир. код
mov ah,06h
int 21h ; Ввод без ожидания
cmp al,48h ; Стрелка вверх?
jne mm1
mov vyx,0ff00h ; Скорость по Y = -1, по X = 0
jmp newpos
mm1: cmp al,50h ; Стрелка вниз?
jne mm2
mov vyx,0100h ; Скорость по Y = 1, по X = 0
jmp newpos
mm2: cmp al,4bh ; Стрелка влево?
jne mm3
mov vyx,00ffh ; Скорость по X = -1, по Y = 0
jmp newpos
mm3: cmp al,4dh ; Стрелка вправо?
jne newpos
mov vyx,0001h ; Скорость по X = 1, по Y = 0
jmp newpos
asckey: cmp al,1bh ; Это Esc?
je quit ; Выход из программы
cmp al," " ; Пробел?
jne newpos
xor attr,01110111b ; Атрибуты инвертировать
newpos: mov bh,0 ; Вычисление позиции курсора.
mov dx,coord ; К старым координатам
add dh,vy ; прибавляются скорости по Y и X,
jge mv1 ; затем проверки, чтобы курсор
inc dh ; не вышел за край экрана
mv1: cmp dh,25
jl mv2
dec dh
mv2: add dl,vx
jge mv3
inc dl
mv3: cmp dl,80
jl mv4
dec dl
mv4: mov coord,dx ; Запомнить новые координаты
mov ah,02h
int 10h ; Переместить курсор
; Рисование шарика
drball: mov ah,09h
mov al,"O" ; Шарик
mov bh,0
mov bl,attr ; Атрибуты
mov cx,1 ; Количество
int 10h ; Выдача на экран шарика
call delay ; Задержка времени
jmp lp ; На повторение цикла
; Конец работы
quit: call clr_scr ; Очистка экрана
xor al, al ; Код завершения 0
mov ah, 4ch ;
int 21h ; Выход в DOS
; Процедура очистки экрана
clr_scr PROC near
mov cx,0 ; Со строки 0, позиции 0
mov dx,184fh ; По строку 24, позицию 79
mov ax,0619h ; Функция 06h, сдвиг на 25 строк
mov bh,07h ; Черный фон для очистки
int 10h ; Очистка
ret
clr_scr ENDP
[/codebox]
 
Статус
Закрыто для дальнейших ответов.