	.TITLE	VRSSMBAST - VERSATEC SYMBIONT AST ROUTINE
	.SBTTL	DEFINITIONS
;
;
;	LANGUAGE:  VAX-11 MACRO
;
;	OPERATING SYSTEM:  VAX/VMS
;
;	ORDER NUMBER:  12X-9XV
;
;	PART NUMBER:  000-025809-XXX REV. G  MAY, 1985
;
;	PRODUCT: VAX-11 DIAGNOSTIC,
;	PRODUCT: VAX/VMS DRIVER, SYMBIONT, AND OUTPUT PACKAGE
;
;	VERSATEC, INC., SANTA CLARA, CALIFORNIA 95051
;	A XEROX COMPANY
;
;	Copyright (C) 1985 by Xerox Corporation.  All rights reserved.
;
;	"NOTICE. THIS PROGRAM IS THE EXCLUSIVE PROPERTY OF VERSATEC,
;	INC. AND IS ISSUED IN STRICT CONFIDENCE UNDER A PREARRANGED
;	LICENSE AGREEMENT AND IS NOT TO BE DISCLOSED IN ANY MANNER TO
;	PERSONS OUTSIDE THE LICENSED ORGANIZATION AND SHALL NOT BE
;	REPRODUCED OR DISSEMINATED, IN WHOLE OR PART, TO ANYONE OUTSIDE
;	THE LICENSED ORGANIZATION WITHOUT THE PRIOR WRITTEN APPROVAL OF
;	VERSATEC, INC. UNLESS OTHERWISE PROVIDED FOR BY SUCH LICENSE
;	AGREEMENT.  THIS WORK IS PROTECTED AS AN UNPUBLISHED WORK UNDER
;	THE COPYRIGHT ACT OF 1976."
;
;
;	VERSATEC SYMBIONT AST ROUTINE
;
;	B.L.	MAY, 1985	INITIAL RELEASE WITH REV. G DRIVER
;
 
	.PSECT	VRSSMBAST,EXE,RD,NOWRT,LONG
 
	$LPDEF
	$QIODEF
	$TTDEF
 
	.LIBRARY	\SYS$LIBRARY:LIB\
	$SMBDEF
 
	.PAGE
	.SBTTL	AST READ MESSAGE ROUTINE
	.ENTRY	VRSSMB$AST ^M<>		;AST ENTRY POINT
RD_MSG:
	PUSHAB	SD_L_REQUEST		;ADDRESS OF LONGWORD TO HOLD REQ. CODE
	PUSHAB	SD_Q_MESSAGE		;ADDRESS OF MESSAGE STRING BUFFER
	PUSHAL	SD_L_STREAM		;STREAM NUMBER (=0)
	CALLS	#3,G^SMB$READ_MESSAGE	;READ THE MESSAGE
	BLBC	R0,BR_ERR		;BRANCH IF ERROR
RD_ITM:
	PUSHAB	SD_W_ITM_SIZ		;ADDR OF WORD TO GET ITEM SIZE
	PUSHAB	SD_Q_ITM_BUF		;ADDR OF STR DESC TO GET ITEM BUFFER
	PUSHAB	SD_L_ITM_COD		;ADDR OF LONG-WORD TO GET ITEM CODE
	PUSHAB	SD_L_CONTEXT		;ADDR OF CONTEXT LONG-WORD
	PUSHAB	SD_Q_MESSAGE		;ADDR OF MESSAGE STRING BUFFER
	CALLS	#5,G^SMB$READ_MESSAGE_ITEM ;READ A MESSAGE ITEM
	BLBS	R0,PROCESS_ITM		;BRANCH IF SUCCESSFUL READ
	CMPL	R0,#SMB$_NOMOREITEMS	;ANY MORE ITEMS?
	BNEQ	BR_ERR			;UNKNOWN MESSAGE
	BRW	PROCESS_MSG		;NO MORE ITEMS, GO PROCESS MESSAGE
BR_ERR:	BRW	FATAL
 
	.PAGE
	.SBTTL	AST INTERPRET ITEM ROUTINE
