Работа с ДОС из программы пользователя


Главная / ЭКВМ / Программы / Примеры

Разрешение дисковых операций

Перед началом работы с ДОС необходимо записать число 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)

  0 1 2 3 4 5 6 7 8 9
000 Cx 1 0 PP П 90 25 1 PP П 91 20
010 Cx PP П 91 28 PP П 91 21 PP ИП 91 29
020 P x=0 03 00 1 0 0 0 П B 3 PP П
030 90 31 2 0 П 0 2 6 K СЧ × 9
040 7 + K П B PP П 90 34 ИП B 1 + П B
050 PF L0 00 35 0 PP П 90 30 1 PP П 90
060 47 1 П A 4 PP П 91 28 PP П 91 25
070 PP ИП 91 29 P x=0 03 00 0 П A 0 PP П
080 90 30 ИП A PP П 91 22 0 PP П 90 31
090 PP ИП 90 33 4 - P x=0 01 28 3 PP П
100 90 31 1 0 0 0 П B 2 0 П 0
110 K ИП B PP ИП 90 34 - P x=0 01 28 ИП B 1
120 + П B PF L0 01 10 P БП 01 48 ИП A 1
130 + П A 6 4 - P x=0 00 78 0 2
140 7 0 PP П 90 26 P БП 02 54 ИП A PP П
150 10 80 1 PP П 90 47 2 П A PP ИП 10
160 80 PP П 91 28 PP П 91 23 PP ИП 91 29
170 P x=0 03 00 ИП A 1 - P x≠0 01 89 0
180 2 8 5 PP П 90 26 P БП 02 54 1
190 PP П 90 47 3 П A PP ИП 10 80 PP П 91
200 28 PP П 91 26 PP ИП 91 29 P x=0 03 00
210 1 PP П 90 47 4 П A PP ИП 10 80 PP П
220 91 28 PP П 91 23 PP ИП 91 29 P x=0 03
230 00 ИП A 3 - P x≠0 02 47 0 2 8
240 5 PP П 90 26 P БП 02 54 0 2 5
250 9 PP П 90 26 Cx PP П 91 20 С/П 8Eh 'О'
260 E8h 'ш' A8h 'и' A1h 'б' AEh 'о' AAh 'к' 20h ' ' ADh 'н' A5h 'е' E2h 'т' 00h
270 94h 'Ф' A0h 'а' A9h 'й' ABh 'л' 20h ' ' ADh 'н' A5h 'е' 20h ' ' ADh 'н' A0h 'а'
280 A9h 'й' A4h 'д' A5h 'е' ADh 'н' 00h 8Eh 'О' E8h 'ш' A8h 'и' A1h 'б' AAh 'к'
290 A0h 'а' 20h ' ' A2h 'в' 20h ' ' E4h 'ф' A0h 'а' A9h 'й' ABh 'л' A5h 'е' 00h
300 П B P x<0 03 06 Cx П B 9 - F x≥0 12
310 9 П B 1 0 0 0 B↑ 5 PP П 90
320 52 ИП B 0 4 9 5 + K ИПРГ 0 3
330 3 7 + PP П 90 26 С/П 8Dh 'Н' A5h 'е' E2h 'т'
340 20h ' ' AEh 'о' E8h 'ш' A8h 'и' A1h 'б' AEh 'о' AAh 'к' 00h 8Dh 'Н' A5h 'е'
350 E2h 'т' 20h ' ' A4h 'д' A8h 'и' E1h 'с' AAh 'к' A0h 'а' 00h 84h 'Д' A8h 'и'
360 E1h 'с' AAh 'к' 20h ' ' ADh 'н' A5h 'е' 20h ' ' E4h 'ф' AEh 'о' E0h 'р' ACh 'м'
370 A0h 'а' E2h 'т' A8h 'и' E0h 'р' AEh 'о' A2h 'в' A0h 'а' ADh 'н' 00h 8Dh 'Н'
380 A5h 'е' E2h 'т' 20h ' ' ACh 'м' A5h 'е' E1h 'с' E2h 'т' A0h 'а' 20h ' ' ADh 'н'
390 A0h 'а' 20h ' ' A4h 'д' A8h 'и' E1h 'с' AAh 'к' A5h 'е' 00h 8Dh 'Н' A5h 'е'
400 E2h 'т' 20h ' ' ACh 'м' A5h 'е' E1h 'с' E2h 'т' A0h 'а' 20h ' ' A2h 'в' 20h ' '
410 AAh 'к' A0h 'а' E2h 'т' A0h 'а' ABh 'л' AEh 'о' A3h 'г' A5h 'е' 00h 8Eh 'О'
420 E8h 'ш' A8h 'и' A1h 'б' AAh 'к' A0h 'а' 20h ' ' A8h 'и' ACh 'м' A5h 'е' ADh 'н'
430 A8h 'и' 00h 8Eh 'О' AFh 'п' A5h 'е' E0h 'р' A0h 'а' E6h 'ц' A8h 'и' EFh 'я'
440 20h ' ' ADh 'н' A5h 'е' A2h 'в' AEh 'о' A7h 'з' ACh 'м' AEh 'о' A6h 'ж' ADh 'н'
450 A0h 'а' 00h 8Eh 'О' A1h 'б' EAh 'ъ' A5h 'е' AAh 'к' E2h 'т' 20h ' ' ADh 'н'
460 A5h 'е' 20h ' ' A2h 'в' EBh 'ы' A1h 'б' E0h 'р' A0h 'а' ADh 'н' 00h 8Dh 'Н'
470 A5h 'е' E2h 'т' 20h ' ' E0h 'р' A0h 'а' A7h 'з' E0h 'р' A5h 'е' E8h 'ш' A5h 'е'
480 ADh 'н' A8h 'и' EFh 'я' 00h 8Dh 'Н' A5h 'е' A8h 'и' A7h 'з' A2h 'в' A5h 'е'
490 E1h 'с' E2h 'т' ADh 'н' AEh 'о' 00h 00h 0Bh 15h 2Ah 3Dh
500 52h 5Fh 73h 84h 93h          

Текст программы 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 (многоканальный)