Faultless #03
31 декабря 1995

CPU для Вас - Работа с TR-DOS на уровне машинных кодов.

<b>CPU для Вас</b> - Работа с TR-DOS на уровне машинных кодов.
  ╔══════════════════════════════════════╗
  ║Раздел: CPU для Вас;                  ║
  ║Статья: Работаем с  TR-DOS;           ║
  ║Музыка: Dreamer;                      ║
  ║Текст : Ворожкин Александр.           ║
  ╚══════════════════════════════════════╝

   Работа с TR-DOS на уровне  машинных ко-
  дов.Вход  в  TR-DOS  обеспечивается  при
  чтении  компьютером команды  по  адресам
  #3D00-#3DFF.При этом основное ПЗУ компь-
  ютера отключается, а на его место "подс-
  тавляется" ПЗУ TR-DOS. В нем  по адресам
  #3D00-#3D2E (15610-15663) размещены точ-
  ки входа в подпрограммы TR-DOS. Наиболее
  важные из них приведены ниже.


   HEX     DEC     Выполняемое действие

   #3D00   15616   Выход в TR-DOS
   #3D03   15619   Выход в TR-DOS,выполне-
                   ние команды  TR-DOS  и
                   возврат в SOS
   #3D13   15635   Выполнение внутренних
                   команд TR-DOS,в зависи-
                   мости от содержимого
                   регистра C микропроцес-
                   сора
   #3D2F   15664   Выполнение  подпрограмм
                   TR-DOS,адресуемых через
                   стек.

   Первые две точки  входа общеизвестны  и
  их использование не вызывает особых зат-
  руднений , две последние заслуживают от-
  дельного рассмотрения.После обращения по
  адресу #3D13 выполняется переход  к под-
  программе #283C (10300), которая в зави-
  симости от кода, содержащегося в регист-
  ре C, выполняет  переход на  необходимую
  подпрограмму TR-DOS.

   1.C = #01.Выбор дисковода.Его номер
     указывается в регистре A.При первом
     обращение к данному дисководу проис-
     ходит его инициализация (определяется
     количество дорожек, константа позици-
     рования) и изменяются соответствующие
     системные переменные.

   2.C = #02.Головка устанавливается на
     трек,указанный регистром A.В случае
     двустороннего дисковода трекам 0
     (нижний) и 1 (верхний) соответствует
     первый физический трек,трекам 2 и 3 -
     второй и т.д. Следует отметить,что на
     диске может  быть  не  80  физических
     треков (от 0 до 79),а 82 - 85 в зави-
     симости от конкретного дисковода, что
     используется  некоторыми программами.
     Пример использования этой команды бу-
     дет дан ниже (пример.16).
 
   3.C = #05.Чтение группы секторов. В ре-
     гистре B-количество  считываемых сек-
     торов,D-номер начального трека, E-на-
     чального сектора , HL-адрес буфера, в
     который производится чтение.
      пример 6.

          LD C,#05     ;код команды
          LD B,#10     ;16 секторов
          LD D,#00     ;трек
          LD E,#00     ;сектор
          LD HL,#8000  ;адрес буфера
          CALL #3D13
          RET

   Эта программа прочитает  содержимое ну-
  левого трека в буфер по  адресу 32678.На
  первый взгляд,две последние строчки про-
  граммы  можно  заменить  одной  командой
  JP #3D13 - ведь вызываемая  подпрограмма
  заканчивается RET.Однако такая замена не
  всегда возможна из-за особенностей возв-
  рата после выполнения подпрограмм TR-DOS
  Отключение  ПЗУ  TR-DOS  происходит  при
  чтении процессором кода команды по адре-
  су, большему #3FFF.Если вы будете запус-
  кать предлагаемые примеры из BASIC'а ко-
  мандой  RANDOMIZE USR adr , то возврат
  происходит через точку #2D2B(STACK-BC) в
  основном ПЗУ.Если вы сделаете предлагае-
  мую замену, то программа  будет нормаль-
  но работать при вызове ее из другой про-
  граммы,находящейся в ОЗУ.Если вы вызове-
  те эту программу с помощью USR из BASIC,
  то при возврате не произойдет переключе-
  ние ПЗУ и результат будет таким, как не
  хотелось бы.

   4.C = #06.Запись группы секторов.Пара-
              метры аналогичны операции
              чтения группы секторов.

      Пример 7.

          LD C,#06     ;код команды
          LD B,#10     ;16 секторов
          LD D,#9F     ;трек
          LD E,#00     ;сектор
          LD HL,#8000  ;адрес буфера
          CALL #3D13
          RET
   Эта программа ззпишет содержимое буфера
  по адресу 32768 на последний,159-й трек.
  Так можно, например,сохранить ранее счи-
  танный каталог на случай его порчи. Про-
  читав его затем из 159-го трека  и запи-
  сав на 0-й,можно спасти ценные программы
  Следует  заметить еще  одну  особенность
  команд #05 и #06 - они могут работать не
  только с секторами длиной 256 байт, но и
  с секторами другой длины  (128,512,1024
  байт).Используя особенность,несложно ор-
  ганизовать обмен информацией между   ZX-
  SPECTRUM и другими компьтерами. так мож-
  но читать и писать на диски,используемые
  в компьютерах "СПЕЦИАЛИСТ" ,"ОРИОН-128",
  ДВК (с контроллером MY), а также IBM.од-
  хако в  этих случаях нельзя сразу прочи-
  тать  или записать группу секторов , так
  как секторы длиннее 256 байт  будут нак-
  ладываться в  памяти компьютера  один на
  другой , неудача также постигнет вас при
  попытке считать с диска IBM сектор с но-
  нером 9 - таких там нет (при стандартном
  формате). Выход из этой ситуации прост -
  необходимо  изучить  структуру  "чужого"
  диска и читать  (или писать)  информацию
  по одному  сектору , каждый раз вычисляя
  номер следующего трека и сектора,а также
  адрес буфера.

   5.C = #07. Вывод каталога диска.В реги-
   стре A - номер канала  для вывода ката-
   лога. Предварительно должна быть выпол-
   нена команда #18.

      пример 8.

          LD C,#18     ;код команды
          CALL #3D13   ;
          LD A,#02     ;номер канала
          LD C,#07     ;код команды
          CALL #3D13
          RET

   Эта программа равносильна директиве CAT
  TR-DOS.Если  в  регистр A перед  вызовом
  команды  занести #03 , то каталог  будет
  выведен  на принтер.
   6.C = #08.Чтение информации о файле.В
  регистре A предварительно помещается по-
  рядковый номер файла (0-127).Из каталога
  диска 16 байт переносятся в область сис-
  темных переменных TR-DOS.Не имеет значе-
  ния,стерт ли этот файл или нет и сущест-
  вует ли он вообще.Адреса соответствующих
  системных переменных приведены ниже.

   HEX    DEC    Длина,  назначение
                 байт
 
  #5CDD  23733  8       Имя файла в ASCII
   ...    ...
   #5CE4  23780
   #5CE5  23781  1       Тип файла (A,B,C,
                         D или #) , но , в
                         принципе , может
                         быть  любой  сим-
                         вол,что открывает
                         дополнительные
                         возможности
   #5CE6  23782  2       Стартовый  адрес
                         кодового  файла
                         или  длина  BASIC
                         программы
   #5CE8  23784  2       Длина  файла
   #5CEA  23786  1       Объем  файла  в
                         секторах
   #5CEB  23787  1       Номер  первого
                         сектора  файла
   #5CEC  23788  1       Номер  первого
                         трека файла.
                        
   7.C = #09.Запись информации о файле в
  каталог.Из области системных переменных
  16 байт переписываются в каталог на мес-
  то информации о файле,номер которого за-
  дан в A.

      Пример 9.

          LD A,#20
          LD C,#80
          CALL #3D13
          LD HL,#5CDD
          LD (HL),#41
          LD C,#09
          CALL #3D13
          RET

   Эта программа изменит первый символ в
  имени 32-го файла "A".Если этот файл был
  стертым, то он  "восстановится" , но для
  этого  необходимо  дополнительно  внести
  изменения  также в  8-й  сектор нулевого
  трека.Как это сделать , будет рассказано
  ниже.

   8.C = #0A.Поиск файла  по имени ,задан-
  ному в области системных переменных.
  Номер найденного файла возвращается в
  регистр C.Можно искать файлы по имени
  и типу (9 байт) или по любому  количест-
  ву первых байтов имени (от 1 до 16),сле-
  дует лишь указать  количество символов в
  системной переменной  по  адресу  #5D06
  (23814).

   9.C = #0B.Запись на диск файла.Имя и
  тип файла - в области системных перемен-
  ных,длина - в DE,начальный адрес - в HL.

      Пример 10.

          LD HL,NAME   ;адрес имени файла
          LD C,#13     ;код команды
          CALL #3D13
          LD DE,#1B00
          LD HL,#4000
          LD C,#0B     ;код команды
          CALL #3D13
          RET
   NAME   DEFM "SCR    C" ;имя и тип фай-
                           ла - 9 байт.

   Эта программа перенесет имя и тип файла
  "SCR" CODE (вообще-то переносится 16 , а
  не 9 байт , но последние 7 байт в данном
  случае не имеют значения) в области сис-
  темных переменных  (адреса 23773-23781),
  затем запишет файл на диск.

   10.C = #0C.Запись BASIC программы.Имя и
  тип файла (при типе,отличном от "B",файл
  записывается  под именем "boot") - в об-
  ласти системных переменных.

   11.C = #0E.Чтение / проверка  файла.Имя
  и тип файла - в области системных  пере-
  менных.Адрес  загрузки  файла  берется с
  директории при A = #00  или из регистро-
  вой пары DE при A = #03. При A = #FF ко-
  ды загружаются с адреса HL, причем длина
  загружаемого файла берется из DE.Байт по
  адресу 23801 определяет тип операции:
  #00 - LOAD,#FF - VERIFY.

      Пример 11.

   Предположим,что на диске есть  экранный
  файл с начальным  адресом 16384 и длиной
  6912 байт.

          LD HL,M1
          LD C,#13
          CALL #3D13
          LD C,#0A
          CALL #3D13
          LD A,C
          LD C,#08
          CALL #3D13
          LD A,#00
          LD (#5CF9),A
          LD C,#0E
          CALL #3D13
          RET
   M1     DEFM "SCR   C"

   Эта программа перенесет  имя и тип фай-
  ла "SCR" CODE (9 символов) в облать сис-
  темных переменных  (адреса 23773-23781),
  затем отыщет этот файл в каталоге , про-
  читает информацию о нем из каталога дис-
  ка,а затем прочитает сам файл по данным,
  взятым из каталога.

      Пример 12.

   Добавьте к программе из примера 11 сле-
  дующие строки:

          LD A,#03
          LD HL,#4800
          LD DE,#0800

   Эти строки следует вставлять между

    LD (#5CF9),A и LD C,#0E.

   Запустив теперь программу, вы увидите в
  центре экрана то,что раньше было в верх-
  ней его части.

      Пример 13.

   Если мофифицировать пример 11 следующим
  образом:

    LD A,#FF
    LD HL,#8000

   То программа загрузит весь файл "SCR"
  CODE по адресу 32768.
   Примечание: пример 13 следует вставлять
  в пример 11 между строками:

   LD (#5CF9),A и LD C,#0E.

   12. C = #12.Удаление файлов. Имя  и тип
               файла - в области системных
               переменных. удаляются все
               файлы с такими данными.

      Пример 14.

          LD HL,M1
          LD C,#12
          CALL #3D13
          LD C,#0A
          CALL #3D13
          LD A,C
          LD C,#18
          CALL #3D13
          RET
   M1     DEFM "SCR      C"

   Эта программа найдет на диске файл
  "SCR" CODE и сотрет его.

   13. C = #13.По адресу 23773 переписыва-
               ются 16 байт  информации из
               памяти,адресуемой регистро-
               вой парой HL.

   14. C = #14.Переписываются 16  байт ин-
               формации из области систем-
               ных  переменных  по  адресу
               23773  в  память по адресу,
               указанному в регистровой
               паре HL.

   15. C = #15.Проверка дорожки. Регистр D
               должен содержать номер про-
               веряемого физического трека

   16. C = #16.Загрузка  системного регис-
               тра.Код - в регистре A.Пре-
               дварительно к  нему прибав-
               ляется #3C.
 
   17. C = #17.Выбрать нижнюю сторону.

   18. C = #18.Настройка на диск. Проверя-
  ется тип диска  (8-й сектор директории).
  Точка  #3D2E  открывает  доступ  к любой
  подпрограмме TR-DOS,однако ее  использо-
  вание немного сложнее, чем #3D13.Для на-
  чала вспомним, как микропоцессор Z80 вы-
  полняет команды  CALL_adr и RET. При вы-
  полнении команды CALL_adr в стек записы-
  ваются два байта - адрес команды,следую-
  щей за CALL_adr, затем выполняется пере-
  ход по адресу adr,При выполнении команды
  RET из стека считываются два байта - ад-
  рес, по которому  происходит  возврат из
  подпрограммы.Причем совсем не обязатель-
  но,чтобы эти два  байта были  записаны в
  стек при выполнении команды CALL_adr-они
  могут быть  помещены туда, например, при
  выполнении команды PUSH_dd, где dd - лю-
  бая пара  регистров  микропроцессора.При
  обращении по адресу,соответствующему
  точке входа  в  DOS  ( в  данном  случае
  #3D2E), как  уже  упоминалось,происходит
  подмена основного  ПЗУ  на ПЗУ  TR-DOS.В
  последнем случае по адресу #3D2E записан
  код команды RET (#C9).Если предваритель-
  но  поместить  в стек  адрес  какой-либо
  подпрограммы TR-DOS, то  будет  выполнен
  переход на нее. В стек также  необходимо
  перед этим  поместить  адрес возврата из
  подпрограммы.

      Пример 15.

          LD HL,RET1   ;адрес возврата
          PUSH HL      ;помещаем в стек
          LD HL,ADRESS ;адрес подпрограм-
                        мы TR-DOS
          PUSH HL      ;помещаем в стек
          JP #3D2E     ;переход
   RET1   RET          ;точка для возврата

   Для использования точки входа #3D2E не-
  обходимо знать адреса подпрограмм TR-DOS
  К сожалению, TR-DOS написана очень запу-
  танно  и  дизассемблировать  ее довольно
  сложно.Три приведенных ниже отрывка мож-
  но использовать при разработке  приклад-
  ных программ,работающих с диском.Они со-
  ответствуют версии 5.03, в других верси-
  ях они тоже  есть, но могут иметь другие
  адреса.

       #2A53 (10835):
             OUT (C),A
             RET

       #3FCA (16330):
         M1  IN A,(#FF) ;читаем системный
                         регистр
             AND #C0    ;проверяем готов-
                         ность данных
             JR Z,M1    ;еще раз,если не
                         готово
             RET M      ;возврат,если все
                         записано
             OUTI       ;вывести следующий
                         байт в регистр
             JR M1      ;данных

       #3FE5 (16357):
         M2  IN A,(#FF)
             AND #C0
             JR Z,M2
             RET M      ;возврат,если все
                         прочитано
             INI        ;прочитать следую-
                         щий байт из ре-
             JR M2      ;гистра данных

   Первая из  приведенных подпрограмм поз-
  воляет выводить необходимые данные в лю-
  бой из портов  контроллера  TR-DOS  (это
  можно  сделать только через  обращение к
  ПЗУ TR-DOS).Таких портов пять.Первые че-
  тыре  из  них  принадлежат  микросхеме
  КР1818ВГ93 (табл.1).

      Таблица 1.

   Адрес     Назначение

   #1F       Регистр команд/состояния

   #3F       Регистр дорожки

   #5F       регистр сектора

   #7F       регистр данных

   Назначение регистров и структура команд
  КР1818ВГ93  рассмотрены  в  работе [4].
   Есть еще один порт, который имеет адрес
  #FF и обычно реализуется на  К555ТМ9.Это
  системный регистр  TR-DOS. При необходи-
  мости узнать  содержимое этого  регистра
  можно,воспользовавшись ячейкой 23830,ко-
  торая хранит копию этого регистра.
   Назначение  разрядов управляющего слова
  следующее:

   D0 и D1 - номер НГМД (0-A,1-B,2-C,3-D);
   D2 - команда сброса контроллера;
   D3 - готовность головки (1 - готово);
   D4 - сторона диска (0 - низ,1 - верх);
   D6 - плотность записи (0 - двойная,1 -
        одинарная);

   При чтении из порта #FF считываются си-
  гналы DRQ (готовность данных для переда-
  чи, 38  вывод ВГ93, 6-й разряд  порта) и
  INTRQ (выполнение команды,38 вывод ВГ93,
  7-й разряд порта).
   Две последние  подпрограммы  предназна-
  чены для чтения массива данных в регистр
  данных.Их можно использовать так:

      Пример 16.

          LD A,#10     ;номер трека
          LD C,#02     ;код команды
          CALL #3D13   ;установить головку
          LD A,#50     ;данные для систем-
                        ного регистра
          LD C,#FF     ;адрес порта
          LD HL,RET0   ;адрес возврата
          PUSH HL      ;в стек
          LD HL,#2A53  ;адрес подпрограммы
          PUSH HL      ;в стек
          JP #3D2E
   RET0   LD C,#1F     ;адрес порта регис-
                        тра команд
          LD A,#E4     ;код команды чтения
                        трека
          LD HL,RET1   ;адрес возврата
          PUSH HL      ;в стек
          LD HL,#2A53  ;адрес подпрограммы
          PUSH HL      ;в стек
          JP #3D2E
   RET1   LD C,#7F     ;адрес порта регис-
                        тра данных
          LD HL,RET2   ;адрес возврата
          PUSH HL      ;в стек
          LD HL,#3FE5  ;адрес подпрограммы
          PUSH HL      ;в стек
          LD HL,#A000  ;адрес буфера
          JP #3D2E
   RET2   RET

   Эта программа прочитает содержимое вер-
  хнего трека 16-го цилиндра диска со все-
  ми метками в буфер по адресу #A000.
   Если изменить две строки

          LD A,#F4     ;код команды записи
                        трека
          LD HL,#3FCA  ;адрес подпрограммы
   ( Эту программу необходимо поместить за
  место строк LD A,#E4 и LD HL,#3FE5 ), то
  получим программу записи  трека со всеми
  метками (форматирование трека).Предвари-
  тельно в  буфере  необходимо подготовить
  массив для записи. Причем можно  записы-
  вать  треки  с  секторами  любой   длины
  (128,256,512,1024 байт) и с произвольной
  нумерацией - необходимо  лишь  правильно
  подготовить данные [4]. Можно предложить
  еще одно применение  этой  точки входа.В
  ПЗУ TR-DOS довольно много свободного
  места (около 4Кбайт). Туда  можно помес-
  тить свои  программы и запустить их, как
  предложено  в примере 15. Таким образом,
  можно значительно расширить  возможности
  TR-DOS, причем такое изменение  не отра-
  зится  на совместимости. Например, можно
  добавить  программу "восстановления" или
  проверки диска,небольшую "boot"-програм-
  му или даже драйвер принтера,хотя в пос-
  леднем  случае потребуются небольшие (не
  более 20 байт) изменения в основном ПЗУ.
  Конечно,неплохо было бы внести изменения
  в некоторые подпрограммы ПЗУ TR-DOS,хотя
  бы с целью исправления имеющихся ошибок,
  но это не всегда приемлемо.Любое измене-
  ние может привести к тому, что какая-ни-
  будь  программа  перестанет  работать на
  таком  компьютере. Особенно это касается
  основного ПЗУ компьютера. Там  даже  не-
  большое изменение (в том числе и  запол-
  нение свободного пространства, изменение
  шрифта или даже надписи,которая выводит-
  ся при включении компьютера) может ухуд-
  шить совместимость с его "фирменным бра-
  том".Так что,решайте, какой компьютер вы
  хотите иметь: Sinclair - совместимый или
  Sinclair - подобный.
 



Другие статьи номера:

Дискуссия - новости: Demobit 96 перенесли на осень, ответы на письма, письмо от Doctor Max, письмо от Девушки спектрумистки.

Дискуссия - интервью с автором аппаратных доработок из Харькова - Гетманцом Владимиром Михайловичем.

На досуге - По щучьему веленью.

Открытие - Возможности КР1818ВГ93 контроллера НГМД "Beta disk".

Открытие - Последний "динозавр CRAY холодной войны" уходит со сцены.

Открытие - Програмирование музыкального процессора AY 3-8910.

Новости - новинки игр: Mortal Kombat, Ice Climber, Streat Fighter, CJ Elephant Fujitive, NB JAM. Новости от известных спектрумовских комманд.

Сделай сам - Применение микросхем серии К155.

Сделай сам - схема многоголосового имитатора звуков.

Описания игр - DALLAS QUEST.

Описания игр - HORROR SHOW.

Описания игр - SIR FRED.

Описания игр - FIGHTER PILOT.

Пользователям - программирование звуковых эффектов.

Приложения - Сегодня в приложении нашего журнала вы найдете следующие программы...

CPU для Вас - Работа с TR-DOS на уровне машинных кодов.

Напутствие - Наверняка любой уважающий себя программист задумывался над написанием DEMO...

Интервью с нашим гостем - Итак, сегодня у нас в гостях PatSoft of Reflection group.

Реклама - Для приобретения новейшего SOFT'а со всего мира можно звонить в Харьков...


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

Похожие статьи:
CODING - Об обечатке в листинге использования стека (в 5 номере).
Раскрутка - Adventurer: графическая адвентюра с видом "из глаз".
Ликбез - Без карты ни шагу: советы будущим писателям.

В этот день...   29 ноября