ZX-Ревю 1996 №7-8 1995 г.

Этюды - многооконный интерфейс.


    ИФК.:   Савченко   Владислав  из г.Скалистый, Мурманской обл., прислал 
материал,  который  наверняка заинтересует начинающих программистов.
         КОРР: Разбирая программы, предложенные на страницах ZX-РЕВЮ мое 
внимание  особо привлекали релоцируемые процедуры.  Считаю, что если программа  
небольшая  (порядка несколько сот байт), то она должна обязательно быть 
релоцируемой.
     Занимаюсь машкодом уже около года и хочу продемонстрировать результаты 
моих тудов.
     Следующая процедура поможет организовать многооконный интерфейс. Она 
строит на экране монитора окно любой ширины и высоты, которое отбрасывает тень 
шириной в одно знакоместо. Отдавая дань традициям процедура вызывается через:

DEF FN R(X,Y,Len,Hig,Col,Sh)=USR add

где: X,Y  -  координаты  верхнего  левого угла окна;
     Len и Hig - длина и высота окна;
     Col - цветовые атрибуты окна;
     Sh - цветовые атрибуты тени;
     add -  адрес загрузки процедуры.
      Окно может накладываться как до, так и после рисования надписи (рисунка).
За  допустимыми значениями задаваемых параметров процедура не следит. Адреса 
этих параметров  она  берет из системной переменной  Def Add (23563), используя 
смещения.  Если использовать процедуры не из Бейсика, а из программы в машкодах, 
то в регистре IX  нужно задать свой адрес, по которому один за другим пойдут 
значения X, y, Len и т.д. В последнем случае придется подправить смещения, но 
это можно сделать даже из монитора.

       Если из Бейсика    Если из машкода
      с помощью Def Fn

      LD    IX,(23563)    LD     IX,adr
X         (IX+4)              (IX+0)
Y         (IX+12)             (IX+1)
Len       (IX+20)             (IX+2)
Hig       (IX+28)             (IX+3)
Col       (IX+36)             (IX+4)
Sh        (IX+44)             (IX+5)

         Процедура  состоит из двух независимых частей: рисование рамки с 
помощью RST 16 и наложение атрибутов. Если удалить строки 80 и 570 и добавить:

570 NEXT LD    IX,(23563)
571      LD    E,(IX+4)
572      LD    D,(IX+12)

то  процедура будет иметь две точки входа по адресам add и add+90.
add - рисование всего окна.
add+90 - только атрибуты.
         Старт  прцедуры с адреса загрузки. Длина - 154 байта.

; (C) Savchenko Vladislav, 1996
10         ENT   $
20         LD    IX,(23563)
30         LD    A,2
40         CALL  #1601
50         LD    C,(IX+4)
60         LD    B,(IX+12)
70         PUSH  BC
80         PUSH  BC
90         XOR   A
100        PUSH  AF
110        CALL  2715
120        LD    C,131
130        LD    DE,#8B87
140 STROKA LD    A,D
150        RST   #10
160        LD    B,(IX+20)
170 LOOP   LD    A,C
180        RST   #10
190        DJNZ  LOOP
200        LD    A,E
210        RST   #10
220        POP   AF
230        AND   A
240        JR    NZ,NEXT
250        POP   DE
260        LD    B,(IX+28)
270 LOOP2  PUSH  BC
280        INC   D
290        LD    C,E
300        LD    B,D
310        PUSH  DE
320        CALL  2715
330        POP   DE
340        LD    A,138
350        RST   #10
360        LD    A,(IX+20)
370        INC   A
380        ADD   A,E
390        LD    C,A
400        LD    B,D
410        PUSH  DE
420        CALL  2715
430        POP   DE
440        LD    A,133
450        RST   #10
460        POP   BC
470        DJNZ  LOOP2
480        INC   D
490        LD    B,D
500        LD    C,E
510        CALL  2715
520        LD    C,140
530        LD    DE,#8E8D
540        INC   A
550        PUSH  AF
560        JR    STROKA
570 NEXT   POP   DE
580        LD    A,D
590        AND   #18
600        RRCA
610        RRCA
620        RRCA
630        OR    #58
640        LD    H,A
650        LD    A,D
660        AND   #07
670        RRCA
680        RRCA
690        RRCA
700        ADD   A,E
710        LD    L,A
720        LD    B,(IX+28)
730        INC   B
740        INC   B
750        LD    D,1
760        LD    E,(IX+20)
770        INC   E
780        INC   E
790 LOOP3  PUSH  BC
800        LD    B,E
810        PUSH  HL
820        LD    A,(IX+36)
830 LOOP4  LD    (HL),A
840        INC   HL
850        DJNZ  LOOP4
860        DEC   D
870        JR    Z,NEXT2
880        LD    A,(IX+44)
890        LD    (HL),A
900 NEXT2  POP   HL
910        LD    DE,#0020
920        ADC   HL,DE
930        POP   BC
940        DJNZ  LOOP3
950        INC   HL
960        LD    B,E
970 LOOP5  LD    (HL),A
980        INC   HL
990        DJNZ  LOOP5
1000       RET




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Разное - "Что было пороками, теперь нравы". Размышления о нравственности.
Конкурс - Кто напишит полную биографию группы PRODIGY.
Cafe'03 demo рецензия - Кто, что думает об нынешнем уровне демомейкинга.
Бук - Похождения Штирлица и другие приключения Бормана.
Обратная связь - контакты редакции.

В этот день...   21 ноября