Адрес 5123. Проверка наличия свободного места на диске-приемни-
ке для команды COPY S. Поместите описатель файла в 23773 и его
часть в 23789 и установите 23824. В дисководе должен быть диск-
-приемник. Подпрограмма устанавливает 23786, 23787 и 23839.
5123 XOR A ;не первый проход
LD (23841),A
CALL 1029 ;настройка на диск
CALL 15889 ;берем режим дисковода
LD (23770),A ;сохраняем его
CALL 7347 ;поиск файла
JP Z,7248 ;если нашли, то FILE EXISTS
CALL 1021 ;загрузка в буфер сектора 8 дорожки 0
LD A,(24073) ;берем количество файлов на диске
CP 128 ;их 128 ?
JP Z,10019 ;если да, то DIRECTORY FULL
LD HL,23789 ;восстановление описателя файла
LD DE,23782
LD BC,7
LDIR
CALL 1021 ;загрузка в буфер сектора 8 дорожки 0
LD A,(23824) ;восстановление длины файла в секторах
LD (23786),A
LD DE,(23786);перевод ее в двухбайтную форму
LD D,0
OR A ;сброс флага C
LD HL,(24074);уменьшаем свободное место на диске
SBC HL,DE
JP C,7237 ;если его не хватило, то NO SPACE
LD (24074),HL;установка нового количества свободного места на диске
LD HL,(24070);берем адрес свободного места на диске
LD (23787),HL;установка адреса файла на диске-приемнике
LD (23839),HL;сохранение его
Боже мой!!! Hу что это такое! ведь эта переменная - флаг способа
вызова TR-DOS. И на такой DOS все работают. Ужас какой-то.
RET ;возвpат
────────────────────────────────────────────────────────────────
Адрес 5201. Копирование файла на одном дисководе. Поместите опи-
сатель файла в 23773 и его часть в 23789 и установите 23793,
23841 , 23843 и 23759. Подпрограмма устанавливает 23739, 23769,
23770 и 23698.
5201 LD A,(23793) ;все скопировали ?
OR A
RET Z ;если да, то возврат
LD A,(23841) ;первый проход ?
OR A
JR NZ,5231 ;если да, то диск - источник уже в дисководе
CALL 7575 ;очистка экрана
LD HL,10154 ;печать INSERT SOURCE DISC
CALL 9991
5221 CALL 4178 ;ожидание клавиши Y
CP "Y"
JR NZ,5211
CALL 7583 ;очистка низа экрана
5231 LD A,(23793) ;все скопировали ?
OR A
RET Z ;если да, то возврат
PUSH HL ;сохранение HL
LD HL,23843 ;копируется часть файла
SUB (HL)
POP HL ;восстановление HL
JR NC,5323 ;если еще не конец, то копируется часть файла
LD A,(23793) ;копируем остаток
LD B,A
XOR A ;скопировали все
LD (23793),A
5252 PUSH BC ;сохранение количества копируемых секторов
LD (23758),A ;обнуление 23758
LD HL,(23759);берем адрес рабочего пространства
PUSH HL ;сохраняем его
LD DE,(23794);берем адрес копируемого участка диска
CALL 5336 ;настройка дисковода под диск-источник
CALL 7741 ;загрузка секторов
LD HL,(23796);установка адреса на диске следующего сектора
LD (23794),HL
CALL 7575 ;очистка экрана
LD HL,10119 ;печать INSERT DESTINATION DISC
CALL 9991
5285 CALL 4178 ;ожидание клавиши Y
CP "Y"
JR NZ,5286
CALL 7583 ;очистка низа экрана
LD A,(23841) ;первый проход ?
OR A
CALL NZ,5123 ;если да, то проверка наличия места на диске
POP HL ;восстановление адреса рабочего пространства
POP BC ;и количества копируемых секторов
LD DE,(23787);берем адрес текущего участка диска
CALL 5348 ;настройка дисковода под диск-приемник
CALL 7757 ;запись секторов
LD HL,(23797);установка адреса на диске следующего сектора
LD (23787),HL
JP 5201 ;повтор
5323 LD (23793),A ;установка длины оставшейся части файла
PUSH HL ;сохранение HL
LD HL,23843 ;берем длину рабочей области
LD B,(HL)
POP HL ;восстановление HL
XOR A ;обнуление аккумулятора
JP 5252 ;копирование
────────────────────────────────────────────────────────────────
Адрес 5336. Помещение значения 23769 в переменную режима диско-
вода. Установите 23769.
5336 PUSH HL ;сохранение DE и HL
PUSH DE
CALL 15889 ;берем адрес переменной с типом дисковода
LD A,(23769);берем тип дисковода из 23769
LD (HL),A ;установка типа дисковода
POP DE ;восстановление DE и HL
POP HL
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 5348. Помещение значения 23770 в переменную режима диско-
вода. Установите 23770.
5348 PUSH HL ;сохранение DE и HL
PUSH DE
CALL 15889 ;берем адрес переменной с типом дисковода
LD A,(23770);берем тип дисковода из 23769
LD (HL),A ;установка типа дисковода
POP DE ;восстановление DE и HL
POP HL
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 5360. Проверка наличия места на диске-приемнике для коман-
ды COPY B. Установите 23775 и поместите в дисковод диск-прием-
ник. Устанавливает 23770, 23783, 23773 и обнуляет 23841.
5360 XOR A ;обнуление 23841
LD (23841),A
CALL 1029 ;настройка на диск
CALL 15889 ;берем режим дисковода
LD (23770),A ;сохраняем его
LD A,(24072) ;сохраняем тип диска
LD (23783),A
LD HL,640 ;вычисление количества секторов на
CP 25 ;диске-приемнике
JR Z,5407
LD HL,1260
CP 24
JR Z,5407
CP 23
JR Z,5407
LD HL,2560
CP 22
JR Z,5407
JP 7540 ;если в качестве типа диска стоит неопределенное значение,
то *ERROR*
Лучше DISC ERROR.
5407 LD (23773),HL;сохранение количества секторов на диске-приемнике
LD BC,(23775);берем количество копируемых секторов
SBC HL,BC ;места хватит ?
JP C,7237 ;если нет, то NO SPACE
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 5420. Выполнение команды COPY B. Установите 23611.
5420 CALL 7541 ;если идет проверка на синтаксис, то возврат
CALL 5743 ;резервирование места в памяти
LD HL,10105 ;печать BACKUP DISC
CALL 9991
LD HL,10154 ;печать INSERT SOURCE DISC
CALL 9991
5438 CALL 4173 ;ввод клавиши
CP "Y" ;это Y ?
JR NZ,5438 ;если да, то повтор
CALL 7583 ;очистка низа экрана
LD A,255 ;первый проход
LD (23841),A
Внимание!!! Эта переменная уже занята. В ней хранятся первые 3
символа командной строки.
CALL 1029 ;настройка на диск
CALL 15889 ;берем режим дисковода
LD (23769),A ;сохраняем его
LD A,(24072) ;берем тип диска
CP 25 ;диск 40-дорожечный односторонний ?
LD HL,640 ;всего на диске 640 секторов
JR Z,5493 ;если да, то копирование
LD HL,1280 ;всего на диске 1280 секторов
CP 24 ;диск 80-дорожечный односторонний ?
JR Z,5493 ;если да, то копирование
CP 23 ;диск 40-дорожечный двухсторонний ?
JR Z,5493 ;если да, то копирование
LD HL,2560 ;всего на диске 2560 секторов
CP 22 ;диск 80-дорожечный двухсторонний ?
JR Z,5493 ;если да, то копирование
JP 7450 ;иначе *ERROR*
Внимание!!! Лучше выдавать сообщение DISC ERROR.
5493 LD BC,(24074);берем количество свободных секторов
SBC HL,BC ;вычисляем количество занятых секторов
LD (23781),HL;установка количества секторов
LD (23775),HL
LD HL,0 ;скопировано 0 секторов
LD (23777),HL
LD (23779),HL
CALL 5560 ;копирование секторов
CALL 1029 ;настройка на диск
LD A,(23783) ;установка нового типа диска-приемника
LD (24072),A
LD HL,(23773);берем общее число секторов на диске-приемнике
LD BC,(23775);берем число скопированных секторов
SBC HL,BC ;вычисление числа свободных секторов на диске - приемнике
LD (24074),HL;установка его
CALL 5348 ;настройка дисковода под диск-приемник
LD DE,9 ;записывали сектор 8 дорожки 0
LD (23796),DE
CALL 7747 ;запись сектора
JP 993 ;O.K.
────────────────────────────────────────────────────────────────
Адрес 5554. Проверка переменной 23781. Соответственно содержимо-
му будет установлен флаг Z, а само содержимое будет в HL.
5554 LD HL,(23781);берем содержимое переменной 23781
LD A,H ;проверка его на 0
OR L
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 5560. Копирование секторов. Установите 23769, 23759,
23781, 23841, 23843 и 23771
5560 CALL 5554 ;все скопировали ?
RET Z ;если да, то возврат
LD A,(23841) ;первый проход ?
OR A
JR NZ,5595 ;если да, то диск-источник уже в дисководе
LD HL,10505 ;печать BACKUP DISC
CALL 9991
LD HL,10154 ;печать INSERT SOURCE DISC
CALL 9991
5585 CALL 4178 ;ожидание нажатия Y
CP "Y"
JR NZ,5585
CALL 7583 ;очистка низа экрана
5595 CALL 5554 ;все скопировали ?
RET Z ;если да, то возврат
PUSH BC ;сохранение BC и количества секторов
PUSH HL
LD HL,23843 ;берем длину рабочей области в секторах
LD C,(HL)
LD B,0
POP HL ;восстановление количества секторов
SBC HL,BC ;уменьшение количества секторов
POP BC ;восстановление BC
JP NC,5700 ;если рабочего пространства мало, то это еще не конец
LD BC,(23781);берем оставшееся количество секторов
LD HL,0 ;все скопировали
LD (23781),HL
5624 PUSH BC ;сохранение количества секторов
LD HL,(23759);берем адрес рабочей области
PUSH HL ;сохраняем его
CALL 5336 ;настройка дисковода под диск-источник
LD DE,(23771);берем адрес группы секторов на диске-источнике
LD B,C
CALL 7741 ;загрузка секторов
LD HL,(23796);установка адреса следующей группы секторов
LD (23771),HL;на диске-источнике
CALL 7575 ;очистка экрана
LD HL,10105 ;печать BACKUP DISC
CALL 9991
LD HL,10117 ;печать INSERT DESTINATION DISC
CALL 9991
5661 CALL 4178 ;ожидание нажатия Y
CP "Y"
JR NZ,5601
CALL 7583 ;очистка низа экрана
LD A,(23841) ;первый проход ?
OR A
CALL NZ,5360 ;если да, то проверка наличия места на диске
POP HL ;восстановление адреса рабочей области
POP BC ;и количества копируемых секторов
LD DE,(23779);берем адрес группы секторов на диске-приемнике
LD B,C
CALL 5348 ;настройка дисковода под диск-приемник
CALL 7757 ;запись секторов
LD HL,(23796);установка адреса следующей группы секторов
LD (23779),HL;на диске-приемнике
JP 5560 ;повтор
5700 LD (23871),HL;установка оставшегося количества секторов
PUSH HL ;сохранение его
LD HL,(23843);берем длину рабочей области
LD C,(HL) ;столько секторов будем копировать
LD B,0
POP HL ;восстановление оставшегося количества секторов
XOR A ;обнуление аккумулятора
JP 5624 ;копирование
────────────────────────────────────────────────────────────────
Адрес 5715. Проверка состояния файла. Номер файла задайте в ре-
гистре A. Возвращает Z, если файл стерт и NZ, если нет, а в A
будет первый символ имени файла.
5715 CALL 5725 ;чтение описателя файла
LD A,(23773);берем первый символ имени файла
CP 1 ;проверка состояния файла
RET ;возврат