ZX-Ревю 1992 №5-6 1991 г.

40 лучших процедур - процедуры обработки программ.


40 ЛУЧШИХ ПРОЦЕДУР

Продолжение. Начало см. с. 17-28, 61-70.

7. ПРОЦЕДУРЫ ОБРАБОТКИ ПРОГРАММ.

7.1 Удаление блока программы.

Длина: 42

Количество переменных: 2 Контрольная сумма: 5977

Назначение: Эта программа удаляет блок BASIC-программы, находящийся между строками, определенными пользователем. Переменные: Имя - start line no Длина - 2 Адрес - 23296

Комментарий: Номер первой строки, подлежащей удалению. Имя - end line no Длина - 2 Адрес - 23298

Комментарий: Номер последней строки, подлежащей удалению.

Вызов программы:

RANDOMIZE USR адрес Контроль ошибок:

Если имеют место следующие ошибки, то процедура останавливается без удаления строк BASIC-программы:

- если последний номер строки меньше, чем первый номер строки;

- если между этими двумя строками нет программы на БЕЙСИКе;

- если один из номеров строк или оба равны 0.

Комментарий:

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

Дж. Хардман, Э.Хьюзон.

перевод: Тихоновой: H.A.

Не вводите номера строк больше, чем 9999.

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

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

АССЕМБЛЕР

МЕТКА

LD HL,(23296) LD DE,(23298)

42 0 91 237 91 2 91

124 181 200 122 179 200 213

LD A,H OR L RET Z LD A,D OR E RET Z PUSH DE

CALL 6510 EX (SP),HL

205 110 25 227

INC HL CALL 6510

35

205 110 25

POP DE AND A

209 167

SBC HL,DE

237 82

200 216 235 122 179 200 213 229

RET Z RET C

EX DE, HL NXT_CH LD A, D

OR E RET Z PUSH DE PUSH HL

205 24 16

CALL 4120

POP HL POP DE DEC DE

225 209 27

24 243

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

В пары регистров HL и DE загружаются начальный и конечный номера строк соответственно. Эти значения проверяются и, если одно из них или оба равны 0, программа возвращается в BASIC.

Затем вызывается подпрограмма ПЗУ по адресу 6510 - она возвращает адрес в памяти компьютера, с которого начинается первая строка. Эта же подпрограмма затем вызывается снова для определения адреса символа, стоящего после 'ENTER' в конечной строке.

В пару регистров HL помещается разность этих двух адресов и, если это значение равно 0 или отрицательно, программа возвращается в BASIC.

Содержимое пары регистров HL копируется в DE для использования DE в качестве счетчика. Если счетчик равен 0, то работа процедуры завершается, а если нет, то вызывается подпрограмма ПЗУ, расположенная по адресу 4120, которая удаляет один символ. После этого - возврат к ^ХТ_СН'.

7.2 Обмен токена.

Примечание: под "токеном" подразумевается любое ключевое слово (команда, функция) из "словаря" БЕЙСИКа, которое рассматривается данной программой (как и интерпретатором компьютера) в виде определенного кода. Длина: 46

Количество переменных: 2 Контрольная сумма: 5000 Назначение:

Меняет любое вхождение заданного токена в БЕЙСИК-программе на другой токен (например, все операторы PRINT могут быть изменены на LPRINT).

Переменные: Имя - chr old Длина - 1 Адрес - 23296

Комментарий: Код заменяемого токена. Имя - chr new Длина - 1 Адрес - 23297

Комментарий: Код замещающего токена.

Вызов программы:

RANDOMIZE USR адрес

JR NXT CH

Контроль ошибок:

Если БЕЙСИК-программы нет в памяти или один из двух заданных токенов имеет код меньше 32, то процедура возвращается в БЕЙСИК.

Комментарий:

Эта процедура очень быстра, но чем длиннее БЕЙСИК-программа, тем медленнее она работает.

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

