Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод текстовой строки на экран, Не получается :( 
:(
    Опции темы
MainUser
Дата 13.3.2004, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 7.3.2004

Репутация: нет
Всего: нет



Привет Всем!
Люди, помогите, чем можете!
Я думаю, вопрос для знающих людей не сложный:
есть com-программа, которая выводит на экран текстовую строку и после нажатия на любую клавишу - завершается:

DSEG segment
org 100h
Poehali:
mov ah,9
mov dx,offset message
int 21h
mov ah,10h
int 16h
message db 'Forgive poor lamer, please!$'
DSEG ends
end Poehali

Нужно усовершенствовать эту программу следующим образом:
после нажатия на клавишу строка “Forgive poor lamer, please” должна
стераться, а на её месте должна появиться другая какая-нибудь текстовая строка.
И только после этого программа должна завершиться.
Помоги, знающие люди! smile.gif А то у меня пока мозгов не хватает! sad.gif

PM MAIL   Вверх
Chingachguk
Дата 13.3.2004, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Код

mov ah,9
mov dx,offset Testmessage
int 21h
mov ah,10h
int 16h

mov ah,9
mov dx,offset NewMessage
int 21h
mov ah,10h
int 16h

 ret
Testmessage db 'Forgive poor lamer, please!',0Dh,'$'
NewMessage  db 'This is new message........','$'



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
MainUser
Дата 13.3.2004, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 7.3.2004

Репутация: нет
Всего: нет



Спасибо!!! То что нужно! Ты гений!
А можно воспользоваться моментом и спросить:
а как вывести текстовую строку, допустим в любое место?
Ну там вторая строка, начиная с 10 символа, например?
Я там мудрил со смещениями, но ничего не вышло. smile.gif
PM MAIL   Вверх
Chingachguk
Дата 14.3.2004, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Если ты выводишь текст через дос (а Int 21h - это дос), то ты можешь кроме обычных символов выводить специальные (управляющие). В первом случае байт 0Dh - специальный. Он означает "возврат каретки" - иначе говоря, курсор перейдет в первую позицию той же строки. Если ты выведешь байт 0Ah, то курсор перейдет на следующую строку. Грубо говоря, ты руководишь расположением курсора. Установив его в какое-либо место, ты можешь ожидать вывода текста именно с этого места.

Для того, чтобы передвинуть курсор в следующую строку и еще в позицию десять, можно выдать байты 0Dh, 0Ah и, затем, 10 пробелов.

Могут быть и другие управляющие символы: TAB(13) , BELL (7) ...

Однако нетрудно видеть, что курсор не вернуть в начало экрана (назад) такими управляющими символами - разве что вызвать скроллинг экрана.

Управлять положением курсора и выводом текста более гибко позволяют функции биоса: семейство int 10h. Есть также ansi-драйвер для DOS, но это такое старье.

Совершенно несложно выводить текст "руками" напрямую в видеопамять, комбинируя команды пересылки в память с адреса B800h с вызовами функций биос для управления курсором и инициализацией текстового режима (int 10h, ax=0003h).


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Ruterian
Дата 14.3.2004, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

Репутация: нет
Всего: нет



Добавлю также, что управлять курсором и получать его координаты можно и без БИОСа, работая напрямую с словом по адресу 0000:0450h - в нем как раз записана строка/столбец текущего положения курсора.
PM MAIL WWW ICQ   Вверх
Shurik
Дата 15.3.2004, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 19.2.2004

Репутация: нет
Всего: нет



Каким образом можно в графическом режиме указывать высоту выводимого символа при прямой работе с видеопамятью?
PM MAIL   Вверх
oleg1973
Дата 15.3.2004, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



сменив системный фонт 8*16 на свой 8*8 к примеру
не помню как но через бивис делается


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Jin X
Дата 16.3.2004, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 5.3.2004

Репутация: 1
Всего: 1



Получаешь нужную таблицу образов символов (фонт) и выводишь вручную по пикселям smile.gif
Код
--------V-101130-----------------------------
INT 10 - VIDEO - GET FONT INFORMATION (EGA, MCGA, VGA)
AX = 1130h
BH = pointer specifier
    00h INT 1Fh pointer
    01h INT 43h pointer
    02h ROM 8x14 character font pointer
    03h ROM 8x8 double dot font pointer
    04h ROM 8x8 double dot font (high 128 characters)
    05h ROM alpha alternate (9 by 14) pointer (EGA,VGA)
    06h ROM 8x16 font (MCGA, VGA)
    07h ROM alternate 9x16 font (VGA only) (see #00021)
    11h (UltraVision v2+) 8x20 font (VGA) or 8x19 font (autosync EGA)
    12h (UltraVision v2+) 8x10 font (VGA) or 8x11 font (autosync EGA)
Return: ES:BP = specified pointer
CX    = bytes/character of on-screen font (not the requested font!)
DL    = highest character row on screen
Note: for UltraVision v2+, the 9xN alternate fonts follow the corresponding
  8xN font at ES:BP+256N
BUG: the IBM EGA and some other EGA cards return in DL the number of rows on
  screen rather than the highest row number (which is one less).
SeeAlso: AX=1100h,AX=1103h,AX=1120h,INT 1F"SYSTEM DATA",INT 43"VIDEO DATA"

Format of alternate font table [array]:
Offset Size Description (Table 00021)
00h BYTE character to be replaced (00h = end of table)
01h  N BYTEs graphics data for character, one byte per scan line

--------------------
Бойся своей мечты, ибо она осуществима!
PM MAIL   Вверх
qwerty009
Дата 24.8.2004, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.8.2004

Репутация: нет
Всего: нет



Для того, чтобы передвинуть курсор в любую позицию , нaдo иcползовaт
фyHKцию video: ah,02 / int 10h

нaпримep: mov ah,02 ; set cursor position
xor bh,bh ; videopage 0 (default)
mov dh,10 ; stroka 10-ja
mov dl,10 ; stolbets 10-i
int 10h ; video preryvanie

eto kak pascal: gotoxy(10,10);



i privet Chingachguk smile.gif

Это сообщение отредактировал(а) qwerty009 - 24.8.2004, 22:16
PM MAIL   Вверх
Akina
Дата 25.8.2004, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Очистка экрана:
Код
CLS            MACRO           attribute
               MOV             AX,600H
       IFIDNI          <attribute>, <>
               MOV             BH,07H
       ELSE
               MOV             BH,attribute
       ENDIF
               XOR             CX,CX
               MOV             DX,1950H
               INT             10H
               MOV             AH,0FH
               INT             10H
               MOV             AH,2
               XOR             DX,DX
               INT             10H
               ENDM

Позиционирование курсора:
Код
LOCATE MACRO   Row, Col
       MOV     AH,2
       XOR     BH,BH
IFIDNI <Row>,<>
       MOV     DH,BH
ELSE
       MOV     DH,Row
ENDIF
IFIDNI <Col>,<>
       MOV     DL,BH
ELSE
       MOV     DL,Col
ENDIF
       INT     10H
      ENDM


Это сообщение отредактировал(а) Akina - 25.8.2004, 09:02


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Girder
Дата 25.8.2004, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: нет
Всего: 155



Для общего развитая

Писал очень давно, так что не обессудте smile.gif
Код
;----------------------------------------------------------------------------
;             Пpоцедуpа записи гpаничных кооpдинатов окна (Save_Cmp), инициа-
;             лизация пpоцедуpы Cmp_Size_Window
;             (По умолчанию: DX=0; CX=1950h)
;        Входные данные:
;                     DH - Hомеp стpоки левой веpхней точки окна (DH>=0)
;                     DL - Hомеp столбца левой веpхней точки окна (DL>=0)
;                     CL - Шиpина окна (CL>=1)
;                     CH - Высота окна (CH>=1)
;        Выходные данные:
;              Инфоpмация в ячейках:
;                          Point_dx   db   2 dup (?)
;                          Point_cx   db   2 dup (?)
;                    эта инфоpмация используется пpоцедуpой Cmp_Size_Windows
;              Регистpы и флаги остаются не изменными
;----------------------------------------------------------------------------
Save_Cmp        proc    near
               pushf
               pusha
               sub     cx,101h
               mov     word ptr cs:[Point_dx],dx
               add     dx,cx
               mov     word ptr cs:[Point_cx],dx
               popa
               popf
               ret
Point_dx        db      0,0
Point_cx        db      4fh,18h
Save_Cmp        endp
;----------------------------------------------------------------------------
;             Пpоцедуpа пpоизводящая коpекцию pегистpов DX,CX (что бы небыло
;             вывода за окно в котоpое pазpешено выводить инфоpмацию)
;             (Cmp_Size_Window), если инфоpмация выводится за гpаницу окна,
;             то выдается запpет на вывод.
;        Входные данные:
;                     DH - Hомеp стpоки левой веpхней точки окна (DH>=0)
;                     DL - Hомеp столбца левой веpхней точки окна (DL>=0)
;                     CL - Шиpина окна (CL>=1)
;                     CH - Высота окна (CH>=1)
;              Инфоpмация в ячейках:
;                          Point_dx   db   2 dup (?)
;                          Point_cx   db   2 dup (?)
;                    должна быть подготовлена пpоцедуpой Save_Сmp
;        Выходные данные:
;                     Если CF=1, то данная яцейка памяти находится за
;                     гpаницей окна (т.е. запpет на вывод), в пpотивном
;                     случаи вывод pазpешен
;                     DH - Hомеp стpоки левой веpхней точки окна в кото-
;                          pое pазpешено выводить инфоpмацию (DH>=0)
;                     DL - Hомеp столбца левой веpхней точки окна в кото-
;                          pое pазpешено выводить инфоpмацию (DL>=0)
;                     CL - Шиpина окна в котоpое pазpешено выводить инфоp-
;                          мацию (CL>=1)
;                     CH - Высота окна в котоpое pазpешено выводить инфоp-
;                          мацию (CH>=1)
;              Дpугие pегистpы и флаги остаются не изменными
;----------------------------------------------------------------------------
Cmp_Size_Window proc    near
               pushf
               push    ax
               push    bx
               mov     ax,word ptr cs:[Point_dx]
               mov     bx,word ptr cs:[Point_cx]
               sub     cx,101h
               add     cx,dx
               cmp     ch,ah
               jb      short error_cmp
               cmp     cl,al
               jb      short error_cmp
               cmp     bh,dh
               jb      short error_cmp
               cmp     bl,dl
               jb      short error_cmp
               cmp     ch,bh
               jb      short ok_size_1
               mov     ch,bh
ok_size_1:      cmp     cl,bl
               jb      short ok_size_2
               mov     cl,bl
ok_size_2:      cmp     al,dl
               jb      short ok_size_3
               mov     dl,al
ok_size_3:      cmp     ah,dh
               jb      short ok_size_4
               mov     dh,ah
ok_size_4:      sub     cx,dx
               add     cx,101h
               pop     bx
               pop     ax
               popf
               clc
               ret
error_cmp:      pop     bx
               pop     ax
               popf
               stc
               ret
Cmp_Size_Window endp
;----------------------------------------------------------------------------
;             Пpоцедуpа pасчета физического адpесса точки (Mul_Pixel)
;        Входные данные:
;                1) AH=0 - Установка физического адpеса левой веpхней точки
;                          экpана (По умолчанию: 0B800h:0h)
;                     ES - Сегмент
;                     DI - Смещение
;                     CX - Длина стpоки на экpане (По умолчанию: 160d)
;                2) AH=1 - Расчет физического адpесса точки
;                     DL - Hомеp столбца точки (DL>=0)
;                     DH - Hомеp стpоки точки (DH>=0)
;                3) AH=2 - Расчет физического адpесса точки
;                     DL - Hомеp столбца точки (DL>=0)
;                     DH - Hомеp стpоки точки (DH>=0)
;        Выходные данные:
;                  ES:DI - Физический адpесс точки
;      Если AH=1 то в DX - длина стpоки на экpане
;              Дpугие pегистpы и флаги остаются не изменными
;----------------------------------------------------------------------------
Mul_Pixel       proc    near
               pushf
               push    ds
               push    cs
               pop     ds
               push    ax
               push    bx
               push    dx
               cmp     ah,2
               ja      short exit_1_mul
               cmp     ah,0
               je      short exit_0_mul
               mov     ax,word ptr ds:[mul_p_dx]
               xor     bx,bx
               xchg    bl,dh
               push    dx
               mul     bx
               pop     dx
               add     dx,dx
               add     ax,dx
               mov     es,word ptr ds:[mul_p_es]
               add     ax,word ptr ds:[mul_p_di]
               jnc     short no_add_es
               mov     bx,es
               add     bx,1000h
               mov     es,bx
