ZX-Ревю 1995 №5 1995 г.

Читатель - читателю - Процедура печати 42 символа в строке.


ЧИТАТЕЛЬ - ЧИТАТЕЛЮ

Процедура печати 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

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




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
О разном - О судьбе Спекки. Сколько можно жевать сопли по PC и AMIGA!
Доска почета - печальная история жизни Владимирской группы REMEDY, так и не выпустившей Героев на спектруме.
FANTASY - Роман Г.Гаррисона "Чума из космоса" (продолжение).
заключение - авторы и т.д.
Юмор - Анекдоты про Штирлица.

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