Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Модуль CRT


Автор: Lonley 22.9.2005, 01:08
ПРИВЕТ!!!
---------------------
Мне нужно заглянуть в модуль CRT и посмотреть функцию WINDOW!!!
может кто знает как это функция работает, я посмотрел чере TurboDeb не совсем все понятно
--------------------

Автор: kent 22.9.2005, 10:18
Вот так она выглядит в Crt.asm... smile

Код

; Define output window

Window:

        MOV     BX,SP
        MOV     DL,SS:[BX+10]
        MOV     DH,SS:[BX+8]
        MOV     CL,SS:[BX+6]
        MOV     CH,SS:[BX+4]
        CMP     DL,CL
        JA      @@1
        CMP     DH,CH
        JA      @@1
        DEC     DL
        JS      @@1
        DEC     DH
        JS      @@1
        DEC     CL
        CMP     CL,CurCrtSize.X
        JA      @@1
        DEC     CH
        CMP     CH,CurCrtSize.Y
        JA      @@1
        MOV     WindMin,DX
        MOV     WindMax,CX
        CALL    SetCursor
@@1:    RETF    8

Автор: Lonley 23.9.2005, 01:39
kent
спасибо, а где взял

Автор: kent 23.9.2005, 06:34
Цитата(Lonley @ 23.9.2005, 01:39)
kent
спасибо, а где взял

Искал его когда надо было глюк Delay убрать, нашёл в инете где точно уже не помню, могу весь модуль скинуть если надо...

Автор: Lonley 24.9.2005, 00:17
kent
Буду весьма признателен
shmv@inbox.ru


к стати, а что за значения они пересылают

Код

        MOV     DL,SS:[BX+10]    
        MOV     DH,SS:[BX+8]    
        MOV     CL,SS:[BX+6]    
        MOV     CH,SS:[BX+4]


Автор: Александра 24.9.2005, 05:16
Lonley
Координаты. далее идет сравнение, если лево больше право, к примеру - то выход. ну и т.д.
Добавлено @ 05:18
...через стек, поэтому регистр SS

Автор: Lonley 24.9.2005, 20:30
а так значит... он просто через позиционирование курсора окно это ставит...
тогда понятно... это можно самому написать...
Александра я правильно понял

Автор: Lonley 25.9.2005, 01:58
Код

Window:

        MOV     BX,SP
        MOV     DL,SS:[BX+10]      {x}
        MOV     DH,SS:[BX+8]       {y}
        MOV     CL,SS:[BX+6]       {x1}
        MOV     CH,SS:[BX+4]       {y1}
        CMP     DL,CL
        JA      @@1               {x > x1}
        CMP     DH,CH
        JA      @@1               {y > y1}
        DEC     DL                {проверка на ноль X отнимаем 1 из DL}
        JS      @@1               {переход если sf = 1 т.е. получилось отриц число}
        DEC     DH                {проверка на ноль Y}
        JS      @@1               {переход если sf = 1 т.е. получилось отриц число}
        DEC     CL                {отнимаеи 1 из CL x1}
        CMP     CL,CurCrtSize.X   {сравниваем не больше ли x1 CurCrtSize.X за экран}
        JA      @@1               {прыжок если больше}
        DEC     CH                {y1 - 1}
        CMP     CH,CurCrtSize.Y   {сравниваем не больше ли x1 CurCrtSize.X}
        JA      @@1               {прыжок если больше}
        MOV     WindMin,DX        {x,y}
        MOV     WindMax,CX        {x1,y1}
        CALL    SetCursor         {установка курсора с координатами x y}
@@1:    RETF    8                 {выход из процедуры дальней... с очисткой стека 8 байт}


вот что Я вычитал... коментарии мои т.е. процедура проверила усианавливаемые координаты окна
поставила курсор в начало окна и ушла, но хоть убей не понятно как она ограничивает текст
как она заставляет текст находиться в пределах заданных координат

Автор: Lonley 25.9.2005, 17:04
а все понял разобрался...
я думаю что функции вывода текста WRITE и т.д. выводят текст относительно от
координат окна...

Код

        MOV     WindMin,DX        {x,y}
        MOV     WindMax,CX        {x1,y1}

т.е. они проверяют не выходит ли выводимый текст за их границы наверно так...
вот запуситл этот код и все стало на свои места

Код

Uses Crt;

BEGIN
      asm
        mov ax,0
        int 16h
      end;
     Window(1,1,10,5);
      asm
        mov ax,0
        int 16h

        mov ah,9
        mov al,65
        xor bh,bh
        mov bl,00001111b
        mov cx,75
        int 10h
      end;
      write ('HELLO HELLO HELLO HELLO HELLO HELLO HELLO HELLO HELLO HELLO HELLO ');
       asm
        mov ax,0
        int 16h
      end;

END.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)