.TITLE DAPAGE - DEVICE ACTIVITY PAGE UPDATE .IDENT /V01.00/ .NLIST BEX ; ; COPYRIGHT (C) 1979, 1980 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND 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. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ; ; ; MODULE DESCRIPTION: ; ; DEVICE ACTIVITY DISPLAY PAGE UPDATE PROCESSING ; ; ; ; RJDK - ATMOS - OXFORD ; ; IDENT HISTORY: ; ; 1.00 11-OCT-81 ; .SBTTL GLOBAL MACROS ; ; GLOBAL MACROS ; .MCALL PCBDF$,TCBDF$,UCBDF$,DCBDF$,GTIM$S .MCALL PKTDF$,SCBDF$ PCBDF$ ; DEFINE PCB OFFSETS AND SYMBOLS TCBDF$ ; DEFINE TCB OFFSETS AND SYMBOLS UCBDF$ ; DEFINE UCB OFFSETS AND SYMBOLS DCBDF$ ; DEFINE DCB OFFSETS AND SYMBOLS SCBDF$ PKTDF$ .SBTTL LOCAL MACROS ; ; LOCAL MACRO DEFINITIONS ; .MACRO FLAG,DD ; FLAG CHARACTER AS CHANGED BISB #200,DD .ENDM .MACRO MVN,FROM,TO,LEN,?A,?B ; MOVE NEW CHARACTERS ONTO SCREEN MOV #LEN,R0 ; GET LENGTH MOV FROM,R1 ; SENDING STRING MOV TO,R2 ; ADDRESS OF POSITION IN SCREEN BUFFER A: CMPB (R1)+,(R2)+ ; CHARACTER CHANGED? BEQ B ; BR IF NO MOVB -1(R1),-1(R2) ; YES, MOVE IT ON FLAG -1(R2) ; AND FLAG IT AS CHANGED B: DEC R0 ; MORE? BGT A ; BR IF YES .ENDM .MACRO OUTC,FROM,TO,?A ; OUTPUT A SINGLE CHARACTER CMPB FROM,TO ; NEW CHARACTER BEQ A ; BR IF NO MOVB FROM,TO ; STORE NEW CHARACTER FLAG TO ; FLAG IT A: .ENDM .MACRO PUSH LIST ; PUSH ONTO STACK .IRP VAL, MOV VAL,-(SP) .ENDM .ENDM PUSH .MACRO POP LIST ; POP OFF STACK .IRP VAL, MOV (SP)+,VAL .ENDM .ENDM POP .SBTTL LOCAL OFFSETS .PSECT OFFSET,ABS ; ; OFFSETS OF DEVICE LIST BLOCK ; DA.NAM: .BLKW 1 ; DEVICE NAME DA.UNT: .BLKW 1 ; Unit number DA.UST: .BLKB 1 ;U.STS DA.US2: .BLKB 1 ; U.ST2 DA.ST2: .BLKW 1 ; S.ST2 DA.STS: .BLKb 1 ; S.STS DA.ST3: .BLKB 1 ; S.ST3 DA.IOP: .BLKW 8. ;up to 8 TCBs of tasks with I/O .SBTTL ENTRY POINT DEFINITION .PSECT PAGE,OVR,I,LCL .WORD PAGE ; DEFINE ENTRY POINT .SBTTL LOCAL DATA ; ; LOCAL SYMBOLS ; DEVMX = 21. ; MAXIMUM NUMBER OF ACTIVE devices ; *** NOTE ANY CHANGE HERE WILL RESULT ; IN A CHANGE IN GBLDAM ; ; LOCAL DATA ; DEVDT: .BLKW DEVMX*21. ; Device list block DEVEND: .WORD 0 ;End of block TIMBUF: .BLKW 8. ; BUFFER FOR TIME PARAMETERS FROM GTIM$S EDTBUF: .BLKW 30. ; EDIT CONVERSION BUFFER NULL: .WORD 0,0 ; GUARD WORD .ENABL LC SEEK: .ASCIZ /Seek / ERROR: .ASCIZ /Error/ BUSY: .ASCIZ /Busy / IDLE: .ASCIZ /Idle / .DSABL LC .SBTTL DAPAGE ENTRY POINT ;+ ; ; PAGE - DEVICE ACTIVITY DISPLAY UPDATE PROCESSING ; ; INPUTS: NONE ; ; OUTPUTS: THE DEVICE ACTIVITY DISPLAY IS UPDATED ; ;- PAGE: MOV #DEVDT,R4 MOV #DEVMX,R1 10$: CALL $DACLR SOB R1,10$ CALL FIND ; ALL THE DEVICE ACTIVITY. CALL UPDATE ; THE DISPLAY. RETURN .IF NDF R$$MPL .ERROR ; CODE NOT WRITTEN .ENDC .SBTTL FIND ;+ ; **-FIND - FILL UP BUFFER WITH CURRENT DEVICE ACTIVITY INFO ; ; INPUTS: ; ; OUTPUTS: ; ;- FIND: MOV #DEVDT,R5 CALL $SWSTK,80$ MOV $TKTCB,R4 ; Point to Task list MOV #8.,R3 ; Keep a count MOV #"CP,(R5)+ ; CP CLR (R5)+ ; 0 MOV #US.BSY,(R5)+ ; set a busy flag CLR (R5)+ ; no S2 CLR (R5)+ ; or STS/S3 MOV R5,-(SP) ADD #40,(SP) 1$: MOV T.ACTL(R4),R4 ; get next active task BEQ 9$ ; no more TST T.STAT(R4) ;blocked? BNE 1$ ; - skip it BIT #*3,T.ST2(R4) BNE 1$ MOV T.NAM(R4),(R5)+ MOV T.NAM+2(R4),(R5)+ SOB R3,1$ ; until 8 tasks in all 9$: MOV (SP)+,R5 MOV $DEVHD,R4 ; GET THE DEVICE LIST HEADER ; ; BACK HERE FOR EACH DCB IN THE DEVICE LIST ; 10$: MOV D.UCB(R4),R3 ; Get 1st UCB MOVb D.UNIT(R4),R2 ; get first unit number 20$: ;here for subsequent units BIT #DV.OSP!DV.ISP,U.CW1(R3) ; If spool device, ignore redirect BNE 30$ CMP R3,U.RED(R3) ;if its redirected , ignore it BNE 60$ 30$: BIT #DV.TTY!DV.PSE,U.CW1(R3) ;Not Terminals or pseudo devices BNE 70$ ; - get next DCB ; BIT #DV.MNT,U.CW1(R3) ; currently only mountable devices ; BEQ 70$ BITB #US.OFL!US.PDF,U.ST2(R3) ; Is this device offline? BNE 60$ BITB #UC.QUE,U.CTL(R3) ;Most devices with UC.QUE set ;are internal to processor BNE 70$ ; - get next dcb MOV D.NAM(R4),(R5)+ ;STORE DEVICE NAME MOV R2,(R5)+ ;AND UNIT NUMBER MOVB U.STS(R3),(R5)+ ; U.STS MOVB U.ST2(R3),(R5)+ ;U.ST2 MOV U.SCB(R3),R1 ;GET SCB ADDRESS MOV S.ST2(R1),(R5)+ MOVB S.STS(R1),(R5)+ MOVB S.ST3(R1),(R5)+ MOV R5,-(SP) ;MAKE POINTER TO END OF PACKET AREA ADD #40,(SP) ; FOR 8 PACKETS ADD #4,R5 ;ASSUME NO CURRENT PACKET BIT #S2.ACT,S.ST2(R1) ;ACTIVE? BNE 35$ ; Yes - Look at packet TSTB S.STS(R1) ;Or busy BNE 35$ BEQ 40$ ;NO - COULD HAVE STUFF QUEUED 35$: BIT #1,S.PKT(R1) BNE 40$ MOV S.PKT(R1),R0 CMP R3,I.UCB(R0) ;SAME UCB? BNE 40$ ; - NO SUB #4,R5 MOV I.TCB(R0),R0 MOV T.NAM(R0),(R5)+ MOV T.NAM+2(R0),(R5)+ 40$: MOV (R1),R1 ;POINT TO NEXT PACKET BEQ 50$ ; NO MORE CMP I.UCB(R1),R3 ;SAME UCB? BNE 40$ MOV I.TCB(R1),R0 MOV T.NAM(R0),(R5)+ MOV T.NAM+2(R0),(R5)+ CMP R5,(SP) ;MORE SPACE? BNE 40$ ;YES - OK 50$: MOV (SP)+,R5 CMP R5,#DEVEND ;ANY MORE SPACE BEQ 80$ ;NO 60$: ADD D.UCBL(R4),R3 ;POINT TO NEXT UCB INC R2 CMPB R2,D.UNIT+1(R4) ;MORE DEVICES ON DCB BLOS 20$ 70$: MOV (R4),R4 BNE 10$ 80$: RETURN .SBTTL UPDATE ; DEVICE STATUS I/O PACKET LIST ; DDX: BUSY TT1 TT2 TT3 TT4 UPDATE: GTIM$S #TIMBUF ; GET TIME AND DATE TST $DADAT ; DO WE WANT DATE DISPLAYED? BEQ 100$ ; BR IF NO MOV #" ,EDTBUF+8. ; IF DAY IS LESS THAN 10 MOV #EDTBUF,R0 ; OUTPUT FROM CONVERSION MOV #TIMBUF,R1 ; INPUT BUFFER CALL $DAT ; CONVERT DATE TO ASCII MVN #EDTBUF,$DADAT,9. ; MOVE ONTO SCREEN 100$: TST $DATIM ; DO WE WANT TIME DISPLAYED? BEQ 200$ ; BR IF NO MOV #" ,EDTBUF+6 ; IF TIME IS BEFORE 10 O'CLOCK MOV #EDTBUF,R0 ; OUTPUT FROM CONVERSION MOV #TIMBUF+6,R1 ; INPUT BUFFER MOV #3,R2 ; HH:MM:SS FORMAT CALL $TIM ; CONVERT TIME TO ASCII MVN #EDTBUF,$DATIM,8. ; MOVE ONTO SCREEN 200$: MOV #DEVDT,R5 MOV #$DANAM,R4 300$: TST (R5) BNE 600$ CMP R4,#$DANAE ; END OF DEVICE ENTRIES? BHIS 500$ ; BR IF YES MOV (R4),R4 ; GET BEGINNING OF DEVICE INFORMATION BEQ 500$ ; BR IF AT END OF SCREEN 400$: CMP #$ESCRN,R4 ; AT END OF SCREEN? BLOS 500$ ; BR IF YES CMP #$SCRN,R4 ; BEFORE BEGINNING OF SCREEN? BHIS 500$ ; BR IF YES CMPB #40,(R4)+ ; IS IT A SPACE ALREADY? BEQ 400$ ; BR IF YES MOVB #40,-1(R4) ; ELSE MAKE IT A SPACE FLAG -1(R4) ; FLAG IT BR 400$ ; CONTINUE 500$: RETURN 600$: MOV #EDTBUF,R0 ; CONVERSION STORAGE BUFFER MOVB (R5)+,(R0)+ ; FIRST HALF OF DEVICE NAME MOVB (R5)+,(R0)+ ; SECOND HALF OF NAME MOV R0,R2 ; POINT TO CONVERSION BUFFER MOV #" ,(R2)+ ; INITIALIZE TO SPACES MOV #" ,(R2)+ ; ... MOV (R5)+,R1 ; ... CMP R4,#$DANAM ;is this first entry? BNE 700$ ADD #'A,R1 ;make alpha MOVB R1,(R0) ;and staore BR 800$ 700$: MOV #3.*4000+8.,R2 CALL $CBTA MOVB #':,(R0)+ 800$: MOV (R4)+,R3 ; GET ADDRESS TO STORE DEVICE NAME BEQ 900$ ; BR IF NOT TO BE DISPLAYED MVN #EDTBUF,R3,5 ; STORE IT 900$: MOVB (R5)+,R3 ; GET U.STS MOVB (R5)+,R2 ; GET U.ST2 MOV (R5)+,R1 ; GET S.ST2 MOV #IDLE,R0 ; Initialise as idle BIT #US.BSY,R3 ; UNIT BUSY BEQ 1000$ MOV #BUSY,R0 1000$: TSTB (R5)+ ;S.STS BEQ 1100$ MOV #BUSY,R0 1100$: BITB #S3.SIP,(R5)+ BEQ 1200$ MOV #SEEK,R0 1200$: BIT #S2.EIP,R1 BEQ 1300$ MOV #ERROR,R0 1300$: MOV (R4)+,R3 ; GET ADDRESS TO STORE STATUS BEQ 1400$ ; BR IF NOT TO BE DISPLAYED MOV R0,R1 MVN R1,R3,5. ; STORE IT 1400$: MOV #EDTBUF,R0 ; EDIT CONVERSION BUFFER MOV (R5)+,R1 ; TASK WORD 1 CALL $C5TA MOV (R5)+,R1 CALL $C5TA MOV (R4)+,R3 ; Get position for current task BEQ 1500$ MVN #EDTBUF,R3,6. ;store active task 1500$: MOV #EDTBUF,R0 ; EDIT CONVERSION BUFFER MOV R0,R2 ; POINT TO CONVERSION BUFFER MOV #30.,R1 ; NUMBER OF WORDS IN BUFFER 1600$: MOV #" ,(R2)+ ; INITIALIZE TO SPACES DEC R1 ; MORE? BGT 1600$ ; BR IF YES MOV #7.,R3 ; COUNT A MAX OF 8 1700$: MOV (R5)+,R1 ; TASK WORD 1 CALL $C5TA MOV (R5)+,R1 CALL $C5TA INC R0 SOB R3,1700$ MOV (R4)+,R3 ; GET ADDRESS TO STOREwaiting list BEQ 1800$ ; BR IF NOT TO BE DISPLAYED MVN #EDTBUF,R3,48. ; STORE IT 1800$: JMP 300$ .END