ЧИТАТЕЛЬ - ЧИТАТЕЛЮ
Процедура печати 42 символа в строке
(С) Дмитрий Сергеев,
Саратовская обл., 1995.
Предлагаю нестандартную процедуру печати символами размером 6x8 пикселов. Алгоритм работы процедуры отличается от печати при помощи PLOT, который предложен в книге "Прикладная графика", и заключается в следующем. Так как символы имеют размер по горизонтали 6 пикселов, то, чтобы перенести их в байты экранного файла, надо вычислить величину горизонтального скроллирования:
H знакоместо |
2-е знакоместо |
3-е знакоместо |
|
|
|
1-й
СИМВ0/1 |
2-й символ
Г—Г----— |
3-й
СИМВОЛ |
4-й символ |
2 4 6 пиксела пиксела пиксе/юв
То есть берем позицию знакоместа (размера 6x8), куда надо напечатать символ, умножаем его на 3/4, получаем позицию обычного знакоместа и остаток; если остаток равен нулю, значит величина скроллинга равна нулю. А если остаток равен п (п=2, 4, 6), то величина скроллинга равна 8-п.
Например, координата по X (в 6x8 знакоместах) равна 5. Тогда 5*6=30; 30 делим на 8, получаем: 3 и 6 в остатке; смещение равно 8-6*2. Это смещение задается в программной переменной NMB (см. листинг):
1 (С) Сергеев Дмитрий
2 ORG 50000
3 ENT $
4 LD HL,TEXT
5 WRITE LD A,(XTXT)
6 CP 42
7
8 9
10 11 12
13 WR1
14
15
16 WR2
17
18
19
20 21
22 WRITE1
23
24 WRITE2
25
26
27
28 WRITE3
29
30
31
32
33
34
35
36
37 WRITE4
38
39
40
41
42
43
44 WRITE5
45
46
47
48 PR10
49
50
51
52 PR10_1
53
54
55
56
57
58
59
60 PR11
61 62
JR |
C,WR2 |
LD |
A,(YTXT) |
INC |
A |
CP |
24 |
JR |
C,WR1 |
XOR |
A |
LD |
(YTXT),A |
XOR |
A |
LD |
(XTXT),A |
LD |
A,(HL) |
INC |
HL |
AND |
A |
RET |
Z |
CP |
32 |
OR |
C,WRITE2 |
CALL |
PRSYM |
OR |
WRITE |
PUSH |
HL |
PUSH |
BC |
LD |
HL,TABLE |
LD |
С, A |
LD |
A,(HL) |
INC |
HL |
AND |
A |
OR |
Z,WRITE5 |
CP |
С |
OR |
Z,WRITE4 |
INC |
HL |
INC |
HL |
OR |
WRITE3 |
POP |
BC |
LD |
A,(HL) |
INC |
HL |
LD |
H,(HL) |
LD |
L, A |
EX |
(SP),HL |
RET |
|
POP |
BC |
POP |
HL |
LD |
A,"?" |
OR |
WRITE1 |
LD |
A,(HL) |
AND |
Xlll |
PUSH |
BC |
LD |
B,%11111000 |
LD |
С, A |
LD |
A,(PATTR) |
AND |
В |
OR |
С |
LD |
(PATTR),A |
POP |
BC |
INC |
HL |
OR |
WRITE |
LD |
A,(HL) |
AND |
%111 |
RLCA |
|
ЧИТАТЕЛЬ - ЧИТАТЕЛЮ
63 |
|
RLCA |
|
119 |
|
CALL |
ADDRZ 1 |
64 |
|
RLCA |
|
120 |
|
LD |
D,H 1 |
65 |
|
PUSH |
ВС |
121 |
|
LD |
E,L 1 |
66 |
|
LD |
В,211000111 |
122 |
|
POP |
ВС |
67 |
|
JR |
PR10 1 |
123 |
|
CALL |
SCRL |
68 |
PR13 |
LD |
A,(HL) |
124 |
|
JR |
FINISH |
69 |
|
AND |
1 |
125 |
CHPASS |
XOR |
A |
70 |
|
PUSH |
ВС |
126 |
|
RET |
|
71 |
|
LD |
В,210111111 |
127 |
FINISH |
LD |
A,(XTXT) |
72 |
|
RRCA |
|
128 |
|
INC |
A |
73 |
|
RRCA |
|
129 |
|
LD |
(XTXT),A |
74 |
|
JR |
PR10 1 |
130 |
ATTR |
POP |
DE |
75 |
PR16 |
LD |
A,(HL) |
131 |
|
CALL |
AADDR |
76 |
|
LD |
(YTXT), A |
132 |
|
LD |
A,(PATTR) |
77 |
|
INC |
HL |
133 |
|
LD |
(HL),A |
78 |
|
LD |
A, (HL) |
134 |
|
POP |
HL |
79 |
|
LD |
(XTXT), A |
135 |
|
EXX |
|
80 |
|
INC |
HL |
136 |
|
RET |
|
81 |
|
JR |
WRITE |
137 |
SCRL |
LD |
A,(DE) |
82 |
PRSYM |
PUSH |
AF |
138 |
|
PUSH |
ВС |
83 |
|
EXX |
|
139 |
|
PUSH |
AF |
84 |
|
POP |
AF |
140 |
|
LD |
А,(ВС) |
85 |
|
PUSH |
HL |
141 |
|
LD |
С,A |
86 |
|
LP |
L,A |
142 |
|
LD |
A,(NMB) S |
87 |
|
LD |
H,0 |
143 |
|
LD |
В, A |
88 |
|
ADD |
HL,HL |
144 |
|
POP |
AF |
89 |
|
ADD |
HL,HL |
145 |
|
PUSH |
ВС |
90 |
|
ADD |
HL,HL |
146 |
SL1 |
SRL |
A |
91 |
|
LD |
DE,(23606) |
147 |
|
DJNZ |
SL1 |
92 |
|
ADD |
HL,DE |
148 |
|
POP |
ВС | |
93 |
|
LD |
B,H |
149 |
|
AND |
A I |
94 |
|
LD |
C,L |
150 |
SL2 |
RL |
С О |
95 |
|
PUSH |
ВС |
151 |
|
RL |
A 1 |
96 |
СНЕСКР |
LD |
A,(XTXT) |
152 |
|
DJNZ |
SL2 |
97 |
|
ADD |
A,A |
153 |
|
LD |
(HL),A |
98 |
|
LD |
E, A |
154 |
|
INC |
HL |
99 |
|
ADD |
A,A |
155 |
|
LD |
(HL),C |
100 |
|
ADD |
A, E |
156 |
|
DEC |
HL |
101 |
|
LD |
D, -1 |
157 |
|
INC |
H |
102 |
CHPL1 |
INC |
D |
158 |
|
INC |
D |
103 |
|
SUB |
8 |
159 |
|
POP |
ВС |
104 |
|
JR |
NC,CHPL1 |
160 |
|
INC |
ВС |
105 |
|
ADD |
A,8 |
161 |
|
LD |
A,(ST) И |
106 |
|
PUSH |
AF |
162 |
|
DEC |
А У |
107 |
|
LD |
A, (YTXT) |
163 |
|
LD |
(ST),A I |
108 |
|
LD |
E,A |
164 |
|
JR |
NZ,SCRL I |
109 |
|
POP |
AF |
165 |
|
LD |
A, 8 |
110 |
|
POP |
ВС |
166 |
|
LD |
(ST),A |
111 |
|
PUSH |
DE |
167 |
|
RET |
|
112 |
|
PUSH |
ВС |
168 |
ADDRZ |
LD |
A,E |
113 |
|
CP |
0 |
169 |
|
AND |
#18 |
114 |
|
CALL |
Z,CHPASS |
170 |
|
ADD |
A,#40 |
115 |
|
LD |
B,A |
171 |
|
L? |
H, A |
116 |
|
LD |
A,8 |
172 |
|
Lb |
A, E |
117 |
|
SUB |
В |
173 |
|
AND |
7 |
118 |
|
LD |
(NMB),A |
174 |
|
RRCA |
|
ЧИТАТЕЛЬ-ЧИТАТЕЛЮ
175 |
|
RRCA |
|
176 |
|
RRCA |
|
177 |
|
ADD |
A,D |
178 |
|
LD |
L,A |
179 |
|
RET |
|
180 |
AADDR |
LD |
A,E |
181 |
|
AND |
#18 |
182 |
|
SRL |
A |
183 |
|
SRL |
A |
184 |
|
SRL |
A |
185 |
|
OR |
#58 |
186 |
|
LD |
H,A |
187 |
|
LD |
A,E |
188 |
|
AND |
7 |
189 |
|
OR |
A |
190 |
|
RRA |
|
191 |
|
RRA |
|
192 |
|
RRA |
|
193 |
|
RRA |
|
194 |
|
ADD |
A,D |
195 |
|
LD |
L,A |
196 |
|
RET |
|
197 |
ST |
DEFB |
8 |
198 |
NMB |
DEFB |
0 |
199 |
PATTR |
DEFB |
7*8 |
200 |
XTXT |
DEFB |
0 |
201 |
YTXT |
DEFB |
0 |
202 |
TABLE |
DEFB |
#10 |
203 |
|
DEFW |
PR10 |
204 |
|
DEFB |
#11 |
205 |
|
DEFW |
PR11 |
206 |
|
DEFB |
#13 |
207 |
|
DEFW |
PR13 |
208 |
|
DEFB |
#16 |
209 |
|
DEFW |
PR16 |
210 |
TEXT |
DEFS |
0 |
Собственно процедура печати -подпрограмма WRITE. При входе в нее в регистре HL должен быть задан адрес начата строки текста:
LD HL,TEXT CALL WRITE
Текст обязательно должен заканчиваться маркером конца - нулевым символом. В тексте могут быть управляющие символы: #10, #11, #13, #16. Их значение аналогично стандартной процедуре печати - соответственно управление INK, PAPER, BRIGHT, AT. Значения операндов для AT могут быть по X: 0. . .41; по Y: 0...23.
В авторский текст программы добавлены строки 5-15. Они необходимы для того, чтобы при достижении правого края экрана, печать продолжалась на следующей строке. Аналогично, при достижении нижней границы экранаЛ печать продолжится на верхней строке экрана (прим. ИФК).
Блок кодов WRITE, обрабатывающий управляющие символы позаимствован из книги "Как написать игру на ассемблере" ("Питер"), выпуск 2, стр. 183. Основная же процедура PRSYM и все ее подпрограммы придуманы самостоятельно. На входе в процедуру PRSYM в регистре А находится код символа, в ячейках ХТХТ и ¥ТХТ - соответственно Х- и Y-координаты печати (позиция печати в 6x8 знакоместах), в ячейке PATTR - атрибуты печати (INK, PAPER, BRIGHT).
Подпрограмма расчета адреса в дисплейном файле взята из раздела ЭТЮДЫ в ZX-PEBI0-94, N3, стр.44, а процедура расчета адреса в файле атрибутов - из книги "Элементарная графика" (стр.89).
Число управляющих кодов, распознаваемых программой, может быть увеличено. Для этого надо расширить таблицу TABLE в конце программы и дополнить листинг процедурами обработки других управляющих кодов (см. например, указанную книгу).
Для работы программе необходим соответствующий символьный набор. Символы в нем не должны иметь ширину больше 6 пиксельных линий и должны быть "прижаты" к левому краю (два правых столбца должны быть свободными).
Длина блока кодов (со строками 5-15) равна 309 байтов:
С350: 21 85 С4 ЗА 77 С4 FE 2А :1А
С358: 38 10 ЗА 78 С4 ЗС FE 18 :2В
С360: 38 01 AF 32 78 С4 AF 32 :5А
С368: 77 С4 7Е 23 А7 С8 FE 20 :94
С370: 38 05 CD СА СЗ 18 DC Е5 :АЗ
С378: С5 21 79 С4 4F 7Е 23 А7 :F5
С380: 28 0Е В9 28 04 23 23 18 :ВС
С388: F4 CI 7Е 23 66 6F ЕЗ С9 :22