no_add_es:      xchg    di,ax
               jmp     short exit_1_mul
exit_0_mul:     mov     word ptr ds:[mul_p_es],es
               mov     word ptr ds:[mul_p_di],di
               mov     word ptr ds:[mul_p_dx],cx
exit_1_mul:     pop     dx
               pop     bx
               pop     ax
               cmp     ah,1
               jne     short no_dx_mul_p
               mov     dx,word ptr ds:[mul_p_dx]
no_dx_mul_p:    pop     ds
               popf
               ret
Mul_p_es        db      0,0b8h
Mul_p_di        db      0,0
Mul_p_dx        db      0a0h,0
Mul_Pixel       endp
;----------------------------------------------------------------------------
;             Пpоцедуpа pисующая окно (Wind_Screen)
;             *** Данная пpоцедуpа использует пpоцедуpу:
;                 1) Mul_Pixel
;                 2) Cmp_Size_Window
;        Входные данные:
;                     DH - Hомеp стpоки левой веpхней точки окна (DH>=0)
;                     DL - Hомеp столбца левой веpхней точки окна (DL>=0)
;                     CL - Шиpина окна (CL>=1)
;                     CH - Высота окна (CH>=1)
;                     BH - (0-3)b-цвет символа
;                          (4-7)b-цвет фона
;                     BL - Символ котоpым будет пpоизведено затиpание
;                          инфоpмации (если BL=0 - без затиpания)
;        Выходные данные:
;              Регистpы и флаги остаются не изменными
;----------------------------------------------------------------------------
Wind_Screen     proc    near
               pushf
               pusha
               push    es
               push    eax
               call    Cmp_Size_Window
               jb      short exit_windscreen
               mov     ah,1
               call    Mul_Pixel
               mov     ax,bx
               shl     eax,16
               mov     ax,bx
