Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Реализовать бегущую строку по диагонали  (Прочитано 11312 раз)
0 Пользователей и 1 Гость смотрят эту тему.
UchenikO
Новенький

ru
Offline Offline

« : 17-05-2014 14:52 » 

Всем привет, составил код, в котором бег. строка идет справа налево, мне же нужно пустить ее по диагонали( без разницы из какого угла в какой и сверху или вниз), прошу помощи!
Код: (ASM)
 .model small
.stack 1000h
.data
x1  equ 10              ;начальная координата выводимой строки
x2  equ 40              ;конечная координата выводимой строки
llen    equ x2-x1+1         ;длина строки
 
txt db llen dup(' ')        ;текст "бегущей" строки
    db 'ABC123'
    db llen-1 dup(' ')
txtl    equ $-txt           ;длина "бегущей" строки
 
movnm   equ txtl-llen+1     ;количество сдвигов "бегущей" строки
 
deltime equ 30              ;задержка (в сотых долях сек.) между сдвигами "бегущей" строки
 
.code
    mov ax,@data            ;загружаем адрес сегмента данных
    mov ds,ax
 
    mov ah,0            ;очищаем экран установкой стандартного текстового видеорежима
    mov al,3
    int 10h
 
m1: mov si,offset txt       ;загружаем адрес начала текста
    mov cx,movnm            ;загружаем количество сдвигов строки
 
m2: push cx
   
    mov dh,12           ;устаналиваем курсор в позицию начала строки
    mov dl,10
   
    call locat
 
    call tprint         ;отображаем строку
 
    call delay          ;формируем временную задержку

 
    inc si              ;переходим к следующей позиции в строке
    pop cx              ;и выполняем отображение остальной части строки в цикле
    loop m2
 
    jmp m1              ;переходим к отображению строки с начала
 
exit:   mov ah,4ch          ;завершаем программу
        int 21h


delay   proc near
    mov ah,2ch          ;получаем текущее время
    int 21h
    mov bl,dl           ;сохраняем сотые доли секунды
 
del1:   mov ah,2ch          ;получаем текущее время
    int 21h
 
    sub dl,bl           ;корректируем время (при переходе через секунду)
    jge del2
    add dl,100
 
del2:   cmp dl,deltime          ;если время не прошло, то ожидаем
    jb del1
 
    ret
delay   endp

                    ;при входе:
                    ;DH - Y-координата
                    ;DL - X-координата
locat   proc near
    mov ah,2            ;устанавливаем позицию курсора
    mov bh,0
    int 10h
 
    ret
locat   endp

                    ;при входе:
                    ;SI - начальный адрес текста
tprint  proc near
    mov ah,40h          ;выводим строку
    mov bx,1
    mov cx,llen
    mov dx,si
    int 21h
 
    ret             ;выход из подпрограммы
tprint  endp

end                
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 17-05-2014 15:41 » new

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

1. сначала определить размер экрана
2 определить количество шагов ( min(width,height) )
3 определить размер шага по вертикали и горизонтали
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
UchenikO
Новенький

ru
Offline Offline

« Ответ #2 : 17-05-2014 15:57 » 

Sla, а можно не определяя размер шага, просто задать координаты по x и y, потом их увеличивать каждый раз?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 17-05-2014 16:58 » 

UchenikO, экран обычно 80х25 или 80х50, т.е. не квадратный. Это значит что на каждом шаге x+1, y+1 до другого угла не дотянет - упрётся в середину нижней стороны. y+1 должен соответствовать x+3 хотя бы для 80x25. Т.е. в каждой линии экрана будет по 3 символа от строки.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
UchenikO
Новенький

ru
Offline Offline

« Ответ #4 : 17-05-2014 17:13 » 

Dimka, честно признаюсь, не знаю как это реализовать, покажите пожалуйста где в коде что нужно вставить или поменять
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 17-05-2014 17:16 » 

UchenikO, честно признаюсь, приведенный код  не ваш.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
UchenikO
Новенький

ru
Offline Offline

« Ответ #6 : 17-05-2014 17:27 » 

Sla, ну я его переделал, удалил лишнее, а так вы правы
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines