.TITLE DVCDAT - DISPLAY DEVICE DRIVER DATABASE .IDENT /JKN03.3/ ; ;WRITTEN BY J. NEELAND ;LAST MODIFIED 801102. ; BYTMOD=<3*4000>+<6*400>+10 ZBYMOD=<3*4000>+<2*400>+10 SBYMOD=<2*4000>+<6*400>+10 WRDMOD=<6*4000>+<6*400>+10 ; .LIST MEB .MCALL QIOW$,EXIT$S,DIR$,GMCR$ .MCALL DCBDF$,UCBDF$,SCBDF$ DCBDF$ ;INVOKE THE DEFINITIONS UCBDF$ SCBDF$ ; ;LOCAL MACRO DEFINITION(S) .MACRO DOAW STG JSR R4,PUTAW .WORD STG .ENDM ;DOAW ; .MACRO DOAB STG JSR R4,PUTAB .WORD STG .ENDM ;DOAB ; .MACRO DOSTG STG JSR R4,PUTSTG .WORD STG .ENDM ;DOSTG ; START:: DIR$ #GMC ;TRY TO GET AN MCR LINE BCS PRMT ;NONE AVAIL...ASK FOR INPUT CMP $DSW,#4 ;IS THERE MORE THAN JUST TASKNAME ON LINE? BLE PRMT ;IF NOT, GO PROMPT INC EXITFL ;INDICATE WE SHOULD EXIT AFTER DISPLAY MOV #GMC+G.MCRB+4,R0 ;GOT IT - SET BUFFER TO BEGINNING OF DVC NAME BR GDVC PRMT: MOV #IO.DET,OUTQIO+Q.IOFN ;SET TO DETACH (CANCEL POSS. CNTL-O) DIR$ #OUTQIO MOV #IO.WVB,OUTQIO+Q.IOFN ;RESTORE TO NORMAL FUNCTION DIR$ #PMTQIO MOV #ANSBUF,R0 ;SET UP TO CLEAR ANSWER BUFFER MOV #8.,R1 ;ONLY 8. CHARS LONG MAX CLRBUF: CLRB (R0)+ SOB R1,CLRBUF DIR$ #ANSQIO CMPB IOSB,#IE.EOF ;DOES USER WANT OUT? BNE 7$ ;IF NO, CONTINUE PROCESSING JMP EXIT ;ELSE IF EOF, YES - GO THERE 7$: MOV #ANSBUF,R0 MOV R0,R1 ;DO LOWER-UPPER CONVERSION IN PLACE MOV #8.,R2 CALL $CVTUC ;MAKE AN UPPER-CASE ANSWER MOV #ANSBUF,R0 ;RESTORE POINTER GDVC: MOV #PARBUF,R3 CALL $FDUCB BCC 8$ ;CONTINUE IF NO ERROR JMP ERROR ;ELSE GO TO ERROR ROUTINE 8$: MOV #IO.ATT,OUTQIO+Q.IOFN ;ATTACH SO CNTL-O WILL STOP ALL OUTPUT DIR$ #OUTQIO MOV #IO.WVB,OUTQIO+Q.IOFN ;RESTORE NORMAL FUNCTION MOV R1,-(SP) ;SAVE UCB ADDRESS MOV R2,-(SP) ;SAVE DCB ADDRESS ALSO MOV R2,R1 ;DO DCB ADDRESS 1ST MOV PC,R2 ;NO ZERO SUPPRESSION MOV #DCBBUF,R0 ;NOW DO THE DCB ADDRESS CALL $CBOMG ;CONVERT TO ASCII MOV 2(SP),R1 ;RETRIEVE UCB ADDRESS MOV #UCBBUF,R0 ;OUTPUT UCB ADDRESS CALL $CBOMG ;CONVERT TO ASCII OCTAL MOV 2(SP),R1 ;RETRIEVE UCB ADDRESS MOV #1,PSEFLG ;SET FLAG FOR PSEUDO DEVICE BIT #DV.PSE,U.CW1(R1) ;IS THIS A PSEUDO DEVICE? BNE 85$ ;SKIP THE SCB STUFF IF YES CLR PSEFLG ;NOT PSEUDO, RESET FLAG MOV U.SCB(R1),R1 ;GET THE CORRESPONDING SCB ADDRESS MOV R1,SCBLOC ;SAVE ADDRESS FOR LATER USE TOO MOV #SCBBUF,R0 ;SET THE OUTPUT POINTER CALL $CBOMG ;CONVERT TO OCTAL MAGNITUDE 85$: MOV #ADRMSG,OUTQIO+Q.IOPL ;SET FOR FIRST MESSAGE SUB #ADRMSG,R0 ;CALCULATE ACTUAL MESSAGE LENGTH MOV R0,OUTQIO+Q.IOPL+2 ;PUT VALUE INTO QIO PARAMETERS DIR$ #OUTQIO MOV (SP)+,R5 ;SAVE A MORE CONVENIENT COPY OF DCB ADDRESS DOAW D$LNK ;OUTPUT D.LNK & D.UCB LOCS DOAW D$UCB CALL PUTADR ;INSERT JUST D.NAM ADDRESS MOV #DNMSTG,R1 ;INSERT ' /' INTO RECORD CALL MOVSTG MOVB (R5)+,(R0)+ ;COPY D.NAM MOVB (R5)+,(R0)+ MOVB #'/,(R0)+ ;TERMINATE NAME W/ ANOTHER SLASH JSR R4,APPLAB ;APPEND LABEL & OUTPUT RECORD .WORD D$NAM CALL PUTADR ;OUTPUT D.UNIT ADDR. MOVB #40,(R0)+ ;PAD W/ SPACE FOR SHORT FIELD MOV #SBYMOD,R2 ;CHANGE MODE TO BYTE MOVB (R5)+,R1 ;GET D.UNIT, LOWEST VALUE BIC #177400,R1 ;MASK OFF POSSIBLE HIGH-ORDER BITS CALL $CBTA ;INSERT THAT MOVB #',,(R0)+ ;SEPARATE W/ A COMMA MOV #SBYMOD,R2 ;USE SAME FORMAT FOR HIGHEST UNIT # JSR R4,PUTAB2 ;JOIN EXISTING CODE TO OUTPUT BYTE & LABEL .WORD D$UNIT DOAW D$UCBL ;OUTPUT D.UCBL TST PSEFLG ;IS THIS A PSEUDO DEVICE? BNE 9$ ;IF YES, THERE'S NO MORE DCB DATA DOAW D$DSP ;OUTPUT D.DSP THRU D.MSK (ALL 9) DOAW D$MSK0 DOAW D$MSK1 DOAW D$MSK2 DOAW D$MSK3 DOAW D$MSK4 DOAW D$MSK5 DOAW D$MSK6 DOAW D$MSK7 BIT #FE.DRV,$FMASK ;IS THERE LOADABLE DRIVER SUPPORT? BEQ 9$ ;IF NOT, SKIP DOAW D$PCB ;ELSE DISPLAY D.PCB LOCATION ;NOW WORK ON UCB DATA 9$: DOSTG UCBLAB ;OUTPUT 'UCB' HEADING MOV (SP),R5 ;NOW MOVE UCB ADDRESS TO R5 TST PSEFLG ;IS THIS A PSEUDO DEVICE? BNE 10$ ;IF YES, NO SPECIAL MULTI-USER LOCS BIT #FE.MUP,$FMASK ;DO WE HAVE MULTI-USER PROTECTION? BEQ 10$ ;IF NOT, SKIP TST -(R5) ;BACK UP TO U.OWN WORD BIT #DV.TTY,U.CW1+2(R5) ;IS THIS A TTY DEVICE? BEQ 95$ ;SKIP IF NOT TST -(R5) ;YES, BACKUP TO U.LUIC JSR R4,OUTUIC ;THEN GO OUTPUT A UIC .WORD U$LUIC ; LABELLED W/ U.LUIC 95$: DOAW U$OWN ;THEN OUTPUT U.OWN CONTENTS 10$: DOAW U$DCB ;DO UCB WORD LOCATIONS U.DCB & U.RED DOAW U$RED MOVB (R5),SVUCTL ;SAVE U.CTL FOR LATER TESTING DOAB U$CTL ;DO BYTE UCB LOCS U.CTL-U.ST2 DOAB U$STS DOAB U$UNIT DOAB U$ST2 DOAW U$CW1 ;DO WORD UCB LOC U.CW1 TST PSEFLG ;THIS A PSEUDO DEVICE? BNE EXITQ ;IF YES, DONE FOR NOW - GO SEE ABOUT EXITTING DOAW U$CW2 ;DO LOCS U.CW2-U.BUF DOAW U$CW3 DOAW U$CW4 DOAW U$SCB DOAW U$ATT DOAW U$BUF DOAW ;DO U.BUF+2 (NO STRING) DOAW U$CNT ;DO U.CNT (LAST STD UCB LOC.) ;NOW DO SCB DATA MOV SCBLOC,R5 ;RETRIEVE SAVED SCB ADDRESS DOSTG SCBLAB ;OUTPUT HEADING BITB #SP.LOG,S.PRI(R5) ;DOES THIS DEVICE SUPPORT ERROR-LOGGING? BEQ 35$ ;SKIP IF NOT SUB #6,R5 ;YES, BACK UP POINTER TO NEW START OF SCB DOAB S$RCNT ;THEN DO S.RCNT-S.BMSK DOAB S$ROFF DOAW S$BMSV DOAW S$BMSK 35$: DOAW S$LHD ;DO S.LHD-S.FRK DOAW ;2ND WORD IS UNLABELLED DOAB S$PRI DOAB S$VCT DOAB S$CTM DOAB S$ITM DOAB S$CON DOAB S$STS DOAW S$CSR DOAW S$PKT DOAW S$FRK DOAW ;FORK BLOCK HAS AT LEAST 4 WORDS DOAW DOAW BIT #FE.DRV,$FMASK ;DO WE HAVE LOADABLE DRIVER SUPPORT? BEQ 40$ ;SKIP IF NOT DOAW ;IF YES, THERE'S 1 MORE WORD 40$: BIT #FE.EXT,$FMASK ;DO WE HAVE TO WORRY ABOUT UMR SUPPORT? BEQ 45$ ;SKIP IF NO BITB #UC.NPR,SVUCTL ;IS THIS AN NPR DEVICE? BEQ 45$ ;SKIP IF NO DOAW S$MPR ;IF YES, DISPLAY UMR CONTROL BLOCK DOAW ; (IT'S 6 WORDS LONG) DOAW DOAW DOAW DOAW 45$: ;REF. LABEL EXITQ: TST EXITFL ;SHOULD WE EXIT? BNE EXIT ;YES IF FLAG SET JMP PRMT ;IF NOT, GO PROMPT AGAIN EXIT: EXIT$S ; ERROR: TST R3 ;WHICH ERROR? BNE NTFND MOV #SYNMSG,OUTQIO+Q.IOPL MOV #SYNSIZ,OUTQIO+Q.IOPL+2 BR OUTSND ; NTFND: MOV #NTFMSG,OUTQIO+Q.IOPL MOV #NTFSIZ,OUTQIO+Q.IOPL+2 OUTSND: DIR$ #OUTQIO ;OUTPUT ERROR MESSAGE BR EXITQ ;GO SEE WHETHER TO EXIT OR PROMPT AGAIN ;+ ; SUBROUTINE(S) ;- OUTUIC: CALL PUTADR ;OUTPUT ADDRESS FIRST MOV #ZBYMOD,R2 ;OUTPUT DATA IN BYTE MODE, NO ZRO SUP. MOVB 1(R5),R1 ;GET GROUP PART OF UIC 1ST BIC #177400,R1 ;MASK OFF POSSIBLE HIGH-ORDER BITS CALL $CBTA ;INSERT THAT IN RECORD MOVB #',,(R0)+ ;SEPARATE PARTS W/ A COMMA MOVB (R5),R1 ;GET MEMBER PART OF UIC BIC #177400,R1 ;AGAIN MASK OFF POSS. HIGH-ORDER BITS TST (R5)+ ;ADVANCE ADDRESS MOV #ZBYMOD,R2 ;AGAIN USE BYTE MODE, NO ZERO SUP. CALLR PUTDAT ;THEN JOIN EXISTING CODE TO FINISH OUTPUT ; PUTAB: CALL PUTADR ;OUTPUT ADDRESS FIRST MOVB #40,(R0)+ ;PAD W/ ' ' TO ALIGN W/ WORD DATA MOVB #40,(R0)+ MOVB #40,(R0)+ MOV #BYTMOD,R2 ;NOW SET FOR BYTE MODE PUTAB2: MOVB (R5)+,R1 ;GET THE DATA BYTE BIC #177400,R1 ;MASK OFF POSSIBLE HIGH-ORDER BITS BR PUTDAT ;JOIN COMMON CODE FOR PUTTING WORDS ; PUTAW: CALL PUTADR ;OUTPUT ADDRESS FIRST MOV #WRDMOD,R2 ;SET TO OUTPUT IN WORD FORMAT MOV (R5)+,R1 ;GET THE DATA WORD PUTDAT: CALL $CBTA ;CONVERT DATA TO ASCII APPLAB: MOV (R4)+,R1 ;GET ADDRESS OF STRING TO COPY BEQ PRTREC ;SKIP LABEL CODE IF NO LABEL ADDRESS MOVB #11,(R0)+ ;INSERT TAB TO SEPARTE LABEL FROM DATA MOVB #';,(R0)+ ;INSERT TRAILING SEMI-COLON TO SEPARATE LABEL CPYSTG: CALL MOVSTG ;COPY TO BUFFER PRTREC: SUB #OUTBUF,R0 ;CALC. LENGTH OF OUTPUT STRING MOV R0,OUTQIO+Q.IOPL+2 ;SET INTO QIO MOV #OUTBUF,OUTQIO+Q.IOPL ;SET PROPER BUFFER START ADDRESS DIR$ #OUTQIO ;PRINT RECORD RTS R4 ;RETURN AFTER IN-LINE PARAMETER ; PUTSTG: MOV #OUTBUF,R0 ;SET UP BEGINNING OF BUFFER APPSTG: MOV (R4)+,R1 ;GET ADDRESS OF STRING BR CPYSTG ; THEN JOIN CODE FOR APPENDING STRINGS ; PUTADR: MOV #OUTBUF,R0 ;SETUP TO START AT BEGINNING OF BUFFER MOV #WRDMOD,R2 ;ADDRESS IS WORD FORMAT MOV R5,R1 ;R5 HAS ADDRESS CALL $CBTA ;CONVERT TO ASCII MOVB #':,(R0)+ ;SEPARATE ADDRESS FROM FOLLOWING DATA W/ ':' MOVB #11,(R0)+ ; AND A TAB RETURN ;THAT'S IT FOR THIS FIELD ; MOVSTG: TSTB (R1) ;ARE WE AT THE TRAILING NULL? BEQ 10$ ;EXIT IF SO MOVB (R1)+,(R0)+ ;ELSE COPY BYTE TO OUTPUT BUFFER BR MOVSTG ; AND TRY THE NEXT ONE 10$: RETURN ;DONE COPYING ;+ ;DATA AREA ;- OUTQIO: QIOW$ IO.WVB,2,2,,,,<,,40> PMTQIO: QIOW$ IO.WVB,1,1,,,, ANSQIO: QIOW$ IO.RVB,1,1,,IOSB,, GMC: GMCR$ EXITFL: .WORD 0 ;EXIT AFTER OUTPUT - INIT. TO NO PSEFLG: .WORD 0 ;FLAG SET IF DOING PSEUDO DEVICE IOSB: .BLKW 2 ;I/O STATUS FOR READ FROM TERMINAL PARBUF: .BLKW 2 ;BUFFER FOR $FDUCB SCBLOC: .BLKW 1 ;ADDRESS OF SCB OUTBUF: ;SHARE W/ ANSBUF ANSBUF: .BLKB 80. ;BUFFER FOR DESIRED DEVICE INPUT TEXT SVUCTL: .BLKB 1 ;STORAGE OF U.CTL FOR LATER TESTING .ENABL LC .NLIST BEX ;DON'T LIST ALL THE TEXT STUFF DNMSTG: .ASCIZ # /# DVCMSG: .ASCII /DVC>/ DVCSIZ=.-DVCMSG SYNMSG: .ASCII /Syntax Error!/ SYNSIZ=.-SYNMSG NTFMSG: .ASCII /NO such physical device!/ NTFSIZ=.-NTFMSG ADRMSG: .ASCII /DCB address is: / DCBBUF: .BLKB 6 .ASCII /, UCB address is: / UCBBUF: .BLKB 6 .ASCII /, SCB address is: / SCBBUF: .BLKB 6 .ASCII <15><12>/ADDR. VALUE LABEL/<15><12> .ASCII /----- ----- -----/<15><12> .ASCII /DCB:/ ADRSIZ=.-ADRMSG D$LNK: .ASCIZ /D.LNK/ D$UCB: .ASCIZ /D.UCB/ D$NAM: .ASCIZ /D.NAM/ D$UNIT: .ASCIZ /D.UNIT/ D$UCBL: .ASCIZ /D.UCBL/ D$DSP: .ASCIZ /D.DSP/ D$MSK0: .ASCIZ /D.MSK - LEGAL 0-15/ D$MSK1: .ASCIZ / - CNTRL 0-15/ D$MSK2: .ASCIZ / - NO-OP 0-15/ D$MSK3: .ASCIZ / - ACP 0-15/ D$MSK4: .ASCIZ / - LEGAL 16-31/ D$MSK5: .ASCIZ / - CNTRL 16-31/ D$MSK6: .ASCIZ / - NO-OP 16-31/ D$MSK7: .ASCIZ / - ACP 16-31/ D$PCB: .ASCIZ /D.PCB/ UCBLAB: .ASCIZ /UCB:/ U$LUIC: .ASCIZ /U.LUIC/ U$OWN: .ASCIZ /U.OWN/ U$DCB: .ASCIZ /U.DCB/ U$RED: .ASCIZ /U.RED/ U$CTL: .ASCIZ /U.CTL/ U$STS: .ASCIZ /U.STS/ U$UNIT: .ASCIZ /U.UNIT/ U$ST2: .ASCIZ /U.ST2/ U$CW1: .ASCIZ /U.CW1/ U$CW2: .ASCIZ /U.CW2/ U$CW3: .ASCIZ /U.CW3/ U$CW4: .ASCIZ /U.CW4/ U$SCB: .ASCIZ /U.SCB/ U$ATT: .ASCIZ /U.ATT/ U$BUF: .ASCIZ /U.BUF/ U$CNT: .ASCIZ /U.CNT/ SCBLAB: .ASCIZ /SCB:/ S$RCNT: .ASCIZ /S.RCNT/ S$ROFF: .ASCIZ /S.ROFF/ S$BMSV: .ASCIZ /S.BMSV/ S$BMSK: .ASCIZ /S.BMSK/ S$LHD: .ASCIZ /S.LHD/ S$PRI: .ASCIZ /S.PRI/ S$VCT: .ASCIZ /S.VCT/ S$CTM: .ASCIZ /S.CTM/ S$ITM: .ASCIZ /S.ITM/ S$CON: .ASCIZ /S.CON/ S$STS: .ASCIZ /S.STS/ S$CSR: .ASCIZ /S.CSR/ S$PKT: .ASCIZ /S.PKT/ S$FRK: .ASCIZ /S.FRK/ S$MPR: .ASCIZ /S.MPR/ .EVEN .LIST BEX ;OK FOR FULL EXPANSION NOW ; .END START