Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ZX-Review-1992-01-12.pdf
Скачиваний:
243
Добавлен:
28.03.2015
Размер:
2.43 Mб
Скачать

сохраняется в стеке, чтобы запомнить значение последнего байта для завершения в C регистре. E регистр настраивается на адрес следующего бита каждого байта. Если вращение не завершено происходит переход к N_BIT.

В DE загружается значение 7, и это значение добавляется к HL. Теперь HL указывает на последний байт данных. В регистр B загружается число байтов, которые должны быть взяты из стека. Для каждого байта новое значение копируется в Е, и это значение помещается в ячейку с адресом в HL. HL уменьшается, чтобы указать на следующий байт и счетчик (B регистр) уменьшается. Если счетчик не равен 0, происходит переход к REPL.

Программа возвращается в BASIC.

6.6 Изменение атрибута.

Длина: 21 Количество переменных:2

Контрольная сумма: 1952 Назначение: Эта программа изменяет значение атрибутов всех символов экрана на

задаваемое например, могут быть изменены цвета всех символов, или весь экран может замигать и т. д.

Переменные: Имя data saved Длина 1 Адрес 23296

Комментарий: неизменяемые биты атрибута. Имя new_data

Длина 1 Адрес 23297

Комментарий: Новые биты, вводимые в байт атрибута. Вызов программы:

RANDOMIZE USR адрес

Контроль ошибок: Нет Комментарий: Отдельные биты атрибута каждого символа могут быть изменены с

помощью инструкций AND и OR.

ЛИСТИНГ МАШИННЫХ КОДОВ

МЕТКА

АССЕМБЛЕР

ЧИСЛА ДЛЯ ВВОДА

 

 

LD HL,22528

33

0

88

 

 

LD BC,768

1

0

3

 

 

LD DE,(23296)

237

91

0

91

NEXT_B

LD A,(HL)

126

 

 

 

 

AND E

163

 

 

 

 

OR D

178

 

 

 

 

LD (HL),A

119

 

 

 

 

INC H

35

 

 

 

 

DEC BC

11

 

 

 

 

LD A,В

12O

 

 

 

 

OR C

177

 

 

 

 

JK NZ,NEXT_B

32 246

 

 

 

 

RET

201

 

 

 

Как она работает:

Впару регистров HL загружается адрес области атрибутов, а в пару регистров BC количество символов на экране, в регистр D загружается значение new_data, а в регистр Е загружается значение data_saved.

Ваккумулятор загружается байт с адресом, находящимся в HL, a биты устанавливаются соответственно значениям регистров D и Е. Результат помещается обратно в ячейку с адресом, хранящимся в HL. HL увеличивается, указывая на следующий байт, а счетчик ВС уменьшается. Если содержимое BC не равно 0, программа возвращается

к NEXT_В.

Программа возвращается в BASIC.

6.7 Смена атрибута.

Длина: 22 Количество переменных: 2

Контрольная сумма: 1825 Назначение: Эта программа ищет атрибуты с определенным значением и заменяет

каждое найденное вхождение другим значением. Переменные:

Имя old_value Длина 1 Адрес 23296

Комментарий: Значение байта, подлежащего замене. Имя new_value

Длина 1 Адрес 23297

Комментарий: Значение замещающего байта. Вызов программы:

RANDOMIZE USR адрес

Контроль ошибок: Нет Комментарий: Эта программа полезна для выделения областей текста и графических

символов.

ЛИСТИНГ МАШИННЫХ КОДОВ

МЕТКА

АССЕМБЛЕР

ЧИСЛА ДЛЯ ВВОДА

 

 

LD HL,22528

33

0

88

 

 

LD BC,768

1

0

3

 

 

LD DE,(23296)

237

91

0

91

NEXT_B

LD A,(HL)

126

 

 

 

 

CP Е

187

 

 

 

 

JR NZ,NO_CH

32

1

 

 

 

LD (HL),D

114

 

 

 

NO_CH

INC HL

