Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ Бегущая точка

Автор: Гость_Андрей 13.05.2004 15:29

Привет спецам...
Вот пытаюсь разобраться с этим "зверем" - 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 13.05.2004 15:34

тебе нужно что бу постоянно бегала до выхода по клавиши??

Автор: Гость_Андрей 13.05.2004 15:52

В принципе да.
По нажатию клавиши - выход.

Автор: BlackShadow 13.05.2004 15:52

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 13.05.2004 16:14

Спасибо за совет.
По нажатию клавиши действительно нужно:
jnz done ...
Большая просьба поподробнее описать процедуру организации паузы.
Именно она меня и интересовала.
Если можно кусочек кода.
Хочется сделать так: по нажатию клавиши "+" - беготня ускоряется;
по "-" - замедляется.

Автор: BlackShadow 13.05.2004 16:24

XOR AH,AH
INT 16h
В AX возвращает код клавиши. Есди это что-то простое типа "+" или "-", то AL соответствует этому символу. Если же что по-сложнее типа F1, то в AL - 0, а в AH дополнительный код клавиши.
А вот про паузу я тебе ничего конкретно сказать не могу - нету у меня доки под рукой sad.gif

Автор: BlackShadow 13.05.2004 16:35

Нашёл. Очень даже не плохо.
XOR AH,AH
INT 1Ah
Возвращает в CX:DX (CX << 16 + DX) кол-во тиков таймера с момента сброса (Reseta компа). получаешь какое-то значение, ждёшь пока оно изменится на нужное тебе кол-во и ваяешь дальше.
Тик генерируется 18.2 раза в секунду. Итого:
1 секунда = 18 тиков
1 минута = 1092
1 час = 65543
1 сутки = 1573040
Вот так.

Автор: Гость_Андрей 13.05.2004 17:53

Большое спасибо за умную мысль.
Премного благодарен...

Автор: BlackShadow 13.05.2004 18:20

Это я премного благодарен.
Хоть какое-то развлечение, а то от работы у меня уже крыша едет. JSP меня явно добъёт.

Автор: Андрей 17.05.2004 18:53

Нашел как установить нужную задержку.
Может кому интересно:

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