Помощь - Поиск - Пользователи - Календарь
Полная версия: Бегущая точка
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
Гость_Андрей
Привет спецам...
Вот пытаюсь разобраться с этим "зверем" - Assemblerом.
Нужно написать лабораторную по графике - бегущая по горизонтали точка.
Вот чегой то накарякал, точка пробегает справа на лево 1 раз, только очень быстро, глазу не заметно...
А как вставить в Assemblerе регулируемую паузу? Есть ли какая ф-ция для етого?
А может это все можно написать по другому, более толково?
Буду рад любой помощи и советам.
	.model	tiny
.code
org 100h
start:
mov ax, 0013h
int 10h
mov cx, 319
mov dx, 100;рисую точку в 100 строке
ekran:
int 10h
mov al, 00110011b;зеленая точка
mov ah, 0Ch
int 10h
dec cx
inc cx
inc cx
mov al, 000b   ; черным затушевываю хвост линии
mov ah, 0Ch
int 10h
dec cx
dec cx
int 10h
jns ekran
ret
end start
Заранее благодарен.
Shadow
тебе нужно что бу постоянно бегала до выхода по клавиши??
Гость_Андрей
В принципе да.
По нажатию клавиши - выход.
BlackShadow
1). Метку ekran надо сместить на строку ниже.
2).

DEC CX
INC CX
INC CX


Вполне модно заменить на один INC CX.
3).
Подытожим:

.model tiny
.code
org 100h
start:
mov ax, 0013h         ;режим
int 10h                     ;установим
mov cx, 319             ;справа налево... по-еврейски как-то
mov dx, 100             ;строка

ekran:
mov ax,0C00h          ;чёрным закрасим предыдущую точку (неважно, что её
                              ;может и не было
int 10h                     ;зарисуем
dec cx                     ;переходим к следующей точке
mov ax,0C33h          ;зелёным
int 10h                     ;рисуем
inc cx                       ;вернёмся к предыдущей
mov ah,1                  ;проверка на нажатие кловиши
int 16h                     ;нажата/ненажата возвращает в ZF
jz done                    ;тут возможно jnz - не помню
loop ekran               ;само изменит CX
mov cx,319              ;заново!
jmp ekran
done:
xor ah,ah                 ;очистка буфера клавы
int 16h
ret
end start
Вот... А паузу можно всунуть по-разному... Можно хоть int 8h перехватывать, а можно просто - через int 21h получать время и работать с миллисекундами.
Guest
Спасибо за совет.
По нажатию клавиши действительно нужно:
jnz done ...
Большая просьба поподробнее описать процедуру организации паузы.
Именно она меня и интересовала.
Если можно кусочек кода.
Хочется сделать так: по нажатию клавиши "+" - беготня ускоряется;
по "-" - замедляется.
BlackShadow
XOR AH,AH
INT 16h
В AX возвращает код клавиши. Есди это что-то простое типа "+" или "-", то AL соответствует этому символу. Если же что по-сложнее типа F1, то в AL - 0, а в AH дополнительный код клавиши.
А вот про паузу я тебе ничего конкретно сказать не могу - нету у меня доки под рукой sad.gif
BlackShadow
Нашёл. Очень даже не плохо.
XOR AH,AH
INT 1Ah
Возвращает в CX:DX (CX << 16 + DX) кол-во тиков таймера с момента сброса (Reseta компа). получаешь какое-то значение, ждёшь пока оно изменится на нужное тебе кол-во и ваяешь дальше.
Тик генерируется 18.2 раза в секунду. Итого:
1 секунда = 18 тиков
1 минута = 1092
1 час = 65543
1 сутки = 1573040
Вот так.
Гость_Андрей
Большое спасибо за умную мысль.
Премного благодарен...
BlackShadow
Это я премного благодарен.
Хоть какое-то развлечение, а то от работы у меня уже крыша едет. JSP меня явно добъёт.
Андрей
Нашел как установить нужную задержку.
Может кому интересно:
timer:
push si
mov  si, tiks;Если tiks=18 - будет задержка в 1 сек.
mov  ah, 0
int  1ah
mov  bx, dx
add  bx, si
delay_loop:
int  1ah
cmp  dx, bx
jne  delay_loop
pop  si
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.