АССЕМБЛЕР

ЧИСЛА ДЛЯ

LD BC,(23296)

237

75

LD A,31

62

31

CP B

184

RET NC

208

CP C

185

RET NC

208

LD HL,(23635)

42

83

INC HL

35

INC HL

35

INC HL

35

LD DE,(23627)

237

91

AND A

167

SBC HL,DE

237

82

RET NC

208

ADD HL,DE

25

INC HL

35

LD A,(HL)

126

INC HL

35

CP 13

254

13

JR Z,NXT CH

40

237

CP 14

254

14

JR NZ,COMP

32

3

INC HL

35

JR NEXT CHR

24

230

DEC HL

43

CP C

185

JR NZ,CHECK

32

229

LD (HL),B

112

JR CHECK

24

226

МЕТКА

91

NXT_CH CHECK

92

COMP

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

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

В пару HL заносится адрес начала БЕЙСИК программы. Пара регистров затем увеличивается и сравнивается с адресом области переменных. Если HL не меньше чем адрес начала области переменных программа возвращается в БЕЙСИК.

Пара HL увеличивается указывая на следующий символ. Код этого символа загружается в аккумулятор и HL увеличивается вновь. Если значение в аккумуляторе равно 13 или 14 (ENTER или NUMBER) подпрограмма возвращается к ^ХТ_СН' а HL увеличивается указывая на следующий символ. Если аккумулятор не содержит 13 или 14, хранимое значение сравнивается с 'chr old'. Если пара найдена, этот символ замещается на 'chr new'.

Затем возврат к проверке ('CHECK') на конец обрабатываемой программы.

7.3 Удаление REM строк

Длина: 132

Количество переменных: 0

Контрольная сумма 13809

Назначение:

Эта программа удаляет все комментарии из БЕЙСИК программы. Вызов программы:

RANDOMIZE USR адрес Контроль ошибок:

Если в памяти нет БЕЙСИК программы процедура вернется в БЕЙСИК без каких либо действий.

Комментарий:

Процедура ПЗУ, которая используется для удаления символов, выполняется не очень быстро и поэтому процедура "Удаление REM" работает медленно.

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

АССЕМБЛЕР

ЧИСЛА ДЛЯ

LD HL,(23635)

42

JR CHECK

24

31

PUSH HL

229

INC HL

35

INC HL

35

LD C,(HL)

78

INC HL

35

LD B,(HL)

70

INC HL

35

LD A,(HL)

126

CP 33

254

33

JR C,NXT СН

56

250

CP 234

254

234

JR NZ,SEARCH

32

26

INC ВС

3

INC BC

3

INC ВС

3

INC BC

3

POP HL

225

PUSH ВС

197

CALL 4120

205

24

POP BC

193

DEC BC

11

LD A,B

120

OR C

177

JR NZ,DEL L

32

248

LD DE,(23627)

237

91

AND A

167

SBC HL,DE

237

82

RET NC

208

ADD HL,DE

25

JR NEXT L

24

214

INC HL

35

LD A,(HL)

126

CP 13

254

13

JR NZ,N ENT

32

8

POP HL

225

ADD HL,BC

9

INC HL

35

INC HL

35

INC HL

35

INC HL

35

JR CHECK

24

231

CP 14

254

14

JR NZ,N NUMB

32

7

INC HL

35

INC HL

35

INC HL

35

92

75

INC HL

35

INC HL

35

JR SEARCH

24

231

CP 33

254

33

JR C,SEARCH

56

227

CP 34

254

34

JR NZ,N QUOT

32

8

INC HL

35

LD A,(HL)

126

CP 34

254

34

JR NZ,FD QT

32

250

JR SEARCH

24

215

CP 58

254

58

JR NZ,SEARCH

32

211

LD D,H

84

LD E,L

93

INC HL

35

LD A,(HL)

126

CP 13

254

13

JR Z,ENT FD

40

209