no_ch_zero:     push    di
               push    cx
no_cl_4_wind:   dec     cl
               je      short cl_4_wind
               dec     cl
               and     al,al
               jne     short ok_clrscr_wind
               mov     es:[di+1],ah
               mov     es:[di+3],ah
               add     di,4
               jmp     short no_clrscr_wind
ok_clrscr_wind: cld
               stosd
no_clrscr_wind: and     cl,cl
               je      short cl_zero_ok
               jmp     short no_cl_4_wind
cl_4_wind:      and     al,al
               jne     short ok_clrscr_wind2
               mov     es:[di+1],ah
               add     di,2
               jmp     short cl_zero_ok
ok_clrscr_wind2:cld
               stosw
cl_zero_ok:     pop     cx
               pop     di
               add     di,dx
               dec     ch
               jne     short no_ch_zero
exit_windscreen:pop     eax
               pop     es
               popa
               popf
               ret
Wind_Screen     endp
;----------------------------------------------------------------------------
;             Пpоцедуpа pисующая линию (Line_Screen)
;             *** Данная пpоцедуpа использует пpоцедуpу:
;                 1) Mul_Pixel
;                 2) Wind_Screen
;                 3) Cmp_Size_Window
;        Входные данные:
;                     DH - Hомеp стpоки левой (веpхней) точки линии (DH>=0)
;                     DL - Hомеp столбца левой (веpхней) точки линии (DL>=0)
;                     CL - Длина линии (по гоpизонтали) (CL>=1)
;                     CH - Длина линии (по веpтикали) (CH>=1)
;                       (Если CL>1 и CH=1 - то линия будет гоpизонтальная
;                        Если CL=1 и CH>1 - то линия будет веpтикальная
;                        Если CL>1 и CH>1 - то будет наpисован квадpат)
;                  DS:SI - Инфоpмация о линиях
;                       Стpуктуpа DS:SI
;    г=============T=================T==============================¬
;    ¦   Смещение  ¦ Количество байт ¦          Hазначение          ¦
;    ¦=============+=================+==============================¦
;    ¦      0      ¦        1        ¦  (0-3)b-цвет символа         ¦
;    ¦             ¦                 ¦  (4-7)b-цвет фона            ¦
;    ¦=============+=================+==============================¦
;    ¦      1      ¦        X        ¦  Символ для гоpизонтальной   ¦
;    ¦             ¦   X=1 Пpи CL>1  ¦  линии                       ¦
;    ¦=============+=================+==============================¦
;    ¦     1+X     ¦        Y        ¦  Символ для веpтикальной     ¦
;    ¦             ¦   Y=1 Пpи CH>1  ¦  линии                       ¦
;    ¦=============+=================+==============================¦
;    ¦    1+X+Y    ¦       Z1        ¦  Символ котоpый надо pаспо-  ¦
;    ¦             ¦     Z1=1 Пpи    ¦  ложить в веpхнем левом угле ¦
;    ¦             ¦  (CL AND CH)>1  ¦  окна                        ¦
;    ¦=============+=================+==============================¦
;    ¦  K=1+X+Y+Z1 ¦       Z2        ¦  Символ котоpый надо pаспо-  ¦
;    ¦             ¦     Z2=1 Пpи    ¦  ложить в веpхнем пpавом угле¦
;    ¦             ¦  (CL AND CH)>1  ¦  окна                        ¦
;    ¦=============+=================+==============================¦
;    ¦     K+Z2    ¦       Z3        ¦  Символ котоpый надо pаспо-  ¦
;    ¦             ¦     Z3=1 Пpи    ¦  ложить в нижнем пpавом угле ¦
;    ¦             ¦  (CL AND CH)>1  ¦  окна                        ¦
;    ¦=============+=================+==============================¦
;    ¦   K+Z2+Z3   ¦       Z4        ¦  Символ котоpый надо pаспо-  ¦
;    ¦             ¦     Z4=1 Пpи    ¦  ложить в нижнем левом угле  ¦
;    ¦             ¦  (CL AND CH)>1  ¦  окна                        ¦
;    L=============¦=================¦==============================-
;
;        Выходные данные:
;              Регистpы и флаги остаются не изменными
;----------------------------------------------------------------------------
Line_Screen     proc    near
               pushf
               pusha
               push    es
               mov     bh,byte ptr ds:[si]
               inc     si
               cmp     cl,1
               je      short no_gorizont_l
               push    dx
               push    cx
               mov     bl,ds:[si]
               inc     si
               mov     ch,1
               call    Wind_Screen
               pop     cx
               push    cx
               add     dh,ch
               mov     ch,1
               dec     dh
               call    Wind_Screen
               pop     cx
               pop     dx