PROCESS_ITM:
	CMPL	SD_L_ITM_COD,#SMBMSG$K_DEVICE_NAME ;DEVICE NAME?
	BNEQ	10$			;BRANCH IF NOT
	MOVAQ	SD_Q_DEV_NAM,R0
	BRW	200$			;BRANCH TO COPY ITEM
 
10$:	CMPL	SD_L_ITM_COD,#SMBMSG$K_FILE_IDENTIFICATION ;FILE ID?
	BNEQ	20$			;BRANCH IF NOT
	MOVAQ	SD_Q_FILE_ID,R0
	BRW	200$			;BRANCH TO COPY ITEM
 
20$:	CMPL	SD_L_ITM_COD,#SMBMSG$K_FILE_SPECIFICATION ;FILE SPEC?
	BNEQ	30$			;BRANCH IF NOT
	MOVAQ	SD_Q_FILE_SPEC,R0
	BRW	200$			;BRANCH TO COPY ITEM
 
30$:	CMPL	SD_L_ITM_COD,#SMBMSG$K_JOB_NAME ;JOB NAME?
	BNEQ	40$			;BRANCH IF NOT
	MOVAQ	SD_Q_JOB_NAM,R0
	BRB	200$			;BRANCH TO COPY ITEM
 
40$:	CMPL	SD_L_ITM_COD,#SMBMSG$K_MESSAGE_VECTOR ;MESSAGE VECTOR?
	BNEQ	50$			;BRANCH IF NOT
	MOVAQ	SD_Q_MSG_VEC,R0
	BRB	200$			;BRANCH TO COPY ITEM
 
50$:	CMPL	SD_L_ITM_COD,#SMBMSG$K_PRINT_CONTROL ;PRINT CONTROL?
	BNEQ	60$			;BRANCH IF NOT
	MOVAQ	SD_Q_PRT_CTL,R0
	BRB	200$			;BRANCH TO COPY ITEM
 
60$:	CMPL	SD_L_ITM_COD,#SMBMSG$K_QUEUE ;QUEUE?
	BNEQ	70$			;BRANCH IF NOT
	MOVAQ	SD_Q_QUE_NAM,R0
	BRB	200$			;BRANCH TO COPY ITEM
 
70$:	CMPL	SD_L_ITM_COD,#SMBMSG$K_SEPARATION_CONTROL ;SEPARATION CONTROL?
	BNEQ	80$			;BRANCH IF NOT
	MOVAQ	SD_Q_SEP_CTL,R0
	BRB	200$			;BRANCH TO COPY ITEM
 
80$:	CMPL	SD_L_ITM_COD,#SMBMSG$K_STOP_CONDITION ;STOP CONDITION?
	BNEQ	90$			;BRANCH IF NOT
	MOVAQ	SD_Q_STOP_COND,R0
	BRB	200$			;BRANCH TO COPY ITEM
 
90$:	CMPL	SD_L_ITM_COD,#SMBMSG$K_TIME_QUEUED ;TIME QUEUED?
	BNEQ	100$			;BRANCH IF NOT
	MOVAQ	SD_Q_TIM_QUE,R0
	BRB	200$			;BRANCH TO COPY ITEM
 
100$:	CMPL	SD_L_ITM_COD,#SMBMSG$K_USER_NAME ;USER NAME?
	BNEQ	300$			;BRANCH IF NOT
	MOVAQ	SD_Q_USR_NAM,R0
 
200$:	PUSHAQ	SD_Q_ITM_BUF		;PUSH ITEM BUFFER DESCRIPTOR
	PUSHL	R0			;PUSH ITEM STORAGE DESCRIPTOR
	CALLS	#2,G^STR$COPY_DX	;COPY ITEM FROM JOB CONTROLLER
	BLBC	R0,400$			;BRANCH IF ERROR
300$:	BRW	RD_ITM			;BRANCH TO READ NEXT ITEM
400$:	BRW	FATAL			;GO HANDLE FATAL ERROR
 
	.PAGE
	.SBTTL	AST PROCESS MESSAGE ROUTINE
PROCESS_MSG:
	.ENABL	LSB
	CMPL	SD_L_REQUEST,#SMBMSG$K_START_TASK ;START TASK?
	BNEQ	20$			;IF NOT, CHECK FOR STOP-TASK
	CLRB	SD_B_GEN_FLAGS		;START TASK WITH ALL FLAGS CLEAR