CP 33

254

33

JR C,FD ENT

56

246

CP 234

254

234

JR NZ,N QUOT

32

236

LD H,D

98

LD L,E

107

PUSH BC

197

CALL 4120

205

24

POP BC

193

DEC BC

11

LD A,(HL)

126

CP 13

254

13

JR NZ,DEL CH

32

245

POP HL

225

INC HL

35

INC HL

35

LD (HL)^

113

INC HL

35

LD (HL),B

112

DEC HL

43

DEC HL

43

DEC HL

43

JR CHECK

24

160

16

МЕТКА

NEXT L

NXT СН

DEL L

CHECK

92

SEARCH

ENT_FD

N_ENT

N_NUMB

FD QD

N QUOT

FD_ENT

DEL CH

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

В пару регистров HL загружается адрес начала БЕЙСИК области и делается переход к подпрограмме проверки конца обрабатываемой программы. Если конец достигнут, происходит возврат в БЕЙСИК.

Программа переходит к обработке следующей строки "NEXT_L". Адрес, имевшийся в HL сохраняется на стеке для дальнейшего использования, а в BC загружается длина обрабатываемой БЕЙСИК строки. Подпрограмма 'NXT_^' увеличивает адрес в HL и загружает в аккумулятор очередной символ. Если его код меньше чем 33, т. е. это пробел или управляющий символ, процедура возвращается, чтобы повторить эту часть вновь. Если встретившийся символ не является символом REM, делается переход к 'SEARCH'.

Если оператор RЕМ найден, регистр ВС увеличивается на 4 (он может быть теперь использован в качестве счетчика), а HL восстанавливается из стека. Затем удаляется количество символов, определенное в ВС, начиная с адреса определенного в HL. Для удаления используется процедура ПЗУ, расположенная по адресу 4120. Затем процедура снова переходит к процедуре 'CHECK'.

Если происходит переход к процедуре 'SEARCH', HL увеличивается указывая на следующий символ, и это значение загружается в аккумулятор. Если это символ ENTER, т.е.

достигнут конец строки, то HL восстанавливается из стека и увеличивается, указывая на начало следующей строки, а затем происходит переход к 'CHECK'.

Если аккумулятор хранит символ NUMBER (код равен 14), то HL увеличивается, указывая на первый символ после обнаруженного числа, и процесс поиска повторяется.

Затем делается проверка для символов, код которых меньше 33. Если такой символ обнаружен делается возврат к 'SEARCH'.

Если обнаружен символ "кавычка" (34), процедура выполняет цикл до тех пор, пока не будет обнаружена вторая кавычка, а затем поиск будет продолжен. Если найденный символ не двоеточие, определяющее строку с несколькими выражениями, поиск повторить.

HL копируется в DE, чтобы сохранить адрес двоеточия, а затем HL увеличивается, указывая на следующий символ. Если это символ ENTER, делается переход к 'ENT_FD', иначе, если это управляющий символ или пробел, программа возвращается к 'FD_ENT'.

Если символ не является кодом REM, происходит переход к 'N_QUOT'. Если же код REM найден, в HL загружается адрес последнего встретившегося двоеточия, а затем все символы от адреса, находящегося в HL до следующего символа ENTER удаляются. Указатели для этой строки корректируются, HL устанавливается в начало этой строки, и происходит переход к 'CHECK'.

7.4 Создание REM строк

Длина: 85

Количество переменных 3 Контрольная сумма 9526 Назначение:

Эта процедура создает выражение REM с заданным количеством символов в заданной строке. Символ выбирается пользователем. Переменные: Имя - line number Длина - 2 Адрес - 23296

Комментарий: номер строки в которую надо вставить выражение RЕМ. Имя - number chr Длина - 2 Адрес - 23298

Комментарий: Количество символов после REM. Имя - chr code Длина - 1 Адрес - 23300

Комментарий: Код символов после REM Вызов программы:

