ZX-Ревю 1997 №1-2 1997 г.

Возвращаясь к напечатанному - в недавно выпущенной нами книге П.Федина "Полное описание и полный дизассемблер TR DOS 5.04 (5.03)" из-за технологической ошибки не был напечатан последний файл полного дизассемблера.


возвращаясь к напечатанному

В недавно выпущенной нами книге П.Федина "Полное описание и полный дизассемблер 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 - адрес его ячейки).

LD

DEC

JR

DEC

JR

RET

15871 15873

возвращаясь к напечатанному

Адрес 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. Определение времени перемещения головки дисковода.

DE,23802

15880 LD

LD ADD

LD RET

HL,(23798) HL.DE

A,(HL)

15883

;берем адрес ячейки с временем перемещения головки ;начнем с наименьшего ;4 попытки

{установка времени перемещения головки

восстановление

15894 CALL 15880

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

15901

позиционирование на дорожку 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 в регистр В надо поместить время перемещения головки дисковода, иначе команда, которая выполнится перед проверкой зависит от содержимого регистра В на входе в подпрограмму и последствия могут быть весьма плачевными.

AND LD IN LD

CALL

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

16251

16276

;печать 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

16288

16301

возвращаясь к напечатанному

ется также с адреса 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

{повтор




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Железячки - обзор некоторых современных контроллеров для работы с внешними накопителями информации для ZX-Spectrum.
Coding - О пользе макросов или TASM 4.12 - RULEZ!
Реклама - Реклама и объявления ...
ANOTHER WORLD - Новости из мира Амиги.
Оттяг - Тест "Ты случайно не тупая задница".

В этот день...   25 апреля