Адрес 7587. Печать числа из регистра A. Используется также с ад-
ресов 7588 (печать числа из регистра C) и 7593 (печать числа из
регистра BC).
7587 LD C,A ;переброска числа в C
7588 LD B,0 ;перевод числа в двухбайтную форму
JP 7593 ;странная команда!
7593 PUSH BC ;сохранение числа
CALL 8433 ;изменение памяти
POP BC ;восстановление числа
RST 24 ;печать числа
DEFW #1A1B
CALL 8433 ;восстановление памяти
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7605. Снятие строки со стека калькулятора. В DE будет ад-
рес строки, в BC - ее длина.
7605 RST 32
DEFW #2BF1
RET
────────────────────────────────────────────────────────────────
Адрес 7613. Помещение строки на стек калькулятора. Установите
23645 на начало строки.
7613 RST 32
DEFW #1C8C
RET
────────────────────────────────────────────────────────────────
Адрес 7617. Помещение числа из BC на стек калькулятора.
7617 RST 32
DEFW #1C82
RET
────────────────────────────────────────────────────────────────
Адрес 7621. Установка CH_ADD на второй символ строки. Установи-
те 23825.
7621 LD HL,(23825);берем адрес строки команды
INC HL ;берем адрес ее второго символа
LD (23645),HL;помещаем его в CH_ADD
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7629. Принятие 2-х строк на стек калькулятора. Поместите в
23825 адрес первой строки.
7629 CALL 7647 ;прием первой строки на стек калькулятора
CALL 7564 ;берем текущий символ
CP "," ;это запятая ?
JP NZ,7450;если нет, то ошибка
CALL 7722 ;следующий символ
CALL 7613 ;прием второй строки на стек калькулятора
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7647. Установка CH_ADD и помещение строки на стек кальку-
лятора. Установите 23825.
7647 CALL 7621 ;установка CH_ADD
JP 7613 ;помещение строки на стек калькулятора
────────────────────────────────────────────────────────────────
Адрес 7653. Принятие одного или двух чисел после символа CODE.
Первое число будет в 23769, второе - в 23771. Если было одно
число, то оно будет в обоих ячейках. Если принято 2 числа, то в
23766 будет 3. На входе установите 23645 и 23611. Используется
также с адреса 7691 (принятие числа; установите 23645 и 23611;
число будет в 23771, а в 23766 будет 3).
7653 CALL 7564 ;берем текущий символ строки
CP 175 ;это CODE ?
RET NZ ;если нет, то возврат
CALL 7547 ;принятие числа на стек калькулятора
JR Z,7675 ;если идет проверка на синтаксис, то дальнейшая проверка
CALL 7609 ;снятие числа со стека калькулятора
LD (23769),BC;установка первого числа
LD (23771),BC
7675 CALL 7564 ;берем текущий символ
CP "," ;это запятая ?
JR Z,9691 ;если да, то принятие второго числа
CP 13 ;это ENTER ?
JP NZ,7450 ;если нет, то ошибка
CALL 7541 ;если строка проверяется на синтаксис, то возврат
RET ;возврат
7691 CALL 7547 ;прием второго числа на стек калькулятора
RET Z ;если проверка на синтаксис, то возврат
CALL 7609 ;снятие числа со стека калькулятора
LD (23771),BC;помещение его в 23771
LD A,3 ;приняли 2 числа
LD (23766),A
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7708. Удаление из командной стpоки пятибайтных чисел
7708 LD HL,(23825);берем адрес строки команды
RST 32 ;удаление из нее пятибайтных чисел
DEFW #11A7
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7715. Выделение пространства в рабочей области. В BC по-
местите длину требуемого пространства.
7715 LD HL,(23649);загрузка HL из 23649
RST 32 ;выделение пространства
DEFW #0030
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7722. Выборка следующего символа строки. Установите 23645.
7722 RST 32
DEFW #0020
RET
────────────────────────────────────────────────────────────────
Адрес 7726. Удаление области памяти. В HL поместите начало об-
ласти, в DE - длину.
7726 RST 32
DEFW #19E8
RET
────────────────────────────────────────────────────────────────
Адрес 7734. Загрузка регистра дорожки. Установите 23761. При вы-
ходе по ошибке в 23831 помещается 255. Можно использовать с адр-
еса 7738 для прямого вывода в порт 63.
7734 CALL 16050;определение номера дорожки, на которой стоит головка
LD A,H ;установка регистра дорожки
7738 OUT (63),A
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7741. Загрузка секторов. Вход: в HL - адрес загрузки,
в D - номер дорожки, в E - номер сектора, в B - кол-во секторов.
7741 XOR A ;признак загрузки
JR 7780;переход к подпрограмме загрузки / записи секторов
────────────────────────────────────────────────────────────────
Адрес 7744. Запись информации о файле. На входе в C должен быть
номер файла. Используется также с адресов:
7747 - запись сектора из буфера. Вход: в 23796 установите номер
сектора+1, а в 23797 - номер дорожки.
7757 - запись секторов. В HL - адрес, в D - номер дорожки, в E -
номер сектора, в B - кол-во секторов.
7780 - загрузка / запись секторов. Предварительные установки
как и для предыдущей подпрограммы плюс в A установите 0 для заг-
рузки или что-нибудь другое для записи.
7744 CALL 5739 ;чтение сектора с описателем файла и замена описателя
7747 LD DE,(23796);берем номер сектора для записи
DEC DE
LD B,1 ;записывать 1 сектор
LD HL,23845 ;записывать будем из буфера
7757 PUSH HL ;сохраним адрес секторов на диске и в памяти
PUSH DE
CALL 15889 ;берем тип дисковода
BIT 7,(HL) ;он 40-дорожечный ?
JR Z,7776 ;если да, то записывать можно
BIT 0,(HL) ;используем 40 дорожек на 80-дорожечном ?
JR NZ,7776 ;если нет, то записывать можно
LD HL,10712 ;адрес сообщения READ ONLY
JP 7465 ;переход на обработку ошибок
Внимание, ошибка!!! В аккумуляторе забыли установить код ошибки.
7776 POP DE ;восстановление адресов секторов
POP HL
7778 LD A,255 ;признак записи
7780 LD (23758),A ;установка признака операции
7783 LD (23796),DE;установка адреса секторов на диске
PUSH BC ;сохранение количества секторов
PUSH HL ;и адреса загрузки / записи
CALL 7734 ;чтение индексной области дорожки
POP HL ;восстановление адреса загрузки / записи
POP BC ;и количества секторов
XOR A ;количество секторов равно 0 ?
OR B
RET Z ;если да, то возврат
7797 PUSH BC ;сохраняем адрес и кол-во секторов
PUSH HL
CALL 16134 ;установка адреса загрузки / записи секторов
LD A,(23796) ;установка номера сектора
CALL 16130
LD A,(23797) ;позиционирование головки на дорожку
CALL 15971
LD A,(23758) ;берем флаг операции
OR A ;загрузка?
PUSH AF
CALL Z,16142 ;если да, то загрузка сектора
POP AF
CALL NZ,16138;иначе запись сектора
POP HL ;берем адрес следующего сектора
LD DE,256
ADD HL,DE
PUSH HL ;сохраняем его
LD A,16 ;на дорожке 16 секторов
LD HL,23796
INC (HL) ;следующий сектор
CP (HL) ;конец дорожки ?
JR NZ,7847 ;если да, то номер следующего сектора 0
LD (HL),0
LD HL,23797 ;и берем следующую дорожку
INC (HL)
7847 POP HL ;восстановление адреса следующего сектора
POP BC ;и количества секторов
DJNZ 7797 ;если не все, то повтор
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7852. Вычисление количества полных секторов файла из его
длины в байтах. В A должно быть количество секторов файла, а в
DE - длина загружаемой части файла.
7852 PUSH HL ;сохранение HL
LD H,A ;берем полную длину файла
LD L,0
PUSH HL ;сохраняем ее
SBC HL,DE ;она меньше длины загрузки ?
CALL C,7868;если да, то загружать весь файл
POP HL ;восстановление полной длины файла
LD A,H ;вычисление количества полных секторов из полной длины файла
POP HL ;восстановление HL
RET C ;если полная длина файла больше длины загрузки,
LD A,D ;то количество полных секторов берем из длины загрузки
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 7868. Обнуление 23766 и установка флага C.
7868 XOR A
LD (23766),A
SCF
RET
────────────────────────────────────────────────────────────────
Адрес 7874. Выполнение команды FORMAT. Установите 23825 и 23611.
Используется также с адреса 7901 (повтор форматирования; устано-
вите 23773).
7874 LD HL,65535
LD (23767),HL;дорожки не проверять
LD (23769),HL;форматировать одну сторону диска
LD (23761),HL;ошибку при чтении адресного маркера игнорировать
CALL 1067 ;следующий символ ENTER ?
JP Z,7450 ;если да, то ошибка
CALL 7647 ;прием имени диска на стек калькулятора
CALL 7541 ;если идет проверка на синтаксис, то возврат
CALL 7255 ;установка имени диска
7901 CALL 12800 ;выбор быстрого или обычного формата
AND 128 ;дисковод 40-дорожечный ?
LD A,40 ;форматировать 40 дорожек
JR Z,7192 ;если дисковод 80-дорожечный,
LD A,80 ;то форматировать 80 дорожек
7192 LD (23767),A ;установка количества дорожек
CALL 15768 ;восстановление
CALL 8182 ;выбор нижней стороны диска
CALL 16032 ;задержка в 2168937 тактов
LD E,1 ;форматирование дорожки с номером 1
CALL 8189
CALL 8171 ;выбор верхней стороны диска
LD E,0 ;форматирование дорожки с номером 0
CALL 8189
LD A,(23773) ;форматировать только одну сторону диска
CP "$"
JR Z,7963 ;если да, то форматирование диска
CALL 8182 ;выбор нижней стороны диска
CALL 16032 ;задержка в 2168937 тактов
CALL 16053 ;чтение адресного маркера
LD A,H ;номер дорожки - 1 ?
CP 1
JR NZ,7963 ;если нет, то форматирование диска
LD A,128 ;форматировать обе стороны диска
LD (23770),A
7963 CALL 8381 ;форматирование диска
LD HL,23845 ;адрес начала буфера
LD (HL),0 ;очистка первого байта
LD DE,23846 ;адрес второго байта буфера
LD BC,255 ;осталось очистить 255 байтов
LDIR ;очистка буфера
LD BC,23767 ;адрес переменной с количеством дорожек
LD DE,23770 ;адрес переменной с количеством сторон
LD A,(BC) ;форматировали 80 дорожек ?
CP 80
JR Z,8009 ;если да, то диск 80-дорожечный
LD A,(DE) ;форматировали 2 стоpоны ?
CP 128
JR Z,8002 ;если да, то диск 40-дорожечный двухстоpонний
LD A,25 ;диск 40-дорожечный односторонний
LD HL,624 ;свободно 624 сектора
JR 8021 ;создание описателя диска
8002 LD A,23 ;диск 40-дорожечный двухсторонний
8004 LD HL,1264 ;свободно 1264 сектора
JR 8021 ;создание описателя диска
8009 LD A,(DE) ;форматировали 2 стороны ?
CP 128
LD A,24 ;если нет, то диск 80-дорожечный односторонний
JR NZ,8004
LD A,22 ;иначе диск 80-дорожечный двухсторонний
LD HL,2544 ;свободно 2544 сектора
8021 LD (24072),A ;установка типа диска
LD (24074),HL;установка количества свободных секторов
LD A,1 ;первая свободная дорожка - 1
LD (24071),A
LD A,16 ;признак принадлежности диска к TR-DOS
LD (24076),A
LD HL,24079 ;9 байтов 32 с адреса 24079
LD DE,24080
LD BC,8
LD (HL),32
LDIR
LD HL,23773 ;установка имени диска
LD DE,24090
LD BC,8
LDIR
CALL 8171 ;выбор верхней стороны диска
LD B,1 ;записать 1 сектор
LD DE,8 ;сектор 8 дорожки 0
LD HL,23845 ;из буфера
CALL 7778 ;запись сектора
LD A,(23766) ;берем количество дефектных секторов
PUSH AF ;сохраняем его
XOR A ;расширение - CHR$ 0
CALL 12996 ;установка расширения и очистка низа экрана
LD HL,(24074);берем количество свободных секторов
LD (23767),HL;сохраняем его
LD HL,23773 ;печать имени диска
RST 24
LD A,13 ;перевод строки
RST 16
LD HL,(23767);восстановление количества свободных секторов
POP AF ;восстановление количества дефектных секторов
PUSH HL ;сохранение количества свободных секторов
LD D,0 ;перевод количества дефектных секторов в
LD E,A ;двухбайтную форму
SBC HL,DE ;вычисление количества хороших секторов
LD B,H ;переброска его в BC
LD C,L
CALL 7593 ;печать его
LD A,"/" ;печать "/"
RST 16
POP BC ;восстановление количества свободных секторов
CALL 7593 ;печать его
JP 12907 ;запрос повтора форматирования
────────────────────────────────────────────────────────────────
Адрес 8121. Таблица секторов для форматирования обычного диска.
Используется также с адреса 8122 для проверки дорожки.
8121 DEFB 1
8122 DEFB 9,2,10,3,11,4,12,5,13,6,14,7,15,8,16,1
────────────────────────────────────────────────────────────────
Адрес 8138. Определение количества дорожек дисковода. Вход: ус-
тановите время перемещения головки дисковода. Выход: в 23767 и
регистре A будет количество дорожек дисковода.
8138 CALL 15880 ;берем время перемещения головки
OR 17 ;позиционирование на дорожку 50
LD B,A
LD A,50
CALL 15940
LD A,2 ;затем на дорожку 2
CALL 15940
CALL 15869 ;задержка в 725779 тактов
IN A,(31) ;головка в исходном положении ?
AND 4
LD A,80 ;если нет, то у дисковода 80 дорожек
JR Z,8167
LD A,40 ;иначе 40
8167 LD (23767),A;установка количества дорожек
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 8171. Выбор верхней стороны диска. Установите 23830. Ис-
пользуется также с адреса 8176 (загрузка системного регистра,
код - в аккумуляторе). Вы можете также использовать с адреса
8179 для прямого вывода в порт 255.
8171 LD A,(23830);берем копию системного регистра
OR 60 ;формат MFM, верхняя сторона, выключение сброса и готовности
8176 LD (23830),A;запоминаем копию системного регистра
8179 OUT (255),A ;установка системного регистра
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 8182. Выбор нижней стороны диска. Установите 23830.
8182 LD A,(23830);берем копию системного регистра
AND 111 ;формат MFM, нижняя сторона, выключение сброса и готовности
JR 8176 ;установка системного регистра
────────────────────────────────────────────────────────────────
Адрес 8189. Форматирование дорожки. В регистр Е поместите ее но-
мер и спозиционируйте головку дисковода. Из переменных установи-
те 23768, 23782, 23784 и обнулите 23766. Используется также с
адреса 8137 (проверка дорожки; установите 23768, 23784 и обнули-
те 23766 и спозиционируйте головку).
8189 DI ;запрет прерываний
LD A,244 ;запись дорожки
OUT (31),A
LD HL,(23782);берем адрес таблицы секторов для форматирования
LD C,127 ;адрес регистра данных
8199 LD B,10 ;10 раз 78 (первый пробел)
LD D,78
CALL 8369 ;запись байта заданное число раз
LD B,12 ;синхропромежуток
LD D,0
CALL 8369
LD B,3 ;синхроимпульс
LD D,245
CALL 8369
LD D,254 ;1 раз 254 (адресная метка идентификатора)
CALL 8367 ;запись байта 1 раз
LD D,E ;номер дорожки
CALL 8367
LD D,0 ;номер стороны (в TR-DOS всегда 0)
CALL 8367
LD D,(HL) ;номер сектора из таблицы
CALL 8367
LD D,1 ;длина сектора - 256 байтов
CALL 8367
LD D,247 ;запись контрольной суммы
CALL 8367
LD B,22 ;второй пробел
LD D,78
CALL 8369
LD B,12 ;синхропромежуток
LD D,0
CALL 8369
LD B,3 ;синхроимпульс
LD D,245
CALL 8369
LD D,251 ;адресная метка данных
CALL 8367
LD B,0 ;данные (256 нулей)
LD D,0
CALL 8369
LD D,247 ;запись контрольной суммы
CALL 8367
LD B,60 ;третий пробел
LD D,78
CALL 8369
LD A,(HL) ;берем адрес номера следующего сектора
INC HL
CP 16 ;конец таблицы ?
JR NZ,8199 ;если нет, то форматирование следующего сектора
LD B,0 ;пробел до конца дорожки
CALL 8369
JP M,8310
CALL 8369
8310 IN A,(31) ;берем состояние контроллера
AND 64 ;запись запрещена ?
JP NZ,16185 ;если да, то сообщение READ ONLY
8317 LD A,(23768) ;дорожку проверять ?
OR A
RET NZ ;если нет, то возврат
Внимание!!! Перед возвратом или выходом по ошибке надо разрешать
прерывания.
LD C,127 ;адрес регистра данных
LD A,E ;установка номера дорожки
OUT (63),A
LD HL,(23784);берем адрес таблицы секторов для проверки
8330 LD B,3 ;3 попытки
LD A,(HL) ;берем номер сектора из таблицы
OUT (95),A ;установка сектора
PUSH HL ;сохранение адреса таблицы секторов
8336 DI ;запрет прерываний
LD A,128 ;чтение сектора
OUT (31),A
PUSH BC ;сохранение количества попыток
CALL 16357 ;чтение данных по адресу из HL (в пзу, не страшно)
IN A,(31) ;все в порядке ?
AND 127
POP BC ;восстановление счетчика попыток
JR Z,8358 ;если все в порядке, то следующий сектор
DJNZ 8336 ;следующая попытка
LD HL,23766 ;есть 1 битый сектор
INC (HL)
8358 POP HL ;восстановление адреса таблицы секторов
LD A,(HL) ;берем номер текущего сектора
INC HL ;берем адрес номера следующего сектора
CP 1 ;конец таблицы ?
JR NZ,8330 ;если нет, то повтор
EI ;разрешение прерываний
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 8367. Запись байта 1 pаз. В регистр D поместите байт, в
C - 127 и выдайте команду записи на вг-93. Используется также с
адреса 8369 (запись байта несколько раз; все для 8367 плюс в B
количество выдач).
8367 LD B,1 ;запись 1 раз
8369 IN A,(255);ожидание DRQ или INTRQ
AND 192
JR Z,8369
RET M ;если поступил INTRQ, то возврат
OUT (C),D ;выдача байта
DJNZ 8369 ;повтор до конца
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 8381. Форматирование диска. Установите 23770, 23767,
23782 и 23784.
8381 LD HL,23767 ;берем число форматируемых дорожек
LD B,(HL)
XOR A ;дорожки проверять
INC HL
LD (HL),A
LD E,255 ;начнем с дорожки 0
PUSH BC ;сохранение количества дорожек
8390 INC E ;следующая дорожка
LD A,E
LD B,27 ;позиционирование
CALL 15940
CALL 8171 ;выбор верхней стороны диска
CALL 13021 ;печать номера дорожки и форматирование ее
LD A,(23770);берем флаг количества сторон
CP 128 ;форматировать 2 стороны ?
JR NZ,8417 ;если да, то
CALL 8182 ;выбор нижней стороны диска
CALL 13071 ;печать номера дорожки и форматирование ее
8417 POP BC ;восстановление количества дорожек
DJNZ 8390 ;если еще не все, то повтор
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 8421. Удаление буфера с изменением памяти. На входе уста-
новите переменные 23734, 23800, 23820 и 23832. Выход: в 23832
записывается 255, а если в 23820 выл 0, то туда также засылается
255. Используется также с адреса 8433 (изменение памяти, работа-
ет только с 23734 и 23832).
8421 PUSH AF ;сохранение AF
LD A,(23800);ничего не делать ?
CP 255
JR Z,8476 ;если да, то возврат
POP AF ;восстановление AF
CALL 10608 ;удаление буфера
8433 PUSH AF ;сохранение AF
LD A,(23734);изменение разрешено ?
CP 244
JR Z,8476 ;если нет, то возврат
XOR A
LD HL,23832 ;подтверждение есть ?
OR (HL)
LD (HL),255 ;в следующий раз подтверждение будет
JR Z,8476 ;если его не было, то возврат
LD A,(23820);буфер есть ?
OR A
LD HL,23747 ;начало первого блока
LD DE,23859 ;начало второго блока
JR NZ,8465 ;если есть буфер, то второй блок смещен на 257
LD DE,24116 ;байтов
8465 LD B,45 ;длина блоков - 45 байтов
8467 LD C,(HL) ;меняем блоки местами
LD A,(DE)
LD (HL),A
LD A,C
LD (DE),A
INC HL
INC DE
DJNZ 8467
8476 POP AF ;восстановление AF
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 8478. Очистка буфера редактора.
8478 LD HL,(23641);берем адрес буфера редактора
LD (HL),13 ;ENTER
LD (23643),HL;установка курсора
INC HL ;конец области
LD (HL),128
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 8490. Восстановление командной строки. Установите 23840.
8490 LD DE,(23641);символы переносить в буфер редактора
LD HL,23840 ;из 23840
CALL 688 ;перенос символов
RET ;возврат
────────────────────────────────────────────────────────────────
Адрес 8501. Принятие команды. Установите 23823 и если там не 0,
то и 23840.
8501 LD A,(23823) ;ошибка была ?
OR A
PUSH AF ;сохранение результата проверки
CALL NZ,8490 ;если да, то восстановление первых трех символов
Не надо этого делать!!! COPY портит буфер по адресу 23840, а бу-
фер редактора всегда остается цел.
POP AF ;восстановление результата проверки
CALL Z,8478 ;если ошибки не было, то стирание старой строки
LD HL,(23641);эта команда тоже не нужна
CALL 15744 ;перевод строки
LD A,(23833) ;берем номер дисковода по умолчанию
ADD A,"A" ;печать его имени
RST 16
LD A,">" ;печать ">"
RST 16
LD HL,23610 ;для нормального выхода из редактора
LD (HL),255
JP 7568 ;ввод команды и возврат