;	                Драйвер винчестера
;                :::::::::::::::::::::::::::::::::
; 	        *** Written by Oleg H. mar 1996 ***
;
;
; Литература:
;
;   1. RT11 Software support manual, chapter 7 (Device handlers)
;        (c) Digital Equpment Corporation, 1983
;
;   2. Программное обеспечение ДВК, книга 5 (Руководство системного 
;                                            программиста)
;        НИИ "Научный центр", 1990
;
	.TITLE	HDD-disk handler
	.LIST	TTM
	.DSABL	GBL
;	.ENABL	LC
	.MCALL	.Drdef .Rofdf .Exit .Print
	.rofdf
;---------------------------------------------------------------------------
;  Здесь необходимо установить параметры генерации Вашей О.С.
; Установите "1" вместо "0" напротив тооо параметра, который поддерживается
; Вашей О.С.
	ERL$G  = 0		; Регистрация ошибок
	MMG$T  = 0		; Поддержка расширенной памяти
	TIM$IT = 1		; Поддержка тайм-аута
	RTE$M  = 0		; ???

	WD$csr = 176670
	WD$vec = 144
	WD$Lqe = <1022-1006>
	WD$Cqe = <1022-1010>
	WD$Exe = <1022-1012>
	
	pw$vec = 24
	rsk2   = 176674
	rdk2   = 176676
	keyprc = 111144
	dprc0  = 174152
	disp   = 174164
	rap    = 177010
	rdp    = 177014
	WD$reg = 177054
	sysreg = 177716
	casadr = 32		; 26		; with 600 !
	PASWRD = 342
	ADRPRC = 7126		; Процесс рестарта
	NPart  = 8.
;	PHBase = 1200-<H$1200-InHBeg>	; 1100
	D$Set  = 1
;---------------------------------------------------------------------------
;	STATUS:	SPFUN$ разрешены обращения .SPFUN
;		HNDLR$ вход в точку отмены даже при отсутствии эл-та очер-и
;		SPECL$ устройство имеет специальную файловую структуру
;		WONLY$ устройство только для вывода
;		RONLY$ устройство только для  ввода
;		FILST$ устройство прямого доступа со структурой RAFOS
;                                          ????
	.DRDEF	WE,53,Filst$!SpFun$!VarSz$,1.,WD$CSR,0
;---------------------------------------------------------------------------
	.ASECT
.=2
	
.IIF Gt,.-176,.ERROR .; Overflow space1
;---------------------------------------------------------------------------
.=200

.IIF GT,.-400,.ERROR .; Overflow space2 (install check)
;---------------------------------------------------------------------------
.=400
;
;	Место для опишания SET-параметров драйвера
; USE:
;	OPTION:	Имя парметра
;	VAL:	Значение != 0 , помещается в R3 при вызове SUBR
;	SUBR:	Имя обслуживающей подпрограммы / должна быть в SPACE3 /
;	MODE:	Описатель параметра , может быть:
;		NO:	Допускает префикс "NO"(/ точка входа SUBR+4 /
;		NUM:	Допускает указание десятичного  значения
;		OCT:	Допускает указание восьмеричного значения
;		Значение MODE помещается в R0 при вызове SUBR
;
;##	.DRSET	##OPTION,##VAL,##SUBR [,##MODE]
;---------------------------------------------------------------------------
	.DRSET	SYSGEN,sysptr,SYSGN
	.DRSET	subset,3,Set$D,NUM
	.DRSET	Auto,10000,Set$A,NO

sysgn:
	mov	(r3),r3
	mov	sysgen(r3),60
	bic	#^c7,60
	return

Set$D:	cmp	r3,r0
	bcs	1$
	ash	r3,r0
	movb	r0,Dset
1$:	return
	
Set$A:	clr	r3
	nop
	bic	#^c7,60
	bis	r3,60
	return

.IIF	GE,.-1000,.ERROR .; Overflow space3
;---------------------------------------------------------------------------
.=1000
;	Секция инициирования ввода/вывода.
;  Все регистры доступны для использования.
; Управление шюда передается, как только в очередь к драйверу
; ставится очередной элемент. Его адрес заносится в ##NAMECQE
;       Смещения элементов очереди:
;        Q$LINK -4 Адрес след. элемента очереди
;        Q$CSW  -2 Указатель на слово состояния канала
;     *  Q$BLKN  0 Номер блока на устройстве
;        Q$FUNC  2 Код специальной функции
;        Q$JNUM  3 Номер задачи
;        Q$UNIT  3 Номер устройства
;     *  Q$BUFF  4 Адрес буфера
;     *  Q$WCNT  6 Количество слов для чтения (if Q$WCNT < 0 then write)
;        Q$COMP 10 Адрес процедуры завершения
; В этой секции необходимо разрешить прерывания от устройства и выйти
; по RETURN. Если устройство не имеет прерываний, то в этой секции 
; необходимо произвести весь ввод/вывод и выйти через .DRFIN .
; В последнем случае необходимо удалить из тела драйвера секцию
; обработки прерываний и установить фиктивную метку ##NAMEINT.
;	
	.DRBEG	WE
.=.-2
	mov	WEcqe,r4
	mov	@#WD$vec,r5		; WD$Int
	beq	WeErr			; WD не загружен

	clr	WElqe
	clr	WEcqe
Dset	= :.+2
	bisb	#D$Set*8.,Q$Unit(r4)	; Смещение
;**	clr	Q$link(r4)		; ** Эл-т всегда последний
	sub	#WD$Lqe,r5
	mov	(r5),r3			; Последний эл-т очереди
	beq	empty
	
	mov	r4,(r5)			; Последний эл-т новой очереди
	mov	r4,Q$link(r3)		; Добавим эл-т в очередь к WD
	Return	

empty:	
	mov	r4,(r5)			; Последний эл-т новой очереди
	mov	r4,-wd$cqe+wd$lqe(r5)	; Первый эл-т новой очереди
	jmp	-wd$exe+wd$lqe(r5)
	


;---------------------------------------------------------------------------
;	Секция обработки прерывания.
;  Сюда передается управление при прерывании от устройства. Здесь необходимо
; произвести ввод/вывод; при его завершении или ошибке управление передать
; на .DRFIN, а если необходимо ждать след. прерывания, ъыйти по RETURN.
; Для использования доступны R4 и R5.
;  На метку ##ABORT управление передается при преждевременном снятии 
; программы, инициировавшей ввод/вывод.

WEERR:
WEINT:				; NO INTERRUPT
	bisb	#HDERR$,@-(r4)	; В PSW псевдовектора - код ошибки
	.DRFIN WE


;    После .DRFIN могут быть размещены подпрограммы резилентной части 
; драйвера.
;---------------------------------------------------------------------------

	.DREND WE

;5555555555555555555555555555555555555555555555555555555555555555555555555
	.End
