.ENABLE LC .TITLE .LMN16 ; ; This program is a priveledged resident monitor task. Its role is ; to gather data from laboratory equipment via A/D converters and the ; like. Data is buffered into Task Common where other tasks can ; access it. ; This task does not comunicate via a TI:. Commands are given to it ; by application programs via send and request directives. ; ; LINK CMD FILE ; ; LMN16/PR:0,LMN16.MAP/-SP=LMN16 ; LB:[1,1]KLABLIB/LB:KCOMM,LB:[1,1]KLABLIB/LB ; LB:[1,54]RSX11M.STB/SS ; LB:[1,1]EXELIB/LB ; / ; TASK=...LMN ; RESLIB=LB:[1,54]KCOM/RW:7 ; RESCOM=ACOM:RO ; // ; ; ; COMMAND FORMAT ; ; Commands are received from tasks ; ; Format Purpose ; ------ ------- ; SH Display active programs,used channels, and ; sampling time. ; SE x Set the sampling time to x secs. ; CH c Channel Request (c=chan map format) ; RU Run A/D sampling ; DI Differential A/D 8 chans ; SI Single ended A/D 16 chans ; ; ; SHOW MESSAGE FORMAT ; ; The SH command, causes LABMON to return display data to the calling ; program via send and connect directives. The data buffer ; format is as follows. ; ; Byte Contents ; ---- -------- ; 0-3 Active task name ; 4-5 Channels used (bit map) ; 6-7 Sampling time (IPRSET) ; 8-9 Clock flag ; 10-11 'SI' for single ended ; 'DI' for differential ; ; ; INTERNAL BUFFER DESCRIPTIONS ; ; ; JOBMAP ; ----- ; JOBMAP is a one word bit array. Set bits represent mapping pointers ; for active offspring tasks into the name array - JOBNME. ; ; JOBNME ; ----- ; JOBNME is a '2 X maxjob' RAD50 array containing offspring task names. ; ; CHNMAP ; ----- ; CHNMAP is a 'maxjobs' WORD array, one for each offspring task. Each ; word is an 8 bit array of currently used channels. This information ; is got from the offspring task via send data, once it has been started. ; ; ; TASK COMMON ; ; Task common is used for 4 X 512. byte analog buffers. ; Each with an 8 byte header. ; This program knows each buffer as 'B1,B2,B3,B4'. ; ; Word Offset Contents ; ----------- -------- ; 0 Number of sweeps in block ; 1 Iprset ; 2 Clock rate ; 3 Unused ; 4-259 Primary analoge buffer ; ; ; ; EMIT STATUS DEFINITIONS ; ; All programs should conform to these definitions. ; ; Status Meaning ; ------ ------- ; 0 Successfull operation ; 1 Command Unknown ; 2 Invalid task name (task not present) ; 3 Some obscure error ; 5 Channels already in use. ; 6 Set cmd ignored because tasks are active. ; ; .NLIST .IDENT /M01.00/ ; ; COPYRIGHT (C) 1977, 1978 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE ; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; MACROS TO FACILITATE CALLING FORTRAN SUBROUTINES FROM MACRO-11. ; ; VERSION 01 ; C. D'ELIA 17-NOV-77 ; ;+ ; INITS -- INITIALIZE FOR STRUCTURED FORTRAN CALL MACROS ; ; CALLING SEQUENCE: ; ; INITS ; ; EFFECTS: ; ; SETS THE GLOBAL LISTING FLAG ; SETS THE ASSEMBLER PASS FLAG ; ;- .MACRO INITS LST=0 $LST=LST .IF NDF $PASS $PASS=0 .IFF $PASS=1 .ENDC .ENDM ;+ ; CALLS -- CALL FORTRAN SUBROUTINE ; ; CALLING SEQUENCE: ; ; CALLS SUBR, ; ; WHERE: ; ; SUBR IS THE SUBROUTINE TO CALL ; ; ARG1,..ARGN ARE THE ARGUMENTS TO PASS TO THE SUBROUTINE. ; THEY MAY EITHER BE CONSTANTS (1,5,8,12,ETC.-- ; TAKEN AS DECIMAL NUMBERS ("." APPENDED)) ; OR MEMORY LOCATIONS (IDATA, BUF, ETC.). ; IF AN ARGUMENT IS DEFAULTED (",,") A ; MINUS 1 (177777) WILL BE INSERTED FOR THE ; ARGUMENT ADDRESS (FORTRAN STANDARD). ; ; EXAMPLES: ; ; CALLS SUB1,<5,18,ARG3> ; CALLS SUB2, ; CALLS SUB3,<,,,IOUT> ; ;- .MACRO CALLS SUBR,ARGLST .PSECT $ARGL$ $$1=. .BLKB 2 $NARG=0 .IRP X, .IF B .WORD 177777 .IFF .NTYPE $T,X .IF NE $T-67 .ERROR X ;INVALID ARGUMENT .MEXIT .ENDC GENARG X .ENDC $NARG=$NARG+1 .ENDM $$2=. .=$$1 .BYTE $NARG,0 .=$$2 .PSECT .IIF GT $LST, .LIST MOV #$$1,R5 JSR PC,SUBR .IIF GT $LST, .NLIST .ENDM .MACRO GENARG ARG .IF DF $C'ARG .WORD $C'ARG .PSECT $CONS$ .IF EQ .-$C'ARG $C'ARG: .WORD ARG'. .ENDC .PSECT $ARGL$ .IFF .IF NDF $PASS .ERROR ;FAILED TO CALL "INITS" .MEXIT .ENDC .IF EQ $PASS TSTARG ARG,\ARG .IFF .WORD ARG .ENDC .ENDC .ENDM .MACRO TSTARG SYM,VAL .IF IDN , .PSECT $CONS$ $C'SYM: .WORD SYM'. .PSECT $ARGL$ .WORD $C'SYM .IFF .WORD SYM .ENDC .ENDM .LIST ; ; ; SART OF MAINLINE HERE !!!!!!! ; ; ; ; DFLG OFFSETS ; ;Value Meaning ;----- ------- AST=1 ;Set=AST exit required SWP=2 ;Set=A/D sweep in progress ; ; ; GENERAL EQUATES ; MXJOBS=8. ; ; .MCALL USTP$S,WSIG$S,EMST$S,SDAT$S,RCVD$S,CLEF$S,EXIT$S .MCALL SDRC$S,ASTX$S,CNCT$S,MRKT$S,CMKT$S,RDAF$S,WTSE$S .MCALL RDAF$S ; ; START: INITS IDLE: WTSE$S #33. ;Wait fo data packet ; ; Program comes here when resumed by other task ; RCVD$S ,#MESG ;Wait for data from parent CLEF$S #33. JSR PC,CMDSCAN ;Scan for my command BCS 10$ ; JMP @CMDMAP(R1) ;Go service this command 10$: MOV #1,R0 ; ; ; CMDX: EMST$S #MESG,R0 ;Give parent task current status MOV #MESG,R2 ; 20$: CLR (R2)+ ;Clear the receive data buffer CMP #MESEND,R2 ; BNE 20$ ; BIT #AST,DFLG ; BEQ 30$ ; BIC #AST,DFLG ; ASTX$S ; 30$: JMP IDLE ;Have sleep ; ; RU: BIT #SWP,DFLG ;Anolog collecting already ? BNE 10$ ; JSR PC,SWEEP ; 10$: JMP IDLE ; ; ; ; SHOW: CLR R2 ; MOV #1,R0 ; SHOW1: CMP R0,#MXJOBS ; BGT SHOW4 ; BIT R0,JOBMAP ;Search jobmap for active task BNE SHOW3 ; SHOW2: ASL R0 ; ADD #2,R2 ; BR SHOW1 ; SHOW3: MOV R2,R1 ;Found one MUL #4.,R1 ; ADD #JOBNME,R1 ; MOV #SENDB,R3 ; MOV (R1)+,(R3)+ ;Move file name to send buffer MOV (R1)+,(R3)+ ;Move file name to send buffer MOV CHNMAP(R2),(R3)+ ;Put channel map WORD in as well ; SDRC$S #MESG,#SENDB,,#SHAST ;Send one lot off ; JMP SHOW5 ; SHOW4: CLR SENDB ;This signifies last buffer MOV #SENDB+6,R3 ; MOV IPRSET,(R3)+ ;and sampling time MOV CLOCK,(R3)+ ; CMP #8.,NCS ; BEQ 10$ ; MOV #"SI,(R3) ;and type of A/D BR 20$ ; 10$: MOV #"DI,(R3) ; 20$: ; SDRC$S #MESG,#SENDB ;Let parent know. ; SHOW5: USTP$S #MESG ; MOV R0,BIN+2 ;Save MOV R2,BIN+4 ; BIT #AST,DFLG ;Entry via AST ? BEQ 10$ ; BIC #AST,DFLG ; TST (SP)+ ASTX$S ; 10$: JMP IDLE ; ; ; AST FOR THE SHOW COMMAND ; SHAST: BIS #AST,DFLG ; MOV BIN+2,R0 ; MOV BIN+4,R2 JMP SHOW2 ; ; ; SET: BIT #SWP,DFLG ;Sweeping at present ? BEQ 10$ ; MOV #6,R0 ; JMP CMDX ; 10$: MOV (R0),IPRSET ;New IPRSET CLR R0 ; JMP CMDX ; ; ; CHAN: MOV #1,R2 ; CLR R1 ; CLR R3 10$: CMP R1,#MXJOBS ; BEQ 40$ ; BIT R2,JOBMAP ;Find other active jobs BNE 20$ ; 15$: ASL R2 ; ADD #2,R3 ; INC R1 ; BR 10$ ; 20$: BIT (R0),CHNMAP(R3) ;Same chans ? BEQ 15$ ;No - keep looking MOV #5,R0 ; JMP CMDX ; 40$: MOV #MESG,R1 ;Point to job nmae JSR PC,MAPJOB ;Map it. INC R1 ; CNCT$S #MESG,R1,#OFAST ;Connect to offspring CLR R0 ; JMP CMDX ; ; ; DI: BIT #SWP,DFLG ;Sweeping at present ? BEQ 10$ ; MOV #6,R0 ; JMP CMDX ; 10$: MOV #8.,NCS ;Diff sampling MOV #32.,NSWPS ; CLR R0 ; JMP CMDX ; ; ; SI: BIT #SWP,DFLG ;Sweeping at present ? BEQ 10$ ; MOV #6,R0 ; JMP CMDX ; 10$: MOV #16.,NCS ;Single ended sampling MOV #16.,NSWPS ; CLR R0 ; JMP CMDX ; ; ; ; Enter here for offspring abort ; ; OFAST: RDAF$S #EFL ;get current eflg BIC EFL,JOBMAP ;Knock job out of map MOV #-1,R0 ; 10$: INC R0 ; ASR EFL ; BCC 10$ ;Find job number bit ASL R0 ; ASL R0 ; ADD #JOBNME,R0 ; EMST$S R0,IBUFNO ;Purge OCB for good measure CLEF$S EFL ; TST (SP)+ ; ASTX$S ; ; .PAGE ; ; ; AST for Analoge sweep ; ; ASERV: TST JOBMAP ;Any jobs about ? BEQ STOPS ;No - finish up CALLS IGTBUF, ; MOV IBUFNO,R0 ; ASL R0 ; MOV BUFMAP(R0),R1 ;Get current buffer MOV R1,R5 ; SUB #8.,R1 ;Position to buffer header MOV NSWPS,(R1)+ ;# of sweeps MOV IPRSET,(R1)+ ;iprset MOV CLOCK,(R1)+ ;clock rate ; CLR R0 ; MOV #1,R1 ; 10$: CMP R0,#MXJOBS ; BEQ 50$ ; BIT R1,JOBMAP ;Find active jobs BNE 40$ ; 20$: ASL R1 ; INC R0 ; BR 10$ ; 40$: MOV R0,R2 ;Got one ASL R2 ; ASL R2 ; ADD #JOBNME,R2 ; ; EMST$S R2,IBUFNO ;Inform task of full buffer ; BR 20$ ; 50$: CALLS RLSBUF, ; RTS PC ; STOPS: CALLS RLSBUF, ; BIC #SWP,DFLG ;Deactivate sweep CALLS STPSWP, ; RTS PC ; ; ; ; ; ****************************************** ; ****** ***** ; ****** SUBROUTINES ***** ; ****** ***** ; ****************************************** ; ; ; ; ************************* ; ***** SWEEP ***** ; ************************* ; ; Start analoge sweep after a buffer reset ; SWEEP: CALLS CLOCKA, CALLS SETIBF, ;Define analog buffers CALLS RLSBUF, ; CALLS ADSWP, BIS #SWP,DFLG ; RTS PC ; ; ; ; ; ************************* ; ***** CMDSCAN ***** ; ************************* ; ; On Exit R1 = Word offset for legal command ; R0 = Position of parameter ; CMDSCAN: CLR R1 ; MOV #MESG+4,R0 ; MOV #CMDS,R2 ; 10$: CMP (R2)+,(R0) ;Match ? BEQ 20$ ; INC R1 ; TST (R2) ; BNE 10$ ; SEC ; RTS PC ; 20$: TST (R0)+ ;Position to parameter TST (R0)+ ; ASL R1 ; CLC ; RTS PC ; ; ; ********************** ; ***** DELJOB ***** ; ********************** ; ; Remove job from map ; ; On Entry R1 = Jobname address ( RAD) ; DELJOB: MOV #1,R0 ; MOV #MXJOBS,R5 ; MOV #JOBNME,R2 ; 10$: CMP (R1)+,(R2)+ ;Look for job BEQ 30$ ; ADD #2,R2 ; 20$: SUB #2,R1 ; ASL R0 ; DEC R5 ; BNE 10$ ; SEC ;Give up RTS PC ; 30$: CMP (R1),(R2)+ ; BNE 20$ ; BIC R0,JOBMAP ;Found one at last CLC ; RTS PC ; ; ; ; ; ********************** ; ***** MAPJOB ***** ; ********************** ; ; Places job name into next available map position ; and updates JOBMAP word. Also update channel map. ; ; On Entry R1 = Address of task name ; On Exit R1 = Mapped position ; ; ; MAPJOB: CLR R3 ; CLR R2 ; MOV #1,R0 ; 10$: BIT R0,JOBMAP ;Find free position BEQ 20$ ; ASL R0 ; INC R3 ; ADD #2,R2 ; BR 10$ ; 20$: BIS R0,JOBMAP ;Set it as occupied MUL #4.,R3 ;Offset for JOBMAP ADD #JOBNME,R3 ; 30$: MOV (R1)+,(R3)+ ;Move name to name map MOV (R1)+,(R3)+ ;Move name to name map MOV MESG+8.,CHNMAP(R2) ;Update chan map MOV R2,R1 ; RTS PC ; ; .PAGE ; ; ; *********************************** ; ***** ***** ; ***** PARAMETER BLOCKS ***** ; ***** ***** ; *********************************** ; ; ; TCOM buffer is split into 4 X 256 word buffers ; .PSECT ABUF,GBL,OVR,D BUF: .BLKW 4 B1: .BLKW 256. .BLKW 4 B2: .BLKW 256. .BLKW 4 B3: .BLKW 256. .BLKW 4 B4: .BLKW 256. ; .PSECT NCS: .WORD 8. NSWPS: .WORD 32. BZ: .WORD 256. EFL: .WORD 0,0,0,0 BIN: .BLKW 4 IBUF: .BLKW 40. IBUFNO: .WORD 0 MESG: .BLKW 15. MESEND: . CMDMAP: .WORD SHOW,SET,CHAN,RU,DI,SI BUFMAP: .WORD B1,B2,B3,B4 ESTAT: .WORD 0 CMDS: .ASCII/SHSECHRUDISI/<0><0> SENDB: .BLKW 13. JOBMAP: .WORD 0 JOBNME: .BLKB 64. ; 8 X mxjobs CHNMAP: .BLKW 8. ;mxjobs .EVEN IPRSET: .WORD 177324 ;0.03 sec sampling time CLOCK: .WORD 3 DFLG: .WORD 0 .END START