© Матюшев Александр, г. Сланцы, 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
;FONT-256
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.