35

 

 

 

 

DEC BC

11

 

 

 

 

LD A,В

120

 

 

 

 

OR C

177

 

 

 

 

JR NZ,NEXT_B

32

245

 

 

 

RET

201

 

 

 

Как она работает:

В пару регистров HL загружается адрес области атрибутов, а в ВС загружается число символов на экране. В E регистр загружается old_value, а в D регистр new_value. В аккумулятор загружается байт, адрес которого хранится в паре HL. Если аккумулятор хранит значение, которое эквивалентно содержимому Е регистра, то в байт с адресом, имеющимся в HL, помещается содержимое D регистра. При этом HL увеличивается, указывая на следующий байт, а счетчик ВС уменьшается. Если ВС не равно 0, происходит переход к NEXT_B, иначе программа возвращается в BASIC.

6.8 Закрашивание контура.

Длина: 263 Количество переменных: 2

Контрольная сумма: 26647 Назначение: Эта программа закрашивает область экрана, ограниченную линией

пикселей.

Переменные:

Имя X_coord Длина 1 Адрес 23296

Комментарий: Координата X стартовой позиции. Имя Y_coord

Длина 1 Адрес 23297

Комментарий: Координата Y стартовой позиции. Вызов программы:

RANDOMIZE USR адрес

Контроль ошибок: Если координата Y>175 или POINT(X,Y)=1, то программа тотчас же возвращается в BASIC.

Комментарий: Эта программа не перемещаемая, ее стартовый адрес 31955. Когда закрашивается большая область сложной формы, нужно большое количество свободного пространства в ОЗУ. Если это невозможно, может произойти сбой.

 

ЛИСТИНГ МАШИННЫХ КОДОВ

 

 

МЕТКА

АССЕМБЛЕР

ЧИСЛА ДЛЯ ВВОДА

 

LD HL,(23296)

42

0

91

 

LD A,H

124

 

 

 

CP

254

176

 

 

RET NC

208

 

 

 

CALL SUBR

205

143*125

 

AND (HL)

166

 

 

 

CP 0

254

0

 

 

RET NZ

192

 

 

 

LD BC,65535

1

255

255

 

PUSH BC

197

 

 

RIGHT

LD HL,(23296)

42

0

91

 

CALL SUBR

205

143*125

 

AND (HL)

166

 

 

 

CP 0

254

0

 

 

JR NZ,LEFT

32

9

 

 

LD HL,(23296)

42

0

91

 

INC L

44

 

 

 

LD (23296),HL

34

0

91

 

JR NZ,RIGHT

32

236

 

LEFT

LD DE,0

17

0

0

 

LD HL,(23296)

42

0

91

 

DEC L

45

 

 

 

LD (23296),HL

34

0

91

PLOT

LD HL,(23296)

42

0

91

 

PUSH HL

229

 

 

 

CALL SUBR

205

143*125

 

OR (HL)

182

 

 

 

LD (HL),A

119

 

 

 

POP HL

225

 

 

 

LD A,H

124

 

 

 

CP 175

254

175

 

 

JR Z,DOWN

40

44

 

 

LD A,E

123

 

 

 

CP 0

254

0

 

 

JR NZ,RESET

32

16

 

 

INC H

36

 

 

 

CALL SUBR

205

143*125

 

AND (HL)

166

 

 

 

CP 0

254

0

 

 

JR NZ,RESET

32

7

 

 

LD HL,(23296)

42

0

91

 

INC H

36

 

 

 

PUSH HL

229

 

 

 

LD E,1

30

1

 

RESET

LD HL,(23296)

42

0

91

 

LD A,E

123

 

 

 

CP 1

254

1

 

 

JR NX,DOWN

32

15

 

 

INC H

36

 

 

 

CALL SUBR

205

143*125

 

AND (HL)

166

 

 

 

CP 0

254

0

 

 

JR Z,DOWN

40

6

 

 

LD E,0

30

0

 

 

JR DOWN

24

2

 

L_JUMP

JR RIGHT

