ИФК.: Савченко Владислав из г.Скалистый, Мурманской обл., прислал
материал, который наверняка заинтересует начинающих программистов.
КОРР: Разбирая программы, предложенные на страницах 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