.TITLE LLPAGE - LOGICAL LINK DISPLAY .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: ; ; PERIODIC UPDATE PROCESSING FOR LOGICAL LINK DISPLAY ; ; ; ; DISTRIBUTED SYSTEMS SOFTWARE ENGINEERING ; ; IDENT HISTORY: ; ; 1.00 15-APR-80 ; .SBTTL GLOBAL MACROS ; ; GLOBAL MACROS ; .MCALL UCBDF$,NSPIN$,RNBDF$,LLWDF$,NSDDB$,HDRDF$ .MCALL DCBDF$,ALUN$S,GTIM$S,DVBDF$,PDVDF$ DCBDF$ ; DEFINE DCB OFFSETS AND SYMBOLS UCBDF$ ; DEFINE UCB OFFSETS AND SYMBOLS NSPIN$ ; DEFINE LOGICAL LINK TABLE OFFSETS RNBDF$ ; DEFINE REMOTE NODE NAME BLOCK OFFSETS LLWDF$ ; LOGICAL LINK WINDOW BLOCK OFFSETS NSDDB$ ; DEFINE NSP'S DDB OFFSETS AND SYMBOLS PDVDF$ ; DEFINE PDV OFFSETS AND SYMBOLS HDRDF$ ; DEFINE THE TASK HEADER OFFSETS DVBDF$ ; DEFINE VOLUME CONTROL BLOCK OFFSETS .SBTTL LOCAL MACROS ; ; LOCAL MACROS ; .MACRO TEXT,STRNG .NCHR SYM, .BYTE SYM .ASCII /STRNG/ .ENDM .MACRO MVN,FROM,TO,LEN MOV FROM,R0 ; SENDING STRING MOV TO,R1 ; ADDRESS OF POSITION IN SCREEN BUFFER MOV LEN,R2 ; LENGTH OF STRING CALL MOVEON ; MOVE ONTO SCREEN .ENDM .MACRO FLAG,DD ; FLAG CHARACTER AS CHANGED BISB #200,DD .ENDM .SBTTL ENTRY POINT DEFINITION .PSECT PAGE,OVR,I,LCL .WORD PAGE ; DEFINE ENTRY POINT .SBTTL LOCAL DATA ; ; LOCAL DATA ; LLTASK: .BLKW 2 ; TASK NAME (RAD50) LLLUN: .BLKW 1 ; TASK LUN LLTUCB: .BLKW 1 ; TASK OWNING TI: UCB ADDRESS LLRLLA: .BLKW 1 ; REMOTE LLA LLNADD: .BLKW 1 ; REMOTE NODE ADDRESS LLNNAM: .BLKW 3 ; REMOTE NODE NAME (ASCII) LLINTO: .BLKW 1 ; NUMBER OF INTERRUPTS OUTSTANDING LLRCVO: .BLKW 1 ; NUMBER OF RECEIVES OUTSTANDING LLXMTO: .BLKW 1 ; NUMBER OF SENDS OUTSTANDING LLSEGZ: .BLKW 1 ; TRANSMIT SEGMENT SIZE LLLTT: .BLKW 1 ; LONG TERM TIMER LLMES: .BLKW 1 ; ADDRESS OF MESSAGE STRING TO DISPLAY LLSTAT: .BLKW 1 ; LLT STATE LLINTP: .BLKB 1 ; NUMBER OF INTERRUPTS PENDING LLINTC: .BLKB 1 ; INTERRUPT COUNT LLDXMP: .BLKB 1 ; NUMBER OF DATA TRANSMITS PENDING LLXMTC: .BLKB 1 ; TRANSMIT COUNT .EVEN TIMBUF: .BLKW 8. ; BUFFER FOR GTIM$ DIRECTIVE LLNDDB= TIMBUF+0 ; NSP'S DDB ADDRESS LLMAXL= TIMBUF+2 ; MAXIMUM NUMBER OF ACTIVE LINKS EDTBUF: .BLKW 30. ; EDIT CONVERSION BUFFER ; ; DISPLAY STRINGS ; LLRNGE: TEXT LLNACT: TEXT LLNACC: TEXT LLTACT: TEXT <(ACTIVE)> LLTNAC: TEXT <(NOT ACTIVE)> LLEXOF: TEXT .EVEN .SBTTL CLEAR FIELDS TABLE ; ; CLEAR FIELDS TABLE - THESE TABLES ARE USED BY THE CLRFLD ROUTINE ; TO BLANK OUT THE SPECIFIED FIELD. EACH ENTRY IN THE TABLE ; CONSISTS OF TWO WORDS WITH THE FOLLOWING FORMAT: ; LENGTH, ADDRESS IN SCREEN BUFFER ; THE END OF THE TABLE IS INDICATED WITH A 0 ; CLRALL: .WORD 3.,$LLLLA CLRRST: .WORD 6.,$LLTSK .WORD 3.,$LLLUN .WORD 6.,$LLTI .WORD 3.,$LLRLA .WORD 3.,$LLNAD .WORD 8.,$LLNNM .WORD MESMXL,$LLSTA .WORD MESMXL,$LLST1 .WORD 3.,$LLINO .WORD 3.,$LLRCO .WORD 3.,$LLXMO .WORD 3.,$LLIXP .WORD 3.,$LLINC .WORD 3.,$LLDXP .WORD 3.,$LLXMC .WORD 6.,$LLSEG .WORD 3.,$LLLTT .WORD 12.,$LLLTM .WORD 0 .SBTTL TRANSLATION TABLES ;+ ; ; STATE DEFINITION TRANSLATION TABLE ; ;- LLSTDF: .WORD 10$,ST$CIS .WORD 20$,ST$CC .WORD 30$,ST$CIR .WORD 40$,ST$CID .WORD 50$,ST$DAT .WORD 60$,ST$DIP .WORD 0 10$: TEXT 20$: TEXT MESMXL=.-20$-1 ; LENGTH OF LONGEST TEXT STRING 30$: TEXT 40$: TEXT 50$: TEXT 60$: TEXT .EVEN ;+ ; ; LINK TYPE DEFINTION TRANSLATION TABLE ; ;- LLTYDF: .WORD 10$,LF.LCL .WORD 20$,LF.LPL .WORD 30$,LF.PH2 .WORD 0 10$: TEXT 20$: TEXT 30$: TEXT .SBTTL RMPAGE ENTRY POINT ;+ ; ; PAGE - REMOTE NODE DISPLAY PAGE ENTRY POINT ; ; INPUTS: ; $XCLLA - LOGICAL LINK ADDRESS TO DISPLAY ; ; OUTPUTS: ; THE DISPLAY IS UPDATED ; ;- PAGE: MOV #LLNACC,LLMES ; ASSUME NETWORK NOT ACCESSIBLE ALUN$S #$MLUN,#"NS ; ASSIGN THE MAILBOX LUN TO THE NETWORK BCS 10$ ; BR IF UNABLE TO ACCESS NETWORK MOV #LLEXOF,LLMES ; ASSUME EXECUTOR STATE IS OFF MOV $HEADR,R0 ; GET OUR TASK'S HEADER ADDRESS MOV H.LUN+<<$MLUN-1>*4>(R0),R1 ; GET UCB ADDRESS FOR NS: BITB #US.MNT,U.STS(R1) ; IS THE EXECUTOR STATE ON BNE 10$ ; BR IF NO CALL FNDNSP ; GET NODE INFORMATION TST LLMES ; LLA OUT OF RANGE? BNE 10$ ; BR IF YES TO DISPLAY MESSAGE CALL FNDLNK ; GET LOGICAL LINK INFORMATION 10$: CALL UPDATE ; UPDATE THE SCREEN RETURN .SBTTL FNDNSP - GET NSP'S DDB ;+ ; ; FNDNSP - GET NSP'S DDB ; ; INPUTS: ; $XCLLA - SPECIFIED LLA ; ; OUTPUTS: ; LLNDDB - ADDRESS OF NSP'S DDB ; LLMAXL - MAXIMUM NUMBER OF LOGICAL LINKS ; LLMES - ADDRESS OF TEXT TO DISPLAY IF LLA OUT OF RANGE, ; OTHERWISE 0 ; ;- FNDNSP: CALL $SWSTK,10$ ;; ENTER SYSTEM STATE MOV #^RNSP,R2 ;; GET NSP'S PROCESS NAME CALL $PDVID ;; GET NSP'S PDV BCS 10$ ;; BR IF NSP NOT LOADED ADD $PDVTA,R2 ;; GET ADDRESS OF NSP'S PDV ADDRESS MOV (R2),R1 ;; POINT TO NSP'S PDV MOV Z.DAT(R1),R2 ;; GET NSP'S DDB ADDRESS MOV R2,LLNDDB ;; SAVE NSP'S DDB ADDRESS MOV #LLRNGE,LLMES ;; ASSUME LLA IS OUT OF RANGE MOV N$LVC(R2),R1 ;; GET MAXIMUM NUMBER OF LINKS CMP $XCLLA,R1 ;; IS LLA OUT OF RANGE? BHI 10$ ;; BR IF YES MOV R1,LLMAXL ;; SAVE MAXIMUM NUMBER OF ACTIVE LINKS CLR LLMES ;; INDICATE NO ERROR 10$: RETURN .SBTTL FNDLNK - GET LOGICAL LINK INFORMATION ;+ ; ; FNDLNK - GET LOGICAL LINK INFORMATION ; ; INPUTS: ; $XCLLA - LOGICAL LINK ADDRESS TO DISPLAY ; LLNDDB - NSP'S DDB ADDRESS ; LLMAXL - MAXIMUM NUMBER OF LOGICAL LINKS ; ; OUTPUTS: ; THE LOGICAL LINK INFORMATION IS SAVED ; ;- FNDLNK: CALL $SWSTK,150$ ;; ENTER SYSTEM STATE MOV $HEADR,R0 ;; POINT TO TASK HEADER MOV H.LUN-4+<4*$MLUN>(R0),R0;; POINT TO NS: UCB MOV U.VCB(R0),R0 ;; POINT TO VCB MOV V.ULT(R0),R1 ;; POINT TO TABLE OF ULT ADDRESSES MOV LLMAXL,R5 ;; SAVE MAXIMUM NUMBER OF LINKS MOV #LLNACT,LLMES ;; ASSUME LINK NOT ACTIVE 10$: MOV (R1)+,R3 ;; GET ULT BEQ 15$ ;; ZERO => ENTRY NOT USED ******* CMPB W.LLA(R3),$XCLLA ;; IS THIS THE LLA TO DISPLAY? BEQ 20$ ;; BR IF YES 15$: DEC R5 ;; MORE? BGT 10$ ;; BR IF YES JMP 150$ ;; FINISHED 20$: CLR LLMES ;; INDICATE LLA FOUND MOV W.TASK(R3),R2 ;; GET TASK'S TCB ADDRESS MOV T.UCB(R2),LLTUCB ;; SAVE OWNING TI:'S UCB ADDRESS MOV T.NAM+0(R2),LLTASK+0 ;; SAVE TASK NAME MOV T.NAM+2(R2),LLTASK+2 ;; ... MOVB W.LUN(R3),LLLUN ;; SAVE LUN MOV W.SEGZ(R3),LLSEGZ ;; SAVE TRANSMIT SEGMENT SIZE CLR LLINTO ;; INITIALIZE INTERRUPT OUTSTANDING CLR LLRCVO ;; INITIALIZE RECEIVES OUTSTANDING CLR LLXMTO ;; INITIALIZE SENDS OUTSTANDING ADD #W.SNDQ,R3 ;; POINT TO SEND QUEUE LISTHEAD 30$: MOV (R3),R3 ;; POINT TO NEXT ENTRY IN QUEUE BEQ 40$ ;; BR IF END OF QUEUE INC LLXMTO ;; INCREMENT TRANSMITS OUTSTANDING BR 30$ ;; GET NEXT ENTRY 40$: MOV -2(R1),R3 ;; POINT TO WINDOW BLOCK ADD #W.RCVQ,R3 ;; POINT TO RECEIVE QUEUE LISTHEAD 50$: MOV (R3),R3 ;; GET NEXT ENTRY IN QUEUE BEQ 60$ ;; BR IF END OF QUEUE INC LLRCVO ;; INCREMENT RECEIVES OUTSTANDING BR 50$ ;; GET NEXT ENTRY 60$: MOV -2(R1),R3 ;; POINT TO WINDOW BLOCK ADD #W.INTQ,R3 ;; POINT TO INTERRUPT QUEUE LISTHEAD 70$: MOV (R3),R3 ;; GET NEXT ENTRY IN QUEUE BEQ 80$ ;; BR IF END OF QUEUE INC LLINTO ;; INCREMENT INTERRUPT OUTSTANDING BR 70$ ;; GET NEXT ENTRY 80$: MOV LLNDDB,R2 ;; GET NSP'S DDB ADDRESS MOV N$LVC+2(R2),R2 ;; POINT TO LLT TABLE MOV $XCLLA,R3 ;; GET LLA ASL R3 ;; MAKE IT A WORD INDEX ADD R3,R2 ;; POINT TO CORRECT LLT MOV (R2),R2 ;; GET LLT ADDRESS MOVB L.RLA(R2),LLRLLA ;; SAVE REMOTE LLA MOV L.STA(R2),LLSTAT ;; SAVE STATE BYTE MOVB L.TIPI(R2),LLINTP ;; SAVE I/LS INTERRUPTS IN PROGRESS MOVB L.TIC(R2),LLINTC ;; SAVE INTERRUPT COUNT MOVB L.TIPD(R2),LLDXMP ;; SAVE DATA TRANSMITS IN PROGRESS MOVB L.TC(R2),LLXMTC ;; SAVE TRANSMIT COUNT MOV L.LTT(R2),LLLTT ;; SAVE LONG TERM TIMER VALUE MOV L.REM(R2),R4 ;; GET REMOTE NODE ADDR (OR CHANNEL #) ; ; CHECK FOR PHASE II NODE ; BIT #LF.PH2,L.STA(R2) ;; PHASE II NODE? BEQ 110$ ;; BR IF NO MOV LLNDDB,R3 ;; GET NSP'S DDB ADDRESS MOV N$PLD+0(R3),R5 ;; GET NUMBER OF PLD'S MOV N$PLD+2(R3),R3 ;; GET FIRST PLD 90$: CMPB P$CHN(R3),R4 ;; IS THIS THE CORRECT PLD? BEQ 100$ ;; BR IF YES ADD #P$LEN,R3 ;; POINT TO NEXT PLD DEC R5 ;; MORE? BGT 90$ ;; BR IF YES BR 150$ ;; NO MATCH ON CHANNEL NUMBER 100$: MOV P$NOD(R3),R4 ;; GET NODE ADDRESS ; ; GET NODE NAME ; 110$: MOVB #40,LLNNAM ;; ASSUME NO NAME .IF DF,M$$MGE MOV @#KISAR5,-(SP) ;; SAVE CURRENT MAPPING MOV $PBIAS,@#KISAR5 ;; MAP TO NETWORK POOL .ENDC MOV #$RNNHD,R0 ;; POINT TO REMOTE NODE LIST 120$: MOV (R0),R0 ;; GET NEXT REMOTE NODE BLOCK BEQ 140$ ;; BR IF END OF LIST .IF DF,M$$MGE CMP #140000,R0 ;; MAPPED TO $PBIAS BHI 130$ ;; BR IF NO BIC #140000,R0 ;; CLEAR OUT CURRENT MAPPING BIS #120000,R0 ;; MUST BE MAPPED TO APR5 130$: .ENDC CMP R4,R.ADD(R0) ;; IS THIS THE NODE WE WANT? BNE 120$ ;; BR IF NO MOV R.NAM+0(R0),LLNNAM+0 ;; SAVE NODE NAME MOV R.NAM+2(R0),LLNNAM+2 ;; ... MOV R.NAM+4(R0),LLNNAM+4 ;; ... 140$: MOV R4,LLNADD ;; SAVE NODE ADDRESS .IF DF,M$$MGE MOV (SP)+,@#KISAR5 ;; RESTORE MAPPING .ENDC 150$: RETURN .SBTTL UPDATE - UPDATE THE SCREEN ;+ ; ; UPDATE - UPDATE THE SCREEN ; ; INPUTS: ; LLMES - ADDRESS OF STRING TO DISPLAY (0 IF NO MESSAGE TO DISPLAY) ; ; OUTPUTS: ; THE SCREEN IS UPDATED ; ;- UPDATE: GTIM$S #TIMBUF ; GET TIME AND DATE TST $LLDAT ; DO WE WANT DATE DISPLAYED? BEQ 10$ ; 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,$LLDAT,#9. ; MOVE ONTO SCREEN 10$: TST $LLTIM ; DO WE WANT TIME DISPLAYED? BEQ 20$ ; BR IF NO MOV #" ,EDTBUF+6 ; IF TIME IS BEFORE 10 O'CLOCK MOV #EDTBUF,R0 ; OUTPUT CONVERSION BUFFER MOV #TIMBUF+6,R1 ; INPUT BUFFER MOV #3,R2 ; HH:MM:SS FORMAT CALL $TIM ; CONVERT TIME TO ASCII MVN #EDTBUF,$LLTIM,#8. ; MOVE ONTO SCREEN ; ; DISPLAY MESSAGE ; 20$: TST LLMES ; ANY MESSAGE TO DISPLAY? BEQ 30$ ; BR IF NO MOV LLMES,R1 ; GET ADDRESS OF DISPLAY STRING MOV $LLMES,R3 ; GET ADDRESS IN SCREEN BUFFER TO MOVE IT CALL STRMES ; MOVE THE MESSAGE ONTO THE SCREEN MOV #CLRALL,R3 ; ASSUME UNABLE TO ACCESS NETWORK CMP LLMES,#LLNACC ; UNABLE TO ACCESS NETWORK? BEQ 25$ ; BR IF YES CMP LLMES,#LLEXOF ; IS EXECUTOR STATE OFF? BEQ 25$ ; BR IF YES MOV $XCLLA,R1 ; GET LLA MOV $LLLLA,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE IT CALL STRBYT ; MOVE INTO SCREEN BUFFER MOV #CLRRST,R3 ; CLEAR ALL FIELDS EXCEPT FOR LOCAL LLA 25$: CALL CLRFLD ; CLEAR THE SPECIFIED FIELDS JMP 110$ ; FINISHED ; ; DISPLAY LOCAL LLA ; 30$: CLR R1 ; INDICATE MESSAGE IS TO BE BLANKED MOV $LLMES,R3 ; ADDRESS IN SCREEN BUFFER TO BLANK CALL STRMES ; BLANK OUT MESSAGE AREA MOV $XCLLA,R1 ; GET LLA MOV $LLLLA,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE LLA CALL STRBYT ; MOVE ONTO SCREEN ; ; DISPLAY TASK NAME ; TST $LLTSK ; DO WE WANT TO DISPLAY TASK NAME? BEQ 40$ ; BR IF NO MOV #EDTBUF,R0 ; OUTPUT CONVERSION BUFFER MOV LLTASK,R1 ; GET FIRST HALF OF NAME CALL $C5TA ; CONVERT IT TO ASCII MOV LLTASK+2,R1 ; GET SECOND HALF OF NAME CALL $C5TA ; CONVERT IT TO ASCII MVN #EDTBUF,$LLTSK,#6 ; MOVE ONTO SCREEN ; ; DISPLAY LUN ; 40$: MOV LLLUN,R1 ; GET LUN MOV $LLLUN,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE IT CALL STRBYT ; MOVE ONTO SCREEN ; ; DISPLAY OWNING TI ; TST $LLTI ; DO WE WANT TO DISPLAY OWNING TI BEQ 50$ ; BR IF NO MOV #EDTBUF,R0 ; OUTPUT CONVERSION NUMBER MOV #" ,(R0) ; BLANK OUT OWNING TI FIELD MOV (R0),2(R0) ; ... MOV (R0),4(R0) ; ... MOV LLTUCB,R3 ; GET UCB ADDRESS OF OWNING TI CALL FMTDV ; FORMAT THE DEVICE NAME MVN #EDTBUF,$LLTI,#6 ; MOVE ONTO SCREEN ; ; DISPLAY REMOTE LLA ; 50$: MOV LLRLLA,R1 ; GET REMOTE LLA MOV $LLRLA,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE IT CALL STRBYT ; MOVE ONTO SCREEN ; ; DISPLAY NODE NAME AND ADDRESS ; MOV LLNADD,R1 ; GET NODE ADDRESS CALL STRADD ; MOVE ONTO SCREEN MOV #LLNNAM,R1 ; GET ADDRESS OF NODE NAME STRING CALL STRNAM ; MOVE ONTO SCREEN ; ; DISPLAY LINK STATE AND TYPE ; MOV #LLSTDF,R0 ; POINT TO STATE TRANSLATION TABLE 60$: MOV (R0)+,R1 ; GET ADDRESS OF TEXT TO DISPLAY BEQ 70$ ; BR IF END OF TABLE MOV (R0)+,R3 ; GET STATE TO MATCH AGAINST CMPB R3,LLSTAT ; DOES THE STATE MATCH? BNE 60$ ; BR IF NO 70$: MOV $LLSTA,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE STATE CALL STRMES ; MOVE ONTO SCREEN MOV #LLTYDF,R0 ; POINT TO TYPE TRANSLATION TABLE 80$: MOV (R0)+,R1 ; GET ADDRESS OF TEXT TO DISPLAY BEQ 90$ ; BR IF END OF TABLE BIT (R0)+,LLSTAT ; DOES THE TYPE MATCH? BEQ 80$ ; BR IF NO 90$: MOV $LLST1,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE TYPE CALL STRMES ; MOVE ONTO SCREEN ; ; DISPLAY QIO'S OUTSTANDING ; MOV LLINTO,R1 ; GET INTERRUPTS OUTSTANDING COUNT MOV $LLINO,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE IT CALL STRBYT ; MOVE ONTO SCREEN MOV LLRCVO,R1 ; GET RECEIVES OUTSTANDING COUNT MOV $LLRCO,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE IT CALL STRBYT ; MOVE ONTO SCREEN MOV LLXMTO,R1 ; GET TRANSMITS OUTSTANDING COUNT MOV $LLXMO,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE IT CALL STRBYT ; MOVE ONTO SCREEN ; ; DISPLAY INTERRUPTS IN PROGRESS AND INTERRUPT COUNT ; CLR R1 ; BISB LLINTP,R1 ; GET INTERRUPTS IN PROGRESS MOV $LLIXP,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE IT CALL STRBYT ; MOVE ONTO SCREEN CLR R1 ; BISB LLINTC,R1 ; GET INTERRUPT COUNT MOV $LLINC,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE IT CALL STRBYT ; MOVE ONTO SCREEN ; ; DISPLAY TRANSMITS IN PROGRESS AND TRANSMIT COUNT ; CLR R1 BISB LLDXMP,R1 ; GET TRANSMITS IN PROGRESS MOV $LLDXP,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE IT CALL STRBYT ; MOVE ONTO SCREEN CLR R1 BISB LLXMTC,R1 ; GET TRANSMIT COUNT MOV $LLXMC,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE IT CALL STRBYT ; MOVE ONTO SCREEN ; ; DISPLAY SEGMENT SIZE ; MOV LLSEGZ,R1 ; GET SEGMENT SIZE MOV $LLSEG,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE IT CALL STRWRD ; MOVE ONTO SCREEN ; ; DISPLAY LONG TERM TIMER ; MOV #LLTNAC,LLMES ; ASSUME LONG TERM TIMER IS NOT ACTIVE MOV LLLTT,R1 ; GET LONG TERM TIMER BPL 100$ ; BR IF NOT ACTIVE BIC #100000,R1 ; IGNORE ACTIVE INDICATOR MOV #LLTACT,LLMES ; LONG TERM TIMER IS ACTIVE 100$: MOV $LLLTT,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE IT CALL STRBYT ; MOVE ONTO SCREEN MOV LLMES,R1 ; GET ADDRESS OF STRING TO DISPLAY MOV $LLLTM,R3 ; GET ADDRESS IN SCREEN BUFFER TO STORE IT CALL STRMES ; MOVE ONTO SCREEN 110$: RETURN .SBTTL STRNAM - STORE NAME IN SCREEN BUFFER ;+ ; ; STRNAM - STORE NODE NAME IN SCREEN BUFFER ; ; INPUTS: ; R1 - ADDRESS OF ASCII NODE NAME STRING ; ; OUTPUTS: ; THE NODE NAME IS STORED IN THE SCREEN BUFFER ; R0,R1,R2 DESTROYED ; ;- STRNAM: TST $LLNNM ; DO WE WANT TO DISPLAY NODE NAME? BEQ 30$ ; BR IF NO MOV #EDTBUF,R0 ; POINT TO OUTPUT CONVERSION BUFFER MOV #" ,(R0) ; BLANK OUT NODE NAME MOV (R0),2(R0) ; ... MOV (R0),4(R0) ; ... MOV (R0),6(R0) ; ... CMPB #' ,(R1) ; IS NODE NAME ALL BLANKS? BEQ 20$ ; BR IF YES MOVB #'(,(R0)+ ; STORE LEFT PARENTHESES MOV #6,R2 ; MAXIMUM LENGTH OF NODE NAME 10$: MOVB (R1)+,(R0)+ ; STORE NODE NAME DEC R2 ; MORE TO STORE? BGT 10$ ; BR IF YES MOVB #'),(R0) ; STORE RIGHT PARENTHESES 20$: MVN #EDTBUF,$LLNNM,#8. ; MOVE ONTO SCREEN 30$: RETURN .SBTTL STRADD - STORE NODE ADDRESS IN SCREEN BUFFER ;+ ; ; STRADD - STORE NODE ADDRESS IN SCREEN BUFFER ; ; INPUTS: ; R1 = NODE ADDRESS (BINARY) TO DISPLAY ; ; OUTPUTS: ; THE NODE ADDRESS IS STORED IN THE SCREEN BUFFER ; R0,R1,R2 DESTROYED ; ;- STRADD: TST $LLNAD ; DO WE WANT TO DISPLAY NODE ADDRESS BEQ 10$ ; BR IF NO MOV #EDTBUF,R0 ; POINT TO OUTPUT BUFFER MOV #" ,(R0) ; BLANK OUT NODE ADDRESS MOV (R0),2(R0) ; ... CLR R2 ; SUPPRESS ZEROES CALL $CBDMG ; CONVERT IT TO ASCII MVN #EDTBUF,$LLNAD,#3 ; MOVE ONTO SCREEN 10$: RETURN .SBTTL STRMES - STORE DISPLAY MESSAGE IN SCREEN BUFFER ;+ ; ; STRMES - STORE DISPLAY MESSAGE IN SCREEN BUFFER ; ; INPUTS: ; R1 - ADDRESS OF ASCII STRING TO DISPLAY (FIRST BYTE IS LENGTH) ; IF ZERO, BLANK OUT MESSAGE ; R3 - ADDRESS IN SCREEN BUFFER TO STORE MESSAGE ; ; OUTPUTS: ; THE DISPLAY STRING IS MOVED INTO THE SCREEN BUFFER ; R0,R1,R2 DESTROYED ; ;- STRMES: TST R3 ; DISPLAY THE MESSAGE? BEQ 30$ ; BR IF NO MOV #EDTBUF,R0 ; OUTPUT CONVERSION BUFFER MOV R1,-(SP) ; SAVE ADDRESS OF DISPLAY STRING MOV #MESMXL,R1 ; GET MAXIMUM LENGTH OF MESSAGE MOV R0,R2 ; GET ADDRESS OF OUTPUT BUFFER 10$: MOVB #' ,(R2)+ ; BLANK OUT OUTPUT BUFFER DEC R1 ; MORE TO STORE? BGT 10$ ; BR IF YES MOV (SP)+,R1 ; RESTORE ADDRESS OF DISPLAY STRING BEQ 25$ ; BR IF NO MESSAGE TO DISPLAY MOVB (R1)+,R2 ; GET LENGTH OF STRING 20$: MOVB (R1)+,(R0)+ ; STORE THE STRING DEC R2 ; MORE? BGT 20$ ; BR IF YES 25$: MVN #EDTBUF,R3,#MESMXL ; MOVE ONTO SCREEN 30$: RETURN .SBTTL STRBYT - STORE BYTE VALUE IN SCREEN BUFFER ;+ ; ; STRBYT - STORE BYTE VALUE IN SCREEN BUFFER ; ; INPUTS: ; R1 - BINARY VALUE TO DISPLAY ; R3 - ADDRESS IN SCREEN BUFFER TO STORE THE VALUE ; ; OUTPUTS: ; THE BINARY VALUE IS CONVERTED TO ASCII AND STORED IN ; THE SPECIFIED AREA OF THE SCREEN BUFFER ; ; R0,R1,R2 DESTROYED ; ;- STRBYT: TST R3 ; DO WE WANT TO DISPLAY THE VALUE? BEQ 10$ ; BR IF NO MOV #EDTBUF,R0 ; OUTPUT CONVERSION BUFFER MOV #" ,(R0) ; BLANK OUT VALUE MOV (R0),2(R0) ; ... CLR R2 ; SUPPRESS ZEROES CALL $CBDMG ; CONVERT IT TO ASCII MVN #EDTBUF,R3,#3 ; MOVE ONTO SCREEN 10$: RETURN .SBTTL STRWRD - STORE WORD VALUE IN SCREEN BUFFER ;+ ; ; STRWRD - STORE WORD VALUE IN SCREEN BUFFER ; ; INPUTS: ; R1 - BINARY VALUE TO DISPLAY ; R3 - ADDRESS IN SCREEN BUFFER TO STORE THE VALUE ; ; OUTPUTS: ; THE BINARY VALUE IS CONVERTED TO ASCII AND STORED IN ; THE SPECIFIED AREA OF THE SCREEN BUFFER ; ; R0,R1,R2 DESTROYED ; ;- STRWRD: TST R3 ; DO WE WANT TO DISPLAY THE VALUE? BEQ 10$ ; BR IF NO MOV #EDTBUF,R0 ; OUTPUT CONVERSION BUFFER MOV #" ,(R0) ; BLANK OUT VALUE MOV (R0),2(R0) ; ... MOV (R0),4(R0) ; ... CLR R2 ; SUPPRESS ZEROES CALL $CBDMG ; CONVERT IT TO ASCII MVN #EDTBUF,R3,#6 ; MOVE ONTO SCREEN 10$: RETURN .SBTTL CLRFLD - CLEAR FIELDS ON SCREEN ;+ ; ; CLRFLD - CLEAR FIELDS ON SCREEN ; ; INPUTS: ; R3 - POINTER TO TABLE OF FIELDS TO CLEAR ; ; OUTPUTS: ; THE SPECIFIED FIELDS ARE SET TO ALL BLANKS ON THE SCREEN ; ;- CLRFLD: MOV #EDTBUF,R1 ; OUTPUT CONVERSION BUFFER MOV #MESMXL,R2 ; NUMBER OF BYTES TO BLANK OUT 10$: MOVB #40,(R1)+ ; MOVE IN SPACES DEC R2 ; MORE? BGT 10$ ; BR IF YES 20$: MOV #EDTBUF,R0 ; POINT TO OUTPUT BUFFER MOV (R3)+,R2 ; GET LENGTH OF FIELD BEQ 30$ ; BR IF END OF TABLE MOV (R3)+,R1 ; GET ADDRESS OF SCREEN BUFFER ADDRESS MOV (R1),R1 ; GET ADDRESS TO STORE IN SCREEN BUFFER BEQ 20$ ; BR IF NOT TO BE DISPLAYED CALL MOVEON ; MOVE ONTO SCREEN BR 20$ ; GET NEXT FIELD TO CLEAR 30$: RETURN .SBTTL MOVEON - MOVE ONTO SCREEN ;+ ; ; MOVEON - MOVE SPECIFIED STRING ONTO THE SCREEN ; ; INPUTS: ; R0 - ADDRESS OF BUFFER CONTAINING STRING TO DISPLAY ; R1 - ADDRESS ON SCREEN TO DISPLAY STRING ; R2 - NUMBER OF CHARACTERS TO MOVE ONTO SCREEN ; ; OUTPUTS: ; THE SPECIFIED STRING IS MOVED INTO THE SCREEN BUFFER AND ; ANY NEW CHARACTERS ARE FLAGGED ; ;- MOVEON: CMPB (R0)+,(R1)+ ; HAS CHARACTER CHANGED? BEQ 10$ ; BR IF NO MOVB -1(R0),-1(R1) ; ELSE MOVE IT ONTO THE SCREEN FLAG -1(R1) ; FLAG IT AS CHANGED 10$: DEC R2 ; MORE? BGT MOVEON ; BR IF YES RETURN ; FINISHED .SBTTL FMTDV - FORMAT DEVICE NAME ;+ ; ; FMTDV - PUT DEVICE NAME AND UNIT BUFFER ; ; INPUT: ; ; R0 - ADDRESS OF BYTE IN BUFFER ; R3 - ADDRESS OF UCB ; ; OUTPUT: R0 - UPDATED ; R1 - UNIT NUMBER ; R2 - DEVICE NAME ; ;- FMTDV:: MOV U.DCB(R3),R2 ; GET DCB ADDRESS MOV D.NAM(R2),-(SP) ; SAVE DEVICE NAME MOVB D.NAM(R2),(R0)+ ; PUT IN DEVICE MOVB D.NAM+1(R2),(R0)+ ; MNEMONIC MOV R0,-(SP) ; SAVE BUFFER POINTER MOV R3,R0 ; GET UCB ADDRESS SUB D.UCB(R2),R0 ; COMPUTE RELATIVE UCB ADDRESS MOV D.UCBL(R2),R1 ; GET UCB LENGTH CALL $DIV ; COMPUTE RELATIVE UNIT NUMBER ADD D.UNIT(R2),R0 ; COMPUTE ABSOLUTE UNIT NUMBER BIC #177400,R0 ; CLEAR HIGH BYTE MOV R0,R1 ; COPY IT MOV (SP)+,R0 ; RESTORE BUFFER POINTER MOV R1,-(SP) ; SAVE UNIT NUMBER CLR R2 ; SET TO SUPPRESS LEADING ZEROES CALL $CBOMG ; CONVERT TO OCTAL MOVB #':,(R0)+ ; PUT IN COLON (DEVICE TERMINATOR) MOV (SP)+,R1 ; RETURN UNIT NUMBER IN R1 MOV (SP)+,R2 ; RETURN DEVICE NAME IN R2 RETURN ; RETURN .END