© Матюшев Александр, г. Сланцы, 1996.
ПРОЦЕДУРА ПЕЧАТИ 42 СИМВОЛОВ В СТРОКЕ.
В ZX-РЕВЮ 95/5 на стр. 29 Вы поместили статью Сергеева Дмитрия "Процедура печати 42 символов в строке". Идея, заложенная в процедуре, мне понравилась. Давно хотелось иметь для использования в своих программах быстродействующую процедуру печати 42 символов в строке, полностью независящую от ПЗУ компьютера. Никак не хочу обидеть автора программы, но детально разобрав работу процедуры, удалось путем замены некоторых команд, новой процедуры расчета адреса атрибутов (позаимствована у Патрахина В.В., ZX-РЕВЮ 94/6, стр. 34), использования управляющих кодов в тексте, размещения переменных "ST" и "MNB" прямо в процедуре, существенно сократить объем и увеличить быстродействие процедуры. Использование управляющего кода "АТ" (#16) осталось таким же, управляющие коды "INK", "PAPER", "BRIGHT", "FLUSH" объединены и рассчитываются стандартно: INK+PAPER*8+BRIGHT*64+FLUSH*128. В тексте это число должно стоять после кода 16(#10). Встретив его, процедура положит следующее за ним число в переменную ATTR_T (23695=#5C8F) и установит временные атрибуты печати. В итоге получилось следующее:
0010 |
ORG |
50000 |
0020 |
ENT |
|
0030 |
LD |
HL,TEXT |
0040 |
WRITE LD |
A, (XTXT) |
0050 |
CP |
42 |
0060 |
JR |
C, WR2 |
0070 |
LD |
A, (YTXT) |
0080 |
INC |
A |
0090 |
CP |
24 |
0100 |
JR |
C, WR1 |
A
(YTXT),A A
(XTXT),A A, (HL) HL A Z
32
C,WRIT2 PRSYM WRITE 16
N Z,WRIT3 A, (HL) (23695),A HL WR2 22
N Z,WRIT4 A, (HL) (YTXT),A HL
A,(HL) (XTXT),A HL
WRITE A, "?"
WRIT1
HL L,A H, 0 HL, HL HL, HL HL, HL DE,15360 HL, DE HL
DE, (XTXT)
A, E
A, A
E,A
A, A
A, E
E, 255
L,8
E
L
NC,CHPL1 A, L H,A A, L H
(SL1-1),A
(SL2-1),A A, D #18 A, #40 H,A A, D 7
0750 |
|
RRCA |
|
0760 |
|
ADD |
A, E |
0770 |
|
LD |
L,A |
0780 |
|
PUSH |
HL |
0790 |
AADDR LD |
A, H |
0800 |
|
RRCA |
|
0810 |
|
RRCA |
|
0820 |
|
RRCA |
|
0830 |
|
AND |
#03 |
0840 |
|
OR |
#58 |
9850 |
|
LD |
H,A |
0860 |
ATTR LD |
A, (23695) |
0870 |
|
LD |
(HL),A |
0880 |
|
POP |
HL |
0890 |
|
POP |
DE |
0900 |
|
LD |
C,8 |
0910 |
SCRL LD |
A,(DE) |
0920 |
|
LD |
B, 0 |
0930 |
SL1 |
SRL |
(HL) |
0940 |
|
DJNZ |
SL1 |
0950 |
|
AND |
A |
0960 |
|
LD |
B, 0 |
0970 |
SL2 |
RL |
A |
0980 |
|
RL |
(HL) |
0990 |
|
DJNZ |
SL2 |
1000 |
|
INC |
HL |
1010 |
|
LD |
(HL),A |
1020 |
|
DEC |
HL |
1030 |
|
INC |
H |
1040 |
|
INC |
DE |
1050 |
|
DEC |
C |
1060 |
|
JR |
NZ, SCRL |
1070 |
FINIS LD |
HL,XTXT |
1080 |
|
INC |
(HL) |
1090 |
|
POP |
HL |
1100 |
|
EXX |
|
1110 |
|
RET |
|
1120 |
XTXTDEFB |
0 |
1130 |
YTXT DEFB |
0 |
1140 |
TEXT DEFS |
0 |
START OF |
OBJECT: |
#C350 (50 |
LENGS |
|
# 0 0AF (00 |
Если использовать символьный набор шириной 6 пикселов, прижатый к левому верхнему углу знакоместа, можно изменить строку N900 на LD C,6, что сократит время выполнения цикла. Если не предусматривается возврат в BASIC, строки 410 и 1090 можно убрать, если нет необходимости сохранения регистров, которые будут испорчены процедурой, можно убрать строки 400 и 1100.