Адрес 11390. Запись страницы ОЗУ. Установите 16643 и 23552.
11390 LD C,0 ;дорожка 0
CALL 12090 ;позиционирование
CALL 11562 ;загрузка сектора 8 по адресу 16384
LD A,(16612) ;берем количество файлов на диске
LD (16642),A ;сохраняем его
INC A ;записали 1 файл
LD (16612),A
LD HL,(16613);берем количество свободного места на диске
LD DE,64 ;уменьшаем его на 64 сектора
SBC HL,DE
LD (16613),HL;установка нового количества свободного места
RET C ;если места нет, то возврат
LD HL,(16609);берем адрес свободного места на диске
LD (16670),HL;установка адреса файла на диске
CALL 11550 ;установка имени файла
LD A,64 ;размер файла - 64 сектора
LD (16669),A
LD HL,49152 ;адрес загрузки - 49152
LD (16665),HL
LD HL,16384 ;длина - 16384 байта
LD (16667),HL
LD DE,(16609);берем адрес свободного места на диске
CALL 11582 ;запись файла
LD (16609),DE;установка нового адреса свободного места
LD C,0 ;дорожка 0
CALL 12090 ;позиционирование
CALL 11572 ;запись сектора 8 с адреса 16384
LD A,(16642) ;восстановление номера файла
CALL 11493 ;загрузка сектора с описателем файла
LD DE,16656 ;замена описателя файла
LD BC,16
EX DE,HL
LDIR
IN A,(95) ;берем номер загруженного сектора
DEC A
LD E,A
LD D,0
LD HL,16384 ;записывать с адреса 16384
CALL 11635 ;запись сектора
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 11493. Загрузка по адресу 16384 Номер файла поместите в A.
На выходе в HL будет адрес описателя файла.
11493 LD C,A ;сохранение номера файла
AND 240 ;вычисление номера сектора с описателем файла
RRCA
RRCA
RRCA
RRCA
LD B,A
PUSH BC
LD E,B
LD D,0
LD HL,16384;загружать с адреса 16384
PUSH DE ;сохранение номера сектора
CALL 12059 ;загрузка сектора
POP DE ;восстановление номера сектора
POP BC ;и номера файла
LD B,0
LD A,C ;вычисление относительного адреса описателя
AND 15 ;файла в секторе
RLCA
RLCA
RLCA
RLCA
LD HL,16384;вычисление абсолютного адреса
ADD A,L
LD L,A
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 11529. Помещение имени и расширения файла "@"CODE по адре-
су 16656.
11529 LD HL,16656 ;адрес имени файла
LD B,9 ;длина области - 9 байтов
11534 LD (HL)," " ;очистка области
INC HL
DJNZ 11534
LD A,"@" ;имя файла - "@"
LD (11656),A
LD A,"C" ;расширение файла - "C"
LD (16664),A
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 11550. Установка имени файла страницы. Установите 16643.
Имя файла будет находиться по адресу 16656.
11550 CALL 11529 ;установка имени главного файла
LD A,(16643);берем номер страницы
ADD A,"0" ;преобразование его в символ
LD (16657),A;установка номера страницы
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 11562. Загрузка сектора 8 по адресу 16384. Спозиционируйте
головку.
11562 LD HL,16384;грузить по адресу 16384
LD DE,8 ;сектор 8
CALL 12059 ;загрузка сектора
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 11572. Запись сектора 8 с адреса 16384. Спозиционируйте
головку.
11572 LD HL,16384;записывать с адреса 16384
LD DE,8 ;сектор 8
CALL 11635 ;запись сектора
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 11582. Запись 64-х секторов с адреса 49152. Установите все
для 11596.
11582 CALL 12133 ;восстановление
LD C,D ;берем номер первой дорожки
CALL 12090 ;позиционирование
LD HL,49152;записывать с адреса 49152
LD B,64 ;64 сектора
JR 11608 ;запись секторов и возврат
────────────────────────────────────────────────────────────────
Адрес 11596. Запись 192-х секторов с адреса 16384 для подпрог-
раммы MAGIC. В DE поместите адрес на диске и установите 23552.
Используется также с адреса 11608 (запись секторов; в HL помес-
тите адрес в памяти, в DE - адрес на диске, в B - количество
секторов, установите 23552 и спозиционируйте головку на первую
дорожку).
11596 CALL 12133 ;восстановление
LD C,D ;берем номер первой дорожки
CALL 12090 ;позиционирование
LD HL,16384;записывать с адреса 16384
LD B,192 ;192 сектора
11608 PUSH BC ;сохранение количества секторов
PUSH DE ;и адреса на диске
CALL 11635 ;запись сектора
LD DE,256 ;адрес следующего сектора в памяти
ADD HL,DE
POP DE ;восстановление адреса на диске
INC E ;следующий сектор
LD A,E ;конец дорожки ?
CP 16
JR NZ,11631;если да, то
LD E,0 ;текущий сектор 0,
INC D ;следующая дорожка,
LD C,D
CALL 12090 ;позиционирование
POP BC ;восстановление количества секторов
DJNZ 11608 ;повтор до конца
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 11666. Загрузка секторов. Установите 23782, 23787 и 23786.
11666 LD HL,(23782);берем адрес загрузки
LD DE,(23787);берем адрес секторов на диске
LD A,(23786) ;берем количество секторов
LD B,A
CALL 7741 ;загрузка секторов
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 11681. Выполнение команды GO TO. Установите 23825 и 23611.
Можно использовать также с адреса 11815 (GO TO для 48К; парамет-
ры как и для 11681). используется также с адреса 11964 для воз-
врата из подпрограммы обработки немаскируемого прерывания.
11681 CALL 7641 ;прием имени файла на стек калькулятора
CALL 7541 ;если идет проверка на синтаксис, то возврат
CALL 4142 ;прием расширения файла
Зачем это нужно ? Ведь MAGIC записывает файлы только с расшире-
нием C.
CALL 7255 ;установка имени файла
LD (16416),BC;сохранение длины имени файла
LD A,C ;она равна 8 символам ?
CP 8
JR NC,11730 ;если да, то работа с 48К
CALL 1029 ;настройка на диск
CALL 7347 ;поиск файла
JP NZ,985 ;если не нашли, то NO FILE
LD HL,23773 ;берем адрес имени файла
LD BC,(16416);и его длину
Зачем портить экран без надобности? Ведь длину имени файла мож-
но сохранять и в другом месте.
ADD HL,BC ;вычисляем адрес конца имени файла
LD (HL),"8" ;прибавление "8"к имени файла
PUSH HL ;сохранение адреса этого символа
CALL 7347 ;поиск файла
POP HL ;восстановление последнего символа имени файла
JR Z,11736 ;если файл нашелся, то загрузка страниц
LD (HL)," " ;восстановление имени главного файла
11730 CALL 7347 ;поиск файла
JP 11827 ;загрузка файла
11736 CALL 5725 ;чтение описателя файла
CALL 11666 ;загрузка файла
LD SP,16639 ;перенос стека
LD B,8 ;всего 8 страниц
11747 PUSH BC ;сохранение номера файла страницы
LD A,B
LD BC,32765 ;адрес порта конфигурации системы
DEC A ;страницы считаем с 0
PUSH AF ;сохранение номера страницы
OR 16 ;экран 0, ПЗУ 1
OUT (C),A ;установка страницы
POP AF ;восстановление номера страницы
ADD A,"0" ;вычисление последнего символа имени файла страницы
LD HL,23773 ;вычисление адреса для этого символа
LD BC,(16416)
ADD HL,BC
LD (HL),A ;установка последнего символа имени файла страницы
CALL 7347 ;поиск файла
JR NZ,11781 ;если не нашли, то загрузка следующей страницы
CALL 5725 ;чтение описателя файла
CALL 11666 ;загрузка файла
Внимание!!! При ответе A на вопpос "DISC ERROR. RETRY,ABORT,
IGNORE ?", может произойти что угодно, если значение ERR_SP
больше 49152, так как старый стек будет затираться загружаемым
файлом или находиться в другой странице.
11781 POP BC ;восстановление номера файла страницы
DJNZ 11747 ;повтор до конца
LD A," " ;восстановление имени главного файла
LD HL,23773
LD BC,(16416)
ADD HL,BC
LD (HL),A
CALL 7347 ;поиск файла
CALL 5725 ;чтение описателя файла
PUSH BC ;сохранение номера файла
PUSH AF ;и AF
LD BC,32765 ;адрес порта конфигурации
LD A,(16641) ;берем его значение в момент записи файла (из восьмого файла)
OUT (C),A ;установка рабочего состояния порта
POP AF ;востановление номера файла и AF
POP BC
JR 11833 ;загрузка главного файла
11815 CALL 7647 ;прием имени файла на стек калькулятора
CALL 7541 ;если идет проверка на синтаксис, то возврат
CALL 4142 ;прием расширения файла
CALL 10543 ;поиск файла
11827 JP NZ,985 ;если он не найден, то NO FILE
CALL 5725 ;чтение его описателя
11833 LD A,(23773) ;берем первый символ имени файла
CP "$" ;это "$" ?
DI ;запрет прерываний
JR NZ,11843 ;если да, то
IM 2 ;установка второго режима прерываний
11843 LD SP,16624 ;перенос стека
CALL 15889 ;берем тип дисковода
LD (16400),A ;сохраняем его
LD A,(23830) ;сохранение копии системного регистра,
LD (16401),A
LD HL,(23782);адреса стека для программы,
PUSH HL
LD DE,(23787);и адреса файла на диске
PUSH DE
INC E ;первый сектор файла пока не загружаем
LD A,E
CP 16
JR NZ,11876
LD E,0
INC D
11876 LD C,D ;берем логический номер дорожки
CALL 12039 ;выбор верхней стороны диска
LD A,(16400) ;берем режим дисковода
AND 2 ;дисковод двухсторонний ?
CALL NZ,12047;если да, то выбор стороны диска
LD A,C ;берем физический номер дорожки
CALL 12112 ;позиционирование
LD HL,16640 ;загружать с адреса 16640
LD B,191 ;191 сектор
11897 PUSH BC ;сохранение количества секторов
PUSH DE ;и адреса текушего сектора на диске
CALL 12059 ;загрузка сектора
LD DE,256 ;вычисление адреса загрузки следующего сектора
ADD HL,DE
POP DE ;восстановление адреса текушего сектора на диске
INC E ;следующий сектор
LD A,E ;конец дорожки ?
CP 16
JR NZ,11932 ;если нет, то продолжение загрузки
LD E,0 ;сектор 0
INC D ;следующая дорожка
LD C,D
CALL 12039 ;позиционирование (смотрите выше)
LD A,(16400)
AND 2
CALL NZ,12047
LD A,C
CALL 12112
11932 POP BC ;восстановление количества секторов
DJNZ 11897 ;повтор до конца
POP DE ;восстановление адреса файла на диске
POP HL ;и адреса стека
LD SP,HL ;установка стека
LD A,(16401) ;берем копию системного регистра
PUSH AF ;сохраняем ее
LD C,D ;позиционирование (смотрите выше)
CALL 12039
LD A,(16400)
AND 2
CALL NZ,12047
LD A,C
CALL 12112
LD HL,16384 ;адрес загрузки первого сектора файла
CALL 12059 ;загрузка сектора
11964 POP AF ;востановление копии системного регистра
EX AF,AF' ;и снова сохранение
POP AF ;восстановление регистров R и I
LD R,A
POP AF
LD I,A
DI ;запрет прерываний
LD A,255 ;установка флага прерываний
JP PO,11980
LD A,0
11980 LD (23552),A
POP AF ;восстановление регистров
POP HL
POP DE
POP BC
EXX
EX AF,AF'
POP IY
POP IX
POP HL
POP DE
POP BC
LD A,(23624) ;установка цвета бордюра
AND 56
RRA
RRA
RRA
OUT (254),A
LD A,(23304) ;берем байт из 23304
CP 238 ;там 238 ?
JR NZ,12023 ;если нет, то системных переменных 128К нет
Ошибка!!! Число 238 по адресу 23304 еще ни о чем не говоpит.
PUSH BC ;сохранение BC
LD BC,32765 ;адрес порта конфигурации
LD A,(23388) ;берем значение переменной BANK_M
OUT (C),A ;установка рабочей страницы
POP BC ;восстановление BC
12023 LD A,(23552) ;берем флаг прерываний
OR A ;прерывания разрешать ?
LD A,201 ;установка переключателя ПЗУ на бейсик
LD (23552),A
JR NZ,12035 ;если в 23552 был 0, то
EI ;разрешение прерываний
POP AF ;восстановление AF
JP 23552 ;запуск программы
────────────────────────────────────────────────────────────────
Адрес 12039. Выбор верхней стороны диска для команды GO TO. Ус-
тановите 16401. Можно использовать также с адреса 12044 для пря-
мого вывода в порт 255.
12039 LD A,(16401);берем копию системного регистра
OR 60 ;сторона - верхняя
12044 OUT (255),A ;загрузка системного регистра
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 12047. Выбор верхней стороны диска для команды GO TO.
Вход: установите 16401, поместите в C логический номер дорожки и
выберите верхнюю сторону диска. Выход: в C будет физический но-
мер дорожки и выбрана сторона диска.
12047 LD A,C ;деление номера дорожки на 2
RRA
LD C,A
RET NC ;если дорожка четная, то возврат
LD A,(16401);берем копию системного регистра
AND 111 ;сторона - нижняя
JR 12044 ;загрузка системного регистра и возврат
────────────────────────────────────────────────────────────────
Адpес 12059. Чтение сектора для команды GO TO. В HL поместите
адрес загрузки, в E - номер сектора.
12059 LD A,E ;установка номера сектора
OUT (95),A
PUSH HL ;сохранение адреса загрузки
LD D,20 ;20 попыток
PUSH DE ;сохранение числа попыток
12067 DI ;запрет прерываний
LD C,127 ;адрес регистра данных контроллера
LD A,128 ;команда чтения сектора
OUT (31),A
CALL 16357 ;чтение байтов
POP DE ;восстановление количества попыток
POP HL ;и адреса загрузки сектора
IN A,(31) ;берем состояние контроллера
AND 127 ;все в порядке ?
RET Z ;если да, то возврат
DEC D ;следующая попытка
PUSH HL ;сохранение адреса загрузки сектора
PUSH DE ;и количества попыток
JR NZ,12067;если попытки не кончились, то повтор
HALT ;остановка процессора
────────────────────────────────────────────────────────────────
Адрес 11635. Запись сектора для команды GO TO. В HL поместите
адрес загрузки, в E - номер сектора.
11635 LD A,E ;установка номера сектора
OUT (95),A
PUSH HL ;сохранение адреса загрузки
LD D,20 ;20 попыток
PUSH DE ;сохранение числа попыток
11643 DI ;запрет прерываний
LD C,127 ;адрес регистра данных контроллера
LD A,160 ;команда чтения сектора
OUT (31),A
CALL 16330 ;чтение байтов
POP DE ;восстановление количества попыток
POP HL ;и адреса загрузки сектора
IN A,(31) ;берем состояние контроллера
AND 127 ;все в порядке ?
RET Z ;если да, то возврат
DEC D ;следующая попытка
PUSH HL ;сохранение адреса загрузки сектора
PUSH DE ;и количества попыток
JR NZ,11643;если попытки не кончились, то повтор
Внимание!!! Самая большая ошибка!!! Диск с заклеенной прорезью
защиты от записи будет, скорее всего, испорчен. Подробное объясне-
ние вы найдете в ZX-PЕВЮ 95/4 на странице 35.
HALT ;остановка процессора
────────────────────────────────────────────────────────────────
Адрес 12090. Позиционирование для подпрограммы MAGIC. Логический
номер дорожки поместите в C и установите 23552. Используется
также с адресов:
12112 - позиционирование для команды GO TO. Поместите в A физи-
ческий номер дорожки.
12119 - выдача команды и ожидание INTRQ. Команду поместите в A.
12090 LD A,60 ;выбор верхней стороны диска
OUT (255),A
LD A,(23552);берем тип дисковода
AND 8 ;он двухсторонний ?
JR NZ,12111 ;если нет, то позиционирование
LD A,C ;деление номера дорожки на 2
OR A
RRA
LD C,A
JR NC,12111 ;если дорожка четная, то позиционирование
LD A,44 ;выбор нижней стороны диска
OUT (255),A
12111 LD A,C
12112 OUT (127),A ;загрузка номера дорожки в регистр данных
CALL 15869 ;задержка в 725779 тактов
LD A,24 ;команда позиционирования
12119 OUT (31),A
12121 IN A,(255) ;ожидание сигнала INTRQ
AND 128
JR Z,12121
PUSH BC ;сохранение BC
CALL 15869 ;задержка в 725779 тактов
POP BC ;восстановление BC
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 12133. Восстановление для подпрограммы MAGIC.
12133 LD A,8 ;команда восстановления
JR 12119;выдача команды, ожидание INTRQ и возврат
────────────────────────────────────────────────────────────────
Адрес 12137. Подпрограмма обработки ошибок, поступающих из пзу
бейсика. Установите 23610 и все для подпрограммы 467.
12137 LD HL,(23836);очистка стека
DEC HL
DEC HL
LD SP,HL
JP 7471 ;выдача сообщения и завершение
────────────────────────────────────────────────────────────────
Адрес 12146. Вызов подпрограмм из пзу бейсика. Адрес задайте в
двух байтах после CALL 12146:
CALL 12146
DEFW #0D6B
12146 LD (23810),HL;сохранение HL и DE
LD (23812),DE
POP HL ;снятие со стека адреса двух байтов с адресом подпрограммы
LD E,(HL) ;берем адрес подпрограммы
INC HL
LD D,(HL)
INC HL
PUSH HL ;помещение на стек адреса возврата в программу, вызвавшую 12146
LD HL,15663 ;помещение на стек адреса переключателя пзу на TR-DOS
PUSH HL
PUSH DE ;помещение на стек адреса вызываемой подпрограммы
LD HL,23746 ;помещение на стек адреса команды RET в озу
PUSH HL
LD HL,(23810);восстановление HL и DE
LD DE,(23812)
RET ;переход к команде RET в озу
────────────────────────────────────────────────────────────────
Адрес 12176. Установка начальных значений системных пеpеменных
TR-DOS. В переменные помещает:
в 23802 - 23805, 23752 - 23755, 23610, 23830, 23820 - 255;
в 23831 - 23833, 23839 - 0;
в 23746 - 201;
в системный регистр помещается 255 и выполняется команда преры-
вания. Подпрограмма может использоваться также с адреса 12227
для прямого вывода в порт 31.
12176 LD HL,65535
LD (23802),HL;типы дисководов неизвестны
LD (23804),HL
LD (23752),HL;время перемещения головок дисководов
LD (23754),HL;неизвестно
XOR A
LD (23831),A ;заставку выводить
LD (23833),A ;дисковод по умолчанию - A:
LD (23832),A ;память не изменять
LD (23839),A ;pаботает командный процессор TR-DOS
LD A,255 ;загрузка системного регистра
OUT (255),A
LD (23610),A ;ошибки нет
LD (23830),A ;сохранение значения системного регистра
LD (23820),A ;буфера нет
LD A,201 ;помещение в ОЗУ команды RET
LD (23746),A
LD A,208 ;команда прерывания
12227 OUT (31),A ;выдача команды
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 12230. Проверка достижения конца каталога при его печати.
12230 CALL 1292 ;проверка и обработка достижения конца буфера
LD A,(HL) ;берем первый символ имени файла
OR A ;конец каталога ?
JP Z,940 ;если да, то окончание выдачи
CP 1 ;файл стерт ?
CALL Z,1287;если да, то пропуск его
RET NZ ;иначе возврат
JR 12230 ;повтор
────────────────────────────────────────────────────────────────
Адрес 12246. Загрузка сектора в буфер. В DE поместите адрес сек-
тора на диске.
12246 LD B,1 ;загружать 1 сектор
LD HL,23845;загружать в буфер
JP 7783 ;загрузка сектора
────────────────────────────────────────────────────────────────
Адрес 12254. Загрузка конца файла. В HL - адрес загрузки, в
23772 - длина, в 23796 - откуда грузить.
12254 PUSH HL ;сохранение адреса загрузки
LD DE,(23796);берем адрес сектора на диске
CALL 12246 ;загрузка его в буфер
LD A,(23772) ;берем количество байтов для загрузки
POP DE ;восстановление адреса загрузки
OR A ;загружаем 0 байтов ?
RET Z ;если да, то возврат
LD C,A ;перевод длины загружаемой части в двухбайтную форму
LD HL,23845 ;перемещаем байты из буфера
LDIR
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 12275. Таблица команд TR-DOS.
12275 DEFB 207,"*",208,209,230,210,239,248,254,190,244,213,247
DEFB 211,212,255,"4",236,"8",240,214
────────────────────────────────────────────────────────────────
Адрес 12296. Таблица адресов подпрограмм, выполняющих команды
TR-DOS.
12296 DEFW 1075,4120,7874,5803,1338,1927,6165,6864,7419,6565
DEFW 6569,6577,7501,8578,9814,1680,10647,11681,10670,4558
DEFW 6160
────────────────────────────────────────────────────────────────
Адрес 12338. Сжатие командной строки. Строку поместите в буфер
редактора. Помещает в 23766 255 и устанавливает 23825.
12338 LD HL,(23641);берем адрес буфера редактора
LD (23825),HL;установка адреса командной строки
LD (23769),HL;установка адреса текущего символа
LD A,255 ;подана прямая команда
LD (23766),A
LD HL,23771 ;любой адрес
LD (23767),HL
JR 12375 ;сжатие строки и возврат
────────────────────────────────────────────────────────────────
Адрес 12360. Сжатие командной строки. В HL поместите адрес стро-
ки. Устанавливает 23766 и 23825. Используется также с адреса
12375 (сжатие строки; установите 23766, 23767 и 23769).
12360 LD (23825),HL;установка адреса строки
LD (23769),HL;и адреса текущего ключевого слова
CALL 12513 ;проверка, где находится строка
RET NZ ;если строка не найдена, то возврат
INC HL ;вычисление адреса поля длины строки
INC HL
LD (23767),HL;установка адреса поля длины строки
12375 CALL 12457 ;определение номера ключевого слова
JR NZ,12423 ;если это не ключевое слово, то следующий символ
EX DE,HL ;переброска адреса последнего символа ключевого слова в DE
INC DE ;вычисление адреса символа после ключевого слова
LD B,0 ;перевод номера ключевого слова в 2-х байтную форму
LD HL,12744 ;адрес таблицы кодов ключевых слов
ADD HL,BC ;вычисление адреса кода ключевого слова
LD A,(HL) ;берем этот код
LD HL,(23769);берем адрес ключевого слова
LD (HL),A ;замена его одним символом
INC HL ;вычисление адреса второго символа ключевого слова
EX DE,HL ;переброска его в DE
RST 32 ;вычисление количества стираемых символов
DEFW #19DD
PUSH BC ;сохранение его
RST 32 ;уничтожение ненужных символов
DEFW #19E8
POP BC ;восстановление количества стертых символов
LD A,(23766) ;строка находится в программе на бейсике ?
OR A
JR NZ,12423 ;если нет, то ее длина нигде не обозначена
LD HL,(23767);берем адрес поля длины строки
LD E,(HL) ;берем длину строки
INC HL
LD D,(HL)
EX DE,HL ;перебросим ее в HL
OR A
SBC HL,DE ;скорректируем ее
EX DE,HL ;перебросим в DE
LD (HL),D ;и загрузим обратно
INC HL
LD (HL),E
12423 LD HL,(23769);берем адрес текущего символа
LD A,(HL) ;берем этот символ
CP 13 ;это ENTER ?
RET Z ;если да, то возврат
INC HL ;следующий символ
LD (23769),HL
LD A,(HL) ;берем его
CP 13 ;это ENTER ?
RET Z ;если да, то возврат
CP 34 ;это кавычки ?
JR NZ,12375 ;если нет, то повтор
12442 INC HL ;следующий символ
LD A,(HL) ;берем его
CP 13 ;это ENTER ?
RET Z ;если да, то возврат
CP 34 ;это кавычки ?
JR NZ,12442 ;если нет, то следующий символ
INC HL ;следующий символ
LD (23769),HL
JR 12375 ;повтор