24

167

 

DOWN

LD HL,(23296)

42

0

91

 

LD A,H

124

 

 

 

CP 0

254

0

 

 

JR Z,NEXT_P

40

40

 

 

LD A,D

122

 

 

 

CP 0

254

0

 

 

JR NZ,REST

32

16

 

 

DEC H

37

 

 

 

CALL SUBR

205

143*125

 

AND (HL)

166

 

 

 

CP 0

254

0

 

 

JR NZ,REST

32

7

 

 

LD HL,(23296)

42

0

91

 

DEC H

37

 

 

 

PUSH HL

229

 

 

 

LD B,1

22

1

 

REST

LD A,D

122

 

 

 

CP 1

254

1

 

 

JR NZ,NEXT_P

32

14

 

 

LD HL,(23296)

42

0

91

 

DEC H

37

 

 

 

CALL SUBR

205

143*125

 

AND (HL)

166

 

 

 

CP 0

254

0

 

 

JR Z,NEXT_P

40

2

 

 

LD D,0

22

0

 

NEXT_P

LD HL,(23296)

42

0

91

 

LD A,L

125

 

 

 

CP 0

254

0

 

 

JR Z,RETR

40

12

 

 

DEC L

45

 

 

 

LD (23296),HL

34

0

91

 

CALL SUBR

205

143*125

 

AND (HL)

166

 

 

 

CP 0

254

0

 

 

JR Z,PLOT

40

129

 

RETR

POP HL

225

 

 

 

LD (23296),HL

34

0

91

 

LD A,255

62

255

 

 

CP H

188

 

 

 

JR NZ,L_JUMP

32

177

 

 

CP 1

189

 

 

 

JR NZ,L_JUMP

32

174

 

 

RET

201

 

 

SUBR

PUSH BC

197

 

 

 

PUSH DE

213

 

 

 

LD A,175

62

175

 

 

SUB H

148

 

 

 

LD H,A

103

 

 

 

PUSH HL

229

 

 

 

AND 7

230

7

 

 

ADD A,64

198

64

 

 

LD C,A

79

 

 

LD A,H

124

 

 

RRA

203

31

 

RRA

203

31

 

RRA

203

31

 

AND 31

230

31

 

LD B,A

71

 

 

AND 24

230

24

 

LD D,A

87

 

 

LD A,H

124

 

 

AND 192

230

192

 

LD E,A

95

 

 

LD H,C

97

 

 

LD A,L

125

 

 

RRA

203

31

 

RRA

203

31

 

RRA

203

31

 

AND 31

230

31

 

LD L,A

111

 

 

LD A,E

123

 

 

ADD A,B

128

 

 

SUB D

146

 

 

LD E,A

95

 

 

LD D,0

22

0

 

PUSH HL

229

 

 

PUSH DE

213

 

 

POP HL

225

 

 

ADD HL,HL

41

 

 

ADD HL,HL

41

 

 

ADD HL,HL

41

 

 

ADD HL,HL

41

 

 

ADD HL,HL

41

 

 

POP DE

209

 

 

ADD HL,DE

25

 

 

POP DE

209

 

 

LD A,E

123

 

 

AND 7

230

7

 

LD B,A

71

 

 

LD A,8

62

8

 

SUB B

144

 

 

LD B,A

71

 

 

LD A,1

62

 

ROTATE

ADD A,A

135

 

 

DJNZ ROTATE

16

253

 

RRA

230

31

 

POP DE

209

 

 

POP BC

193

 

 

RET

201

 

Как она работает:

Эта программа вычерчивает горизонтальные линии из смежных пикселей. Назовем их строчками. Предел заполнения области строчками ограничен включенными (ON) пикселями. Каждая строчка запоминается с помощью занесения в стек координат крайнего правого пикселя этой строчки.

Запускаясь с определенных координат, программа делает заполнение в каждой строчке, отмечая позиции каждой из невыполненных строчек выше или ниже. По завершении одной строчки последнее значение отмеченных координат восстанавливается и для соответствующей строчки происходит заполнение. Этот процесс повторяется до тех пор, пока не останется незаполненных строчек.

