.TITLE UCB .IDENT /V1.00/ ;******************************************************************* ; ; UCB - IMPLEMENTS UCB COMMAND TO DETERMINE LOCATION OF DATA STRUCTURES ; ; FORMAT: ; ; >UCB DDNN: ; ; JANUARY 1982 ; ; STEVE THOMPSON ; SCHOOL OF CHEMICAL ENGINEERING ; OLIN HALL ; CORNELL UNIVERSITY ; ITHACA NY 14853 ; ; ;******************************************************************* .MCALL GMCR$,EXIT$S,DIR$,QIOW$,ALUN$ .MCALL EXST$ .MCALL UCBDF$,DCBDF$ .MCALL HDRDF$ UCBDF$ DCBDF$ HDRDF$ SPA = 40 ; SPACE LUN1 = 1 ; TI: I/O LUN LUN2 = 2 ; LUN FOR DEVICE ASSIGNMENT EFN = 1 ; EVENT FLAG FOR I/O ; ; MACROS ; .MACRO PRINT ERR,ERRSZ MOV ERR,ODPB+Q.IOPL .IF B ERRSZ MOV ERR'SZ,ODPB+Q.IOPL+2 .IFF MOV ERRSZ,ODPB+Q.IOPL+2 .ENDC DIR$ #ODPB .ENDM .MACRO FMTNUM STR,ADDR MOVB #SPA,(R0) MOVB (R0)+,(R0)+ MOVB STR,(R0)+ MOVB #'C,(R0)+ MOVB #'B,(R0)+ MOVB #'=,(R0)+ MOV ADDR,R1 MOV SP,R2 CALL $CBOMG .ENDM ; ; ERROR MESSAGES ; .NLIST BEX .ENABL LC ERR1: .ASCII /UCB -- Command input error/ ERR1SZ=.-ERR1 ERR2: .ASCII /UCB -- Syntax error/ ERR2SZ=.-ERR2 ERR3: .ASCII /UCB -- Illegal device or unit/ ERR3SZ=.-ERR3 ; ; TEXT MESSAGES ; UCBSTR: .ASCII /U/ DCBSTR: .ASCII /D/ SCBSTR: .ASCII /S/ .EVEN ; ; LOCAL DATA ; UCB: .BLKW 1 ; UCB ADDRESS OF TARGET DEVICE DCB: .BLKW 1 ; DCB ADDRESS OF TARGET DEVICE SCB: .BLKW 1 ; SCB ADDRESS OF TARGET DEVICE ; ; DIRECTIVE PARAMETER BLOCKS ; GMCR: GMCR$ BUF=GMCR+2 ODPB: QIOW$ IO.WVB,LUN1,EFN,,,,<0,0,40> ; OUTPUT DPB ALUN: ALUN$ LUN2,SY,0 ; ASSIGN LUN DPB EXST: EXST$ EX$SUC ; EXIT WITH STATUS DPB .PAGE $UCBEP: ; XFR ADDRESS ; ; GET COMMAND LINE ; DIR$ #GMCR ; GET THE COMMAND LINE BCC 10$ ; OK PRINT #ERR1 ; ERROR, NONE THERE 5$: MOV #EX$SEV,EXST+E.XSTS ; SET SEVERE EXIT STATUS JMP EXIT ; EXIT ; ; PARSE COMMAND LINE ; 10$: MOV #BUF,R0 ; GET BUFFER ADDRESS 15$: CALL $GNBLK ; GET NEXT NON-BLANK BCC 25$ ; OK 20$: PRINT #ERR2 ; ERROR, NULL COMMAND LINE BR 5$ ; EXIT 25$: TST R1 ; ANY BLANKS SEEN? BEQ 15$ ; IF EQ NO, CONTINUE SCAN DEC R0 ; BACKUP TO DEVICE NAME MOV #ALUN,R4 ; GET ADDRESS OF ASSIGN LUN DPB MOVB (R0)+,A.LUNA(R4) ; STORE DEVICE NAME MOVB (R0)+,A.LUNA+1(R4) ; CALL $GTNUM ; GET DEVICE NUMBER MOV R1,A.LUNU(R4) ; STORE DEVICE NUMBER ; ; ASSIGN LOGICAL UNIT TO TARGET DEVICE ; DIR$ R4 ; ASSIGN THE LUN BCC 80$ ; IF CC ASSIGN WORKED OK 75$: PRINT #ERR3 ; MUST HAVE BEEN AN ILLEGAL DEVICE MOV #EX$SEV,EXST+E.XSTS ; SET SEVERE EXIT STATUS JMP EXIT ; SO EXIT ; ; DETERMINE DETAILS OF TARGET DEVICE (UCB, DCB, SCB ADDRESS) ; 80$: CALL $SWSTK,90$ ; SWITCH STACKS MOV $HEADR,R1 ;; GET OUR HEADER ADDRESS MOV H.LUN+<4*>(R1),R1 ;; GET UCB ADDRESS OF TARGET DEVICE MOV R1,UCB ;; SAVE IT MOV U.SCB(R1),SCB ;; SAVE SCB ADDRESS MOV U.DCB(R1),DCB ;; SAVE DCB ADDRESS RETURN ;; RETURN TO USER STATE 90$: ; ; ; PRINT DETAILS OF DEVICE ; MOV #BUF,R0 ; GET OUTPUT BUFFER ADDRESS MOV UCB,R3 ; GET DEVICE UCB ADDRESS CALL $FMTDV ; FORMAT DEVICE NAME FMTNUM UCBSTR,UCB ; FORMAT UCB ADDRESS FMTNUM DCBSTR,DCB ; FORMAT DCB ADDRESS FMTNUM SCBSTR,SCB ; FORMAT SCB ADDRESS SUB #BUF,R0 ; CALCULATE MESSAGE LENGTH PRINT #BUF,R0 ; AND PRINT IT EXIT: DIR$ #EXST ; EXIT WITH CORRECT STATUS .END $UCBEP