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

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

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

 
 Ответить  Открыть новую тему 
> Бегущая точка, графика в тасме
сообщение
Сообщение #1


Гость






Привет спецам...
Вот пытаюсь разобраться с этим "зверем" - 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
Заранее благодарен.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Lonely_Raven
****

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

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


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


--------------------
Программа делает то что вы ей приказали а не то что бы ВАМ хотелось бы.
МЕРФИ
---------------------
RTFM - Read the fucking manual
---------------------
http://www.livejournal.com/users/lonley_raven/
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






В принципе да.
По нажатию клавиши - выход.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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 получать время и работать с миллисекундами.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






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


Гость






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


Гость






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


Гость






Большое спасибо за умную мысль.
Премного благодарен...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Это я премного благодарен.
Хоть какое-то развлечение, а то от работы у меня уже крыша едет. JSP меня явно добъёт.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10





Группа: Пользователи
Сообщений: 5

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


Нашел как установить нужную задержку.
Может кому интересно:
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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 29.03.2024 13:53
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name