[an error occurred while processing this directive]
.сс
.гр
.ов \---------------------------------------\ | | | Программа MAKE DIR | | | | Предназначена для: | | создания | | переименования | | удаления | | подкаталогов | | | |---------------------------------------
После того как вами в диалоге ОТЛАДЧИКА будет подана команда 'K' на экране появится заставка и меню из трех пунктов:
F1 - Создать подкаталог F2 - Переименовать подкаталог F3 - Удалить подкаталог
Если Вы хотите создать подкаталог, то нажмите клавишу F1. Далее Вы должны ввести имя того подкаталога, который вы хотите создать и его длину. Длина подкаталога может быть в промежутке от 1 до 100 секторов.От длины подкаталога зависит количество файлов, которое Вы сможете туда записать ( по 7 файлов в сектор ).Максимальная цифра в 100 секторов выбрана чисто из разумных соображений ( вряд-ли кому-нибудь потребуется подкаталог более чем на 700 файлов ). Выбор длины осуществляется стрелками вправо/влево, подтверждением выбора является нажатие клавиши 'Ввод'. После чего подкаталог будет создан и программа вернется в заставку.
Если Вы хотите переименовать подкаталог, то нажмите клавишу F2. После чего вам нужно задать два имени через ','( точно как в команде '[REN' ОТЛАДЧИКА ) и нажать ввод. После переименования подкаталога программа вернется в заставку.
Если Вы хотите удалить подкаталог, то нажмите клавишу F3.Программа запросит у Вас имя подкаталога, который вы хотите удалить.Нужно учитывать, что подкаталог, содержащий нестертые файлы не может быть удален по идеологическим соображениям. То есть перед удалением подкаталога нужно стереть из него все файлы.
Вместо имени подкаталога можно использовать символ '/' точно также как и в файловой системе ОТЛАДЧИКа. При возникновении любой ошибки программа 'вывалится' в ОТЛАДЧИК.
Для выхода из программы нажмите клавишу 'РЕД'.
Еще раз напоминаем, что не нужно переименовывать и удалять подкаталоги любой другой программой, кроме 'MAKE DIR', так как это может привести к непредсказуемым последствиям.
.сс
.цв
УСТРОЙСТВО СИСТЕМЫ
.ов
8.1. Адресное пространство.
Все адресное пространство системы можно разделить на пользовательскую и системную память. Для пользователя выделен участок памяти с адреса ¤1000 (или точнее говоря ¤1800, т.к. с адреса ¤1000 находится текстовый экран системы) и до ¤BFFF. Сама система располагается в псевдо-ПЗУ, но несмотря на это автор специально предусмотрел возможность изменения системы командой ':'. Говоря другими словами при вводе данных командой ':' в адреса ¤D000-¤FFFF, производится запись информации в видимую страницу псевдо-ПЗУ.
Область памяти с адресами меньше ¤1000 отведена для работы самой системы. Там располагаются всевозможные буферы, изменяемые таблицы, пользовательские данные, а также векторы обмена внешних программ с системой и переключатель памяти.
В нулевой странице памяти значительная часть ячеек (почти половина) является свободной и соответственно доступна для работы внешних программ. В принципе занимаемое системой пространство нулевой страницы кончается ячейкой ¤7B, но при печати на бумагу колоночным драйвером, могут быть задействованы еще несколько ячеек, из расчета по две на одну колонку. Фактически можно считать, что начиная с адреса ¤90 пространство полностью свободно, маловероятно, что кто-либо воспользуется печатью более чем в 8-10 колонок.
=============================================================== 00 - 7B - Рабочие ячейки нулевой страницы системы. 7C - FF - Свободные ячейки нулевой страницы. 0100 - 01FF - Рабочий стек системы. 0200 - 0235 - Векторы ввода/вывода для внешних программ. 0236 - 036E - Переключатели памяти 036F - 0392 - Подпрограммы обработки прерываний процессора. 0393 - 041F - Рабочие подпрограммы системы. 0420 - 04FF - Буферы для долговременных данных системы. 0500 - 05FF - Буфер для данных резидентной программы. 0600 - 06FF - Буфер секторного редактора. 0700 - 0753 - Для работы драйвера MFM накопителя. В другое время свободная память. 0754 - 07FF - Переключатели памяти 0800 - 08FF - Буфер информации EXEC файла. 0900 - 09FF - T/S List EXEC файла. 0A00 - 0AFF - Сектор каталога. 0B00 - 0BFF - T/S List обрабатываемого файла, он же буфер под вводимую с клавиатуры информацию. 0C00 - 0CFF - Буфер под VTOC. 0D00 - 0DFF - Первый буфер (RWTS НГМД ЕС 5088). 0E00 - 0E55 - Второй буфер (RWTS НГМД ЕС 5088). 0E56 - 0E95 - Таблица кодировки (RWTS НГМД ЕС 5088). 0E96 - 0EFF - Таблица декодировки (RWTS НГМД ЕС 5088). 0F00 - 0FFF - Буфер под переопределяемые клавиши. 1000 - 17FF - Текстовый экран. 1800 - BFFF - Пользовательское пространство. C000 - CFFF - Порты ввода/вывода. D000 - FFFF - Все страницы псевдо-ПЗУ заняты системой. ===============================================================
Система запрещает подключение к 4,5 сегментам других банков, кроме 4,5 соответственно. Система занимает банки 6,7,E,F,а банки C,D использует как буфер для колоночной печати,причем из диалога эти банки недоступны.
.сс
8.2. Подробно о нулевой странице.
Для нормального использования подпрограмм ввода/вывода необходимо знать расположение ячеек в нулевой странице. Эта информация я думаю будет полезна и тем, кто захочет разобрать систему, узнать как она работает. Ниже приведена часть исходного текста системы в котором производится описание всех меток нулевой страницы с краткими коментариями. При дальнейшем описании системы мы будем пользоваться именами ячеек нулевой страницы из исходного текста.
.кс0
================================================================ 1000: 71 *=======================* 1000: 72 * Ячeйки нулевой страницы 1000: 73 *=======================* 0000: 74 ORG 0 0000: 75 *=======================* 0000: 76 ADL DS 1 Буфepныe ячeйки для coxpaнeния 0001: 77 ADH DS 1 peгиcтpoв, и для paбoты 0002: 78 ASAVE DS 1 нeкoтopыx дpугиx пpoгpaмм 0003: 79 XSAVE DS 1 0004: 80 YSAVE DS 1 0005: 81 0005: 82 COLOR DS 1 Hу c цвeтoм вce яcнo 0006: 83 WNDLFT DS 1 Пapaмeтpы тeкcтoвoгo oкнa 0007: 84 WNDWDTH DS 1 0008: 85 WNDTOP DS 1 0009: 86 WNDBTM DS 1 000A: 87 CH DS 1 Koopдинaтa куpcopa пo X 000B: 88 CV DS 1 Koopдинaтa куpcopa пo Y 000C: 89 BASL DS 1 Aдpec нaчaлa в пaмяти cтpoки в 000D: 90 BASH DS 1 кoтopoй cтoит куpcop 000E: 91 BAS2L DS 1 Иcпoльзуютcя для paбoты poликa 000F: 92 BAS2H DS 1 0010: 93 CSWL DS 1 Beктop экpaнa 0011: 94 CSWH DS 1 0012: 95 KSWL DS 1 Beктop клaвиaтуpы 0013: 96 KSWH DS 1 0014: 97 RNDL DS 1 Для тoгo чтoбы куpcop мигaл 0015: 98 RNDH DS 1 0016: 99 YSAV1 DS 1 Koд cимвoлa нa кoтopoм cтoит куpcop 0017: 100 BUFFER0 DS 1 Иcпoльзуютcя пpи пepeoпpeдeлeнии 0018: 101 OXREG DS 1 и пpи paбoтe c пepeoпpeдeляeмыми 0019: 102 FLAJOK DS 1 клaвишaми 001A: 103 SIGHL DS 2 Aдpec пoзиции в cooбщeнии 001C: 104 SIGVEC DS 2 Вектор таблицы сообщений 001E: 105 POLSTR DS 1 Положение в строке ввода 001F: 106 001F: 107 SLOT DS 1 Paзъeм 0020: 108 DRIV DS 1 Дpaйвep 0021: 109 TRAK DS 1 Tpeк 0022: 110 SECT DS 1 Ceктop 0023: 111 BUFR DS 2 Буфep 0025: 112 RBOT DS 1 Дeйcтвия 0026: 113 SRAZU DS 1 MFM - cpaзу oбpaбaтывaть ? 0027: 114 SHGFD DS 1 FM/MFM 0028: 115 OTZV DS 1 Boзвpaтный кoд 0029: 116 POLO DS 2 Пoлoжeниe гoлoвки Shugarta 002B: 117 POOL DS 2 Пoлoжeниe гoлoвки TEACa 002D: 118 Z0A DS 1 Paбoчиe ячeйки: 002E: 119 Z0B DS 1 Ceктop 002F: 120 Z0C DS 1 Tpeк 0030: 121 Z0D DS 1 Toм 0031: 122 Z0E DS 1 0032: 123 Z0F DS 1 0033: 124 Z10 DS 1 Koнcтaнтa кoдиpoвки 0034: 125 GAP DS 1 Пpoмeжутoк мeжду ceктopaми 0035: 126 DTRK DS 1 Teкущий тpeк 0036: 127 SBF DS 2 Aдpec oбpaбaтывaeмoгo ceктopa 0038: 128 CNTF DS 2 Cчeтчик paзмepa GAPa 003A: 129 003A: 130 PSLOT DS 1 Разъем интерфейса 003B: 131 003B: 132 LMNEM DS 1 Bce ячeйки oтлaдчикa cильнo 003C: 133 RMNEM DS 1 pacxoжи. He вoзмoжнo тoчнo 003D: 134 FORMAT DS 1 укaзaть нa xoзяинa дaннoй ячeйки. 003E: 135 LENG DS 1 B кaждoм кoнкpeтнoм cлучae нaдo 003F: 136 MODE DS 1 cмoтpeть oтдeльнo 0040: 137 PC DS 2 0042: 138 A1 DS 2 0044: 139 A2 DS 2 0046: 140 A3 DS 2 0048: 141 A4 DS 2 0048: 142 COMM EQU A4 004A: 143 CODE DS 2 004C: 144 COUNT DS 1 004D: 145 ADGO DS 2 004F: 146 004F: 147 TEKAДM DS 1 Teкущий aдpec в пaмяти 0050: 148 TEKAДC DS 1 0051: 149 OKHO DS 1 Peгиcтp cocтoяния 0052: 150 CЧETЧИK DS 1 Peгиcтp oбщeгo нaзнaчeния 0053: 151 AДPTEKM DS 1 0054: 152 AДPTEKC DS 1 0055: 153 TEKAБM DS 1 Teкущий aдpec в пaмяти пpи 0056: 154 TEKAБC DS 1 вывoдe нa экpaн 0057: 155 AДPЭKP DS 1 Teкущий aдpec нa экpaнe 0058: 156 AДPЭKPC DS 1 0059: 157 0059: 158 NVTOC DS 1 Hoмep тeкущeгo VTOCa 005A: 159 SHIFT DS 1 Cмeщeниe в ceктope кaтaлoгa 005B: 160 FILETYP DS 1 Зaкaзaнный тип фaйлa 005C: 161 FINDFLAG DS 1 Флaг для oткpытия фaйлa 005D: 162 SLIST DS 1 Ceктop T/S List 005E: 163 TLIST DS 1 Tpeк T/S List 005F: 164 SCAT DS 1 Ceктop тeкущeгo ceктopa кaтaлoгa 0060: 165 TCAT DS 1 Tpeк тeкущeгo ceктopa кaтaлoгa 0061: 166 BLSTAT DS 1 Kaк читaть фaйл: oтнocитeльнo,... 0062: 167 BLSTPAL DS 1 Физичecкoe нaчaлo фaйлa 0063: 168 BLSTPAH DS 1 0064: 169 BLSTARL DS 1 Лoгичecкoe нaчaлo фaйлa 0065: 170 BLSTARH DS 1 0066: 171 BLLENL DS 1 Физичecкaя длинa фaйлa 0067: 172 BLLENH DS 1 0068: 173 RDBL DS 1 Aдpec нaчaлa фaйлa 0069: 174 RDBH DS 1 006A: 175 RDLN DS 1 Длинa в ceктopax 006B: 176 RTYP DS 1 Eгo тип 006C: 177 SHLIST DS 1 Cмeщeниe в T/S List 006D: 178 DCRES DS 2 Иcпoльзуютcя пpи вывoдe кaтaлoгa 006F: 179 DCWORK DS 2 0071: 180 DCRES1 DS 1 0072: 181 CTDCT DS 1 Cтepтыe/нopмaльныe (кaтaлoг) 0073: 182 NFILE DS 1 Чиcлo фaйлoв (кaтaлoг) 0074: 183 SMEZ DS 1 Tип фaйлa 0075: 184 DR1 DS 1 First HГMД 0076: 185 DR2 DS 1 Second HГMД 0077: 186 OTIDO DS 1 Haчинaя/кoнчaя c фaйлa(oм) 0078: 187 LAST DS 1 0079: 188 NTRC DS 1 Hoмep тpeкa пpи пoиcкe cвoбoднoгo 007A: 189 NVVT DS 1 Cчeтчик тpeкoв вo VTOCe 007B: 190 NDVG DS 1 Paбoчaя пpи уcт./ocвoбoждeнии 007C: 191 ADBF EQU * Пo двe ячeйки нa кoлoнку ================================================================
.кс
8.3. Векторы подпрограмм системы.
Для обращения к подпрограммам системы, в ОЗУ расположены точки входа, при входе в которые произойдет переадресация на реальные подпрограммы системы. Передача управления на все подпрограммы осуществляется через переключатель памяти, что позволяет обращаться к ним из произвольной страницы псевдо-ПЗУ, хотя реально страница отведенная для программы пользователч фиксирована. В таблице ниже приведены точки входа с краткими коментариями:
=============================================== 0200 - Вывод символа на принтер. 0203 - Вывод байта на принтер. 0206 - Инициализация принтера. 0209 - Вывод символа на устройство. 020C - Вывод символа на экран. 020F - Вывод сообщения. 0212 - Чтение символа с устройства. 0215 - Чтение символа с клавиатуры. 0218 - Обращение к драйверу НГМД. 021B - Установка стандартного формата экрана. 021E - Дизассемблирование команды. 0221 - Диззасемблировать с адреса. 0224 - Выделить число из строки. 0227 - Вывод байта (шестнадцатиричное). 022A - Вывод шестнадцатиричной цифры. 022D - Чтение символа с клавиатуры без курсора. 0230 - Вертикальная табуляция. 0233 - Вход в отладчик. ===============================================
.сс
8.4. Описание подпрограмм.
Первые три подпрограммы предназначены для вывода информации на печатающее устройство. Интересной особенностью является то, что эти векторы (т.е. адреса перехода на подпрограммы в командах JMP), можно заменить на любые другие. Автор специально построил все внутренние подпрограммы так, что при выводе информации на бумагу, вызов подпрограмм самим отладчиком производится через эти три вектора.
Подпрограмма '0200' выводит на печать символ. В стандартном варианте (предусмотренном самой системой) вывод может производиться на принтеры СМ6313 и СМ6337. Для правильной работы подпрограммы, требуется стандартная распайка кабеля принтера, в соответствии с описание СПТ 'Агат-Автор'. Эта подпрограмма осуществляет перекодировку кодов, соответствующих знакам ПЭВМ "АГАТ", в коды, требуемые принтерами.
Вторая подпрограмма '0203' тоже выводит информацию на принтер, но в отличие от первой не производит какой-либо перекодировки байта. Эта подпрограмма используется как самой системой для начальной закачки принтера кодами, так может быть использована и пользователем, например для вывода на бумагу графических изображений.
Перед тем, чтобы начать вывод на бумагу, нужно инициализировать плату интерфейса ПЭВМ "АГАТ", для чего нужно вызвать подпрограмму '0206'. Если плата не была инициализирована, вывод будет невозможен. При вызове этой подпрограмма, одновременно производится и инициализация принтера.
'0209' - выводит символ на устройство. Это значит, что если в текущий момент включен вывод на бумагу, то вывод информации по этому вектору приведет к появлению символов, как на экране, так и на бумаге. В сущности это подпрограмма состоит из одной команды 'JMP (CSWL)', но ее наличие все равно важно, т.к. подпрограммы к которым может происходить переход через адреса в 'CSWL', находятся в другой странице псевдо-ПЗУ.
'020C' - выводит символ на экран. Никаких специфичных вещей эта подпрограмма не имеет. По структуре она сопадает с подпрограммой 'COUT' монитора 'Школьницы'. В общем случае можно скзать, что подпрограмма выводит символ содержащийся в аккумуляторе и содержимого регистров не меняет. Цвет находится в ячейке 'COLOR' причем старший бит определяет режим вывода на экран: 0 - на экран 32*32, 1 - на экран 64*32. Все остальные имена ячеек соответствуют исходному тексту упоминавшегося выше монитора.
'020F' - вывод на экран сообщения. Это специальная подпрограмма используемая в том числе и самой системой. Для ее функционирования требуется задать вектор списка адресов сообщений. Вектор располагается в двух ячейках: 'SIGVEC' - младший байт, 'SIGVEC'+1 - старший байт. Сам список адресов, должен содержать адреса начала сообщений в порядке старший байт, младший байт (команда 'DDB'). При вызове подпрограммы в регистр 'Y' заносится номер сообщения, по порядку содержимого списка адресов, начиная с нуля. После возврата содержимое регистров остается неизменным.
При выводе сообщения можно использовать разнообразные коды переключения цвета, инверсии, управляющих символов и т.д. Заканчивается сообщение байтом 00. Есть пять специальных команд вводимые непосредственно в текст сообщения, и интерпретируемых подпрограммой вывода сообщений:
============================= 1 - Установка в позицию. 2 - Установка по горизонтали. 3 - Повторить по горизонтали. 4 - Повторить по вертикали. 5 - Перейти на адрес. =============================
'1' - за этой командой следуют два байта содержащие координаты по горизонтали и вертикали.
'2' - за этой командой следует координата по горизонтали. Текущая вертикальная координата не изменяется.
'3' - эта команда требует двух дополнительных байта. Она позволяет вывести строку из одинаковых символов. В первом байте указывается количество выводимых символов, во втором сам символ. После вывода каждого символа курсор перемещается вправо.
'4' - требует наличия двух дополнительных байт. Она также выводит несколько одинаковых символов, с тем исключеним, что после вывода каждого символа курсор смещается не вправо, а вниз. Это позволяет выводит вертикальные столбцы символов. Эта команда совместно с предыдущей становится незаменимой при оформлении рабочих экранов программ.
'5' - после команды должны находиться два байта, содержащие адрес перехода вывода сообщения. Адрес указывается в том же формате как и в списке адресов сообщений.
При работе с подпрограммой вывода сообщений, обязательно нужно учитывать, что она способна охватить за раз сообщение не более чем из 256 байт. Если требуется выводить сообщение большей длины (хотя это и редкий случай), используйте команду '5' с адресом например непосредственно следующим за командой. При вызове команды '5' отсчет начинает производиться вновь с нуля, что позволяет выводить бесконечно длинные сообщения.
Еще одним немаловажным условием для работы с подпрограммой вывода сообщений является обязательное расположение списка адресов сообщений и самих сообщений по адресу не менее ¤E000. Это связано с тем, что подпрограмма выводящая сообщения располагается в другой странице псевдо-ПЗУ и не может иметь одновременный доступ к своим данным и данным в другой странице.
'0212' - вводит символ с устройства. В наиболее частом виде это происходит с клавиатуры, но может также быть например из файла (команда ДОС [EXEC), или при нажатии функциональной клавиши, такие символы будут введены из буфера переопределяемых клавиш.
'0215' - вводит символ с клавиатуры выводя на экран курсор. Никакой обработки или проверки при вызове подпрограммы не происходит. Подпрограмма использует для работы регистр 'Y'. При нажатии клавиши в аккумуляторе возвращается соответствующий символ. В ячейке 'YSAV1' находится символ на котором стоял курсор.
'0218' - позволяет производить обмен с диском на уровне секторов. Для работы с подпрограммой нужно заполнить таблицу которая располагается в нулевой странице начиная с адреса ¤1F. При работе драйвера НГМД параметры не изменяются, поэтому можно использовать например текущий НГМД не изменяя SLOT, DRIV, SHGFD, или изменять номер сектора на очередной непосредственно в таблице командой 'DEC' или 'INC'.
.кс0
SLOT - в ней содержится номер разъема накопителя умноженный на ¤10.
DRIV - номер привода накопителя. Первому приводу соответствует число 0, второму 1.
TRAK - номер трека на котором располагается обрабатываемый сектор.
SECT - номер обрабатываемого сектора.
BUFR - адрес буфера в который читается или из которого пишется сектор. Адрес указыватся двумя байтами в порядке младший, старший.
RBOT - команда драйверу НГМД.
1 - Чтение сектора с диска. 2 - Запись сектора на диск.
¤80 - Форматирование диска.
SRAZU - команда используемая при работе с MFM НГМД. Если старший бит в ячейке 'SRAZU' установлен в 1, то драйвер будет работать также, как и драйвер FM НГМД, т.е. выполнять чтение или запись сразу после получения команды. Если же старший бит в 'SRAZU' равен 0, то информация о секторе будет буферизирована. Также будет буферизироваться информация о всех последующих секторах, до тех пор, пока не будет заказана работа с другим треком, или старший бит в 'SRAZU' установлен в 1. В этом случае все буферизированные сектора будут обработаны сразу. Это позволяет довести скорость обмена с НГМД, до максимально возможного - производить обработку трека за один оборот диска.
SHGFD - определяет тип НГМД. Если старший бит 0 - FM накопитель, 1 - MFM.
OTZV - код завершения обмена. Если после выхода из подпрограммы признак 'C' процессора сброшен в 0, то обмен завершился успешно, если 'C'=1, то произошла ошибка. В ячейке 'OTZV':
0 - Успешное завершение. 1 - Ошибка обмена с НГМД. 2 - Диск закрыт на запись.
Остальные ячейки относящиеся к драйверу диска являются рабочими и для пользователя важной информации не несут.
.стОписание.Часть 4
[an error occurred while processing this directive]