РДС.Руководство программиста. 1.Введение. Программирование в РДС мало отличается от программирования в СР/М,интерес для программиста представляют системные ячейки и переключение режимов.Кроме того есть некоторые тонкости в работе с адресами 0А000h по 0DFFFh. 2.Системные ячейки. РДС предоставляет программисту 62,5кб в режиме 0 (полностью совместимом с СР/М) и 64кб в режиме 1.При этом в обоих режимах задействованы системные ячей ки,которые находятся в нулевой системной странице памяти(адреса с 0 по 0100h) Как известно в ОС СР/М в этой области памяти зарезервированы следующие адреса 0-2 - "горячий" старт ОС, 3 - байт конфигурации, 4 - номер текущего диска и области пользователя, 5-7 - переход на диспетчер функций BDOS, 38h-3Ah - переход на обработку прерывания по кадровому импульсу (в "Вектор 06Ц"), 5Ch-7Fh - зарезервированы для БУФ файла, 80h-0FFh - зарезервированы под область DMA. В РДС добавлены следующие ячейки: 8-0Аh - переход на диспетчер функций BDOS,добавлен для корот- кого вызова BDOS - командой RST 1,а также зарезервирован для расширения функ- ций BDOS. 0Bh-0Dh - признак РДС (три байта в КОИ-8 - "РДС"),для того что- бы программа смогла определить (если надо),что она работает именно в РДС. 0Eh - версия РДС,старшая тетрада - номер версии,младшая - номер коррекции. 0Fh - слово включения резидентной части РДС,байт выводимый в порт 10h.В данной версии ОС,РДС находится в нулевой зоне квазидиска,соответ ственно слово включения будет - 20h. 3Bh - копия порта 10h,используется при обращении к резидент ной части РДС.(См. также п.8) 3Ch - слово возврата из резидентной части РДС,после холодно ного старта и для полной СР/М-совместимости установлено в 23h,но может быть изменено (например,если его установить в 0,то по адресам с 0A000h по 0DFFFh будут находится 2 и 3 экранные плоскости). 3Dh - коды ошибок BIOS,если при обмене с диском не было оши бок,устанавливается в 0.В основном эта ячейка предназначена для режима работы РДС номер 1. 3Eh - номер текущего режима РДС (биты 0-6),в данной версии использутся только режимы 0 и 1,бит 7 зарезервирован для переключения режимов 3Fh - номер режима обработки ошибок BIOS при обмене информа цией с дисками.Номера 0 и 2 используются только в режиме 0 РДС,номер 1 - в лю бом. - номер 0 (установлен при холодном старте) -- ошибки обрабатывает BIOS,выво- водится сообщение типа "BIOS ERROR,CONTINUE ?" - номер 1 -- BDOS и BIOS игнорируют ошибки,их обработка поручается программе пользователя,в ячейке 3Dh - код ошибки. - номер 2 -- ошибки передаются для обработки BDOS - номер 3 -- дополнительный режим, ошибки обрабатываются BDOS, плюс при чте- нии с КД выполняется корректировка контрольных сумм по данным секторов 40h-5Bh - зарезервированы в режиме номер 1. Кроме того,в сегменте РДС (то есть в данной версии зона 0) по адресу 0А000h находятся три слова,которые содержат адреса частей РДС интересных для програм миста.По адресу 0А000h - адрес начала кода BIOS,0А002h - адрес начала BIOS ди сплэя (РК-консоль) и 0А004 - адрес начала знакогенератора. 3.Переключение режимов. Режим номер 1 в РДС есть то новое,ради чего и была написана эта ОС,этот ре- жим предоставляет пользователю все 64кб ОЗУ ВЕКТОРа,и предназначен для созда- ния ВЕКТОРовских программ для ДОС.Именно он позволяет использовать полноцвет- ную графику и дисковые функции BDOS одновременно,- без всяких проблем. Я не случайно упомянул,про дисковые функции,-дело в том,что в режиме 1,фун- кции работы с консолью BDOS не работают,ведь подразумевается,что программа для того и выходит в него,чтобы использовать нестандартные векторовские функ- ции работы с экраном,поэтому эта программа должна их в себе содержать.Кстати, для своей работы программа пользователя может использовать знакогенератор РДС который содержит 256 знаков с матрицей 6Х10 точек (10 байт на символ). Кроме того,возможно использование программы обработки "дисплэйного" прерыва ния (RST 7) и подпрограмм работы с клавиатурой (об этом смотри п.8). Теперь приведу пример переключения режимов.Представим программу,которой тре буется после загрузки перейти в режим 1,использовать 16-цветную графику и ра- боту с дисками,а после окончания работы,скажем по желанию пользователя,-выйти обратно в ОС.Ниже приведен пример структуры такой программы. ВНИМАНИЕ ! По сравнению с v1.XX ,переключение из режима в режим стало более удобным,- не обязательно после каждого переключения "сбрасывать" дисковую под систему. START: LXI SP,0 DI XRA A STA 3CH ;По адресам 0А000h-0DFFFh должно быть экранное ОЗУ. MVI A,81H STA 3EH ;Переходим в режим 1,бит 7 - признак переключения. MVI C,0 ;Используем для этого функцию 0. CALL 5 ;или RST 1 ;После этого РДС установит режим обработки дисковых ;ошибок номер 1,и запишет 0C9h (RET) по адресу 38h. LDA 4 STA TDISK ;Возьмем номер текущего диска. LXI H,INT0 SHLD 1 ;Установим адрес перехода по БЛК+СБР, LXI H,INT7 SHLD 39H ;и адрес "дисплэйного" прерывания. MVI A,0C3H STA 38H EI ;Разрешаем прерывания. . . . Далее текст программы... . . . ;Здесь выход в РДС. EXIT: DI MVI A,80H STA 3EH ;В режим номер 0. MVI C,0 CALL 5 ;После этого РДС установит режим обработки ошибок - 0 ;и запишет 23h по адресу 3Ch. EI LDA TDISK STA 4 ;Установим текущим прежний диск. JMP 0 END 4.Пример обработки ошибок BIOS в режиме РДС номер 1. При работе программы в режиме номер 1,при использовании дисковых функций BDOS нужно следить за ошибками BIOS.Примерный код такого обработчика приведен ниже. ;Программа вызывающая функции BDOS. . . . MVI C,15 CALL V5 ;Вызов функции BDOS. . . . V5: CALL 5 MOV C,A ;Сохраним "выход" BDOS. LDA 3DH ANA A MOV A,C RZ ;Возврат,если нет ошибок. BIOSER: ;Здесь код обработчика ошибок BIOS. . . . Кроме приведённого выше способа обработки дисковых ошибок в режиме РДС но- мер 1,есть ещё один способ. Он заключается в том,что режим обработки ошибок (ячейка 3Fh) устанавливают, как и режиме 0 РДС,в 0 или 2,но при этом перехватывают обработку функций РК- консоли.Об этом смотри п.8. 5.Доступ к данным BIOS дисплэя. По смещению 1Еh от начала кода BIOS дисплэя, находится указатель (слово) на некоторые небезынтересные для программиста ячейки. +-----+-----+--------------------------------------------------------------+ |Смещ.|Длина| Назначение данных | +-----+-----+--------------------------------------------------------------+ | 0 | 1 | ХХ | | 1 | 1 | Текущая координата X курсора,от 0 до 79. | | 2 | 1 | Текущая координата Y курсора,от 0 до 255. | | 3 | 1 | При ненулевом значении байта,при каждом прерывании по кадрово| | | |му импульсу,будет устанавливаться палитра и этот байт уменьш..| | 4 | 16 | Таблица элементов палитры (цветов). | | 20 | 2 | Указатель на текущую кодовую таблицу символов. | | 22 | 2 | Указатель на коды,вырабатываемые при нажатии комбинаций кла- | | | |виш <УС>,<СС> и клавиш дополнительного поля клавиатуры (также | | | |такие как <ТАБ>,<ПС>,<ЗБ>,<ВК>), - это четыре группы по 16 б.;| | | |и следом за ними четыре группы по 12 байт - коды псевдографики| | | |вырабатываемые при совместном нажатии клавиш <УС+СС> и дополни| | | |тельного поля клавиатуры. | | 24 | 1 | Цвет бордюра экрана и признак режимов 512/256 (копия порта 2)| | 25 | 1 | Ячейка Scroll,копия порта 3. | | 26 | 1 | Байт определяющий нажата ли какая-либо клавиша,если -1,то нет| | 27 | 1 | Больше не используется, оставлено для совместимости. | | | |Было RUSLT=FFh, при =A0h ускоряет работу ПП обработки прерыва-| | | |ния,пропуская проверку при отсутствии нажатых клавиш и РУС/СС.| | 28 | 2 | MODKEY: состояние РУС и СС (= 0,1 или 2) | | 30 | 1 | PORT1. Как бы состояние порта 1, но РУС=7 и 5 биты, СС=6 бит.| | 31 | 1 | Количество введенных кодов в буфере клавиатуры. | | 32 | 1 | Указатель на первое свободное место в буфере клавиатуры. | | 33 | 1 | Указатель на первый введенный код в кольцевом буфере. | | 34 | 8 | Кольцевой буфер клавиатуры на 8 символов. | | 42 | 1 | Константа чтения,подпрограммы чтения байта с магнитофона. | | 43 | 1 | Константа записи,подпрограммы записи байта на магнитофон. | | 44 | 1 | При ненулевом значении этого байта,при каждом нажатии на кла-| | | |виши,будет подаваться звуковой сигнал. | | 45 | 1 | TIMER | | 46 | 1 | POVTK | | 47 | 1 | POVTK2 | | 48 | 1 | CNTCUR | | 49 | 1 | CURFR | | 50 | 1 | ESCCNT | | 51 | 1 | ESCP | | 52 | 1 | MASC | | 53 | 1 | MIGCN | +-----+-----+--------------------------------------------------------------+ Пример доступа к этим данным: . . . DI LDA 15 OUT 10H LHLD 0A002H LXI D,1EH DAD D MOV E,M INX H MOV D,M XCHG ;теперь в HL адрес начала данных. LXI D,СМЕЩЕНИЕ ; смещение нужного байта. DAD D . . . ;здесь производятся неоходимые над этими данными действия. . . . LDA 3CH ;отключение "сегмента" РДС. OUT 10H EI . . . 6.Новые функции BDOS. Начиная с версии 2.00, в BDOS РДС введены новые функции,которые вызываются с занесением в регистр С значения 80h,а в регистр В - номер новой функции. Функция 0. Тест квазидиска,в D передаётся номер диска (C: = 2), в E параметры проверки (0 - обычный тест, 1 - тест с восстановлением контрольных сумм секторов, 2 - форматирование КД). При обнаружении ошибки выводится сообщение с указа- нием номера дорожки и сектора. Функция 1. Сообщение о занятости текущего диска.Входных параметров нет,на выходе в HL содержится количество занятых файлами килобайт,в DE - всего килобайт на диске Функция 2. Переназначение ввода с клавиатуры на файл,в DE БУФ файла.На выходе - А=0FFh если ошибка,иначе А=0. Функция 3. Установка вывода в файл,выводимых на экран символов,в DE БУФ файла.Если всё нормально - на выходе А=0. Функция 4. Закрытия файла вывода символов.Без параметров. Функция 5. Запуск BAT-файла,в DE БУФ,по адресу 80h - параметры для BAT-файла в том же формате,в котором они передаются Consol Command Processor'ом COM-файлу.Пара- метры должны быть разделены пробелом.Подробнее см. в "РДС.Руководство пользо вателя".На выходе - А=0,если всё нормально. Функция 6. Получение очередного символа из BAT-файла.На выходе - А=очередной символ, или 1Аh,если достигнут конец файла. Функция 7. Получение параметров BAT-файла,в DE адрес следующей структуры: 1-й байт - номер параметра,2 и 3-й байт - адрес,куда переслать параметр. Функция 8. Статус BAT-файла,на выходе А=0 - не активен,А=-1 активен. Функция 9. Вызов функций BIOS,в DE адрес следующей структуры: 1-й байт - номер функции (номер 0 - активность клавиатуры),2 и 3-й байт - передаваемые параметры. Функция 10. Передача команд основному CCP РДС - файлу COMMAND.SYS,по адресу 80h- до 128 символов команд,разделённых 0Dh и 0Аh,и заканчивающихся символом 1Аh. Функция 11. Установка активности альтернативного CCP,в DE БУФ файла с обязательным ука- занием диска. Функция 12. При Е=0 - деактивизация альтернативного CCP,возвращение активности основно- му;при Е=-1 получение статуса альтернативного CCP,если А=0 - не активен,А=-1 - активен. Функция 13. Проверка текущего диска на статус Read only,если он установлен то происхо- дит "сброс" текущего диска. Функция 14.Получение номера "диска" HDD. Вход: регистр Е - номер диска (А:=0 и т.д.);выход: HL=номер (0 - если не один "диск" не подключен),DE=максимальный возможный номер "диска". Функция 15.Установка номера "диска" HDD. Вход: по адресу 4 - номер диска (обычно текуший,А:=0 и т.д.),DE=номер; выход: А=0 - нормально. ПРИМЕЧАНИЕ: Все параметры-адреса должны лежать (в новых функциях) вне диа- пазона 0A000h-0DFFFh. 7.Установка и работа альтернативного Consol Command Processor'a. В версиях РДС до 2.00,была возможность подмены основного CCP методом замены файла COMMAND.SYS,но начиная с версии 2.00 появляется более элегантное реше- ние этой проблемы.С помощью новых функций BDOS №№ 10,11,12 возможна одновре- менная работа основного и альтернативного CCP. К примеру,оболочка типа Vector Commander с помощью новой функции 0B80h,уста навливает себя в качестве активного (загружаемого после каждого "горячего" старта) CCP, и при необходимости передаёт, с помощью функции 0A80h,команды основному CCP.После вызова этой функции,необходимо сделать "горячий" старт,т. е. JMP 0,после этого временно,до конца выполнения последней переданной коман- ды,становится активным основной CCP,а затем снова передаётся управление аль- тернативному. 8.Использование подпрограмм "дисплэного" прерывания и работы с клавиатурой. Ниже приведён пример программы,которая переходит в режмим РДС №1 и при этом использует для своей работы подпрограмму "дисплэйного" прерывания,функции ра- боты с клавиатурой РДС,а также перехватывает подпрограмму вывода символа на экран "РК-консоли" (в виду возможных ошибок диска) на подпрограмму вывода сим вола в окно сообщений ОС. ; Программа начинает свою работу ещё в режиме РДС №0. LHLD 6 LXI D,37H ;по смещению 36h,от адреса перехода на диспетчер ;функции BDOS,содержится команда перехода на адрес ;"дисплэйного" прерывания в сегменте РДС. DAD D MOV E,M INX H MOV D,M XCHG SHLD OINT7+1 LDA 4 ;здесь переход в режим №1. STA MEM4 MVI C,0 MVI A,81H STA 3EH CALL 5 DI LXI H,INT7 SHLD 39H MVI A,0C3H STA 38H LXI H,BDOS SHLD 6 SHLD 9 ;после перехода в режим №1,при вызове функций BDOS ;по умолчанию блокируются прерывания,поэтому здесь ;происходит замена векторов. LDA 0FH OUT 10H LHLD 0A002H LXI D,10 DAD D MOV E,M INX H MOV D,M XCHG SHLD OPRINTC ;сохраняем старый адрес подпрограммы вывода символа. XCHG LXI D,IN_WINDOW ;это адрес подпрограммы вывода символа в окно ;сообщений ОС.Незабудьте,что в момент передачи уп ;равления этой подпрограмме,подключен сегмент РДС ! MOV M,D DCX H MOV M,E XRA A STA 3CH ;по адресам 0А000h-0DFFFh будут 2 и 3 экр.плоскости. STA 3BH OUT 10H EI ;Здесь можно также было установить новую таблицу цветов и отключить ;режим 512/256 экрана,установив соответствующие ячейки. ;Ниже начинается основная программа. . . . INT7: PUSH H PUSH PSW LDA 15 OUT 10H LXI H,0 DAD SP LXI SP,STEK1 OINT7: CALL 0 SPHL LDA 3BH ;возможно прерывание произошло в момент обращения ;в сегмент РДС. OUT 10H POP PSW POP H EI RET BDOS: LXI H,0 DAD SP SHLD BDOS10+1 DI LDA 15 STA 3BH OUT 10H LXI SP,STEK2 EI CALL 0A006H ;на диспетчер BDOS в сегменте РДС. DI MOV C,A BDOS10: LXI SP,0 LDA 3CH STA 3BH OUT 10H MOV A,C EI RET ;При возврате в режим №0,нужно будет лишь восстановить адрес ;подпрограммы вывода символа на экран. 9.Заключение. В заключении хочу упомянуть о некоторых тонкостях работы с адресами 0A000h- 0DFFFh.Все дисковые функции работают с этими адресами корректно,а вот функции 9 и 10 в режиме 0,если их параметры лежат в указанном диапазоне,не будут рабо тать верно.Это надо учитывать при разработке программ,в крайнем случае можно написать собственные аналогичные функции. И последнее,новый ПКК после запуска COM-файла,по адресу 4Сh оставляет БУФ запущенного файла.Таким образом программа может узнать под каким именем и что очень важно - с какого диска она загружена. Вьюнов.