RANDOMIZE USR адрес Контроль ошибок:

Если номер строки равен 0, больше 9999, или строка с тем же самым номером уже существует, программа возвращается в BASIC. Комментарий:

Эта программа не проверяет достаточно ли свободной памяти для добавления новой строки. Следовательно это должно быть сделано перед стартом с помощью программы "Размер свободной памяти" из нашей статьи. Символы для ввода после REM должны иметь коды больше чем 31, т. к. управляющие символы (0 - 31) могут сбить с толку подпрограмму LIST в ПЗУ.

Подпрограмма ПЗУ, которая вызывается для вставки символов, довольно медленно выполняется, занимая много времени.

Созданное выражение REM может быть использовано для хранения машинного кода или данных.

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

АССЕМБЛЕР

ЧИСЛА ДЛЯ

ВВОДА

LD HL,(23296)

42

0

91

LD A,H

14

OR L

181

RET Z

200

LD DE,10000

17

16

39

AND A

167

SBC HL,DE

237

82

RET NC

208

ADD HL,DE

25

PUSH HL

229

CALL 6510

205

110

25

JR NZ,CREATE

32

2

POP HL

225

RET

201

LD BC,(23298)

237

75

2

PUSH BC

197

PUSH BC

197

LD A,13

62

13

CALL 3976

205

136

15

INC HL

35

POP ВС

193

PUSH BC

197

LD A,B

120

OR C

177

JR Z,INSERT

40

11

LD A,(23300)

58

4

91

CALL 3976

205

136

16

INC HL

35

POP BC

193

DEC BC

11

JR NXT_CH

24

240

POP BC

193

LD A,234

62

234

CALL 3976

205

136

15

INC HL

35

POP BC

193

INC BC

3

INC BC

3

LD A,B

120

PUSH BC

197

CALL 3976

205

136

15

POP BC

193

INC HL

35

LD A,C

121

CALL 3976

205

136

15

INC HL

35

POP BC

193

LD A,C

121

PUSH BC

197

CALL 3976

205

136

15

POP BC

193

INC HL

35

LD A,B

120

JP 3976

195

136

15

МЕТКА

CREATE

91

NXT CH

INSERT

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

В пару регистров HL загружается заданный номер строки. Это значение сравнивается с нулем и если он равен нулю, программа возвращается в БЕЙСИК. Если HL содержит число больше 9999 (максимально возможный номер строки), также происходит возврат в БЕЙСИК.

Вызывается подпрограмма ПЗУ (CALL 6510), которая возвращает в HL адрес строки, номер которой был в HL перед вызовом этой подпрограммы. Если флаг нуля установлен, то строка уже существует и в этом случае программа также возвращается в БЕЙСИК.

Если флаг нуля не установлен, делается переход к 'CREATE'. В BC загружается количество символов для вставки после 'REM' и это число запоминается на стеке. В аккумулятор загружается число 13 - код символа ENTER. Затем вызывается подпрограмма ПЗУ из адреса 3976 для вставки символа ENTER. Регистр ВС восстанавливается из стека.

После повторного сохранения ВС на стеке, пара ВС тестируется чтобы определить есть ли еще символы для вставки. Если нет, то делается переход к 'INSERT'. Если есть еще символы для вставки, в аккумулятор загружается заданный нами код и подпрограмма по адресу 3976 (из ПЗУ) используется для его вставки. Счетчик ВС уменьшается и программа возвращается к проверке ВС на 0.

Как только процедура достигает 'INSERT', код REM вставляется, используя эту же подпрограмму. Затем в ВС загружается длина созданной новой строки, и указатели длины для этой строки созданы. Номер строки затем извлекается из стека, и это значение вставляется перед возвратом в БЕЙСИК.

7.5 Сжатие программы.

Длина: 71

Количество переменных: 0

Контрольная сумма: 7158

Назначение:

Эта программа удаляет все ненужные управляющие символы и свободные пространства из БЕЙСИК-программы, увеличивая таким образом количество доступной памяти.

Вызов процедуры:

RANDOMIZE USR адрес

Контроль ошибок:

Если в памяти нет БЕЙСИК-программы, процедура возвращается в БЕЙСИК.

Комментарий:

Эта процедура предполагает, что все выражения REM уже удалены из БЕЙСИК-программы. Если же это не так, произойдет сбой. Время выполнения пропорционально длине БЕЙСИК программы.

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

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

АССЕМБЛЕР

МЕТКА

LD HL,(23635)

42 83 92

INC HL INC HL

35 35

NEXT L

LD DE,(23627) AND A SBC HL,DE RET NC ADD HL,DE PUSH HL LD C,(HL) INC HL LD B,(HL) INC HL LD A,(HL) CP 13

JR NZ,NUMBER POP HL LD (HL)^ INC HL LD (ИЬ),В

CHECK

237 91 75 92 167

237 82

208 25 229 78 35 70 35 126

LENGTH

NEXT_B LOAD

254 13 32 8

RESTOR

225 113 35 112

ADD HL,BC INC HL JR NEXT_L

9

35

24 227 254 14

32 7 35

NUMBER CP 14

JR NZ,QUOTE INC HL INC HL INC HL INC HL INC HL JR NEXT_B QUOTE CP 34

JR NZ,CONTR F_QUOT INC HL

35 35 35 35

24 231 254 34

32 12 35

LD A,(HL) CP 34

JR Z,NEXT_B CP 13

JR Z,RESTOR JR F_QUOT

CONTR CP 33

JR NC,NEXT_B PUSH BC CALL 4120 POP BC DEC BC JR LOAD

205 24 16

193

11

24 204

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

В пару регистров HL загружается адрес БЕЙСИК-программы. HL затем увеличивается дважды, указывая на два байта, хранящих длину следующей строки. В пару регистров DE загружается адрес области переменных. Если HL не меньше, чем DE, подпрограмма возвращается в BASIC, т. к. достигнут конец программной области.

Адрес из HL сохраняется в стеке, в ВС загружается длина строки, и HL увеличивается, указывая на следующий байт в строке. Байт в HL затем загружается в аккумулятор. Если это значение не равно 13, происходит переход к 'NUMBER'.

Для достижения 'RESTOR' должен быть найден конец строки. Адрес указателей длины строки загружается из стека в HL и вставляется длина существующей строки. Длина строки добавляется к HL, HL увеличивается и программа возвращается к NEXT_L.

Если программа достигает 'NUMBER', проверяется, содержит ли аккумулятор символ NUMBER (код 14). Если да, HL увеличивается на 5 - т. е. выполняется прыжок через следующее за NUMBER число, и происходит переход к 'NEXT BYTE'.

Если аккумулятор не содержит кода кавычки, программа переходит к 'CONTR'. Если код кавычки найден, циклы программы будут выполняться до тех пор, пока не будет достигнут конец строки или найдена другая кавычка. В первом случае происходит переход к RESTOR, в последнем - к NЕХТ_В.

В процедуре CONTR происходит проверка символа. Если он имеет код не меньше, чем 33, подпрограмма возвращается к 'NEXT_B'.

Если свободное пространство или управляющий символ найдены, вызывается подпрограмма ПЗУ по адресу 4120 для его удаления. Длина строки, которая хранится в ВС, уменьшается и происходит переход к 'LOAD'.

7.6 Загрузка машинного кода в DATA-строку.

Длина: 179

Количество переменных: 2 Контрольная сумма: 19181 Назначение:

Эта программа создает выражение DATA в первой строке программы на БЕЙСИКе, а

затем заполняет его данными из памяти. Переменные: Имя - data start Длина - 2 Адрес - 23296

Комментарий: Адрес данных для копирования. Имя - data length Длина - 2 Адрес - 23298

