Адрес 1921. Стирание файлов. Вход: установите 23773, 23781, и
произведите поиск файла. Программа устанавливает 23816 и 23815.
1921 XOR A ;обнуление количества стертых файлов
LD (23815),A
JR 1952 ;стирание файлов
────────────────────────────────────────────────────────────────
Адрес 1927. Выполнение команды ERASE. Установите 23825 и 23611.
1927 CALL 7647 ;прием имени файла на стек калькулятора
CALL 7541 ;если идет проверка на синтаксис, то возврат
CALL 4142 ;прием расширения файла
XOR A ;пока ничего не стерто
LD (23815),A
CALL 10543 ;установка и проверка имени стираемого файла
CALL 1952 ;стирание файла
JP NZ,1399 ;если стерли файл не в конце каталога, то проверка, сколько
файлов стерли
JP 993 ;сообщение O.K.
────────────────────────────────────────────────────────────────
Адрес 1952. Стирание файлов. Вход: установите 23773, 23781, об-
нулите 23815 и произведите поиск файла. Программа устанавливает
23816 и 23815.
1952 LD A,(23773) ;сохранение первого символа имени файла
LD (23816),A
RET NZ ;если файл не был найден, то возврат
LD HL,23815 ;стерт еще один файл
INC (HL)
PUSH BC ;сохранение номера файла
CALL 1021 ;чтение в буфер сектора 8 дорожки 0
LD A,(24073) ;берем количество файлов на диске
POP BC ;восстановление номера файла
INC C ;этот файл последний ?
CP C
JR NZ,1980 ;если нет, то стирание обычным порядком
DEC A ;на диске теперь на 1 файл меньше
LD (24073),A
XOR A ;стираемый файл в конце каталога
1980 PUSH AF ;сохранение признака метода стирания
JR Z,1987 ;если файл не в конце каталога,
LD HL,24089 ;то увеличение на 1 количества стертых файлов
INC (HL)
1987 PUSH BC ;сохранение номера стираемого файла
CALL 7747 ;перезапись сектора 8 дорожки 0
POP BC ;восстановление номера стираемого файла
DEC C
CALL 5725 ;загрузка описателя файла
POP AF ;восстановление флага метода стирания
JP Z,2002 ;если файл в конце каталога, то первый символ имени будет
CHR$ 0
LD A,1 ;иначе он будет CHR$ 1
2002 LD (23773),A ;установка первого символа имени
PUSH AF ;сохранение метода стирания
CALL 7744 ;запись описателя файла
LD A,(23816) ;восстановление первого символа имени файла
LD (23773),A
POP AF ;восстановление метода стирания
JR Z,2023 ;если стерт файл в конце каталога, то реорганизация
описателя диска
CALL 7347 ;поиск следующего файла с таким именем
JR 1952 ;стирание его, если он есть
2023 CALL 1021 ;чтение сектора 8 дорожки 0
LD HL,(23787);установка нового начала свободного места
LD (24070),HL
LD DE,(23786);установка нового количества свободных секторов
LD HL,(24074)
LD D,0
ADD HL,DE
LD (24074),HL
JP 7747 ;перезапись сектора 8 дорожки 0 и возврат
────────────────────────────────────────────────────────────────
Адрес 2048. Позиционирование с быстрой скоростью перемещения го-
ловки. Поместите физический номер дорожки в регистр данных, а
команду позиционирования - в аккумулятор.
2048 AND 252 ;позиционировать с быстрой скоростью
JP 15770;выдача команды и ожидание INTRQ
────────────────────────────────────────────────────────────────
Адpес 2054. Фирменный знак изготовителей TR-DOS версии 5.04T.
2054 DEFM " Message for hackers: Base version 5.03, High Speed"
DEFM ", Turbo Format. "
DEFB 127
DEFM "Copyright C.C. 1991"
────────────────────────────────────────────────────────────────
Адрес 4096. Текст "Interface one fitted."
4096 DEFB 22,9,5
DEFM "Interface one fitted."
DEFB 0
────────────────────────────────────────────────────────────────
Адрес 4120. Выполнение команды "*". Установите 23825 и 23611.
4120 CALL 7647 ;установка CH_ADD и прием имени дисковода на стек калькулятора
CALL 7541 ;если идет проверка на синтаксис, то возврат
CALL 1329 ;снятие имени дисковода со стека калькулятора
LD A,(DE) ;берем первый символ имени
CALL 1316 ;вычисление номера дисковода
LD (23833),A;установка дисковода по умолчанию
CALL 15819 ;выбор дисковода
JP 993 ;сообщение O.K.
────────────────────────────────────────────────────────────────
Адрес 4142. Прием расширения файла. Установите 23645 и 23766.
4142 LD B,"C" ;расширение C
LD A,(23766);расширение принимать ?
OR A
JR NZ,4173 ;если нет, то установка расширения файла
CALL 7564 ;берем текущий символ
CP 175 ;это CODE ?
LD B,"C" ;расширение C
JR Z,4173 ;если да, то установка расширения файла
CP 228 ;это DATA ?
LD B,"D" ;расширение D
JR Z,4173 ;если да, то установка расширения файла
CP "#" ;это # ?
LD B,"#" ;расширение #
JR Z,4173 ;если да, то установка расширения файла
LD B,"B" ;расширение B
4173 LD HL,23781 ;адрес переменной с расширением файла
LD (HL),B ;установка расширения
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 4206. Вывод цветных полос для заставки.
4206 LD HL,22757;адрес линии атрибутов
LD B,10 ;установка атрибутов
4211 LD (HL),7
INC HL
DJNZ 4211
LD (HL),2
INC HL
LD (HL),22
INC HL
LD (HL),52
INC HL
LD (HL),37
INC HL
LD (HL),40
INC HL
LD (HL),7
LD HL,16622;адрес верхней линии пикселей
LD B,8 ;8 линий пикселей в знакоместе
XOR A ;обнуление аккумулятора
4239 PUSH BC ;сохранение количества линий
SCF ;сдвиг пикселей
RLA
PUSH HL ;сохранение адреса линии пикселей
PUSH AF ;и байта для заполнения
LD B,5 ;в линии 5 байтов
4246 INC HL ;заполнение линии
LD (HL),A
DJNZ 4246
POP AF ;восстановление байта для заполнения линии,
POP HL ;адреса линии
POP BC ;и количества линий
LD DE,256 ;берем адрес следующей линии
ADD HL,DE
DJNZ 4239 ;повтор до конца
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 4178. Ввод клавиши с ожиданием.
4178 DI ;запрет прерываний
PUSH HL ;сохранение регистров
PUSH BC
PUSH DE
4182 RST 32 ;определение номера нажатой клавиши
DEFW #028E
LD C,0 ;режим клавиатуры - C или L
JR NZ,4182;если нажата бессмысленная комбинация клавиш, то повтор
RST 32 ;определение кода нажатой клавиши
DEFW #031E
JR NC,4182;если ничего не нажато, то повтор
DEC D ;режим клавиатуры - C или L
LD E,A ;помещение кода клавиши в регистр E
RST 32 ;обработка клавиш CAPS SHIFT и SYMBOL SHIFT
DEFW #0333
POP DE ;восстановление регистров
POP BC
POP HL
AND 223 ;буква будет заглавная
EI ;разрешение прерываний
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 4261. Сообщения команды LIST.
4261 DEFM " Del."
4265 DEFM " File(s)"
DEFB 0
4275 DEFM "Title:"
DEFB 160
4282 DEFB 23,17
DEFM "Disk Drive: "
DEFB 0
4298 DEFB 23,16," ",0
4302 DEFM " 40 Track S.Side"
DEFB 0
4322 DEFM " 80 Track S.Side"
DEFB 0
4342 DEFM " 40 Track D.Side"
DEFB 0
4362 DEFM " 80 Track D.Side"
DEFB 0
4382 DEFB 23,16
DEFM " Free sector "
DEFB 0
4398 DEFB 13,13
DEFM " File Name Start Length Line"
DEFB 0
────────────────────────────────────────────────────────────────
Адрес 4433. Выделение 546 байтов в рабочей области. Устанавлива-
ет 23759.
4433 LD HL,(23649);берем адрес рабочей области
LD (23759),HL;установка адреса пространства
LD BC,546 ;выделять 546 байтов
JP 7715 ;выделение области и возврат
────────────────────────────────────────────────────────────────
Адрес 4445. Печать числа из HL с нулями.
4445 XOR A ;в числе 0 десятков тысяч
LD DE,10000
4449 SBC HL,DE ;вычитание из числа 10000
JR C,4456 ;если получилось число меньше 10000, то следующий разряд
INC A ;следующий десяток тысяч
JR 4449 ;повтор
4556 ADD A,"0" ;печать десятков тысяч
CALL 4520
ADD HL,DE ;восстановление остатка числа
XOR A ;в числе 0 тысяч
4446 LD DE,1000
SBC HL,DE ;вычитание из числа 1000
JR C,4473 ;если получилось число меньше 1000, то следующий разряд
INC A ;следующая тысяча
JR 4446 ;повтор
4473 ADD A,"0" ;печать тысяч
CALL 4520
ADD HL,DE ;восстановление остатка числа
XOR A ;в числе 0 сотен
LD DE,100
4483 SBC HL,DE ;вычитание из числа 100
JR C,4490 ;если получилось число меньше 100, то следующий разряд
INC A ;следующая сотня
JR 4483 ;повтор
4490 ADD A,"0" ;печать сотен
CALL 4520
ADD HL,DE ;восстановление остатка числа
XOR A ;в числе 0 десятков
LD DE,10
4500 SBC HL,DE ;вычитание из числа 10
JR C,4507 ;если получилось число меньше 10, то следующий разряд
INC A ;следующий десяток
JR 4500 ;повтор
4507 ADD A,"0" ;печать десятков
CALL 4520
ADD HL,DE ;восстановление остатка числа
LD A,L ;печать единиц
ADD A,"0"
CALL 4520
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 4520. То же, что и 15746.
4520 PUSH HL ;сохранение HL и DE
PUSH DE
CALL 15746;печать символа
POP DE ;восстановление DE и HL
POP HL
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 4528. Проверка достижения конца буфера при работе с ката-
логом. Установите 23801 и 23756, а в HL поместите текущий адрес
буфера. Если конец буфера достигнут, то в буфер загрузится сле-
дующий сектор каталога, а в HL будет 23845.
4528 PUSH HL ;сохранение HL и BC
PUSH BC
LD A,(23801) ;берем номер дисковода из 23801
LD HL,23798 ;берем номер текущего дисковода
CP (HL) ;назначен другой дисковод ?
CALL NZ,15819;если да, то выбор назначенного дисковода
POP BC ;восстановление HL и BC
POP HL
CALL 1292 ;проверка достижения конца буфера
LD A,(HL) ;берем первый символ имени файла
OR A ;конец каталога ?
JP Z,467 ;если да, то завершение
CP 1 ;файл стерт ?
CALL Z,1287 ;если да, то пропуск файла
RET NZ ;иначе возврат
JR 4528 ;если файл был пропущен, то повтор
────────────────────────────────────────────────────────────────
Адрес 4558. Выполнение команды LIST. Установите 23825 и 23611.
4558 CALL 1067 ;проверка второго символа строки
LD BC,2 ;по умолчанию печатать в поток 2
LD (23771),BC
JR Z,4163 ;если второй символ строки ENTER, то вывод каталога
CP "#" ;если второй символ строки "#" ?
JR NZ,4600 ;если нет, то установка дисковода
LD (23645),HL;установка CH_ADD
CALL 7691 ;прием номера потока
CALL 7564 ;берем текущий символ
CP 13 ;это ENTER ?
JR Z,4163 ;если да, то вывод каталога
CP "," ;это "," ?
JP NZ,7450 ;если нет, то ошибка
CALL 7722 ;следующий символ
CALL 7613 ;прием имени дисковода на стек калькулятора
JR 4603 ;установка дисковода
4600 CALL 7647 ;установка CH_ADD и прием имени дисковода на стек
калькулятора
4603 CALL 7541 ;если идет проверка на синтаксис, то возврат
CALL 7605 ;снятие имени дисковода со стека калькулятора
EX DE,HL ;переброска его адреса в HL
CALL 7297 ;установка дисковода
4613 CALL 7541 ;если идет проверка на синтаксис, то возврат
LD A,(23798) ;загрузка имени дисковода в 23801
LD (23801),A
CALL 1029 ;настройка на диск
LD A,(23771) ;берем номер потока
CP 2 ;это 2 ?
PUSH AF ;сохраняем его
CALL Z,7555 ;если да, то очистка экрана
POP AF ;восстановление номера потока
CP 17 ;он больше 16 ?
JP NC,7450 ;если да,то ошибка
CALL 7556 ;открытие потока
LD A,255 ;буфер не убирать, память не изменять
LD (23800),A
CALL 4433 ;выделение памяти в рабочей области
LD HL,24070 ;начало описателя диска в буфере
LD DE,(23759);берем адрес WORKSP
LD BC,32 ;длина описателя диска
LDIR ;сохранение описателя диска
CALL 1000 ;загрузка в буфер сектора 0 дорожки 0
LD HL,23845 ;адрес буфера
PUSH HL ;сохранение его
4670 LD HL,4275 ;адрес сообщения TITLE:
PUSH BC ;сохранение BC
RST 24 ;печать TITLE:
LD HL,(23759);берем адрес WORKSP
LD BC,20 ;20-й байт
ADD HL,BC
RST 24 ;печать имени диска
LD HL,4282 ;печать DISC DRIVE:
RST 24
LD A,(23798) ;берем номер дисковода
ADD A,"A" ;вычисление имени дисковода
CALL 15746 ;печать его
CALL 15744 ;перевод строки
LD HL,(23759);3-й байт описателя диска
LD BC,3
ADD HL,BC
LD A,(HL) ;берем количество файлов на диске
LD HL,(23759);19-й байт
LD BC,19
ADD HL,BC
SUB (HL) ;вычисление количества нестертых файлов
PUSH HL ;сохранение адреса 19-го байта описателя диска
CALL 7587 ;печать количества нестертых файлов
LD HL,4266 ;печать FILE(S)
RST 24
LD HL,(23759);2-й байт описателя диска
LD BC,2
ADD HL,BC
LD A,(HL) ;берем тип диска
LD HL,4302 ;адрес сообщения 40 TRACKS,S.SIDE
CP 25 ;это 25 ?
JR Z,4754 ;если да, то печать сообщения
LD HL,4322 ;адрес сообщения 80 TRACKS,S.SIDE
CP 24 ;это 24 ?
JR Z,4754 ;если да, то печать сообщения
LD HL,4342 ;адрес сообщения 40 TRACKS,D.SIDE
CP 23 ;это 23 ?
JR Z,4754 ;если да, то печать сообщения
LD HL,4362 ;адpес сообщения 80 TRACKS,D.SIDE
4754 RST 24 ;печать сообщения
POP HL ;восстановление адреса 19-го байта описателя диска
LD C,(HL) ;берем количество стертых файлов
CALL 7588 ;печать его
LD HL,4261 ;печать DEL.FILES
RST 24
LD HL,4382 ;печать FREE SECTORS:
RST 24
LD HL,(23759);4-й байт
LD BC,4
ADD HL,BC
LD C,(HL) ;берем количество свободных секторов
INC HL
LD B,(HL)
CALL 7593 ;печать его
LD HL,4398 ;печать FILE NAME,START,LENGTH,LINE
RST 24
POP BC ;восстановление BC и текущего адреса в буфеpе
POP HL
LD B,16 ;печатать информацию о 16 файлах
4789 CALL 4528 ;проверка достижения конца буфера
CALL 15744 ;перевод строки
PUSH BC ;сохранение количества оставшихся файлов
PUSH HL ;и текущего адреса в буфеpе
CALL 10552 ;печать имени и расширения файла
LD BC,13 ;13-й байт описателя файла
POP HL ;восстановление текущего адреса в буфере
ADD HL,BC
LD C,(HL) ;берем размер файла в секторах
PUSH BC ;сохраняем его
LD A,C ;загружаем его в C
LD B,2 ;печатать 2 пробела перед числом
CP 10 ;длина файла меньше 10 секторов ?
JR C,4816 ;если да, то печать пробелов
DEC B ;печатать один пробел
4816 CP 100 ;длина файла меньше 100 сектоpов ?
JR NC,4825 ;если нет, то пробелы не печатать
4820 LD A," " ;печать пробелов
RST 16
DJNZ 4820
4825 POP BC ;восстановление длины файла в секторах
CALL 7593 ;печать ее
LD HL,4298 ;16 пробелов
RST 24
POP HL ;восстановление адреса описателя файла в буфере
PUSH HL ;и снова сохранение его
LD BC,9 ;9-й байт описателя
ADD HL,BC
LD E,(HL) ;берем адрес загрузки файла
INC HL
LD D,(HL)
PUSH HL ;сохранение текущего адреса в описателе файла
EX DE,HL ;переброска адреса загрузки файла в HL
CALL 4445 ;печать его
LD A," " ;пробел
CALL 15746
POP HL ;восстановление текущего адреса в описателе файла
INC HL ;следующий адрес
LD E,(HL) ;берем длину файла
INC HL
LD D,(HL)
EX DE,HL ;перенос ее в HL
CALL 4445 ;печать ее
POP HL ;восстановление адреса описателя файла
PUSH HL ;и снова сохранение его
LD BC,8 ;8-й байт
ADD HL,BC
LD A,(HL) ;берем расширение файла
CP "B" ;это "B" ?
CALL Z,4891 ;если да, то печать строки автозапуска
POP HL ;восстановление адреса описателя файла
POP BC ;и счетчика файлов
LD DE,16 ;адрес следующего описателя файла
ADD HL,DE
DJNZ 4789 ;повтор до конца
PUSH HL ;сохранение адреса описателя файла
CALL 15744 ;2 раза перевод строки
CALL 15744
JP 4760 ;повтор с самого начала
────────────────────────────────────────────────────────────────
Адрес 4891. Печать строки автостарта прогpаммы на бейсике. В HL
Поместите адрес описателя файла плюс 8 и установите 23759.
4891 LD BC,5 ;берем адрес длины файла в секторах
ADD HL,BC
LD B,(HL) ;берем эту длину
INC HL ;следующий адрес в описателе
LD E,(HL) ;берем адрес файла на диске
INC HL
LD D,(HL)
DEC B ;загружать будем 2 сектоpа
JR Z,4917
DEC B
JR Z,4917 ;если длина файла не больше 2-х секторов, то загрузка
секторов
LD A,16 ;на дорожке 16 секторов
4908 INC E ;следующий сектор
CP E ;конец дорожки ?
JR NZ,4915 ;если да, то
LD E,0 ;следующий сектор 0
INC D ;и берем следующую дорожку
4915 DJNZ 4908 ;повтор до конца
4917 LD HL,(23759);берем адрес рабочей области
LD BC,33 ;33 байта уже заняты
ADD HL,BC
LD B,2 ;загружать 2 сектора
PUSH HL ;сохранение адреса загрузки секторов
CALL 7741 ;загрузка секторов
LD A,128 ;будем искать конец программы
POP HL ;восстановление адреса секторов в памяти
LD BC,512 ;длина области - 512 байтов
CPIR ;поиск конца программы
LD A,(HL) ;берем следующий байт
CP 170 ;это 170 ?
RET NZ ;если нет, то возврат
INC HL ;берем номер строки автостарта
LD C,(HL)
INC HL
LD B,(HL)
LD A,B ;это 0 ?
OR C
RET Z ;если да, то возврат
PUSH BC ;сохранение номера строки автостарта
LD A," " ;печать пробела
CALL 15746
POP BC ;восстановление номера строки автостарта
CALL 7593 ;печать его
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 4960. Выполнение команды COPY S. Установите 23825 и 23611.
4960 CALL 7621 ;установка CH_ADD
CALL 7722 ;следующий символ
CALL 7613 ;прием имени файла на стек калькулятора
CALL 7541 ;если идет проверка на синтаксис, то возврат
CALL 5743 ;резервирование места в памяти
LD HL,10154 ;печать INSERT SOURCE DISC
CALL 9991
4981 CALL 4178 ;ввод символа с клавиатуры
CP "Y" ;это Y ?
JR NZ,4981 ;если нет, то повтор
CALL 7583 ;очистка низа экрана
CALL 4142 ;прием расширения файла
CALL 7344 ;установка имени файла
JP NZ,985 ;если такого файла нет, то ошибка
CALL 5047 ;копирование файла
LD A,(23781);расширение файла # ?
CP "#"
JP NZ,993 ;если нет, то O.K.
5011 LD A,10 ;файл искать по 10 символам
LD (23814),A
LD HL,23782 ;следующий блок
INC (HL)
CALL 7575 ;очистка экрана
LD HL,10154 ;печать INSERT SOURCE DISC
CALL 9991
5029 CALL 4178 ;ввод клавиши
CP "Y" ;это Y ?
JR NZ,5029 ;если да, то повтор
CALL 7347 ;поиск блока
JP NZ,993 ;если не нашли, то O.K.
CALL 5047 ;копирование блока
JR 5011 ;повтор
────────────────────────────────────────────────────────────────
Адрес 5047. Копирование файла при одном дисководе. Номер файла
поместите в регистр C.
5047 CALL 5725 ;чтение описателя файла
LD HL,23782 ;сохранение его части
LD DE,23789
LD BC,7
LDIR
LD A,(23793) ;установка объема файла в секторах
LD (23824),A
CALL 1029 ;настройка на диск
CALL 15889 ;сохранение режима дисковода
LD (23769),A
LD A,255 ;первый проход
LD (23841),A
Внимание!!! Эта переменная уже занята. В ней хранятся первые 3
символа командной строки.
CALL 5201 ;копирование файла
LD HL,(23839) ;берем адрес файла на диске - приемнике
LD (23787),HL ;устанавливаем его
LD HL,(23698) ;берем новый адрес свободного места на диске
LD (24070),HL ;устанавливаем его
LD HL,24073 ;записали 1 файл
INC (HL)
LD C,(HL) ;берем номер файла
DEC C
LD B,0 ;переводим его в двухбайтную форму
PUSH BC ;сохраняем его
LD DE,9 ;записывать сектор 8 дорожки 0
LD (23796),DE
CALL 7747 ;запись сектора
POP BC ;восстановление номера файла
CALL 5739 ;чтение и замена описателя файла
CALL 7747 ;запись сектора с описателем
RET ;возврат