[an error occurred while processing this directive]

10.9. Работа с драйвером дисковода.

В этом и следующих параграфах используются имена из файла DOS.H.

SETDRV - установка текущего устройства <вх: A=0..4>, <вых: установлены CSUNIT, SLOT, DRIV, CSUTR (треков на у-ве)>.

RWTS (DRWTS) - вход на драйвер дисковода (возможен перехват) 
<вх:
 CSUNIT - номер текущего у-ва: 0..4,
 SLOT - номер разъема, умноженный на 10, 0=RAM,
 DRIV - 0- первый привод, 1- второй,
 TRACK/SECT - обрабатываемый трек/сектор,
 BUFR - адрес буфера чтения/записи: LH,
 RBOT - код операции:
   1-читать,
   2-писать,
   80-разметить диск,
   C0-разметить группу треков от TRACK до SECT
   (т.е. SECT=конечный трек; в 5.0 было только для Teac),
 SRAZU - для TEAC: В7=обработать немедленно(1)
   (при SRAZU<80 запрос на чтение/запись не будет исполнен
   до перехода к другому треку или установки SRAZU>7F),
 SHGFD - тип НГМД. B7=0 - Shug/RAM, B7=1 - Teac>.
<вых:  OTZV - код завершения обмена с дисководом:
   при C=0=OTZV - нет ошибки,
   при C=1, OTZV=IOER/WPER (ошибка обмена/диск закрыт,
   значения входных ячеек не изменились>.

Примечание: разметка не работает с RAM, при разметке не гарантируется неизменность TRACK/SECT.

Рабочие ячейки POLO содержат положение головок дисководов, ячейка FSSLW - скорость перемещения головки Shug (FF=быстро, 00=медленно).

10.10. Вызов ДОС.

При вызове ДОС в тексте программы на ассемблере можно использовать символьные имена команд, коды ошибок и типы файлов, содержащиеся в файле DOS.H.

Во всех случаях текст, помещаемый в INBUF, заканчивается 'ВВОДом'. В данном разделе под командами ДОС имеются ввиду те команды системы, которые начинаются с '['. И еще: команды '[READ', '[WRITE', '[SAVE', '[PUT', '[GET' используют Q-параметры умолчания. Вы можете сами установить значения этих ячеек и опустить эти параметры в тексте команды. Вот имена этих ячеек:

   BADRM - адрес размещения B-файла в памяти: LH;
   BADRA - логический адрес В-файла: LH;
   BLEN - длина В-файла: LH;
   RBEG - адрес произвольного файла в памяти: LH;
   RLEN - длина файла/группы блоков в секторах;
   RTYP - тип файла, согласно кодировке ДОС.

Для исполнения команды ДОС существует несколько входов:

DOS - <вх: INBUF = параметры команды, в COMAND ее номер,
           Y=MODE=CTDCT=CONV=TEKABM=0>,
      <вых: параметры разобраны, команда выполнена,
           OTZV=код ошибки или 0,
           диагностика выдается на стандартный вывод>.

Примечание: при желании вектор DOS может быть перехвачен пользовательской программой, тогда система после определения номера команды и занесения его в COMAND, обнуления MODE,CTDCT,CONV,TEKABM (в Y будет позиция, с которой в INBUF начинаются параметры команды) передаст управление перехватившей программе, которая должна будет собрать параметры и выполнить команду.

DOSCOM - <вх: INBUF = текст команды ДОС с параметрами,
           POLSTR=позиция начала текста команды в INBUF:
           0 - если (CAT), 1 - если ([CAT)>,
         <вых: исполнение команды, OTZV, диагностика>.

Вектор DOSCOM предназначен специально для программ, поддерживающих диалог с прямым вводом командной строки.

Две следующие точки входа можно использовать либо совместно, либо использовать из них только вторую.

GOTOPAR - сбор параметров команды ДОС:
         <вх: INBUF = параметры команды,
           Y=0, MODE=0, COMAND - номер команды>,
         <вых: произведен разбор команды, заполнены
           соответствующие ячейки
           C=1 - ошибочные параметры>;
GOTOCOM - исполнить команду ДОС:
         <вх: CTDCT=CONV=TEKABM=0, COMAND=номер команды,
           все параметы команды заданы,
           в DR1 и DR2 номера дисководов минус один>,
         <вых: в OTZV код ошибки>.

Таблица кодов ошибок может быть почерпнута из файла DOS.H, SYSTEM.DOC.3 или SYSTEM.APP.345. По сравнению с версией 5.0 в ней одно изменение: вместо ошибки REXECER появилась CATFLER.

Ниже приводятся параметры, которые надо установить в том случае, если Вы решили использовать GOTOCOM без GOTOPAR. Во всех случаях, кроме команды SIGN, при использовании буферов NAMEBUF/2/3 помещаемое в них имя должно дополняться пробелами до 30 (дес.) символов. При этом, при поиске файла последний символ NAMEBUF игнорируется.

Для команд, работающих в конвейерном режиме либо при использовании выбора, действуют следующие правила:

   а) если в команде нет указания с какого или до какого
      файла должна производиться обработка, то OTIDO=0;
   б) при обработке с какого-либо файла OTIDO=40,
      в NAMBUF3 имя этого файла;
   в) при обработке до какого-либо файла OTIDO=80,
      в NAMBUF3 имя этого файла;
   г) NAMEBUF содержит текст шаблона, начинающийся
      со '/' при выборе.