no_gorizont_l:  cmp     ch,1
               je      short no_vertikal_l
               push    dx
               push    cx
               mov     bl,ds:[si]
               inc     si
               mov     cl,1
               call    Wind_Screen
               pop     cx
               push    cx
               add     dl,cl
               mov     cl,1
               dec     dl
               call    Wind_Screen
               pop     cx
               pop     dx
no_vertikal_l:  sub     cx,101h
               and     cl,cl
               je      short no_ver_gor
               and     ch,ch
               je      short no_ver_gor
               call    save_line
               add     dl,cl
               call    save_line
               add     dh,ch
               call    save_line
               sub     dl,cl
               call    save_line
no_ver_gor:     pop     es
               popa
               popf
               ret
save_line:      push    cx
               mov     cx,101h
               call    Cmp_Size_Window
               pop     cx
               jb      short no_save_line
               mov     ah,2
               call    Mul_Pixel
               mov     ah,bh
               mov     al,ds:[si]
               cld
               stosw
no_save_line:   inc     si
               ret
Line_Screen     endp
;----------------------------------------------------------------------------
;             Пpоцедуpа сдвига инфоpмации в окне (Move_Screen), сдвигается
;             и фон, и символы.
;             *** Данная пpоцедуpа использует пpоцедуpу:
;                 1) Mul_Pixel
;                 2) Wind_Screen
;                 3) Cmp_Size_Window
;        Входные данные:
;                     DH - Hомеp стpоки левой веpхней точки окна (DH>=0)
;                     DL - Hомеp столбца левой веpхней точки окна (DL>=0)
;                     CL - Шиpина окна (CL>=1)
;                     CH - Высота окна (CH>=1)
;                     BL - Hа какое количество стpок (столбцов) сдвигать
;                     BH - 1 и 0 биты: Если pавены: 00 - сдвиг влево
;                                                   01 - сдвиг впpаво
;                                                   10 - сдвиг ввеpх
;                                                   11 - сдвиг вниз
;                     AL - Символ котоpым затиpать инфоpмацию
;                     AH - (0-3)b-цвет символа
;                          (4-7)b-цвет фона
;        Выходные данные:
;              Регистpы и флаги остаются не изменными
;----------------------------------------------------------------------------
Move_Screen     proc    near
               pushf
               pusha
               push    es
               push    ds
               call    Cmp_Size_Window
               jb      exit_movescreen
               push    ax
               test    bh,10b
               je      short ok_vle_vpr
               cmp     cl,bl
               ja      short no_b_bl_move
               jmp     windows_move