Рис. 2 иллюстрирует технику процесса. Квадраты представляют пиксели, X обозначает стартовую позицию в пределах области штриховки, а * обозначает крайние правые пиксели строчек.

////

////

////

////

////

////

////

////

 

 

 

 

 

 

 

 

////

о

////

 

*

////

////

////

 

 

 

 

 

 

 

 

////

о

////

 

X

 

 

////

 

 

 

 

 

 

 

 

////

////

////

 

 

 

*

////

 

 

 

 

 

 

 

 

////

 

 

*

////

 

*

////

 

 

 

 

 

 

 

 

////

 

*

////

////

////

*

////

 

 

 

 

 

 

 

 

////

 

*

////

////

////

*

////

 

 

 

 

 

 

 

 

////

////

////

////

////

////

////

////

 

 

 

 

 

 

 

 

Рис. 2 Иллюстрация техники заполнения области. X это стартовая позиция, * начало строчек, о оставшаяся незаштрихованная область.

Программа штрихует горизонтальную линию, содержащую стартовую позицию и сохраняет в стеке позицию начала строчки на линиях непосредственно выше и ниже. Далее она штрихует линию выше, а затем ниже, отмечая в последнем случае, что ещё 2 строчки запускаются на следующей нижней строке и т.д. Любая позиция в пределах области для штриховки может быть выбрана как стартовая позиция. Но заметим, что два пиксела, промаркированные нулями, нетронуты, т.к. они отделены от заштриховываемой области.

Врегистр H загружается Y координата, а в L регистр X координата. Если значение Y больше, чем 175, программа возвращается в BASIC. Процедура SUBR вызывается, возвращая адрес бита (X,Y) в память. Если этот бит в состоянии 'ON' (включен), подпрограмма возвращается в BASIC.

Число 65535 помещается в стек, чтобы отметить первое сохраненное значение. Позднее, когда число восстанавливается из стека, оно интерпретируется, как пара координат. Однако, если число равно 65535, происходит возврат в BASIC, т.к. программа закончена.

Врегистр H загружается Y координата, а в регистр L X координата. Процедура SUBR вызывается, возвращая в HL адрес бита (Х,Y). Если этот бит установлен (ON), происходит переход к LEFT. Иначе X координата увеличивается, и делается переход к RIGHT, если X не равен 256.

Впроцедуре LEFT, DE устанавливается в 0. Регистры D и Е используются, как флаги: D

вниз (DOWN), Е вверх (UP). X координата уменьшается. SUBR вызывается, и вычерчивается точка (X,Y). Если Y координата равна 175, подпрограмма переходит к DOWN. Если флаг "ВВЕРХ" установлен, происходит переход к RESET. Если бит (X,Y+1) сброшен, значение X и Y+1 сохраняются в стеке и флаг "ВВЕРХ" включается.

Впроцедуре RESET, если флаг "ВВЕРХ" включен, происходит переход к DOWN. Если бит (X,Y+1) включен (ON). Флаг "ВВЕРХ" выключается. В процедуре DOWN, если Y координата равна 0, происходит переход к NEXT_PIXEL. Если флаг "ВНИЗ" включен, происходит переход к REST. Если бит (X,Y 1) сброшен (OFF), то значения X и Y 1 сохраняются на стеке и флаг "ВНИЗ" включается.

Впроцедуре REST, если флаг "ВНИЗ" выключен, происходит переход к NEXT_P. Если бит (X,Y 1) установлен (ON), то флаг "ВНИЗ" выключается. В процедуре NEXT_P, если X координата равна 0, подпрограмма переходит к RETR. X координата уменьшается, и, если новый бит (X,Y) сброшен (OFF), происходит переход к PLOT. В процедуре RETR X и Y координаты извлекаются из стека. Если X и Y равны 255, то возврат в BASIC, т.к.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]