Адрес 6732. Подготовка памяти к загрузке массива. Установите
23784, 23767, 23769 и 23801.
6732 LD DE,(23784);загружать весь файл
LD (23771),DE
LD HL,(23767);берем адрес массива в памяти
LD A,(23801) ;верификация ?
CP 255
RET Z ;если да, то возврат
LD HL,(23769);берем адрес загрузки файла
PUSH HL ;сохраняем его
6753 CALL 6642 ;проверка наличия места для массива
POP HL ;восстановление адреса загрузки файла
LD A,H ;он равен 0 ?
OR L
JR Z,6777 ;если да, то старый массив не убираем
LD HL,(23767);берем начало старого массива
DEC HL
DEC HL
DEC HL
LD BC,(23769);берем его длину
INC BC
INC BC
INC BC
CALL 7726 ;стирание старого массива
6777 LD HL,(23641);берем начало области переменных
DEC HL
LD BC,(23784);берем длину файла
PUSH BC ;сохраняем ее
INC BC
INC BC
INC BC
CALL 7730 ;резервирование места для нового массива
INC HL ;установка имени массива
LD A,(23762)
LD (HL),A
INC HL ;восстановление и установка длины массива
POP DE
LD (HL),E
INC HL
LD (HL),D
INC HL ;берем адрес тела массива
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 6804. Вычисление адреса сектора файла на диске по его но-
меру в файле. Вход: установите 23767 и 23769 и поместите в ре-
гистр B длину файла в секторах, а в DE - адрес файла на диске.
Выход: в DE будет адрес сектора на диске, а в B помещается 1.
6804 LD A,(23769) ;берем номер сектора в файле
LD C,B
LD B,A
LD A,C
CP B ;он меньше, чем количество секторов в файле ?
JR C,6838 ;если нет, то ошибка
Внимание, ошибка!!! Вы не сможете загрузить последний сектор
файла, т.к. его номер равен количеству секторов в файле.
LD A,B ;он равен 0 ?
OR A
JP Z,7450 ;если да, то синтаксическая ошибка
DEC B ;он был равен 1 ?
JR Z,6832 ;если да, то его адресом будет адрес файла
LD A,16 ;на дорожке 16 секторов
6823 INC E ;вычисление адреса сектора на диске
CP E
JR NZ,6830
LD E,0
INC D
6830 DJNZ 6823
6832 LD B,1 ;загружать надо 1 сектор
LD HL,(23767);берем адрес загрузки сектора
RET ;возврат
6838 LD HL,10733 ;адрес сообщения REC.O/F
LD A,5 ;код ошибки - 5
JP 7242 ;обработка ошибки
────────────────────────────────────────────────────────────────
Адрес 6846. Проверка наличия файла и свободного места в катало-
ге. Имя файла поместите на стек калькулятора.Используется также
с адреса 6852 (проверка наличия свободного места в каталоге дис-
ка).
6846 CALL 10543 ;установка имени и поиск файла
JP Z,7248 ;если нашли, то FILE EXISTS
6852 CALL 1021 ;загрузка в буфер сектора 8 дорожки 0
LD A,(24073);на диске 128 файлов ?
CP 128
JP Z,10019 ;если да, то сообщение DIRECTORY FULL
RET ;иначе возврат
────────────────────────────────────────────────────────────────
Адрес 6864. Выполнение команды SAVE. Установите 23611 и 23825.
Используется также с адресов:
6951 - запись программы на бейсике. Установите 23773 и 23781.
6995 - запись файла. Установите 23773, 23781, 23767, 23769 и
23771.
6864 CALL 6226 ;обнуление 23824
LD HL,0 ;автостарт бейсика не производить
LD (23761),HL
CALL 7647 ;помещение имени файла на стек калькулятора
CALL 7564 ;берем текущий символ
CP 175 ;это CODE ?
JR Z,6969 ;если да, то прием начала и длины
CP 202 ;это LINE ?
JR NZ,6904 ;если нет, то проверка остальных расширений
CALL 7691 ;прием строки автостарта бейсика
CALL 7541 ;если проверка на синтаксис, то возврат
LD HL,(23771);установка строки автостарта бейсика
LD (23761),HL
LD HL,23781
JR 6943 ;переход на запись бейсика
6904 CP 170 ;текущий символ SCREEN$ ?
JR NZ,6925 ;если нет, то проверка расширения DATA
LD HL,16384 ;начало файла - 16384
LD (23767),HL
LD HL,6912 ;его длина - 6912 байтов
LD (23769),HL
LD (23771),HL
JR 6984 ;запись файла с расширением C
6925 CALL 7541 ;если проверка на синтаксис, то возврат
CALL 7564 ;берем текущий символ
LD HL,23781
CP 228 ;это DATA ?
JR Z,6956 ;если да, то запись массива
CP 13 ;это ENTER ?
JP NZ,7450 ;если нет, то ошибка
LD (HL),"B" ;расширение B
CALL 6846 ;проверка наличия такого файла и свободного места в каталоге
CALL 7708 ;удаление из командной строки пятибайтных чисел
6951 CALL 7134 ;установка начала и длины файла
JP 6995 ;запись файла
6956 LD (HL),"D" ;расширение D
CALL 6846 ;проверка наличия файла и места в каталоге
CALL 7183 ;установка начала и длины файла
JR NC,6995 ;если все в порядке, то запись файла
JP C,7450 ;иначе ошибка
6969 CALL 7653 ;принятие начала и длины файла
LD HL,(23769);установка начала файла
LD (23767),HL
LD HL,(23771);установка длины файла
LD (23769),HL
6984 CALL 7541 ;если проверка на синтаксис, то возврат
LD A,"C" ;расширение C
LD (23871),A
CALL 6846 ;проверка наличия файла и места в каталоге
6995 CALL 7001 ;запись файла
JP 1385 ;запись информации о нем
────────────────────────────────────────────────────────────────
Адрес 7001. Запись файла. Установите 23761, 23767, 23769 и
23771, а в буфер загрузите сектор 8 дорожки 0.
7001 LD HL,(23767);установка начала файла
LD (23782),HL
EX DE,HL ;переброска его в DE
LD HL,(23769);берем длину файла
LD A,L ;она равна 0 ?
OR H
JP Z,7450 ;если да, то ошибка
LD A,L ;вычисление длины файла в секторах
OR A
JR Z,7021
INC H
7021 LD A,H ;установка длины файла в секторах
LD (23786),A
LD E,A ;вычисление нового количества свободных секторов
LD D,0
LD HL,(24074)
SBC HL,DE
JP C,7237 ;если на диске нет места, то ошибка
PUSH HL ;сохранение нового количества свободных секторов
LD HL,(23641);добавление к программе на бейсике байта 170
LD (HL),170
INC HL
LD DE,(23761);и номера строки автостарта
LD (HL),E
INC HL
LD (HL),D
LD HL,(23771);установка длины файла
LD (23784),HL
LD HL,(24070);установка адреса файла на диске
LD (23787),HL
EX DE,HL ;переброска его в DE
LD HL,(23782);берем начало файла
LD A,(23786) ;берем его длину в секторах
LD B,A
CALL 7757 ;запись файла
LD HL,(23796);берем адрес свободного пространства диска
PUSH HL ;сохраняем его
CALL 1021 ;загрузка в буфер сектора 8 дорожки 0
POP HL ;восстановление адреса свободного места на диске
LD (24070),HL;установка его
POP HL ;восстановление количества свободных секторов
LD (24074),HL;установка его
LD HL,(24073);берем номер файла
LD A,(HL)
LD (23838),A ;установка его
INC (HL) ;записали еще 1 файл
PUSH HL ;сохранение адреса с кол-вом файлов на диске
CALL 7747 ;перезапись сектора 8 дорожки 0
POP HL ;восстановление адреса с кол-вом файлов
LD C,(HL) ;берем номер записанного файла
DEC C
LD A,(23781) ;расширение файла B ?
CP "B"
CALL Z,7112 ;если да, то установка длины программы без переменных
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7112. Установка длины программы на бейсике без переменных.
Длину с переменными программа помещает в 23782, длину без пере-
менных - в 23784.
7112 LD HL,(23641);вычисление длины программы с переменными
LD DE,(23635)
SCF
SBC HL,DE
LD (23782),HL;установка ее
LD HL,(23627);вычисление длины только программы
SBC HL,DE
LD (23784),HL;установка ее
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7134. Установка начала и длины файла для записи программы
на бейсике.
7134 LD HL,(23627);вычисление длины программы с переменными
LD DE,(23635)
SBC HL,DE
LD (23771),HL;установка длины файла для каталога
LD HL,(23635);установка начала файла
LD (23767),HL
LD HL,(23641);вычисление длины файла с параметрами автозапуска
INC HL
INC HL
INC HL
SBC HL,DE
LD (23769),HL;установка действительной длины файла
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7164. Прием имени массива для команды LOAD...DATA. Вход:
установите 23645 на расширение файла и установите 23801. Выход:
устанавливает 23762, 23767, 23769 и 23771. Используется также с
адреса 7183 (то же, что и 7195, но с обработкой ошибок).
7164 CALL 7195 ;поиск массива
RET NC ;если массив найден, то возврат
LD HL,0 ;старого массива нет
LD (23769),HL
LD A,(23801) ;идет загрузка ?
CP 255
RET NZ ;если да, то возврат
JP 7781 ;ошибка
7183 CALL 7195 ;поиск массива
RET NC ;если массив найден, то возврат
7187 LD A,14 ;код ошибки - 14
LD HL,10205 ;адрес сообщения ARRAY NOT FOUND
JP 7242 ;обработка ошибок
────────────────────────────────────────────────────────────────
Адрес 7195. Поиск массива без обработки ошибок. Будут установле-
ны 23762, 23767, 23769 и 23771. При ошибке флаг C будет установ-
лен, иначе сброшен.
7195 CALL 7722 ;берем следующий символ
CALL 7579 ;поиск массива
SET 7,C ;установка бита 7 в его имени
LD A,C ;установка его имени
LD (23762),A
JR NC,7211 ;если массив найден, то установка его параметров
7209 SCF ;была ошибка
RET ;возврат
7211 JR NZ,7209 ;если флаг Z сброшен, то ошибка
INC HL ;берем длину массива
LD E,(HL) ;установка длины массива
INC HL
LD D,(HL)
INC HL
LD (23767),HL;установка адреса тела массива
LD (23771),DE;установка длины массива
LD (23769),DE
CALL 7722 ;следующий символ
CP ")" ;это ")" ?
JR NZ,7211 ;если нет, то ошибка
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7237. Обработка ошибки NO SPACE. Используется также с ад-
реса 7242 (обработка ошибок; в A - код ошибки, в HL - адрес со-
общения).
7237 LD HL,10683;адрес сообщения NO SPACE
LD A,3 ;код ошибки - 3
7242 CALL 963 ;если надо, то печать сообщения
JP 467 ;завершение
────────────────────────────────────────────────────────────────
Адрес 7248. Обработка ошибки FILE EXISTS.
7248 LD HL,10693;адрес сообщения FILE EXISTS
LD A,2 ;код ошибки - 2
JR 7242 ;обработка ошибок
────────────────────────────────────────────────────────────────
Адрес 7255. Установка имени файла. Установите 23645 на имя фай-
ла. Будет выбран дисковод и установлена переменная 23773.
7255 LD HL,23773;адрес переменной с именем файла
LD B,8 ;ее длина - 8 байтов
7260 LD (HL)," ";очистка ее
INC HL
DJNZ 7620
CALL 1329 ;снятие строки со стека калькулятора
EX DE,HL
CALL 7297 ;установка дисковода
LD A,C ;имя файла - пустая строка ?
OR A
Ошибка в программе!!! Здесь должно быть OR B.
JP Z,7450 ;если да, то ошибка
CP 9 ;в имени файла больше 8 символов
JR Z,7283 ;если да, то обрезаем его
LD C,8
Внимание!!! Это будет работать неправильно при длине имени файла
больше 255 символов.
7283 LD A,(HL) ;берем первый символ имени файла
CP " " ;его код меньше 32 ?
JP C,7450 ;если да, то ошибка
LD DE,23773;адрес переменной с именем файла
PUSH BC ;сохранение длины имени
LDIR ;установка имени
POP BC ;восстановление длины имени
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7297. Установка дисковода для операции с файлом. В HL по-
местите начало имени файла в ASCII представлении, а в BC - его
длину. HL установится на начало имени без дисковода, а в BC бу-
дет его длина.
7297 INC HL ;берем адрес следующего символа имени
LD A,(HL) ;берем этот символ
CP ":" ;это двоеточие ?
JR NZ,7230 ;если нет, то активизация дисковода по умолчанию
DEC HL ;берем адрес имени дисковода
LD A,(HL) ;берем имя дисковода
CALL 1316 ;преобразование имени дисковода в его номер
PUSH BC ;сохранение длины имени файла
PUSH HL ;и адреса имени дисковода
CALL 15819 ;выбор дисковода
POP HL ;восстановление адреса имени дисковода
POP BC ;и длины имени файла
DEC BC ;отсекли 2 символа
DEC BC
INC HL ;берем адрес имени файла без дисковода
INC HL
RET ;возврат
7320 DEC HL ;берем адрес имени файла
LD A,(23833);берем дисковод по умолчанию
PUSH BC ;сохранение длины и адреса имени файла
PUSH HL
CALL 15819 ;выбор дисковода
POP HL ;восстановление длины и адреса имени файла
POP BC
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7332. Определение адреса описателя файла в буфере по его
номеру в секторе. В C должен быть номер описателя в секторе. На
выходе в HL будет его адрес.
7332 LD L,C ;перевод номера описателя файла в двухбайтную
LD H,0 ;форму
ADD HL,HL ;умножение его на 16
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,23845;адресуемся от начала буфера
ADD HL,BC
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7344. Установка и проверка имени файла. Имя файла должно
быть помещено на стек калькулятора. Выход: если файл с таким
именем есть, то будет установлен флаг Z, а в рег. C и в 23838
будет его номер, а если такого файла нет, то флаг Z сбросится.
Используется также с адреса 7347 (поиск файла, установите 23773
и 23781, выход как и из 7344).
7344 CALL 7255 ;установка имени файла
7347 CALL 1000 ;начнем с сектора 0
LD B,128 ;всего 128 файлов
LD C,0 ;начнем с нулевого описателя в секторе
7354 PUSH BC ;сохраним номер файла и счетчик
CALL 7332 ;определим начало описателя в буфере
CALL 1292 ;проверка и обработка достижения конца буфера
POP BC ;восстановление номера описателя в секторе и
PUSH BC ;счетчика файлов без изменения стека
LD A,C ;просмотрен весь сектор ?
CP 16
JR NZ,7373 ;если да, то
POP BC ;снятие номера описателя и счетчика со стека
LD C,0 ;нулевой описатель в секторе
JR 7354 ;повтор проверки
7373 LD DE,23773 ;берем адрес части описателя для проверки
LD A,(23814);берем длину этой части
LD B,A
XOR A ;конец каталога ?
CP (HL)
JR NZ,7387 ;если нет, то переход на проверку описателя
POP BC ;снятие номера описателя и счетчика со стека
JR 7396 ;выход с флагом NZ
7387 CALL 10003 ;сравнение частей описателей
POP BC ;восстановление номера описателя и счетчика
JR Z,7399 ;если части описателей совпали, то на выход
INC C ;следующий описатель
DJNZ 7354 ;повтор до конца
7396 OR 255 ;выключение флага Z
RET ;возврат
7399 LD A,128 ;определение номера файла
SUB B
LD C,A
LD (23838),A;помещение его в 23838
XOR A ;сброс флага Z
RET Z ;возврат
────────────────────────────────────────────────────────────────
Адрес 7408. Поиск файла. Часть описателя, подлежащую проверке,
установите по адресу 23773 и установите 23814. Если файл не
найден, то будет сброшен флаг Z и в 23823 будет 255, а если най-
ден, то включится флаг Z, а номер файла будет в рег. C и по ад-
ресам 23823 и 23838.
7408 CALL 7347 ;поиск файла
LD HL,23823
LD (HL),C ;загрузка регистра C в 23823
RET Z ;если файл найден, то возврат
LD (HL),255;помещаем в 23823 255
RET ;возврат
────────────────────────────────────────────────────────────────
Адpес 7419. Выполнение команды RETURN. Установите 23611, 23836 и
23827.
7419 CALL 7541 ;если идет проверка на синтаксис, то возврат
CALL 8421 ;изменение памяти
RES 3,(IY+1) ;установка режима ввода "K"
CALL 562 ;восстановление старого ERR_SP
LD SP,(23836);восстановление стека
LD HL,(23613);берем адрес перед адресом из ERR_SP
DEC HL
LD A,18 ;там находится 18 ?
CP (HL)
JR NZ,7449 ;если нет, то возврат
DEC HL ;установка ERR_SP на адрес ниже
LD (23613),HL
7449 RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7450. Обработка синтаксической ошибки. Установите 23610,
23822, 23829, и все для подпрограммы 467. Используется также с
адреса 7465 (обработка ошибок; в A - код ошибки, в HL - адрес
сообщения).
7450 BIT 7,(IY+0);код ошибки бейсика уже назначен ?
JR Z,7461 ;если нет, то установка ошибки
LD A,11 ;NONSENCE IN BASIC
LD (23610),A
7461 INC A ;получение кода ошибки DOS
LD HL,10674 ;адрес сообщения ERROR
7465 CALL 963 ;печать сообщения, если можно
JP 467 ;завершение
────────────────────────────────────────────────────────────────
Адрес 7471. Обработка ошибки, поступившей из пзу бейсика без
очистки стека. Установите 23610.
7471 LD A,(23610);берем код ошибки бейсика
LD HL,10186 ;адрес сообщения *BREAK*
CP 20 ;BREAK INTO PROGRAM ?
JR Z,7465 ;если да, то печать сообщения
CP 12 ;BREAK - CONT REPEATS ?
JR Z,7465 ;если да, то печать сообщения
LD HL,10194 ;адрес сообщения OUT OF RAM
CP 3 ;OUT OF MEMORY ?
JR Z,7465 ;если да, то печать сообщения
LD HL,10205 ;адрес сообщения ARRAY NOT FOUND
CP 1 ;VARIABLE NOT FOUND ?
JR Z,7465 ;если да, то печать сообщения
JR 7450 ;иначе сообщение *ERROR*
────────────────────────────────────────────────────────────────
Адрес 7501. Выполнение команды RUN. Установите 23825 и 23611.
7501 CALL 6226 ;выполнять загрузку файла
CALL 6198 ;обработка параметров и загрузка файла
CALL 7541 ;если идет проверка на синтаксис, то возврат
LD HL,(23782);берем адрес загрузки файла по умолчанию
Ошибка!!! Ведь файл могли загрузить и по другому адресу. В под-
программе 6315 надо сохранять в 23840 действительный адрес заг-
рузки файла, а здесь восстанавливать его.
LD A,(23781) ;расширение файла B ?
CP "B"
JP Z,298 ;если да, то запуск программы на бейсике
PUSH HL ;запуск программы в кодах
RET
Боже!!! Ну кто так делает!!! Во-первых, адрес программы при за-
пуске должен быть в BC; во-вторых, надо совсем выйти из TR-DOS,
иначе программа спятит при вызове 15635; в третьих, куда прог-
рамма будет возвращаться ?; в четвертых... В общем, надо так
(после CALL 7541):
LD A,(23781)
CP "D"
JP Z,7450
CP "B"
JP Z,298
LD HL,START
LD (23834),HL
JP 467
───────────────────
START CALL 562
LD BC,(23840)
PUSH BC
RET
────────────────────────────────────────────────────────────────
Адрес 7523. Очистка рабочей области памяти.
7523 LD HL,23822;рабочую область очищать ?
LD A,(HL)
CP 255
LD (HL),0 ;рабочая область очищена
RET NZ ;если рабочая область очищена, то возврат
RST 32 ;очистка рабочей области
DEFW #16BF
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7536. Проверка, идет ли проверка строки на синтаксис или
выполнение команды. Если идет выполнение, то флаг Z будет сбро-
шен, иначе установлен.
7536 BIT 7,(IY+1)
RET
────────────────────────────────────────────────────────────────
Адрес 7541. Если идет проверка на синтаксис, то возврат из прог-
раммы, вызвавшей эту подпрограмму. Установите 23611.
7541 CALL 7536;проверка, что делается
RET NZ ;если идет выполнение, то возврат
POP HL ;снятие адреса возврата в вашу программу
RET ;возврат по следующему адресу
────────────────────────────────────────────────────────────────
Адрес 7547. Помещение числа на стек калькулятора. Установите
23645 на символ перед числом. Если строка проверяется на синтак-
сис, то будет установлен флаг Z, а при выполнении он сброшен.
7547 CALL 7722;берем следующий символ строки
CALL 7617;помещение числа на стек калькулятора
JR 7536 ;проверка, идет выполнение или проверка и возврат
────────────────────────────────────────────────────────────────
Адрес 7555. Открытие потока 0. Используется также с адреса 7556
(открытие потока; номер в регистре A).
7555 XOR A ;номер потока - 0
7556 RST 32 ;открытие потока
DEFW #1601
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7560. Открытие потока 2.
7560 LD A,2 ;номер потока - 2
JR 7556;открытие потока
────────────────────────────────────────────────────────────────
Адрес 7564. Выборка текущего символа строки. Поместите его адрес
в 23645.
7564 RST 32
DEFW #0018
RET
────────────────────────────────────────────────────────────────
Адрес 7568. Ввод команды.
7568 CALL 7555 ;открытие потока 0
RST 32 ;редактирование командной строки
DEFW #0F2C
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7575. Очистка экрана и открытие потока 0.
7575 RST 32
DEFW #0D6B
RET
────────────────────────────────────────────────────────────────
Адрес 7579. Поиск массива. Установите 23645 на имя массива. Если
массив найден, то в HL будет его адрес.
7579 RST 32
DEFW #28B2
RET
────────────────────────────────────────────────────────────────
Адpес 7583. Очистка низа экрана.
7583 RST 32
DEFW #0D6E
RET