возвращаясь к напечатанному
В недавно выпущенной нами книге П.Федина "Полное описание и полный дизассемблер TR DOS 5.04 (5.03)" из-за технологической ошибки не был напечатан последний файл полного дизассемблера. Приносим автору и читателям свои извинения и исправляем допущенную оплошность. Итак: Адрес 15361. То же, что и 15665. 15361 JR 15366 Адрес 15364. То же, что и 15642 15364 JR 15369 Адрес 15366. То же, что и 15665. 15366 JP 15616 Адрес 15369. То же, что и 15642. 15369 JP 15619 Адрес 15610. То же, что и 8433. 15610 JP 8433
Адрег 15613. То же, что и 15635, но не переключает ПЗУ 15613 JP 10300 Адрес 15616. Вход в TR-DOS. => Переключает ПЗУ
15616 NOP
JR 15665 Адрес 15619. Выполнение команд TR-DOS из бейсика. => Установите CH ADD на префикс :REM: перед командой. Возвращает
в ВС код ошибки. Переключает ПЗУ 15619 NOP
JR 15642 Адрес 15622. Подпрограмма ввода из файла данных.
=> Переключает ПЗУ. При вызове из редактора вводит всю строку и производит выход из редактора, иначе возвращает в А символ из файла.
15622 NOP
JP 9711
Адрес 15626. То же, что и 15629, но не переключает ПЗУ 15626 JP 9290
Адрес 15629. Подпрограмма вывода в файл данных.
=> Символ поместите в аккумулятор. Используется также с адреса 15630. Обе точки входа переключают ПЗУ
15629 NOP
15630 JR 15626
возвращаясь к напечатанному
Адрес 15632. То же, что и 8433. => Переключает ПЗУ. 15632 NOP
JR 15610
Адрес 15635. Переход на подпрограмму вызова подпрограмм TR-DOS
из машинного кода.
=> Адрес является переключателем.
15635 NOP
JR 15613
Адрес 15638. Переход на подпрограмму обработки ошибок. => Адрес является переключателем. 15638 NOP
JP 12137
Адрес 15642. То же, что и 15619, но не переключает ПЗУ 15642 CALL 15649 ;создание системных переменных TR-
DOS
PUSH HL помещение на стек адреса переключателя ПЗУ на бейсик JP 364 выполнение команды Адрес 15649. Создание области системных переменных TR-DOS, если ее нет.
=> В HL помещается 23746.
15649 CALL 12787 ;проверка наличия области системных переменных
NOP NOP
CALL С, 15692 ;если ее нет, то создание ее LD HL,23746 ;загрузка в HL адреса переключателя
ПЗУ на бейсик RET ; возврат
Адрес 15663. Переключение пзу на TR-DOS и переход на любой адрес. => Адрес поместите на стек 15663 NOP RET
Адрес 15665. Вход в TR-DOS.
15665 CALL 15649 ;создание области системных переменных
PUSH HL помещение на стек адреса переключателя ПЗУ на бейсик JP 569 ;вход в TR-DOS
15684
XOR |
A |
интерфейс-1 есть? |
OUT |
(247),A |
|
IN |
A,(247) |
|
CP |
30 |
|
JR |
Z, 15684 |
;если да, то создание его системных переменных |
CP |
31 |
|
RET |
NZ |
;если нет, то возврат |
RST |
8 |
;создание системных переменных интерфейса-1 |
DEFB |
#31 |
|
LD |
A,1 |
;по команде SAVE записывать 1 копию |
LD |
(23791), A |
|
RET |
|
; возврат |
Адрес 15692. Создание системных переменных TR-DOS. => При наличии интерфейса-1 перед созданием переменных TR-DOS создаются его переменные ив 23791 помещается 1. В переменные TR-DOS помещаются:
• в 23802 - 23804, 23752 - 23754, 23610, 23830 и 23820 - 255;
• в 23831, 23833, 23832, 23823 и 23839 - 0;
• в 23746 - 201.
Также в системный регистр помещается 255, а на ВГ93 выдается команда прерывания. Подпрограмма портит ячейки памяти калькулятора.
15692
возвращаясь к напечатанному
JP 23698 ;запуск подпрограммы
Адрес 15719. Создание системных переменных TR-DOS. => В переменные помещаются:
• в 23802 - 23805, 23752 - 23755, 23610, 23830 и 23820 - 255;
• в 23831, 23833, 23832, 23823 и 23839 - 0;
• в 23746 - 201.
Также в системный регистр помещается 255, а на ВГ93 выдается команда прерывания.
15719
LD |
HL.12176 |
;адрес возврата из пзу бейсика |
PUSH |
HL |
помещение его на стек |
LD |
HL, 15663 |
;адрес переключателя ПЗУ на TR- |
|
|
DOS |
PUSH |
HL |
;помещение его на стек |
LD |
HL.5717 |
;адрес подпрограммы MAKE_ROOM |
|
|
из ПЗУ бейсика |
PUSH |
HL |
помещение его на стек |
LD |
HL.23551 |
;адрес переключателя ПЗУ на бейсик |
PUSH |
HL |
помещение его на стек |
LD |
(HL),201 |
;помещение в озу команды RET |
LD |
HL,23773 |
начальный адрес области системных |
|
|
переменных |
LD |
ВС,112 |
;длина ее |
RET |
|
;запуск подпрограммы MAKE_ROOM |
Адрес 15744. Перевод строки.
=> Используется также с адреса 15746 (печать символа из аккумулятора). Также эта подпрограмма ошибочно используется с адреса 15755 подпрограммой 1270.
15744 |
LD |
A,13 |
;символ ENTER |
15746 |
PUSH |
HL |
^охранение регистров |
|
PUSH |
ВС |
|
|
PUSH |
DE |
|
|
PUSH |
AF |
^охранение символа |
|
CALL |
8433 |
изменение памяти |
|
POP |
AF |
восстановление символа |
15754 |
CALL |
15764 |
; печать символа |
|
CALL |
8433 |
восстановление памяти |
|
POP |
DE |
восстановление регистров |
|
POP |
ВС |
|
|
POP |
HL |
|
|
RET |
|
; возврат |
Адрес 15764. Печать символа без изменения памяти. => Символ поместите в аккумулятор.
15764 RST 32
DEFW #0010 RET
Адрес 15768. Восстановление с оокиданием INTRQ. => Используется также с адреса 15770 (отдача команды из per. А с ожиданием INTRQ).
15768 |
LD |
A.8 |
восстановление |
15770 |
OUT |
(31),A |
|
15772 |
PUSH |
HL |
^охранение HL |
|
RST |
32 |
;проверка нажатия BREAK |
|
DEFW |
#1F54 |
|
|
JR |
C, 15781 |
;если нажато, то сообщение *BREAK* |
|
RST |
32 |
|
|
DEFW |
#1B7B |
|
15781 |
POP |
HL |
восстановление HL |
|
IN |
A,(255) |
;INTRQ поступил ? |
|
AND |
128 |
|
|
JR |
Z, 15772 |
;если нет, то повтор |
|
RET |
|
; возврат |
Адрес 15789. Проверка наличия диска в дисководе. => Никаких установок не требуется.
LD |
A,8 |
;команда восстановления |
CALL |
15770 |
;выдача команды и ожидание INTRQ |
LD |
DE.O |
;за 65536 проходов индексный сигнал |
|
|
должен измениться |
IN |
A,(31) |
;берем индексный сигнал для образ |
|
|
ца |
AND |
2 |
|
LD |
B,A |
;запоминаем его |
IN |
A,(31) |
;берем его снова |
AND |
2 |
|
CP |
В |
;он изменился ? |
RET |
NZ |
;если да, то возврат |
INC |
DE |
следующая попытка |
LD |
A,E |
;попьпки кончились |
OR |
D |
|
JR |
NZ, 15802 |
;если нет, то повтор |
JP |
16103 |
;обработка ошибки NO DISC |
Адрес 15816. Выбор дисковода, определенного по умолчанию. => Вход: можно установить время перемещения головки и режим дисковода согласно описанию команды #01.
возвращаясь к напечатанному
Выход: эти переменные могут быть изменены согласно этому описанию. Используется также с адресов:
• 15819 выбор дисковода. Номер задайте в per. А, остальное как и для предыдущей подпрограммы.
• 15869 - задержка в 725779 тактов.
• 15871 - задержка любой нужной длительности. В per. А установите число, определяющее длительность задержки.
15865
дттштш, ФшаёквШ Не проверяется количество сторон дисковода и предполагается, что он односторонний.
15866 CALL 7734 ;проверка индексной области диска 15869 LD А,0 ;задержка в 725779 тактов
15816
15819
LD |
A,(23833) |
; берем номер дисковода по умолча |
|
|
нию |
LD |
(23798),A |
установка номера выбранного дис |
|
|
ковода |
LD |
HL.23830 |
; выбор дисковода |
LD |
C.A |
|
LD |
A,60 |
|
OR |
С |
|
OUT |
(255),A |
|
LD |
(HL),A |
|
CALL |
15880 |
;берем время перемещения головки |
|
|
дисковода |
AND |
128 |
;бит 7 выключен ? |
JR |
Z, 15866 |
;если да, то инициализацию не про |
|
|
водим |
CALL |
15789 |
;проверка наличия диска в дисководе |
CALL |
15894 |
определение времени перемещения |
|
|
головки дисковода |
CALL |
15889 |
;берем тип дисковода |
CP |
255 |
;в этой переменной 255 ? |
JR |
Z, 15866 |
;если да. то не определяем его |
PUSH |
HL |
{сохраняем адрес переменной с ти |
|
|
пом дисковода |
CALL |
8138 |
{определение количества дорожек |
|
|
дисковода |
POP |
HL |
{восстановление адреса переменной |
|
|
типа |
CP |
80 |
{установка этой переменной |
LD |
A,0 |
|
JR |
NZ, 15865 |
|
LD |
A, 128 |
|
LD |
(HL),A |
|
возвращаясь к напечатанному
С,255 С
NZ, 15873 А
NZ, 15871
; возврат
Адрf.r 1.5880. Выборка времени перемещения головки текущего дисковода.
=> Установите 23798. На выходе в А будет время перемещения головки дисковода, а в HL - адрес, по которому оно находится. Используется также с адреса 15883 (выборка параметра дисковода; в DE поместите адрес таблицы параметров и установите 23798; На выходе в А будет параметр, в HL - адрес его ячейки).
возвращаясь к напечатанному
Адрес 15672. Проверка наличия интерфейса-1.
=> В случае его обнаружения происходит создание его системных переменных и в 23793 помещается 1. Для работы подпрограмма должна быть перемещена в любое место ОЗУ.
15672
XOR |
A |
;выбор дисковода А: и сброс ВГ93 |
OUT |
(255),A |
|
IN |
A,(246) |
;это ничего не дает |
LD |
HL, 15672 |
;адрес подпрограммы проверки на |
|
|
личия интерфейса-1 |
LD |
DE,23698 |
; любой свободный адрес, ОЗУ |
LD |
ВС,20 |
;длина подпрограммы |
LDIR |
|
;перенос подпрограммы в ОЗУ |
LD |
HL.15719 |
;адрес возврата из подпрограммы |
PUSH |
HL |
;помещение его на стек |
LD |
HL, 15663 |
;адрес переключателя ПЗУ на TR- |
|
|
DOS |
PUSH |
HL |
помещение его на стек |
;берем адрес таблицы скоростей пе ремещения головок ;смещение равно номеру дисковода вычисление адреса ячейки с параметром
;берем оттуда параметр ;возврат
Адрес 15889. Выборка типа дисковода. => Вход: установите 23798.
=> Выход: в А тип дисковода, в HL - адрес его ячейки. 15889 LD DE,23752 ;берем адрес таблицы типов дисководов
JR 15883 ;выборка параметра и возврат Адрес 15894. Определение времени перемещения головки дисковода.
;берем адрес ячейки с временем перемещения головки ;начнем с наименьшего ;4 попытки
{установка времени перемещения головки
восстановление
LD LD LD
LD
CALL
LD
LD
CALL
LD
LD
B,8
C,4 (HL),B
A,8 15770
A,32
B.11 15940 B,(HL) A,1
позиционирование на дорожку 32
;берем время перемещения головки позиционирование на дорожку 1 с заданным временем
CALL 15940
|
возвращаясь к напечатанному |
IN |
A,(31) |
; головка на дорожке 0 ? |
AND |
4 |
|
JR |
NZ, 15935 ;если да, то ошибка |
XOR |
А |
{позиционирование на дорожку 0 |
IN |
А,(31) |
;головка на дорожке 0 ? |
AND |
4 |
|
RET |
NZ |
;если да, то возврат |
15935 INC |
В |
{увеличение времени перемещения |
|
|
головки на 1 |
DEC |
С |
{следующая попытка |
RET |
Z |
{если попытки кончились, то возврат |
JR |
15901 |
{повтор |
Адрес 15940. Позиционирование. |
=> В А поместите физический номер дорожки, в В - время перемеще |
ния головки и выберите |
сторону. |
15940 OUT |
(127), А |
{помещение номера дорожки в регистр |
|
|
данных |
LD |
А,В |
{получение команды позиционирования |
OR |
24 |
|
JP |
2048 |
{позиционирование с быстрой скоро |
|
|
стью |
Внимание!!! Здесь нужно JP 15070, т.к. 2048 гасит биты скорости |
перемещения головки дисковода, следовательно позиционирование рабо |
тает только с быстрой скоростью. |
Адрес 15948. Позиционирование. |
=> На входе в А должен быть физический номер дорожки, а в В - время |
перемещения головки дисковода. |
15948 OUT |
(127), А |
{загрузка номера дорожки в регистр |
|
|
данных |
PUSH |
ВС |
{сохранение времени перемещения |
|
|
головки дисковода |
LD |
В,А |
{головка уже спозиционирована ? |
IN |
А,(63) |
|
CP |
В |
|
POP |
ВС |
{восстановление времени перемеще |
|
|
ния головки |
PUSH |
AF |
{сохранение результата проверки |
LD |
А,В |
{получение команды позиционирова |
|
|
ния |
OR |
24 |
|
CALL |
2048 |
{преобразование и выдача команды и |
ожидание INTRQ
возвращаясь к напечатанному
ВншмншеШ Позиционирование осуществляется только с быстрой скоростью перемещения головки, т.к. в 2048 используется AND 252. Для исправления ситуации здесь нужно поставить JP 15770.
POP |
AF |
восстановление результата проверки поло |
|
|
жения головки |
RET |
Z |
;если головка была спозиционирована, то |
|
|
возврат |
PUSH |
ВС |
^охранение времени перемещения головки ? |
CALL |
15869 |
;задержка в 725779 тактов |
POP |
ВС |
{восстановление времени перемещения го |
|
|
ловки |
RET |
|
{возврат |
Адрес 15971. Позиционирование головки дисковода. => Вход: в per. А установите логический номер требуемой дорожки и установите 23757. На выходе 23757 обнуляется. Используется также с адреса 16032 (задержка в 2168937 тактов). 15971
16002 16003
LD |
C,A |
{загрузка номера дорожки в регистр с* |
CALL |
8171 |
и
;выбор верхней стороны диска |
CALL |
15889 |
;берем тип дисковода |
AND |
2 |
;дисковод двухсторонний ? |
CALL |
NZ, 16042 |
;если да, то выбор стороны |
PUSH |
ВС |
;сохраним номер дорожки |
BIT |
7,(HL) |
.дисковод 40-дорожечный ? |
JR |
Z, 16003 |
;если да, то номера дорожек не ме |
|
|
няем |
BIT |
0,(HL) |
;используем только 40 дорожек ? |
JR |
NZ, 16003 |
;если нет, то номера дорожек не |
|
|
меняем |
IN |
A,(63) |
;берем номер текущей дорожки |
CP |
С |
;головка уже спозиционирована ? |
JR |
Z, 16002 |
;если да, то номера дорожек не ме |
|
|
няем |
RLCA |
|
;делим номер текущей дорожки на 2 |
OUT |
(63),A |
|
LD |
А,С |
;делим номер требуемой дорожки на
о |
RLCA |
|
с |
LD |
С,A |
|
CALL |
15880 |
;берем время перемещения головки |
|
|
дисковода |
LD |
В,A |
|
IN |
A,(63) |
;головка уже спозиционирована ? |
возвращаясь к напечатанному
16032 16034
СР |
С |
PUSH |
ВС |
CALL |
NZ, 15869 |
POP |
ВС |
LD |
А,С |
CALL |
15948 |
POP |
ВС |
LD |
А,С |
OUT |
(63),A |
LD |
A,(23757) |
OR |
A |
RET |
Z |
XOR |
A |
LD |
(23757),A |
LD |
B.3 |
LD |
A,255 |
CALL |
15871 |
DJNZ |
16034 |
RET |
|
LD |
А,С |
OR |
A |
RRA |
|
LD |
C.A |
RET |
NC |
JP |
8182 |
;сохраним номер требуемой дорожки
;если головка не спозиционирована, то задержка в 725779 тактов восстановление номера требуемой дорожки
позиционирование восстановление номера требуемой дорожки
установка регистра дорожки
;нужна задержка после операции ?
;если нет, то возврат ;в следующий раз задержка не понадобится
;задержка в 2168937 тактов
; возврат
Адрес 16042. Выбор стороны при позиционировании. => Вход: в С поместите логический номер дорожки и выберите верхнюю сторону диска.
=> Выход: будет выбрана сторона, а в С будет физический номер дорожки.
16042 LD А.С ;деление номера дорожки на 2
;если номер дорожки был четный, то возврат
;иначе выбор нижней стороны диска Адрес 16050. Проверка индексной области дорожки. => Установите 23761 и поместите в В время перемещения головки дисковода. Выбирается верхняя сторона и при ошибке в 23831 помещается 255. В регистр Н помещается номер текущей дорожки. Используется также с адреса 16103 (обработка ошибки NO DISC). 16050 CALL 8171 ;выбор верхней стороны диска
IN_А,(31)_;берем состояние контроллера_
возвращаясь к напечатанному
{сохранение флага готовности
{берем номер текущей дорожки ;на случай возврата {преобразование и выполнение команды из per. В
tmrntmit!!! Перед CALL 15940 в регистр В надо поместить время перемещения головки дисковода, иначе команда, которая выполнится перед проверкой зависит от содержимого регистра В на входе в подпрограмму и последствия могут быть весьма плачевными.
128
(23757),A A,(63) H,A 15940
16078
16103
LD |
C.127 |
{адрес регистра данных |
LD |
D,1 |
{число,определяющее количество |
|
|
попыток |
DI |
|
{запрет прерываний |
LD |
A, 192 |
{чтение индексной области |
OUT |
(31). A |
|
PUSH |
ВС |
{сохранение адреса регистра дан |
|
|
ных |
LD |
B,3 |
{определяем количество попыток |
IN |
A,(255) |
{берем состояние сигналов DRQ и |
|
|
INTRQ |
AND |
192 |
|
JR |
NZ,16144 |
{если какой-нибудь сигнал поступил |
|
|
то начало чтения |
INC |
DE |
{следующая попытка |
LD |
A,E |
|
OR |
D |
|
JR |
NZ, 16078 |
|
DJNZ |
16078 |
{повтор до конца попыток |
POP |
ВС |
{восстановление адреса регистра |
|
|
данных |
El |
|
{разрешение прерываний |
LD |
A,208 |
{остановка контроллера |
OUT |
(31),A |
|
UX |
A,(23761) |
{ошибку игнорировать ? |
чвилШ Надо LD A,(23831). |
CP |
255 |
|
RET |
Z |
{если да, то возврат |
CALL |
10027 |
{установка ТАРЕ LOADING ERROR |
LD |
A.255 |
;в следующий раз ошибку игнориро |
|
|
вать |
LD |
(23831),A |
|
JP |
10011 |
{обработка ошибки NO DISC |
возвращаясь к напечатанному
16114 POP |
ВС |
{восстановление адреса регистра данных |
IN |
H,(C) |
{чтение первого байта |
16117 IN |
А,(255) |
{ожидание какого-нибудь сигнала |
AND |
192 |
|
JR |
Z,16117 |
|
El |
|
;на случай возврата |
Ошибке!!! Так можно потерять байт при чтении. |
RET |
М |
{если поступил INTRQ, то возврат |
Dl |
|
{запрет прерываний |
IN |
А,(127) |
{чтение байта |
JR |
16117 |
{повтор |
Адряг 16130. В комментариях не нуждается. 16130 LD (23807),А RET
Адрдс 16134. Похоже на предыдущее. 16134 LD (23808),HL RET
Адрес 16138. Запись сектора.
=> Спозиционируйте головку и установите 23807 и 23808. 16138 LD А,160 ;команда записи сектора
JR 16144 ;переход к подпрограмме чтения / записи сектора
Адрес 16142. Загрузка сектора.
=> Установите 23807 и 23808 и спозиционируйте головку. Используется также с адреса 16144 (загрузка / запись сектора; установите все для 16142 плюс в А поместите команду чтения или записи сектора).
16142 |
LD |
A, 128 |
{команда чтения сектора |
16144 |
LD |
(23806),A |
{установка команды |
16147 |
LD |
D,10 |
{10 попыток |
16149 |
PUSH |
DE |
{сохранение счетчика попыток |
|
Dl |
|
{запрет прерываний |
|
LD |
A,(23807) |
{установка сектора |
|
INC |
A |
|
|
OUT |
(127),A |
|
|
LD |
HL,(23808) |
{берем адрес чтения / записи |
|
LD |
C,127 |
{берем адрес регистра данных |
|
LD |
A,(23806) |
{отдаем команду |
|
OUT |
(31 ),A |
|
|
CP |
160 |
{была команда записи сектора ? |
|
PUSH |
AF |
|
|
CALL |
Z,16314 |
{если да, то запись данных |
_97/1»% _
возвращаясь к напечатанному
POP AF
CALL NZ, 16341 ;иначе чтение данных POP DE восстановление счетчика попыток
El разрешение прерываний
IN А,(31) ;берем состояние контроллера
LD В,А сохраняем его
AND 127 ;все в порядке ?
RET Z ;если да, то возврат
LD HL, 10712 ;адрес сообщения READ ONLY AND 64 .запрещена запись ?
JR NZ, 16203 ;если да, то переход на обработку ошибки
LD А,В восстановление состояния кон
троллера
AND 4 ;была потеря данных ?
JR Z, 16288 ;если нет, то обработка дисковых ошибок
DEC D .следующая попытка
JR NZ,16149 ;если попытки не кончились, то повтор
10200 LD HL, 10722 ;адрес сообщения DISC ERROR 16203 LD А,208 .команда прерывания
OUT (31).А
LD А,В восстановление состояния кон
троллера
AND 1 ;контроллер был занят ?
JP NZ.16103 ;если да, то обработка ситуации NO DISC
IN А,(63) ;если ошибка произошла в секторе
10 дорожки
OR А ;0, то возврат (игнорирование)
JR NZ, 16223 IN А,(127) CP 10 RET Z
PUSH HL ^охранение адреса сообщения
CALL 7575 ;очистка экрана
POP HL восстановление адреса сообще
ния
RST 24 ;печать сообщения
LD HL, 10771 ;печать TRK: RST 24
_IN_А,(63)__печать номера дорожки
возвращаясь к напечатанному
CALL 7587
LD
RST
IN
CALL
LD
RST
CALL
CP
RET
CP
JR
CP JR
CALL
LD
LD
JP
LD
CALL CALL JP
HL, 10776 24
A,(95) 7587 HL, 10750 24
4178
»|n
Z
"R"
Z, 16276 "A"
NZ, 16251 10027 A,7
(23823),A 467
A,(23797) 15971 16032 16149
;печать SEC:
;печать номера сектора
;печать RETRY,ABORT,IGNORE?
;ввод клавиши ;нажато I ? ;если да, то возврат .нажато R ?
;если да, то перепозиционирование и повтор ; нажато А ?
;если нет, то повтор ввода клавиши установка ТАРЕ LOADING ERROR ;дисковая ошибка
.завершение ;перепозиционирование
;задержка в 2168937 тактов ; повтор
Ошибка!!! Надо JP 16147 для того, чтобы обновить число попыток.
следующая попытка ;если попытки кончились, то обработка DISC ERROR .сохранение счетчика попыток ;берем время перемещения головки дисковода ;оно равно 10 ?
;если нет, то увеличение его на 1
восстановление
;перепозиционирование
восстановление счетчика попыток ;повтор
Адрес 16314. Запись данных на диск.
=> Установите в HL адрес блока данных, в DE - число, определяющее количество циклов, за которое должна начаться запись, в С - адрес регистра данных контроллера и отдайте команду записи. Использу-
DEC JP
PUSH CALL
AND
JR
INC
CALL
LD
CALL
POP
JP
D
Z. 16200 DE
15880 2
NZ. 16301
(HL)
15768
A,(23797)
15971
DE
16149
возвращаясь к напечатанному
ется также с адреса 16330 (то же, что и 16314, но без обработки NO DISC).
16314 |
LD |
B,4 |
{установка количества попыток |
16316 |
IN |
A,(255) |
{поступил какой-нибудь сигнал ? |
|
AND |
192 |
|
|
JR |
NZ, 16337 |
{если да, то начинаем запись |
|
INC |
DE |
{следующая попытка |
|
LD |
A.E |
|
|
OR |
D |
|
|
JR |
NZ,16316 |
|
|
DJNZ |
16316 |
|
|
RET |
|
{если попытки кончились, то возврат |
16330 |
IN |
A,(255) |
{поступил какой-нибудь сигнал ? |
|
AND |
192 |
|
|
JR |
Z, 16330 |
{если нет, то ожидание его |
|
RET |
M |
{если поступил INTRQ, то возврат |
16337 |
OUTI |
|
{вывод байта из вашей области в ре |
|
|
|
гистр данных |
|
JR |
16330 |
{повтор |
Адрес 16341. Чтение данных с диска. |
=> Все установки аналогично подпрограмме 16314, но отдать нужно ко |
манду чтения. Используется также с адреса 16357 (то же, что и |
1634] |
i, но без обработки NO DISC). |
16341 |
LD |
B.4 |
{установка количества попыток |
16343 |
IN |
A,(255) |
{поступило что-нибудь ? |
|
AND |
192 |
|
|
JR |
NZ. 16364 |
{если да, то начинаем читать |
|
INC |
DE |
{следующая попытка |
|
LD |
A.E |
|
|
OR |
D |
|
|
JR |
NZ. 16343 |
|
|
DJNZ |
16343 |
|
|
RET |
|
{если попытки кончились, то возврат |
16357 |
IN |
A,(255) |
{поступил какой-нибудь сигнал ? |
|
AND |
192 |
|
|
JR |
Z, 16357 |
{если нет, то ждем его |
|
RET |
M |
{если это INTRQ, то возврат |
|
INI |
|
{чтение байта |
|
JR |
16357 |
{повтор |