Комментарий: Количество байтов для копирования. Вызов программы:

RANDOMIZE USR адрес Контроль ошибок:

Если число байтов для копирования равно 0, или первая строка уже есть, программа возвращается в БЕЙСИК. Программа не проверяет, достаточно ли памяти для новой строки. Программа требует 10 байтов на байт данных плюс пять байтов для номеров строк, указателей длины и т. д. Кроме того, используемая подпрограмма ПЗУ также использует большую рабочую область - принимайте это в расчет. Если доступной памяти недостаточно, указатели строки будут установлены неправильно, и листинг БЕЙСИКа будет недостоверен. Комментарий:

Время, занимаемое работой этой программы, пропорционально объему памяти для копирования.

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

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

АССЕМБЛЕР

МЕТКА

LD DE,(23296) LD ВС,(23298) LD A,B OR C RET Z

LD HL,(23635) LD A, (HL) CP 0

JR NZ,CONT INC HL LD A,(HL) CP 1 RET Z DEC HL PUSH HL PUSH BC PUSH DE SUB A CALL 3976 EX DE,HL LD A,1 CALL 3976 EX DE,HL CALL 3976 EX DE,HL CALL 3976 EX DE,HL LD A,228 CALL 3976 EX DE,HL POP DE LD A,(DE) PUSH DE

237 91 0 91 237 75 2 91

120 177 200

42 83 92 126

254 0

32 6

35 126

254 1

200

43

229

197

213

151

CONT

205 136 15 235 62 1

205 136 15 235

205 135 15 235

205 135 15 235 62 228 205 135 15

235 209 26 213

NEXT B

LD C,47

14

47

INC C

12

LD B,100

6

100

SUB B

144

JR NC,HUNDR

48

250

ADD A,В

128

LD B,A

71

LD A, С

121

PUSH BC

197

CALL 3976

205

136

EX DE,HL

235

POP BC

193

LD A,B

120

LD C,47

14

47

INC C

12

LD B,10

6

10

SUB B

144

JR NC,TENS

48

250

ADD A,B

128

LD B, А

71

LD A,C

121

PUSH BC

197

CALL 3976

205

136

POP BC

193

EX DE,HL

235

LD A,B

120

ADD A,48

198

48

CALL 3976

205

136

EX DE,HL

235

LD A,14

62

14

LD B, 6

6

6

PUSH BC

197

CALL 3976

206

136

POP BC

193

EX DE,HL

235

SUB A

151

DJNZ N ZERO

16

247

POP DE

209

PUSH HL

229

DEC HL

43

DEC HL

43

DEC HL

43

LD A,(DE)

26

LD (HL),A

119

POP HL

225

INC DE

19

POP BC

193

DEC BC

11

LD A,B

120

OR C

177

JR Z,ENTER

40

10

PUSH BC

197

PUSH DE

213

LD A,44

62

44

CALL 3976

205

136

EX DE,HL

235

JR NEXT B

24

173

LD A,13

62

13

CALL 397

205

136

POP HL

225

LD BC,0

1

0

INC HL

35

INC HL

35

LD D,H

84

LD E,L

93

15

15

15

15

15

HUNDR

TENS

N ZERO

ENTER

INC HL INC HL INC BC

35 35 3 126

POINT

LD A,(HL) CP 14

JR NZ,END?

254 14 32 12

3 3 3 3 3

35 35 35 35 35

JR POINT CP 13

JR NZ,POINT LD A,C LD (DE),A

24 237

254 13

32 233 121

END?

18

INC DE LD A,B

19 120

LD (DE),A RET

18

201

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

В пару регистров DE загружается адрес байтов для копирования, а в пару регистров ВС загружается число байтов для копирования. Если ВС содержит 0, программа возвращается в БЕЙСИК.