10$:	BRW	WAK_UP
 
20$:	CMPL	SD_L_REQUEST,#SMBMSG$K_STOP_TASK ;STOP TASK?
	BNEQ	30$			;BRANCH IF NOT
	BISB	#SD_M_STOP_TASK,SD_B_GEN_FLAGS ;SET STOP-TASK FLAG
	BBS	#SD_V_PAUS_TASK,SD_B_GEN_FLAGS,10$ ;GOTO WAK-UP IF PAUSE SET
	$CANCEL_S SD_G_QIOBLK+QIO$_CHAN ;CANCEL PRINTER I/O, IGNORE ERROR
	BRW	DONE
 
30$:	CMPL	SD_L_REQUEST,#SMBMSG$K_START_STREAM ;START STREAM?
	BEQL	40$			;BRANCH IF SO
	BRW	130$			;GO SEE WHAT MESSAGE IS
40$:	$ALLOC_S SD_Q_DEV_NAM		;ALLOCATE DEVICE
	BLBC	R0,50$			;BR IF ERROR
	$ASSIGN_S  SD_Q_DEV_NAM,SD_G_QIOBLK+QIO$_CHAN ;NOW ASSIGN THE CHANNEL
	BLBC	R0,50$			;BR IF ERROR
	$GETDVIW_S CHAN=SD_G_QIOBLK+QIO$_CHAN,ITMLST=SD_L_ITMLST ;GET CHAN INFO
	BLBS	R0,60$			;BR IF NO ERROR
50$:	BRW	120$			;GO TELL JOBCTL ABOUT ERROR
60$:	CLRL	SD_L_DEV_STAT		;CLEAR DEVICE STATUS LONGWORD
	CMPL	SD_L_DEVCLASS,#DC$_LP	;IS DEVICE A PRINTER?
	BNEQ	70$			;BRANCH IF NOT
	BBS	#LP$V_LOWER,SD_L_DEVDEPEND,90$ ;BRANCH IF LOWERCASE PRINTER
	BRB	100$			;NOT LOWERCASE PRINTER
70$:	CMPL	SD_L_DEVCLASS,#DC$_TERM	;IS DEVICE A TERMINAL?
	BEQL	80$			;BRANCH IF SO
	MOVL	#SS$_IVDEVNAM,R0	;INVALID DEVICE TYPE FOR OPERATION
	BRB	120$			;GO REPORT ERROR
80$:	BISL	#SMBMSG$M_TERMINAL,SD_L_DEV_STAT ;SET STATUS AS TERMINAL
	BBC	#TT$V_LOWER,SD_L_DEVDEPEND,100$ ;CAN TERMINAL HANDLE LOWER CASE?
90$:	BISL	#SMBMSG$M_LOWERCASE,SD_L_DEV_STAT ; SET STATUS AS LOWERCASE OK
100$:	CVTLW	SD_L_DEVBUFSIZ,SD_W_PAGEWIDTH ;SET PAGE WIDTH
	MOVB	SD_L_DEVDEPEND+3,SD_B_PAGELEN ;SET PAGE LENGTH
	BNEQ	110$			;BR IF NOT ZERO
	INCB	SD_B_PAGELEN		;MAKE EQUAL TO 1
110$:	SUBB3	#4,SD_L_DEVDEPEND+3,SD_B_MAXLTP ;SET MAX LINES THIS PAGE
120$:	MOVL	#1,SD_L_NUM_ERROR	;1 ERROR CODE
	MOVL	R0,SD_T_ERROR		;PASS RESULT TO JOBCTL
	PUSHAL	SD_L_NUM_ERROR		;PUSH ERROR STATUS
	PUSHAL	SD_L_DEV_STAT		;PUSH DEVICE STATUS
	CLRQ	-(SP)			;NO ACCOUNTING OR CHECKPOINT DATA
	PUSHAL	SD_L_REQUEST		;PUSH CODE OF REQUEST
	PUSHAL	#0			;STREAM NUMBER 0 FOR SINGLE THREADED
	CALLS	#6,G^SMB$SEND_TO_JOBCTL	;REPLY TO REQUEST
	BLBS	R0,135$			;BRANCH IF NO ERROR
	BRW	FATAL			;GO HANDLE ERROR
 
