*DECK BLINK
USETEXT NIPDEF
USETEXT DRHDR
USETEXT AT
USETEXT ACB
USETEXT ACNB
USETEXT KDIS
USETEXT KHDRX
PROC BLINK((BUFADDR),(CBADDR)); # LINK A DATA BLOCK TO DATA RING #
STARTIMS;
#
*1DC BLINK
*
* 1. PROC NAME AUTHOR DATE
* BLINK E. GEE 77/09/14
*
* 2. FUNCTIONAL DESCRIPTION.
* LINK DATA BLOCK TO DATA RING
*
* 3. METHOD USED.
* CHECK IF DATA RING ALREADY EXISTS
* IF SO, ADD NEW ENTRY TO END OF RING
* IF NOT, CREATE DATA RING WITH NEW ENTRY
* UPDATE K-DISPLAY BUFFER IF NECESSARY.
*
* 4. ENTRY PARAMETERS.
* BUFADDR ADDR OF DATA BLOCK TO ADD TO RING
* ACNBADDR ADDR OF ACB/ACNB TO QUEUE DATA BLK DATA
*
* 5. EXIT PARAMETERS.
* NONE
*
* 6. COMDECKS CALLED AND SYMPL TEXTS USED.
* ACB ACNB AT
* DRHDR NIPDEF KDIS
*
* 7. ROUTINES AND OVERLAYS CALLED.
* HUPDDAW UPDATE DATA AVAILABLE WORD
* HWRAVAL WRITE DATA AVAILABLE WORD
* KPUT UPDATE K-DISPLAY BUFFER
* INSCDR INSERT ACNB IN CONNECTION DATA RING
* XTRACE RECORD PROCEDURE CALLS
*
* 8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION.
* NONE
*
#
STOPIMS;
#
INPUT PARAMETERS
#
ITEM BUFADDR; # FWA OF DATA BLOCK TO LINK #
ITEM CBADDR; # FWA OF DATA STRUCTURE ACB/ACNB/NCNB #
#
EXTERNAL VARIABLES
#
XREF
BEGIN
PROC HUPDDAW; # UPDATE DATA AVAILABLE WORD #
PROC HWRAVAL; # UPDATE UCP-S DATA AVAIALABILITY WORD #
PROC INSCDR; # INSERT ACNB IN CONNECTION DATA RING #
PROC KPUT; # UPDATE STATUS DISPLAY CONTENT #
PROC XTRACE; # TRACE PROCEDURE CALL #
END
#
LOCAL VARIABLES
#
ITEM TEMP1; # TEMPORARY VARIABLE #
ITEM TEMP2; # TEMPORARY VARIABLE #
CONTROL EJECT;
BEGIN # BLINK #
CONTROL IFEQ DEBUG,1;
XTRACE("BLINK"); # TRACE CALL #
CONTROL FI;
P<ACNB> = CBADDR; # ACNB/NCNB/ACB FWA #
P<DRHDRWD> = BUFADDR; # FWA OF DATA BLOCK TO ADD TO RING #
DRID[0] = DRIDVALUE; # SET DATA RING ID #
TEMP1 = LOC(ACNBDRFP[0]);
NEXTPTR[0] = TEMP1; # SET FORWARD PTR IN DATA BLOCK #
IF ACNBDRFP[0] EQ 0
THEN # DATA RING NOT YET EXISTS, CREATE ONE #
BEGIN
BACKPTR[0] = TEMP1;
ACNBDRFP[0] = BUFADDR;
END
ELSE # ADD DATA BLOCK TO DATA RING #
BEGIN
BACKPTR[0] = ACNBDRBP[0];
P<DRHDRWD> = ACNBDRBP[0];
NEXTPTR[0] = BUFADDR;
END
ACNBDRBP[0] = BUFADDR;
IF ACNBID[0] NQ NCNBIDVALUE
THEN # ITS AN ACB OR ACNB #
BEGIN
IF ACNBID[0] EQ ACNBIDVALUE
THEN # IT IS AN ACNB #
BEGIN # INCREMENT DATA BLOCKS QUEUED COUNT #
P<ACB> = ATACBA[ACNBAN[0]]; # FWA OF ACB #
HUPDDAW(P<ACB>,P<ACNB>,1,1); # UPDATE DATA AVAILABLE WORD #
IF ACNBCDRFP[0] EQ 0
THEN # ACNB IS NOT IN CON DATA RING #
BEGIN
INSCDR(P<ACNB>); # INSERT ACNB IN CONN DATA RING #
END
TEMP1 = KPAPNDM;
TEMP2 = ACBBLKSQ[0];
END
ELSE # IT IS AN ACB #
BEGIN # INCREMENT SUPERVISORY MESSAGE QUEUED COUNT #
P<ACB> = CBADDR;
ACBSMQ[0] = ACBSMQ[0] + 1;
TEMP1 = KPAPNSM;
TEMP2 = ACBSMQ[0];
IF TEMP2 EQ 1
THEN # QUEUED 1ST SUP MSG FOR APP #
BEGIN
HWRAVAL(P<ACB>,TRUE); # UPDATE AIP-S DATA AVAIL WORD #
END
END
IF KDIS$RT
AND ACBKNDX[0] NQ 0
AND ACBKNDX[0] GQ KDAPPST[0]
AND ACBKNDX[0] LQ KDAPPND[0]
THEN # UPDATE STATUS DISPLAY #
KPUT(KHDRNP[0],ACBKNDX[0]-KDAPPST[0],TEMP1,TEMP2);
END
ELSE # IT IS A NCNB #
ACNBBLKSQ[0] = ACNBBLKSQ[0] + 1; # INCREMENT BLKS QUEUED #
RETURN;
END # BLINK #
TERM