В пару регистров HL загружается адрес БЕЙСИК-программы. В аккумулятор загружается байт из адреса установленного в HL. Это старший байт номера строки. Если он не равен 0, первая строка не существует и программа переходит к 'CONT'. Если старший байт содержит 0, в аккумулятор загружается младший байт. Если это значение установлено в 1, первая строка уже существует и программа возвращается в БЕЙСИК.

Адрес старшего байта номера строки сохраняется на стеке. Сохраняется число байтов для копирования, затем адрес данных. В аккумулятор загружается 0 (старший байт нового номера строки). Вызванная подпрограмма ПЗУ, находящаяся по адресу 3976, вставляет символ, имеющийся в аккумуляторе, по адресу установленному в HL.

В HL восстанавливается значение, хранившееся там перед этой операцией. В аккумулятор загружается 1 и это значение вставляется 3 раза. Первая единица - это младший байт номера строки, следующие две - указатель длины строки. В аккумулятор затем загружается код символа 'DATA' и это значение вводится в строку.

Адрес следующего байта данных восстанавливается из стека и загружается в DE. Сам этот байт загружается в аккумулятор, а содержимое DE вновь сохраняется на стеке. В C-регистр загружается значение, на 1 меньшее, чем код символа "0". C-регистр увеличивается, а в B-регистр загружается значение 100. B-регистр вычитается из аккумулятора и, если результат не отрицательный, подпрограмма возвращается к 'HUNDR'.

B-регистр прибавляется к аккумулятору. Таким образом аккумулятор содержит положительное значение. Это значение затем загружается в B-регистр. В аккумулятор загружается содержимое C-регистра, а ВС сохраняется на стеке. Вызовом подпрограммы ПЗУ (3976), вставляется символ, хранящийся в аккумуляторе, по адресу, содержащемуся в HL. Пара регистров ВС восстанавливается из стека, а в аккумулятор загружается значение B-регистра. Вышеупомянутый прием затем повторяется для B=10. Аккумулятор затем увеличивается на 48 и полученный в результате символ вставляется в строку.

Вышеописанная подпрограмма делала вставку десятичного представления встречающегося байта данных в выражение DATA. Теперь должно быть вставлено двоичное представление. Это значение маркируется с помощью кода NUMBER (CHR 14), который вводится первым, а за ним 5 нулей. Значение копируемого байта помещается в ячейку, чтобы заместить третий ноль. DE увеличивается, указывая на следующий байт данных. Число байтов для копирования снимается из стека в ВС, и это значение уменьшается. Если результат равен 0, делается переход к 'ENTER', иначе содержимое пар регистров ВС и DE вторично помещается в стек, в выражение DATA включается запятая, а программа возвращается к 'NEXT_B'. В данной процедуре код ENTER (конец строки) добавляется для маркировки конца выражения DATA. В HL загружается адрес начала строки, а ВС устанавливается в 0. HL увеличивается, указывая на младший байт указателя строки, и этот новый адрес копируется в DE. HL увеличивается, указывая на старший байт указателя строки. HL и ВС затем увеличиваются, а в аккумулятор загружается символ, находящийся по адресу в HL.

Если аккумулятор содержит код 14, число найдено, то HL и ВС увеличиваются на 5, перепрыгивая через число и указывая на символ, следующий за ним. Подпрограмма затем переходит к 'POINT'.

Если аккумулятор не содержит значений 14 и 13, происходит переход к 'POINT'.

Завершение формирования строки выполняется помещением содержимого ВС в ячейку указателя длины строки. На необходимый адрес указывает DE. По окончании работы процедура выполняет возврат в БЕЙСИК.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Возможности Спектрума - Pseudo-Color: миф или реальность? Алгоритм перевод чёрно-белого изображения в цветное.
Система - Обзор системных программ: копировщик REAL COPY
Разборка - тактика игры в игре UFO-1.
История - история Львовской группы Тertius Gаudens (авторы газеты Optron).
MY SPEKK - У мну oбычный Pentagon-128...

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