Адрес 5724. Чтение описателя файла. На входе в регистр A помес-
тите номер файла. Описатель будет загружен по адресу 23781. Ис-
пользуется также с адресов:
5725 - то же, что и 5724, но номер файла в регистре C.
5726 - то же, что и 6121, но сохраняет номер файла.
5724 LD C,A ;перенос номера файла в рег. C
5725 XOR A ;переносим описатель из буфера в память
5726 PUSH BC ;сохранение номера файла
CALL 6121;чтение сектора с описателем и перенос описателя
POP BC ;восстановление номера файла
RET ;возврат
----------------------------------------------------------------
Адрес 5732. запись информации о файле. Вход: описатель располо-
жить по адресу 23773, а в аккумулятор поместить номер файла.
5732 LD C,A ;перенос в C номера файла
CALL 5739;чтение сектора и замена описателя файла в нем
JP 7747 ;перезапись сектора
----------------------------------------------------------------
Адрес 5739. Чтение в буфер сектора с описателем файла и замена
описателя. Поместите описатель по адресу 23773.
5739 LD A,255;описатель перемещать из переменных в буфер
JR 5726 ;то же, что и 6121, но с сохранением BC
----------------------------------------------------------------
Адрес 5743. Резервирование места в памяти. Устанавливает 23759 и
23843.
5743 LD A,255 ;WORKSP использовалась
LD (23822),A
CALL 5760 ;вычисление размера доступной памяти
LD HL,(23649);установка адреса рабочей области
LD (23759),HL
JP 7715 ;выделение места в памяти и возврат
----------------------------------------------------------------
Адрес 5760. Вычисление количества свободной памяти в секторах.
Размер свободной памяти в байтах будет в BC, а в секторах - в
23843.
5760 RST 32 ;берем количество свободной памяти в байтах
DEFW #1F1A
LD HL,65535
SBC HL,BC
LD A,H ;свободно меньше 16 секторов ?
CP 16
JR NC,5775 ;если да, то
LD A,17 ;будем выделять 16 секторов
5775 DEC A ;1 сектор на всякий случай
LD (23843),A;установка размера свободной памяти в секторах
LD B,A ;установка размера свободной памяти в байтах
LD C,0
RET ;возврат
----------------------------------------------------------------
Адрес 5783. Помещает HL в 23767 и 23771 и прибавляет 23786 (1
байт) к 23769 (2 байта).
5783 LD (23767),HL;установка 23767 и 23769
LD (23771),HL
LD DE,(23786);сложение 23786 и 23769
LD HL,(23769)
LD D,0
ADD HL,DE
LD (23769),HL
RET ;возврат
----------------------------------------------------------------
Адрес 5803. Выполнение команды MOVE. Установите 23611.
5803 CALL 7541 ;если идет проверка на синтаксис, то возврат
CALL 5743 ;резервирование места в памяти
CALL 1029 ;настройка на диск
LD A,(24089) ;стертые файлы на диске есть ?
OR A
JP Z,993 ;если нет, то сообщение O.K.
LD HL,0 ;пока освободилось 0 секторов
LD (23769),HL
LD C,255 ;начнем с файла номер 0
5827 INC C ;следующий файл
CALL 5715 ;он стерт ?
JR NZ,5827 ;если нет, то следующий файл
LD A,C ;сохранение номера стираемого файла
LD (23764),A
LD HL,(23787);берем адрес стираемого файла на диске
LD (23765),HL;сохраняем его
CALL 5783 ;приращение счетчика освободившихся секторов
5846 INC C ;следующий файл
CALL 5715 ;он стерт ?
JR Z,5846 ;если да, то следующий файл
CP 0 ;это конец каталога ?
JP NZ,5904 ;если нет, то меняем файлы местами
LD A,(23764) ;берем номер стираемого файла
LD C,A
5861 INC C ;следующий файл
CALL 5715 ;это конец каталога ?
CP 0
JR Z,5996 ;если да, то реорганизация описателя диска
XOR A ;конец каталога
LD (23773),A
CALL 7744 ;запись описателя файла
CALL 5783 ;приращение счетчика освободившихся секторов
JR 5861 ;повтор
5904 LD A,(23786) ;берем размер перемещаемого файла в секторах
LD (23763),A ;сохраняем его
LD (23761),A
LD HL,(23787);берем адрес перемещаемого файла на диске
LD (23765),HL;сохраняем его
PUSH BC ;сохранение номера перемещаемого файла
CALL 6053 ;перемещение файла
POP BC ;восстановление номера перемещаемого файла
LD HL,(23796);перемещение продолжится с этого места
LD (23765),HL
LD (23787),HL
XOR A ;размер стертого файла - 0 секторов
LD (23786),A
LD A,(23773) ;сохранение первого символа имени файла
PUSH AF
LD A,1 ;файл стерт
LD (23773),A
CALL 7744 ;запись описателя стертого файла
POP AF ;восстановление первого символа имени файла
LD (23773),A
LD A,(23764) ;берем номер стертого файла
LD C,A
LD HL,(23771);установка нового адреса перемещенного файла
LD (23787),HL;на диске
LD A,(23761) ;восстановление размера перемещенного файла
LD (23786),A ;на диске
CALL 7744 ;запись описателя перемещенного файла
LD A,(23764) ;берем номер файла после перемещенного
INC A
LD C,A
CALL 5725 ;чтение его описателя
LD HL,(23765);установка его нового адреса на диске
LD (23787),HL
CALL 7744 ;запись его описателя
LD A,(23764) ;берем номер перемещенного файла
LD C,A
JP 5827 ;повтор
----------------------------------------------------------------
Адpес 5996. Реорганизация описателя диска. Установите 23759,
23769 и 23765.
5996 LD HL,(23759);берем адрес рабочего пространства
LD BC,4096 ;сокращаем его на 4096 байтов
CALL 7726
CALL 1021 ;загрузка в буфер сектора 8 дорожки 0
LD HL,(24074);увеличение количества свободного места на
LD DE,(23769);диске
ADD HL,DE
LD (24074),HL
LD A,(24073) ;уменьшение количества файлов на диске на
LD HL,24089 ;число стертых
SUB (HL)
LD (24073),A
LD (HL),0 ;на диске больше нет стертых файлов
LD HL,(23765);установка нового адреса свободного места на
LD (24070),HL;диске
PUSH AF ;сохранение количества файлов на диске
CALL 7747 ;запись сектора 8 дорожки 0
POP AF ;восстановление количества файлов на диске
LD C,A
CALL 5725 ;чтение описателя файла за последним
XOR A ;это конец каталога
LD (23773),A
JP 1385 ;запись описателя файла и завершение
----------------------------------------------------------------
Адрес 6053. Перемещение файла. Установите 23763, 23843, 23759,
23765 и 23767.
6053 LD A,(23763) ;перемещен весь файл ?
OR A
RET Z ;если да, то возврат
PUSH HL ;сохранение HL
LD HL,23843 ;буфера хватит на остаток ?
SUB (HL)
POP HL ;восстановление HL
JR NC,6109 ;если буфера не хватит, то перемещаем часть файла
LD A,(23763) ;берем количество оставшихся секторов
LD B,A
XOR A ;переместили все
LD (23763),A
6074 PUSH BC ;сохранение количества перемещаемых секторов
LD HL,(23759);берем адрес рабочей области
PUSH HL ;сохранение его
LD DE,(23765);берем адрес части перемещаемого файла на старом месте
CALL 7741 ;загрузка секторов
LD HL,(23796);установка адреса следующей части файла
LD (23765),HL
POP HL ;восстановление адреса рабочей области
POP BC ;и количества перемещаемых секторов
LD DE,(23767);берем адрес части перемещаемого файла на новом месте
CALL 7757 ;запись секторов
LD HL,(23796);установка адреса следующей части файла
LD (23767),HL
JR 6053 ;повтор
6109 LD (23763),A ;установка количества оставшихся секторов
PUSH HL ;сохранение HL
LD HL,23843 ;берем длину рабочей области в секторах
LD B,(HL)
POP HL ;восстановление HL
XOR A ;обнуление аккумулятора
JR 6074 ;перемещение секторов
----------------------------------------------------------------
Адрес 6121. Загрузка в буфер сектора с описателем файла и пере-
нос описателя. В регистре C - номер файла, в A - направление пе-
ремещения (0 - в переменные, иначе - в прочитанный сектор).
6121 PUSH AF ;сохранение направления перемещения
LD HL,23756;первый сектор каталога - 0
LD (HL),0
LD A,C ;определение номера сектора с описателем файла
6128 SUB 16
JR C,6135
INC (HL)
JR 6128
6135 ADD A,16 ;берем номер описателя в секторе
LD C,A
PUSH BC ;сохраним его
CALL 1004 ;загрузка в буфер сектора с описателем
POP BC ;восстановление номера описателя в секторе
POP AF ;и направление перемещения
CALL 7332 ;определение адреса описателя файла в буфере
LD DE,23773;берем второй адрес для LDIR
LD BC,16 ;берем длину описателя
OR A ;установка направления перемещения
JR Z,6157
EX DE,HL
6157 LDIR ;перенос описателя файла
RET ;возврат
----------------------------------------------------------------
Адрес 6160. Выполнение команды VERIFY. Установите 23825 и 23611.
Используется также с адресов:
6165 - выполнение команды LOAD. Установите 23825 и 23611;
6168 - выполнение команды LOAD, PEEK или POKE; Установите 23825,
23611 и 23824.
6160 LD A,255 ;верификация файла
LD (23801),A
6165 CALL 6226 ;обнуление 23824
6168 CALL 6198 ;обработка параметров и загрузка файла
CALL 7541 ;если идет проверка на синтаксис, то возврат
LD A,255 ;выполняется команда LOAD
LD (23824),A
LD A,(23801);выполняется VERIFY ?
CP 255
JP Z,993 ;если да, то O.K.
LD A,(23781);расширение файла B ?
CP "B"
Внимание!!! Если была операция с одним сектором файла, то надо
выходить независимо от расширения.
JP Z,298 ;если да, то обработка строки автостарта
JP 993 ;иначе O.K.
----------------------------------------------------------------
Адрес 6198. Обработка параметров для команды LOAD и загрузка
файла. Установите 23825, 23611, 23801 и 23824.
6198 CALL 6266;принятие параметров
CALL 7541;если идет проверка на синтаксис, то возврат
CALL 6315;проверка параметров
JP 6433 ;загрузка файла и возврат
----------------------------------------------------------------
Адрес 6210. Обработка параметров для команды LOAD...CODE. Уста-
новите 23645 на расширение файла. На выходе устанавливает 23766,
23769 и 23771.
6210 LD HL,(23645);следующий символ строки ENTER ?
INC HL
LD A,(HL)
CP 13
RET Z ;если да, то возврат
LD A,1 ;задан адрес загрузки
LD (23766),A
CALL 7569 ;прием одного или двух чисел
XOR A ;обнуление 23824
LD (23824),A
RET ;возврат
----------------------------------------------------------------
Адрес 6226. Обнуление 23824.
6226 XOR A
LD (23824),A
RET
----------------------------------------------------------------
Адрес 6231. Прием параметров для команды POKE или PEEK. Вход:
установите 23645 на расширение файла. Выход: устанавливает
23767, 23769, 23771 и 23871.
6231 CALL 4142 ;прием расширения файла
LD A,"B" ;это "B" ?
CP B
JR NZ,6246 ;если да, то декремент CH_ADD, так как для
LD HL,(23645);программы на бейсике расширение не
DEC HL ;указывается
LD (23645),HL
6246 CALL 7659 ;прием чисел
LD HL,(23769);установка адреса загрузки / записи сектора
LD (23767),HL
LD HL,(23771);установка номера сектора
LD (23769),HL
XOR A ;обнуление 23766
LD (23766),A
RET ;возврат
----------------------------------------------------------------
Адрес 6266. Принятие параметров для команды LOAD. Вход: устано-
вите 23825 и 23611. Выход: устанавливает 23762, 23767, 23769,
23781 и 23766 и читает описатель файла.
6266 CALL 1067 ;второй символ командной строки ENTER ?
JP Z,635 ;если да, то вход в командный процессор с вводом команды
;RUN"boot"
Ошибка!!! это некорректно, так как при ошибке вы попадете в ко-
мандный процессор TR-DOS, а не вернетесь в бейсик.
CALL 7647 ;помещение имени файла на стек калькулятора
CALL 1394 ;операция со всем файлом ?
CALL NZ,6231;если нет, то прием расширения и двух чисел
CALL 7564 ;берем текущий символ строки
CP 175 ;это CODE ?
CALL Z,6210 ;если да, то прием чисел, если они есть
CP 228 ;это DATA ?
PUSH AF ;сохранение результата проверки
CALL 1394 ;операция со всем файлом ?
CALL Z,4142 ;если да, то прием расширения
POP AF ;восстановление результата проверки
CALL Z,7164 ;если символ DATA, то прием имени массива
CALL 7541 ;если идет проверка на синтаксис, то возврат
CALL 10543 ;установка имени файла и поиск файла
JP NZ,985 ;если файл не найден, то NO FILE
CALL 5725 ;чтение описателя файла
RET ;возврат
----------------------------------------------------------------
Адрес 6308. Чтение описателя файла, если он был найден. Устано-
вите 23773, 23781 и флаг Z: при Z=1 происходит чтение описателя,
иначе ошибка NO FILE.
6308 JP NZ,985;если перед вызовом файл не был найден, то ошибка
CALL 5725;загрузка описателя файла
RET ;возврат
----------------------------------------------------------------
Адрес 6315. Обработка параметров для подпрограммы загрузки фай-
ла. На входе установите 23766, 23769 и 23771; считайте описатель
нужного вам файла. На выходе в 23771 будет длина файла для заг-
рузки, в 23766 0, если длина менялась, иначе 3. В HL будет адрес
загрузки файла, в DE - его адрес на диске, в B - количество сек-
торов для загрузки. При загрузке массива или программы на бейси-
ке будет произведена подготовка памяти к загрузке.
6315 LD A,(23766) ;берем флаг загрузки
OR A ;начало и длину брать из каталога ?
LD HL,(23782);берем начало файла из описателя
JR Z,6327 ;если параметры берем не из каталога, то
LD HL,(23769);берем начальный адрес, назначенный нами
6327 LD DE,(23787);берем адрес файла на диске
CP 3 ;все параметры назначены пользователем ?
LD A,(23786) ;берем размер файла в секторах
PUSH DE ;сохранение адреса файла на диске
LD DE,(23784);берем длину файла из описателя
JR NZ,6347 ;если нужно брать ее не оттуда, то берем
LD DE,(23771);длину загрузки, назначенную нами
6347 LD B,A ;сохранение размера файла в секторах
LD (23771),DE;установка длины файла для загрузки
LD A,(23781) ;расширение файла C ?
CP "C"
LD A,B ;восстановление длины файла в секторах
JR NZ,6397 ;если расширение не C, то длину не менять
LD A,B ;если длина файла в байтах соответствует его
CP D ;размеру в секторах, то длина загрузки не ме-
JR Z,6390 ;няется
DEC A
CP D
LD A,B
JR Z,6390
LD A,(23766) ;длина назначена пользователем ?
CP 3
LD A,B ;восстановление размера файла в секторах
JR Z,6390 ;если мы сами назначили длину загрузки, то она не меняется
XOR A ;грузить только полностью заполненные сектора
LD (23766),A
LD D,B ;вычисление длины файла в байтах из его длины
LD E,0 ;в секторах
LD (23771),DE;установка новой длины
JR 6393
6390 CALL 6427 ;файл загружать весь
6393 LD A,B ;восстановление размера файла в секторах
CALL 7852 ;вычисление количества секторов для загрузки
LD B,A ;сохранение его
LD A,(23781) ;расширение файла C ?
CP "C"
POP DE ;восстановление адреса файла на диске
RET Z ;если расширение файла C, то возврат
Ошибка!!! Если выполняется чтение или запись сектора файла, то
здесь должен быть возврат. Из-за этой ошибки нельзя прочитать
или записать сектор файла с расширением B или D.
PUSH DE ;сохранение адреса файла на диске
CP "B" ;расширение B ?
PUSH AF ;сохранение расширения файла
CALL Z,6657 ;если расширение B, то подготовка к загрузке программы
;на бейсике
POP AF ;восстановление расширения
CP "D" ;расширение D ?
CALL Z,6732 ;если да, то подготовка к загрузке массива
CALL 6427 ;длина загрузки не менялась
LD A,(23772) ;берем количество секторов для загрузки
LD B,A
POP DE ;восстановление адреса файла на диске
RET ;возврат
----------------------------------------------------------------
Адрес 6427. Помещает число 3 по адресу 23766.
6427 LD A,3
LD (23766),A
RET
----------------------------------------------------------------
Адрес 6433. Загрузка / верификация файла а также загрузка / за-
пись сектора файла. Вход: установите 23801, 23824, 23767, 23771,
в HL - адрес загрузки, в DE - адрес файла на диске,в B - коли-
чество секторов для загрузки.
6433 CALL 1394 ;выполняется загрузка или верификация ?
JR Z,6445 ;если да, то выполнение операций со всем файлом
PUSH AF ;сохранение флага операции
CALL 6804 ;вычисление адреса сектора на диске
POP AF ;восстановление флага операции
CP 255 ;чтение сектора файла ?
6445 PUSH AF
CALL Z,6492 ;если да, то чтение сектора или операция с файлом
POP AF
JR Z,6455 ;и завершение загрузки или верификации
JP 7757 ;иначе запись сектора и возврат
6455 LD A,(23766) ;загружать весь файл ?
CP 3
Не нужно этого делать!!! Лучше так:
LD A,(23824)
OR A
и PEEK будет работать правильно. Не будет грузится мусор после
загруженного сектора. ведь если в 23766 находится 0, то младший
байт длины всегда равен 0 и 6470 не будет работать.
CALL Z,6470 ;если да, то загрузка или верификация конца файла
LD HL,(23641);отметка конца программы на бейсике
DEC HL
LD (HL),128
RET ;возврат
----------------------------------------------------------------
Адрес 6470. Загрузка или верификация конца файла. Установите
23796, 23771 и 23801.
6470 LD A,(23801) ;верификация ?
CP 255
JP NZ,12254 ;если нет, то загрузка конца файла
LD A,(23771) ;файл занимает сектора без остатка ?
OR A
RET Z ;если да, то возврат
LD C,A ;берем длину остатка
LD B,1 ;1 сектор
LD DE,(23796);текущее место диска
JR 6506 ;верификация конца файла и возврат
----------------------------------------------------------------
Адрес 6492. Загрузка / верификация файла а также загрузка секто-
ра файла. Установите 23801 ,в DE поместите адрес файла на диске,
в HL - адрес файла в памяти, в B - длину файла в секторах. Ис-
пользуется также с адреса 6506 для верификации заданного коли-
чества байтов (все для 6492, кроме 23801 плюс в B - количество
байтов).
6492 LD A,(23801) ;верификация ?
CP 255
JP NZ,7741 ;если нет, то загрузка секторов и возврат
LD (23796),DE;запомним адрес файла на диске
LD C,0 ;в секторе 256 байтов
6506 LD A,B ;верифицируем 0 секторов ?
OR A
RET Z ;если да, то возврат
LD (23767),HL;сохранение адреса файла в памяти
LD (23769),DE;сохранение адреса файла на диске
6516 PUSH BC ;сохранение количества секторов
LD B,1 ;загружать 1 сектор
LD DE,(23769);с текущего места диска
LD HL,23845 ;в буфер
CALL 7741 ;загрузка сектора
LD HL,(23796);адрес следующего сектора на диске
LD (23769),HL
POP BC ;восстановление количества секторов
LD HL,(23767);берем адрес файла в памяти
LD DE,23845 ;адрес сектора в буфере
6542 LD A,(DE) ;сравнение их
CP (HL)
JR NZ,6557 ;если несовпадение, то VERIFY ERROR
INC HL ;следующие байты
INC DE
DEC C
JR NZ,6542 ;повтор до конца
LD (23767),HL;установка следующего адреса
DJNZ 6516 ;повтор до конца
RET ;возврат
6557 LD HL,10091 ;адрес сообщения VERIFY ERROR
LD A,13 ;код ошибки - 13
JP 7242 ;обработка ошибок
----------------------------------------------------------------
Адрес 6565. Выполнение команды PEEK. Установите 23825 и 23611.
6565 LD A,255;код функции PEEK
JR 6571 ;выполнение команды
----------------------------------------------------------------
Адрес 6569. Выполнение команды POKE. Установите 23825 и 23611.
Используется также с адреса 6571 (выполнение команды LOAD, PEEK
или POKE; Установите 23825 и 23611, а в аккумулятор поместите
код функции).
6569 LD A,238 ;код функции POKE
6571 LD (23824),A;установка кода функции
JP 6168 ;выполнение команды
----------------------------------------------------------------
Адрес 6577. Выполнение команды MERGE. Установите 23825 и 23611.
6577 LD A,255 ;использовалась рабочая область
LD (23839),A
Ошибка!!! Флаг состояния рабочей области находится по адресу
23829.
CALL 6266 ;обработка параметров
CALL 7541 ;если идет проверка на синтаксис, то возврат
LD A,(23781) ;расширение файла B ?
CP "B"
JP NZ,7450 ;если нет, то ошибка
LD BC,(23782);установка длины файла для загрузки
LD (23771),BC
PUSH BC ;сохранение ее
INC BC ;оставим место для байта 128
RST 32 ;выделение места в рабочей области
DEFW #0030
LD (HL),128 ;маркер конца программы
EX DE,HL ;переброска адреса загрузки в HL
POP DE ;снятие со стека длины файла
PUSH HL ;сохранение адреса загрузки
LD DE,(23787);берем адрес файла на диске
CALL 6427 ;загружать весь файл
LD A,(23772) ;берем длину файла в блоках
LD B,A
CALL 6226 ;операция со всем файлом
CALL 6433 ;загрузка файла
POP HL ;восстанавливаем адрес загрузки
LD DE,(23635);берем адрес программы на бейсике
RST 32 ;объединение программ
DEFW #08D2
JP 993 ;сообщение O.K.
----------------------------------------------------------------
Адрес 6642. Проверка места в памяти для резервирования нового
пространства вместо старого. В HL - старая длина, в DE - новая.
Используется также с адреса 6653 (проверка наличия пространства
в памяти; длина пространства должна быть в DE).
6642 EX DE,HL
SCF ;вычисление разности длин
SBC HL,DE
RET C ;если новая длина меньше старой, то возврат
LD DE,10 ;должно остаться еще 10 байтов
ADD HL,DE
LD B,H ;переброска разности длин в BC
LD C,L
6653 RST 32 ;проверка наличия пространства в памяти
DEFW #1F05
RET ;возврат
----------------------------------------------------------------
Адрес 6657. Подготовка к загрузке программы на бейсике.
6657 LD DE,(23635);берем адрес начала программы на бейсике
LD HL,(23641);берем адрес конца программы на бейсике
DEC HL
PUSH HL ;сохранение начала и конца программы
PUSH DE
SBC HL,DE ;вычисление длины программы на бейсике
LD DE,(23782);берем длину программы с переменными
PUSH DE ;сохраняем ее
PUSH HL ;сохранение длины старой программы
LD HL,0 ;идет верификация ?
LD A,(23801)
CP 255
JR Z,6688 ;если да, то длину не меняем
LD HL,5 ;иначе увеличим ее на 5 байтов
6688 ADD HL,DE
LD (23771),HL;установка длины загрузки
POP HL ;восстановление длины старой программы
LD A,(23801) ;верификация ?
CP 255
JR NZ,6705 ;если нет, то подготовка памяти
POP DE ;снятие регистров со стека
POP DE
POP HL
JR 6728 ;возврат
6705 CALL 6642 ;проверка наличия места для программы
POP BC ;восстановление длины программы с переменными
POP DE ;восстановление начала программы
POP HL ;восстановление конца программы
PUSH BC ;сохранение длины программы
RST 32 ;стирание старой программы
DEFW #19E5
POP BC ;восстановление длины программы
CALL 7730 ;резервирование места для новой программы
INC HL ;установка переменной VARS
LD BC,(23784)
ADD HL,BC
LD (23627),HL
6728 LD HL,(23635);берем адрес загрузки программы
RET ;возврат