130$:	CMPL	SD_L_REQUEST,#SMBMSG$K_PAUSE_TASK ;PAUSE TASK?
	BNEQ	140$			;BRANCH IF NOT
	BISB	#SD_M_PAUS_TASK,SD_B_GEN_FLAGS ;SET PAUSE-TASK FLAG
135$:	BRW	DONE
 
140$:	CMPL	SD_L_REQUEST,#SMBMSG$K_RESUME_TASK ;RESUME TASK?
	BNEQ	150$			;BRANCH IF NOT
	PUSHAL	SD_L_REQUEST		;PUSH CODE OF REQUEST
	PUSHAL	#0			;STREAM NUMBER 0 FOR SINGLE THREADED
	CALLS	#2,G^SMB$SEND_TO_JOBCTL	;SMBMSG$K_RESUME_TASK
	BLBS	R0,WAK_UP		;NO ERROR, WAKE MAIN ROUTINE TO RESUME
	BRW	FATAL			;GO HANDLE ERROR
 
WAK_UP:	BISB	#SD_M_GOOD_WAKE,SD_B_GEN_FLAGS ;SET FLAG EXPECTING WAKEUP
	$WAKE_S				;WAKE THE SYMBIONT
DONE:	RET				;
 
150$:	CMPL	SD_L_REQUEST,#SMBMSG$K_STOP_STREAM ;STOP STREAM?
	BNEQ	160$			;BRANCH IF NOT
	$DASSGN_S SD_G_QIOBLK+QIO$_CHAN	;DEASSIGN CHANNEL, IGNORE ERROR
	$DALLOC_S SD_Q_DEV_NAM		;DEALLOCATE DEVICE, IGNORE ERROR
	PUSHAL	SD_L_REQUEST		;PUSH CODE OF REQUEST
	PUSHAL	#0			;STREAM NUMBER 0 FOR SINGLE THREADED
	CALLS	#2,G^SMB$SEND_TO_JOBCTL	;SMBMSG$K_STOP_STREAM
	BLBC	R0,FATAL		;BRANCH IF ERROR
	BRB	EXIT
 
160$:	CMPL	SD_L_REQUEST,#SMBMSG$K_RESET_STREAM ;RESET STREAM?
	BNEQ	180$			;IF NOT, BRANCH TO HANDLE ERROR
	TSTW	SD_G_FAB+FAB$W_IFI	;IS FILE OPEN?
	BEQL	170$			;BRANCH IF NOT
	$CLOSE	FAB=SD_G_FAB		;CLOSE FILE, IGNORE ERROR
170$:	$CANCEL_S SD_G_QIOBLK+QIO$_CHAN ;CANCEL PRINTER I/O, IGNORE ERROR
	$DASSGN_S SD_G_QIOBLK+QIO$_CHAN	;DEASSIGN CHANNEL, IGNORE ERROR
	PUSHAL	SD_L_REQUEST		;PUSH CODE OF REQUEST
	PUSHAL	#0			;STREAM NUMBER 0 FOR SINGLE THREADED
	CALLS	#2,G^SMB$SEND_TO_JOBCTL	;SMBMSG$K_RESET_STREAM
	BLBC	R0,FATAL		;BRANCH IF ERROR
	BRB	EXIT
 
180$:	MOVL	#SS$_BUGCHECK,R0	;SET ERROR CODE---UNKNOWN REQUEST
	BRB	FATAL			;EXIT WITH ERROR STATUS
;
; SYMBIONT EXIT
EXIT:	MOVL	#SS$_NORMAL,R0		;SET NORMAL STATUS
	$EXIT_S	R0			;DONE - GET OUT
;
; FATAL ERROR HANDLER
FATAL:	PUSHL	R0			;PUSH ERROR STATUS
	CALLS	#1,G^LIB$SIGNAL		;SIGNAL ERROR
	$EXIT_S	R0			;FATAL INTERNAL ERROR
 
	.END