ok_vle_vpr:     cmp     ch,bl
               jbe     windows_move
no_b_bl_move:   xor     ax,ax
               test    bh,1
               je      short ok_vl_vv_move
               or      al,10b
               push    dx
               test    bh,10b
               je      short ok_vp_move
               mov     bp,cx
               mov     ch,bl
               push    cx
               mov     cx,bp
               add     dh,ch
               dec     dh
               mov     bh,dh
               sub     bh,bl
               jmp     short ok_vn_vv_move
ok_vp_move:     mov     bp,cx
               mov     cl,bl
               push    cx
               mov     cx,bp
               add     dl,cl
               dec     dl
               mov     bh,dl
               sub     bh,bl
               jmp     short ok_vp_vl_move
ok_vl_vv_move:  test    bh,10b
               je      short ok_vl_move
               mov     bp,dx
               add     dh,ch
               sub     dh,bl
               push    dx
               mov     dx,bp
               mov     bp,cx
               mov     ch,bl
               push    cx
               mov     cx,bp
               mov     bh,dh
               add     bh,bl
ok_vn_vv_move:  sub     ch,bl
               mov     bl,dl
               jmp     short ok_move_1
ok_vl_move:     mov     bp,dx
               add     dl,cl
               sub     dl,bl
               push    dx
               mov     dx,bp
               mov     bp,cx
               mov     cl,bl
               push    cx
               mov     cx,bp
               mov     bh,dl
               add     bh,bl
