Работа с ДОС из программы пользователя |
Главная / ЭКВМ / Программы / Примеры |
Разрешение дисковых операцийПеред началом работы с ДОС необходимо записать число 1 в R9120. После окончания работы с ДОС рекомендуется запретить все дисковые операции, для этого в R9120 записывается число 0. Разрешение операцииКаждую операцию, кроме чтения строки каталога, требуется разрешать отдельно - для защиты от случайного исполнения. При этом содержимое регистра RX, которое передаётся в регистр функции ДОС, предварительно записывается в R9128 - на практике перед каждой функцией ставится команда "РР П 9128" или её аналог с косвенной адресацией. Ошибки дисковых операцийЛюбая программа, работающая с дисками, должна учитывать возможность возникновения ошибок. Для проверки успешности выполнения операции считывается содержимое R9129. Ненулевое значение свидетельствует о возникновении ошибки, их перечень приведён в эксплуатационной документации. Нулевое значение соответствует успешному выполнению. Выбор дискаПеред началом работы с файлами и каталогами нужно указать номер диска: 0 (диск А - внутренний) или 1 (диск В - внешний, например УЗВМК). При успешном выполнении операции автоматически считывается и становится доступным для обращений головной каталог диска. При обращении к внутреннему диску операцию можно пропустить - она автоматически выполняется при разрешении дисковых операций. Чтение строки каталогаФайлы и каталоги на диске различаются по имени, но обращение к ним через функции происходит по номеру строки в текущем каталоге. Функция R9122 считывает строку каталога в универсальный байтовый буфер - формат приведён в документации. Перед чтением следует записать определённое значение (к примеру, нулевое) в индексный регистр 0 через R9030. Для корректной работы с файлами и каталогами в программе пользователя необходимо иметь функцию поиска нужной строки каталога. Перед разбором поля имени рекомендуется проверять тип записи - это заметно ускоряет работу. Загрузка файла или каталогаПри использовании функции R9123 для считывания файла десятичных данных необходимо учитывать, что содержимое всех десятичных регистров от 0 до 9999 (включая R0-RE) при выходе из функции будет перезаписано. Загрузка файлов программы позволяет изменять содержимое памяти программ. Эта возможность снимает ограничение на максимальный размер программы, разбитой на отдельные модули. Удаление файла или каталогаПроизводится при обращении к R9124. Следует использовать с осторожностью: удалённые файлы восстановлению не подлежат. Файлы программ и непустые каталоги не удаляются. После удаления содержимое активного каталога будет изменено, поэтому при обращении к другому файлу или каталогу потребуется повторный поиск по имени. Создание файла или каталогаПеред обращением к R9125 следует перенести все 20 байт имени создаваемого файла в универсальный байтовый буфер: имя файла в ЭКВМ не ограничивается нулевым либо каким-либо иным символом. Неиспользуемый конец поля имени лучше заполнять пробелами - символом 32 (20h). Другие поля, в том числе тип записи, заполнять не требуется: тип указывается при обращении к R9125, остальные поля заполняются автоматически. Перед обращением к R9125 необходимо записать соответствующее значение в индексный регистр 0 через R9030. К примеру, при записи нуля в R9030 имя файла должно быть расположено в универсальном байтовом буфере в байтах с 3 по 22 включительно. После успешной записи содержимое каталога изменяется, поэтому при обращении к любому файлу, включая только что записанный, требуется выполнить его поиск по имени. При записи файлов данных следует обратить внимание на то, что в файл переносится содержимое энергонезависимой памяти, а не оперативной. Генерируемые в программе данные, которые требуется сохранить в файле, должны записываться в регистры памяти с использованием функции R9047. На практике, перед каждой командой записи таких данных в регистр (до формирования записываемого числа в RX и собственно его записи) следует выполнять последовательность команд "1 РР П 9047" или аналогичную с использованием косвенной адресации. Перезапись файлаВыполняется при обращении к R9126. Достоинство функции в том, что при перезаписи повторный поиск по имени не требуется. Позволяет периодически сохранять результаты длительных расчётов или данных текущего мониторинга на диск для последующего протоколирования или восстановления с промежуточной точки при выключении питания. Пример программыСледующий пример демонстрирует работу с файлами. В головном каталоге внутреннего диска создаётся файл десятичных данных со случайным именем, далее он перезаписывается и проверяется. При успешной проверке программа выводит в строке комментариев сообщение об отсутствии ошибок. При обнаружении какой-либо ошибки - соответствующий текст. Запись, чтение и перезапись файла десятичных данных (primdos.mkp, 505 байт; КС 81031/131)
Текст программы primdos.mkl для кросс-компилятора .CHARSET 1251 ; Файл primdos ; Запись, чтение и перезапись файла десятичных данных ; расположенного в головном каталоге STR1 .EQU 1000 FID .EQU 1080 ; номер строки каталога (вне области десятичных данных) CX 10 PP M 9025 ; очистить строку комментариев 1 PP M 9120 ; разрешить дисковые операции CX PP M 9128 ; разрешение PP M 9121 ; выбор диска A PP RM 9129 P X=0 FILEERR ; ошибка дисковой операции ; создать файл данных в головном каталоге ; создать и записать случайное имя в строку STR1 ; а также в поле имени УББ (со смещения 3) .NUM STR1 MB 3 PP M 9031 ; индекс 1 УББ 20 M0 ; размер поля имени 20 символов A1: 26 KRAN * 97 + ; В RX коды символов a-z KMB ; запись в STR1 PP M 9034 ; запись в УББ по индексу 1 с автоинкрементом RMB 1 + MB PFL0 A1 0 PP M 9030 ; обнулить индекс 0 УББ ; метка файла данных "1" 1 PP M 9047 ; разрешение записи в ЭСППЗУ 1 MA ; записать файл десятичных данных 4 PP M 9128 ; разрешение PP M 9125 ; запись файла PP RM 9129 P X=0 FILEERR ; ошибка дисковой операции ; найти номер строки в текущем каталоге 0 MA A2: 0 PP M 9030 ; индекс 0 УББ RMA PP M 9122 ; чтение очередной строки каталога в УББ 0 PP M 9031 PP RM 9033 4 - P X=0 A4 ; !=4 - это не файл десятичных данных 3 PP M 9031 ; начало имени файла в УББ .NUM STR1 MB ; начало имени файла в STR1 20 M0 ; длина имени A3: KRMB PP RM 9034 - P X=0 A4 ; перейти если имя не совпадает RMB 1 + MB PFL0 A3 P GOTO A5 A4: RMA 1 + MA 64 - P X=0 A2 ; цикл по строкам окончен, файл не обнаружен .NUM TEXT1 PP M 9026 P GOTO AE A5: ; файл обнаружен RMA PP M FID ; сохранить номер строки каталога в области двоичных данных ; изменить RA 1 PP M 9047 ; разрешение записи в ЭСППЗУ 2 MA PP RM FID PP M 9128 ; разрешение PP M 9123 ; чтение файла PP RM 9129 P X=0 FILEERR ; ошибка дисковой операции RMA 1 - ; проверить чтение P X!=0 A6 ; ошибка содержимого файла .NUM TEXT2 PP M 9026 P GOTO AE A6: ; изменить RA 1 PP M 9047 ; разрешение записи в ЭСППЗУ 3 MA PP RM FID PP M 9128 ; разрешение PP M 9126 ; перезапись файла PP RM 9129 P X=0 FILEERR ; ошибка дисковой операции ; изменить RA 1 PP M 9047 ; разрешение записи в ЭСППЗУ 4 MA PP RM FID PP M 9128 ; разрешение PP M 9123 ; чтение файла PP RM 9129 P X=0 FILEERR ; ошибка дисковой операции RMA 3 - ; проверить чтение P X!=0 A7 ; ошибка содержимого файла .NUM TEXT2 PP M 9026 P GOTO AE A7: .NUM TEXT0 PP M 9026 AE: CX PP M 9120 ; запретить дисковые операции R/S TEXT0: .TEXT "Ошибок нет\0" TEXT1: .TEXT "Файл не найден\0" TEXT2: .TEXT "Ошибка в файле\0" ;============================================== Обработка ошибки дисковой операции FILEERR: MB P X<0 FILEERR1 CX MB FILEERR1: 9 - F X>=0 FILEERR2 9 MB FILEERR2: 1000 ENT 5 PP M 9052 ; звук RMB .NUM TFERRT + K PRGM .NUM TFERR0 + PP M 9026 R/S .BASE TFERR0: .TEXT "Нет ошибок\0" TFERR1: .TEXT "Нет диска\0" TFERR2: .TEXT "Диск не форматирован\0" TFERR3: .TEXT "Нет места на диске\0" TFERR4: .TEXT "Нет места в каталоге\0" TFERR5: .TEXT "Ошибка имени\0" TFERR6: .TEXT "Операция невозможна\0" TFERR7: .TEXT "Объект не выбран\0" TFERR8: .TEXT "Нет разрешения\0" TFERR9: .TEXT "Неизвестно\0" TFERRT: .DBB TFERR0, TFERR1, TFERR2, TFERR3, TFERR4 .DBB TFERR5, TFERR6, TFERR7, TFERR8, TFERR9 .ENDP |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
НПП "СЕМИКО" (383) 271-01-25 (многоканальный) |