Привет спецам...
Вот пытаюсь разобраться с этим "зверем" - 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
тебе нужно что бу постоянно бегала до выхода по клавиши??
В принципе да.
По нажатию клавиши - выход.
1). Метку ekran надо сместить на строку ниже.
2).
DEC CX
INC CX
INC CX
Вот... А паузу можно всунуть по-разному... Можно хоть int 8h перехватывать, а можно просто - через int 21h получать время и работать с миллисекундами.
.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
Спасибо за совет.
По нажатию клавиши действительно нужно:
jnz done ...
Большая просьба поподробнее описать процедуру организации паузы.
Именно она меня и интересовала.
Если можно кусочек кода.
Хочется сделать так: по нажатию клавиши "+" - беготня ускоряется;
по "-" - замедляется.
XOR AH,AH
INT 16h
В AX возвращает код клавиши. Есди это что-то простое типа "+" или "-", то AL соответствует этому символу. Если же что по-сложнее типа F1, то в AL - 0, а в AH дополнительный код клавиши.
А вот про паузу я тебе ничего конкретно сказать не могу - нету у меня доки под рукой
Нашёл. Очень даже не плохо.
XOR AH,AH
INT 1Ah
Возвращает в CX:DX (CX << 16 + DX) кол-во тиков таймера с момента сброса (Reseta компа). получаешь какое-то значение, ждёшь пока оно изменится на нужное тебе кол-во и ваяешь дальше.
Тик генерируется 18.2 раза в секунду. Итого:
1 секунда = 18 тиков
1 минута = 1092
1 час = 65543
1 сутки = 1573040
Вот так.
Большое спасибо за умную мысль.
Премного благодарен...
Это я премного благодарен.
Хоть какое-то развлечение, а то от работы у меня уже крыша едет. 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