Во всех случаях (кроме '[CAT') в NAMEBUF после исполнения команды содержится имя последнего обработанного файла или сам шаблон, если ни одного файла обработано не было.

[CAT - CTDCT=40 или 0 - нет параметра,
       CTDCT=41 или 1 - параметр в NAMEBUF.
[SIGH - в NAMEBUF имя, оканчивающееся 'ВВОДом'.
[LOAD - в NAMEBUF имя, в BLSTAT:
       0 - читать на адрес, указанный в файле;
       1 - читать на адрес, указанный в BADRA/BADRA+1: LH;
       40 - читать с положительным смещением;
       C0 - читать с отрицательным смещением.
Смещение (H) находится в BADRA, работает в конвейере.
[SAVE - в NAMEBUF имя файла,
       BADRM - адрес файла в памяти: LH;
       BADRA - логический адрес файла: LH;
       BLEN  - длина файла в байтах: LH.
[DEL  - в NAMEBUF имя, работает в конвейере.
[UNDEL - в NAMEBUF имя файла, работает в конвейере.
[REN  - в NAMEBUF старое имя, в NAMBUF2 новое имя.
[EXEC - в NAMEBUF имя файла.
[VER  - в NAMEBUF имя файла, работает в конвейере.
[TYPE - в NAMEBUF имя файла, работает в конвейере.
[RUN  - в NAMEBUF имя файла.
[COPY - в NAMEBUF имя файла, в DR1 ДЗУ-оригинал,
       в DR2 ДЗУ-дубликат, работает в конвейере.
[READ - в NAMEBUF имя, в RBEG/RBEG+1 адрес загрузки: LH,
       работает в конвейере.
[WRITE - в NAMEBUF имя, в RBEG/RBEG+1 адрес записи: LH,
       в RLEN длина файла в блоках, в RTYP тип файла.
[1,[2,[3,[4,[5 - параметров не требуют.
[MD   - в NAMEBUF имя директории, в SMEZ длина в блоках.
[CD   - в NAMEBUF имя директории.
[BOOT - в NAMEBUF имя файла.
[STORE - параметров не требует.
[STATUS - параметров не требует.
[FORMAT - в NFILE=треков занять, не считая нулевого.
[RAM  - в NFILE находится 0/1/2.
[GET  - в NAMEBUF имя, в RBEG/RBEG+1 адрес загрузки: LH,
       в CNTF/CNTF+1 позиция группы блоков в файле: LH,
       начиная с 1, в BSTAT число загружаемых блоков.
Число реально считанных блоков после исполнения команды помещается в RLEN.
[PUT  - в NAMEBUF имя, в RBEG/RBEG+1 адрес группы: LH,
       в RLEN число блоков, в RTYP тип файла, в CNTF/
       CNTF+1 позиция группы в файле: LH, начиная с 1.

10.11. Внутренние подпрограммы файловой системы.

При создании программ, обрабатывающих файлы нестандартным образом, можно пользоваться непосредственно рядом подпрограмм файловой системы. Перехват данных векторов невозможен.

Отметим, что карты свободного места (BITMAP) диска, размеченного для Teac'а, читаются в память на адрес VTOC+38, т.е. занимают часть системного буфера с адреса D00.

Ни одна из подпрограмм, занимающихся выделением/освобождением секторов, не сохраняет BITMAP на диске и не считывает его с диска, если нет перехода к не текущей BITMAP. Номер текущей BITMAP хранится в NVTOC (0, 1 или 2, причем VTOC - это 0) и является как входным, так и выходным параметром. Если была задана работа не с текущей BITMAP, она записывается на диск и подчитывается требуемая.

RDFIL - искать на диске произвольный файл:
    <вх: NAMEBUF=имя; A=тип файла; CONV=CTDCT=ТЕКАBМ=0>,
    <вых: без ошибок: OTZV=0,
           TSLIST - TS-список файла,
           CATAL - сектор каталога, в котором файл найден,
           TLIST/SLIST - TS адрес TS-списка файла,
           TCAT/SCAT - TS адрес сектора каталога,
           SHIFT - позиция файла в CATAL;
          с ошибкой: OTZV=код ошибки>.

WRITFIL - создать на диске произвольный файл:
    <вх: аналогично RDFIL>,
    <вых: без ошибок: OTZV=0,
           TSLIST - обнулен,
           CATAL - сектор каталога, в котором файл создан,
           TLIST/SLIST - TS адрес TS-списка файла,
           TS-список объявлен занятым,
           TCAT/SCAT - TS адрес сектора каталога,
           SHIFT - позиция файла в CATAL;
          с ошибкой: OTZV=код ошибки>.
Если файл уже существовал, то он уничтожается.

Во всех остальных подпрограммах C=1 на выходе означает ошибочное завершение, а C=0 - отсутствие ошибки. В некоторых из них также указывается в OTZV код ошибки.

SUDEL - занять/освободить сектор в BITMAP:
    <вх: C=1 - освободить сектор/C=0 - занять сектор,
           A/X - трек/сектор

INITLIST - найти на диске место под TS-список:
    <вых: TLIST/SLIST - TS адрес созданного TS-списка,
           TSLIST обнулен, в память считана нужная BITMAP,
           сектор TS-списка занят>.

SYSRWTS - читать/писать системный буфер:
    <вх: в A - трек, в Y - сектор,
           в X - номер буфера: 0..5, где
           0=VTOC, 1=TSLIST, 2=CATAL, 3=800, 4=D00, 5=FUNBUF,
           C=0 - читать, C=1 - писать>,

BEGCAT - чтение сектора каталога:
    <вх: в A - трек, в Y сектор каталога>,
    <вых: X и SHIFT = B, в CATAL считанный сектор,
           в TCAT/SCAT - TS адрес сектора>.

PUTCAT - запись сектора каталога:
    <вх: в TCAT трек каталога, в SCAT сектор каталога,
           в CATAL записываемый сектор>.

PGTTSL - чтение/запись TS-списка:
    <вх: C=0 - читать, C=1 - писать, в TLIST/SLIST TS
           адрес TS-списка, TSLIST буфер чтения/записи>.

UDTSL - удалить/востановить сектора файла:
    <вх: C=1 - удалить, C=0 - востановить сектора,
           TSLIST - первый TS-список>,
    <вых: TSLIST - последний TS-список файла>.

NEWSECT - найти свободный сектор на диске, и выделить его:
    <вх: NFILE - позиция в BITMAP, NVVT - треков в BITMAP,
           NTRC - номер трека, соответствующий позиции и
           текущей BITMAP, от которого производится поиск>,
    <вых: в A/X - TS адрес выделенного сектора>.

PGVTOC - читать/писать VTOC:
    <вх: C=1 - писать, C=0 - читать, в A - трек BITMAP,
           в X - смещение: для VTOC =0, иначе =38>.
    <вых: не изменен BUFR>.

10.12. Другие векторы системы.

SYNTERR - вектор не распознанной команды.

Сюда система передает управление при вводе неизвестной команды. В исходном варианте это звонок, однако возможен перехват данного вектора для расширения системы.

ERROUT - вывод ошибки ДОС на стандартный вывод.
    <вх: в OTZV - код ошибки, для ошибки обмена: TRACK/SECT>.

SEDIT - вызов секторного редактора.

При вызове секторного редактора полезно иметь представление о том, где он хранит свои переменные:

 SEBUF - текущий сектор.
 SPSEDIT - указатель свободного места для стека '.',
  возможные значения: 0, 1, 2, 3, причем 3=0.
 TSPSEDIT - стек '.': 
  DS 3 - треки;
  DS 3 - сектора;
  DS 3 - позиции.
 DFINDBUF - буфер поиска, общий с редактором памяти:
  DS 1 - число байт в образце;
  DS 8 - образец;
  DS 8 - маска, с которой производится AND.
 DSEDIT - текущий трек/сектор/направление (0/FF) поиска.
 PSEDIT - текущая позиция в секторе.

При входе/выходе секторный редактор для очистки экрана использует функцию THOME.

DUMP - вызов редактора памяти.
 DUMPAD - текущий адрес редактора: LH.

CALLRES - передача управления резидентной программе.

LIST1 (DLIST1) - дизассемблирует команду процессора в формате директивы 'L' Отладчика на стандартный вывод:

    <вх: в PC/PC+1 адрес команды: LH>,
    <вых: в PC/PC+1 адрес следующей команды>.
В ячейке LSHIFT - смещение (H) адреса дизассемблирования.

LIST (DLIST) - выдает бесконечный листинг:

    <вх: см. LIST1>.

SDWOET - запись байта в псевдо-ПЗУ:

    <вх: в A3/A3+1 содержиться адрес записи: LH,
           в Y - смещение, в A - записываемый байт>.
Запись производится только в банки E, F, причем от банка E используется младшая половина.

GETNUM (DGETNUM) - выделяет из INBUF числовой параметр в формате Отладчика, т.е. 'S и *10001110 тоже являются числовыми параметрами. Подпрограмма считывает все цифры числа до знака, не являющегося цифрой (незначащие нули опускаются). При работе использует TPROWCIF.

    <вх: в INBUF строка, в Y позиция в строке>,
    <вых: выделенное число находиться в A2 и A2+1,
           если в MODE не ноль, то результат копируется
           в A1,A1+1 и A3,A3+1. В A находится последний
           символ, преобразованный TPROWCIF, Y=Y+кол-во
           обработанных символов>.

TPROWCIF - проверка на шестнадцатеричную цифру. Символ, не являющиеся цифрой, преобразуется в некоторый код.

    <вх: A - проверяемый символ>,
    <вых: C=1 - это шестнадцатеричная цифра, A - цифра,
           C=0 - не она, A - код>.
Ниже приводится текст подрограммы, перекодирующей A:
  ПРОВЦИФ  EOR #¤B0
           CMP #¤A
           BCC ПРОВЦИФ1
           ADC #¤88
           CMP #¤FA
           BCS ПРОВЦИФ1
           RTS
  ПРОВЦИФ1 AND #¤F
           SEC
           RTS

Отметим также несколько ячеек и буферов Отладчика:

MICRONAD - адрес микроассемблера: LH;
JFINDBUF - буфер масок поиска команды 'J':
 DS 1 - число масок, м.б. 0, если они не используются,
 DS 8 - сами маски;
HFINDBUF - буфер образца поиска команды 'H':
 DS 1 - число байт в образце, 0 - нет образца,
 DS 8 - сам образец;
CURTXT - здесь сохраняется COLOR при включении резидента, секторного редактора и редактора памяти.

.сс

.стSYSTEM.APP.12

[an error occurred while processing this directive]