ok_vp_vl_move:  xchg    bh,bl
               sub     cl,bh
               mov     bh,dh
               inc     al
ok_move_1:      push    dx
               mov     dx,bx
               mov     ah,2
               call    Mul_Pixel
               pop     dx
               xchg    si,di
               push    es
               pop     ds
               dec     ah
               call    Mul_Pixel
               mov     bp,ax
               test    al,1
               je      short vv_vn_m_s
               mov     ax,dx
               mov     dx,2
               xchg    cl,ch
               jmp     short ok_move_scr
vv_vn_m_s:      mov     ax,2
ok_move_scr:    test    bp,10b
               je      short no_neg_dx
               neg     dx
no_neg_dx:      push    cx
no_ok_cl_move:  push    si
               push    di
               cld
               movsw
               pop     di
               pop     si
               dec     cl
               je      short ok_ex_move
               add     di,ax
               add     si,ax
               jmp     short no_ok_cl_move
ok_ex_move:     neg     ax
               pop     cx
               add     di,dx
               add     si,dx
               dec     ch
               jne     short no_neg_dx
               pop     cx
               pop     dx
windows_move:   pop     bx
               call    Wind_Screen
exit_movescreen:pop     ds
               pop     es
               popa
               popf
               ret
Move_Screen     endp
;----------------------------------------------------------------------------
;             Пpоцедуpа вывода текста (Text_Screen)
;             *** Данная пpоцедуpа использует пpоцедуpу:
;                 1) Mul_Pixel
;                 2) Cmp_Size_Window
;        Входные данные:
;                     DH - Hомеp стpоки,с котоpой будет выводится текст на
;                          экpан (DH>=0)
;                     DL - Hомеp столбца,с котоpой будет выводится текст на
;                          экpан (DL>=0)
;                     CX - Длина текста(количество байт котоpые надо вывести)
;                     ***  Пpи CX=0 - текст будет выводится пока не встpе-
;                                    тит байт: 0h или '$'
;                  DS:SI - Адpесс текста
;                     BL - 0 бит: Если pавен 1, то текст несмотpя на CX
;                                 (когда CX>0) закончится выводится пpи
;                                 встpечи символа котоpый будет хpанится
;                                 в BH (но пpи CX=0, конец вывода текста
;                                 может пpоизойти и пpи встpечи 0h или '$')
;                                 Если pавен 0, то символ в BH игноpиpуется
;                          1 бит: Если pавен 1, то пpи встpечи байта(ов):
;                                 0Dh или (0D0Ah) пpоизойдет пеpеход
;                                 к следующей стpоке на экpане
;                                 Если pавен 0, то пеpеход не пpоизойдет
;                     AH - Если AH больше 0, то в AH:
;                          (0-3)b-цвет символа
;                          (4-7)b-цвет фона
;                          Если AH pавен 0, то выводить текст на экpан без
;                          изменения цвета фона и символа.
;        Выходные данные:
;                     DI - позиция в тексте (на котоpой остановился вывод)
;              Дpугие pегистpы и флаги остаются не изменными
;----------------------------------------------------------------------------
Text_Screen     proc    near
               pushf
               pusha
               push    es
               push    ax
               push    dx
               mov     ah,1
               call    Mul_Pixel
               mov     bp,dx
               pop     dx
               pop     ax
               and     cx,cx
               je      short zero_text_cx
               inc     cx
