*DECK HPGETMM
USETEXT NIPDEF
USETEXT ACB
USETEXT ACNT
USETEXT APPSTAT
USETEXT AHEADER
USETEXT AWLNTRY
USETEXT DBGBUF
USETEXT DRHDR
USETEXT GETMM
USETEXT OVERLAY
USETEXT PARAMS
PROC HPGETMM;
STARTIMS;
#
*1DC HPGETMM
*
* 1. PROC NAME AUTHOR DATE
* HPGETMM E. GEE 85/05/01
*
* 2. FUNCTIONAL DESCRIPTION.
* PROCESS AIP NETGETMM WORKLIST ENTRY
*
* 3. METHOD USED.
* VALIDATE GETMM WORKLIST ENTRY.
* IF NOT VALID,
* CALL HLGLERR TO SEND ERR/LGL SUP MSG TO APP.
* ELSE (VALID GETMM WORKLIST ENTRY),
* SET UP INITIAL GETMM AWL ENTRY IN ACB.
* IF DATA MESSAGES TO DELIVER,
* CALL MGETS TO GET BUFFER FOR HOLDING DATA MESSAGES.
* LOOP GETTING DATA MESSAGES UNTIL BUFFER FULL OR NO MORE.
* CALL HGETDA TO GET DATA MESSAGE.
* IF DATA MESSAGE IS TOO LARGE FOR BUFFER,
* DISCONTINUE LOOP.
* IF DATA MESSAGES WERE FOUND,
* CREATE SCP FUNCTION LIST TO WRITE DATA BACK TO APP.
* CALL HWRTDA TO WRITE DATA BACK TO APP.
* UPDATE GETMM AWL ENTRY WITH DELIVERED DATA INFORMATION.
*
* 4. ENTRY PARAMETERS.
* ACBADDR ACB ADDRESS
* WLADDR NWL NETMM WORKLIST ENTRY ADDRESS
*
* 5. EXIT PARAMETERS.
* DONE TRUE IF WORKLIST PROCESSING COMPLETED
*
* 6. COMDECKS CALLED AND SYMPL TEXTS USED.
* ACB APPLICATION CONTROL BLOCK
* DBGBUF DEBUG TRACE BUFFER
* MEM MEMORY LOCATION TEMPLATE
* APPSTAT NETWORK WORKLIST PROCESSING TABLE
* AT APPLICATION TABLE
* AWLHEAD APPLICATION WORKLIST HEADER WORD
* AWLNTRY APPLICATION WORKLIST ENTRY TEMPLATE
* APPSTAT NETWORK WORKLIST PROCESSING TABLE
* DRHDR BUFFER HEADER WORD TEMPLATE
* FLIST SCP FUNCTION LIST TEMPLATE
* GETMM GETMM WORKLIST TEMPLATE
* NIPDEF CONSTANT DEFINITIONS
*
* 7. ROUTINES CALLED.
* BDELINK DELINK DATA BLK FROM ACB/ACNB DATA RING
* HBSMABH COMPUTE LENGTH OF SUP MSG
* HGETDA GET DATA MESSAGE TO DELIVER
* HLGLERR OVL ISSUE ERR/LGL SUPERVISORY MESSAGE
* MGETS ALLOCATE EMPTY BUFFER
* MRELS RELEASE BUFFER SPACE
* OSCCALL ISSUE SCP FUNCTION
* OSCHAPP SCHEDULE APPLICATION
* XTRACE RECORD PROCEDURE CALLS
*
* 8. DAYFILE MESSAGES. NONE
*
#
STOPIMS;
#
EXTERNAL VARIABLES
#
XREF PROC HGETDA; # GET DATA MESSAGE FOR DELIVERY #
XREF PROC HWRTDA; # WRITE DATA TO APP FIELD LENGTH #
XREF PROC MGETS; # GET BUFFER #
XREF PROC MRELS; # RETURN BUFFER #
XREF PROC OVLCALL; # LOAD AND EXECUTE OVERLAYS #
XREF PROC XTRACE;
#
INTERNAL VARIABLES
#
ITEM ABHWD U; # WORD FOR SAVING ABH OF DELINKED MSGS #
ITEM ACNBADR; # ADDRESS OF ACNB #
ITEM ACNALN ; # APPLICATION LIST OR CONNECTION NUMBER #
ITEM BUFADDR; # ADDR OF BUF FOR HOLDING DATA MSGS #
ITEM BUFSIZE; # SIZE OF BUF SPECIFIED BY APP #
ITEM FLSIZ; # SIZE OF SCP FUNCTION REQUEST #
ITEM FOUND B; # TRUE IF DATA MSG DELINKED #
ITEM LIST B; # LIST NUMBER SCAN FLAG #
ITEM NDEL; # NUMBER OF DATA MSGS DELIVERED #
ITEM NEXT; # ADDR OF NEXT FREE LOCATION IN BUFFER #
ITEM NWDS; # NUMBER OF WORDS TO WRITE BACK TO APP #
ITEM SIZE; # SIZE OF DELINKED DATA BLOCKS #
ARRAY FLW P(3); # ARRAY FOR ISSUING SCP CALL #
BEGIN
ITEM FLWRC U(00,00,06); # RETURN CODE FROM SCP CALL #
ITEM FLWFP U(00,06,12); # NUMBER OF WORDS TO READ #
ITEM FLWUCPA U(00,18,18); # UCP ADR FOR SF.WRITE SCP FUNC #
ITEM FLWSCPA U(00,36,18); # SCP ADR FOR SF.WRITE SCP FUNC #
ITEM FLWFC U(00,54,06); # SCP FUNCTION CODE #
ITEM FLWCB U(00,59,01); # SCP FUNCTION COMPLETION BIT #
ITEM FLWWD0 U(00,00,60) = [0]; # WORD 0 OF SCP FUNCTION BUFFER #
ITEM FLWJSNWD U(01,00,60); # UCP JSN / EJT ORDINAL WORD #
ITEM FLWXUCPA U(02,12,24); # UCP ADR FOR SF.XWRITE SCP FUNC#
ITEM FLWXSCPA U(02,36,24); # SCP ADR FOR SF.XWRITE SCP FUNC#
ITEM FLWWD2 U(02,00,60) = [0]; # WORD 2 OF SCP FUNCTION BUFFER #
END
#**********************************************************************#
BEGIN
CONTROL IFEQ DEBUG,1 ;
XTRACE("HPGMM") ;
CONTROL FI;
DONE = FALSE; # ASSUME FUNC NOT COMPLTE UNLESS OTHERWISE#
LIST = FALSE; # ASSUME NOT GETTING DATA FROM LIST #
P<GETMM> = WLADDR; # WORKLIST ADDRESS #
P<ACB> = ACBADDR; # ACB ADDRESS #
P<ACNT> = ACBACNT[0] ;
NDEL = 0;
NWDS = 0;
#
COPY NEEDED INFORMATION FROM GETMM WORKLIST ENTRY
#
BUFSIZE = GETMMSZ[0]; # SIZE OF APP MULTIPLE MSG BUFFER #
ACNALN = GETMMACN[0]; # GET MULTIPLE MSGS CONNECTION NUMBER #
IF ACNALN EQ 0
THEN # GET MULTIPLE MSGS FROM LIST #
BEGIN
LIST = TRUE;
ACNALN = GETMMALN[0]; # LIST NUMBER FOR GETTING MULTIPLE MSGS #
END
#
VALIDATE GETMM WORKLIST ENTRY
#
IF ( NOT LIST ) AND
( ( ACNALN GR ACNTHCN[0] ) OR # CONNECTION NO TOO LARGE #
( ACNALN LS ACNTMINACN[0] ) OR # CONNECTION NO TOO SMALL #
( ACNTACNB[ACNALN+ACNTHSIZE-ACNTMINACN[0]] EQ 0 ) )
THEN # INVALID CON NUMBER WAS SPECIFIED #
BEGIN
PARAMS1 = RLG"ACN"; # REASON CODE FOR ERR/LGL SM #
OVLNAME = HLGLERRP; # NAME OF OVERLAY TO LOAD #
OVLCALL; # LOAD AND EXECUTE OVERLAY #
END
ELSE # VALID CON NUMBER OR GETTING FROM LIST #
BEGIN
#
COPY NETGETMM WORKLIST ENTRY TO AWL
#
P<AWLENTRY> = LOC(ACBAWL2[0]);
AWLEAIPH[0] = GETMMWD0[0]; # AIP OPCODE WORD #
AWLEWD1[0] = GETMMWD1[0]; # SECOND WORD OF GETMM ENTRY #
P<GETMM> = P<AWLENTRY>; # BASED ARRAY NOW POINTS TO AWL ENTRY #
IF (BUFSIZE NQ 0) AND
(ACBBLKSQ[0] NQ 0)
THEN # THERE ARE DATA MSGS TO DELIVER #
BEGIN
MGETS(BUFSIZE+BLKHSIZE+1,BUFADDR,FALSE); # GET BUF FOR DATA #
P<DRHDRWD> = BUFADDR;
BLKID[0] = MOUTIDVALUE;
NEXT = BUFADDR + BLKHSIZE; # FWA TO WRITE DATA MESSAGE TO #
#
GET DATA MESSAGES
#
FOUND = TRUE; # INITIALIZE FLAG TO DATA MSG FOUND #
FOR ACNALN=ACNALN WHILE FOUND
DO # LOOP UNTIL NO MORE MSGS OR BUF FULL #
BEGIN
SIZE = BUFSIZE - ABHSIZE; # NO OF WDS LEFT TO HOLD TEXT #
HGETDA(NEXT,SIZE,ACNALN,LIST,ABHWD);
P<AHEADER> = NEXT; # ADDR OF WORD TO HOLD ABH #
ABHWORD[0] = ABHWD; # COPY ABH WORD TO BUFFER #
IF (ABHWD EQ 0) OR # NO DATA MSG FOUND #
(ABHIBU[0] NQ 0) # DATA MSG WAS NOT DELIVERABLE #
THEN # DISCONTINUE LOOPING #
BEGIN
FOUND = FALSE;
END
ELSE # FOUND DATA MSG TO DELIVER #
BEGIN
CONTROL IFEQ DEBUG,1;
PNVALUE[0] = ACBAN[0]; # APPL. NUMBER #
BGETW[BGETP] = PNWORD[0] ;
BGETP = BGETP + 1 ;
IF BGETP GR 999
THEN
BEGIN
BGETP = 0;
END
P<TRAP> = NEXT;
FOR TRAPINDEX = 0 STEP 1 UNTIL SIZE
DO
BEGIN
BGETW[BGETP] = WORD[TRAPINDEX] ;
BGETP = BGETP + 1;
IF BGETP GR 999
THEN
BEGIN
BGETP = 0;
END
END
CONTROL FI;
NDEL = NDEL + 1;
NWDS = NWDS + SIZE; # NO OF WORDS TO WRITE BACK #
NEXT = NEXT + SIZE; # ADDR OF NEXT FREE WORD IN BUFFER #
BUFSIZE = BUFSIZE - SIZE; # REMAINING SIZE OF BUFFER #
END
END
IF NWDS NQ 0
THEN # DATA MESSAGES TO WRITE BACK TO APP BUF #
BEGIN
#
CREATE SCP FUNCTION LIST TO WRITE MSGS BUFFER TO UCP FL
#
FLWFP[0] = NWDS; # NO OF WORDS TO WRITE TO UCP FL #
FLWJSNWD[0] = ACBJNWD[0]; # JOB ID WORD #
IF NWDS GR 64
THEN # SCP WRITE FUNCTION USED TO WRITE MSGS #
BEGIN
FLSIZ = FLXSIZE; # SIZE OF SCP FUNCTION REQUEST #
FLWXUCPA[0] = GETMMTA[0]; # AIP GETMM BUF ADDRESS #
FLWXSCPA[0] = BUFADDR + BLKHSIZE; # ADDR OF FIRST SUP MSG#
FLWFC[0] = SFXWRT;
END
ELSE # SCP EXTENDED WRITE FUNCTION MUST BE USED#
BEGIN
FLSIZ = FLSIZE; # SIZE OF SCP FUNCTION REQUEST #
FLWUCPA[0] = GETMMTA[0]; # AIP GETMM BUF ADDRESS #
FLWSCPA[0] = BUFADDR + BLKHSIZE; # ADDR OF FIRST SUP MSG #
FLWFC[0] = SFWRITE;
END
HWRTDA(FLW,FLSIZ,BUFADDR);
END
ELSE # NO DATA MESSAGES TO WRITE TO APP FL #
BEGIN
MRELS(BUFADDR); # RELEASE GETMM BUFFER #
DONE = TRUE;
END
END # BUFFER SIZE IS NOT ZERO #
ELSE
BEGIN
DONE = TRUE; # SET FUNCTION-COMPLETED FLAG #
END
END
#
FILL AWL NETGETMM ENTRY
#
GETMMND[0] = NDEL; # NO OF DATA MSGS WRITTEN TO UCP FL #
GETMMCB[0] = 1; # SET WORKLIST ENTRY COMPLETION BIT #
GETMMNW[0] = NWDS; # NO OF WDS WRITTEN TO AIP SUP MSG BUF #
GETMMALN[0] = ACNALN ;
RETURN;
END
TERM