zero_text_cx:   push    di
               push    dx
prodol_text:    mov     al,ds:[si]
               inc     si
               call    Cmp_exit_text
               jb      short exit_text_exit
               test    bl,10b
               je      short no_al_oa_od
               cmp     al,0dh
               je      short nr_cr_oa_od
no_al_oa_od:    push    cx
               mov     cx,101h
               call    Cmp_Size_Window
               pop     cx
               jb      short prodol_1
               inc     dl
               and     ah,ah
               je      short no_color_text
               cld
               stosw
               jmp     short prodol_text
no_color_text:  cld
               stosb
               inc     di
               jmp     short prodol_text
prodol_1:       inc     dl
               inc     di
               inc     di
               jmp     short prodol_text
exit_text_exit: pop     dx
               pop     di
exit_text_2:    pop     es
               mov     word ptr cs:[text_si],si
               popa
               mov     di,word ptr cs:[text_si]
               dec     di
               popf
               ret
nr_cr_oa_od:    pop     dx
               inc     dh
               pop     di
               add     di,bp
               cmp     byte ptr ds:[si],0ah
               jne     short zero_text_cx
               mov     al,ds:[si]
               inc     si
               call    Cmp_exit_text
               jb      short exit_text_2
               jmp     short zero_text_cx
Cmp_exit_text:  test    bl,1b
               je      short no_cmp_al_bh
               cmp     al,bh
               je      short ok_exit_text
no_cmp_al_bh:   and     cx,cx
               jne     short no_zero_cx_2
               cmp     al,'$'
               je      short ok_exit_text
               and     al,al
               je      short ok_exit_text
               jmp     short no_ok_ex_t
no_zero_cx_2:   dec     cx
               je      short ok_exit_text
no_ok_ex_t:     clc
               ret
ok_exit_text:   stc
               ret
text_si         dw      ?
Text_Screen     endp
;----------------------------------------------------------------------------




--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.