*DECK KHOPDIS USETEXT NIPDEF USETEXT DRHDR USETEXT KINITBF USETEXT ACB USETEXT KDIS USETEXT DISTAIL USETEXT SUPMSG USETEXT OVERLAY USETEXT PARAMS USETEXT APPSTAT USETEXT NWLNTRY PRGM KHOPDIS; STARTIMS; # *1DC KHOPDIS * * 1. PROC NAME AUTHOR DATE * KHOPDIS A. BEN-ARTZI 81/12/08 * * 2. FUNCTIONAL DESCRIPTION * * PUT HOP/DIS MESSAGES ON K-DISPLAY SCREEN * * 3. METHOD USED * DECODE OUT THE DIS MESSAGE FROM NWL. * RELEASE USED PORTION OF NWL. * CHAIN BUFFER WITH K-DISPLAY DATA RING, AND * RELEASE SAME NUMBER OF LINES FROM TOP OF RING. * * 4. ENTRY PARAMETERS. * * WLADDR * * 5. EXIT PARAMETERS * * PARAMS1 - ERROR CODE (IF ANY) * * 6. COMDECKS CALLED AND SYMPL TEXT USED * * NIPDEF KDIS DISTAIL * SUPMSG APPSTAT NWLNTRY * DRHDR KINITBF PARAMS * * 7. ROUTINES AND OVRLAYS CALLED * * XTRACE - TRACE PROCEDURE CALL * MRELS - RELEASE BUFFER SPACE * HRELPWL - RELEASE USED PORTION OF WORKLIST * * * * * 8. DAYFILE MESSAGES * * THIS PROGRAM IS A SECONDARY OVERLAY LOADED BY * SUBROUTINE OVLCALL. WHEN EXECUTION HAS COMPLETED, * A JUMP IS MADE TO LOCATION RJMAIN TO RETURN TO * THE CALLING PROGRAM. * * W A R N I N G - THIS PROGRAM CANNOT EXCEED THE SECONDARY *CALL OSSIZE * * THIS OVERLAY IS CALLED BY HPKDISP * # STOPIMS; # EXTERNAL REFERENCES # XREF BEGIN LABEL RJMAIN; # RETURN ADDRESS IN OVLCALL # PROC XTRACE; PROC MRELS; PROC HRELPWL; END # INTERNAL VARIABLES # ITEM ENDLOOP I=0 ; ITEM KLINES I=0 ; # NUMBER OF LINES IN HOP/DIS RECEIVED # ITEM KINDEX I=0; # LOCAL LOOP COUNTER # ITEM KCOUNT I=0; # LOCAL COUNTER # ITEM KDONE B ; # AND OF RELEASE LOOP CHECK # ITEM K2 I=0; # NO OF DOWN LINES KDISTOP SHOULD MOVE # ITEM KBACK U ; # ADDRESS OF FORMER BLOCK IN RING # ITEM KREL U ; # ADDRESS OF BUFFER TO BE RELEASED # BASED ARRAY HOPLN [1:1] S(1) ; BEGIN ITEM HOPENDL U(0,48,12) ; ITEM HOPSTRL U(0,0,12) ; ITEM HOPWRDL U(0,0,60) ; END BEGIN CONTROL IFEQ DEBUG,1; XTRACE("KHOPD"); CONTROL FI; #**********************************************************************# PARAMS1 = 0 ; # FIRST PUT THE TABLETS # P = WLADDR; P = WLADDR + AIPHSIZE + ABHSIZE; P = P + 1 ; IF HOPI[0] THEN # WE CAN ENABLE INPUT TO APPLICATION # BEGIN KDNI[0]=FALSE; KDBK[0]=FALSE; END # # P = WLADDR + BLKBS[0]-1; # TABLET ON LAST WORD OF BUFFR# IF P LS P THEN # NO DATA AT ALL. EVEN A ZERO WORD # GOTO ERRX ; IF HOPSCR THEN BEGIN K7777[0] = 0; KDSTAIL[0] = 0; # END OF RIGHT DISPLAY # END ELSE BEGIN K7777[0] = O"7777"; KDSTAIL[0] = LOC(KDTLNAM[0])+1;# AND POINT TO NEXT DATA(TAIL) # END # SCAN ALL MESSAGE TO SEE HOW MANY LINES WE GOT (BYTE 4=BINARY 0 # KLINES = 0 ; ENDLOOP = BLKBS[0] - AIPHSIZE - ABHSIZE - KHDRSIZE - 1 ; IF ENDLOOP EQ 0 THEN # EMPTY HOPDIS # GOTO KEXIT ; IF HOPWRDL[1] EQ 0 THEN # TERMINATOR WITHOUT TEXT # GOTO ERRX ; FOR KINDEX=1 STEP 1 UNTIL ENDLOOP DO BEGIN IF HOPSTRL[KINDEX] EQ 0 AND HOPWRDL[KINDEX] NQ 0 THEN GOTO ERRX ; IF HOPENDL[KINDEX] EQ 0 THEN BEGIN KLINES = KLINES+1; IF (HOPWRDL[KINDEX+1] EQ 0) AND (KINDEX NQ ENDLOOP) THEN # DSD MAY GET CONFUSED # GOTO ERRX ; END END BLKID[0] = KDISIDVALUE; # THEN MAKE IT A K TYPE BLOCK # P = WLADDR+BLKHSIZE ; KDTYPE[0] = KDISTYPE ; IF HOPSCR THEN BEGIN IF KDRFP[0] NQ 0 THEN # PREVIOUS RIGHT SCREEN BUFFER EXISTS # BEGIN MRELS(KDRFP[0]); # RELEASE PREVIOUS RIGHT SCREEN BUFFER # END HRELPWL; # RELEASE FIRST PART OF NWL # BACKPTR[0] = LOC(KDRBP[0]); # CHAIN BUF INTO RIGHT SCRN CHAIN # KDRBP[0] = WLADDR; NEXTPTR[0] = LOC(KDRFP[0]); KDRFP[0] = WLADDR; KDRSTOP[0] = WLADDR+3; # POINT TO FIRST DISPLAY WORD # GOTO RJMAIN; END # NOW WE UPDATE DATA AND POINTERS IN THE BLOCK WE JUST GOT # BACKPTR[0] = KDBP[0]; # FIRST PUT INTO K RING # NEXTPTR[0] = LOC(KDFP[0]); # NOW UPDATE THE LAST BLOCK (TO BE CHAINED TO NEW ONE) # P = KDBP[0]; # HERE IT IS # # # NEXTPTR[0] = WLADDR; # # P = KDBP[0]+BLKBS[0]-1; # PUT TABLET ON LAST WORD OF BLK# KDSTAIL[0] = P ; # AND POINT TO NEW DATA # # FINALLY SHOW THE CHAIN BOTTOM MOVE ON THE KDIS COMMON # KDBP[0] = WLADDR; # AND RELEASE USED PORTION ON NWL # HRELPWL; # NOW WE MOVE KDISTOP POINTER DOWN,SAME LINES AS NEWLY CAME # KCOUNT=0; K2 =0; KDONE = FALSE ; P = KDLSTOP[0]; # START COUNTING FROM CURRENT LOCATION # # # FOR KINDEX =0 WHILE NOT KDONE DO BEGIN # # IF K7777[KCOUNT] EQ O"7777" # THIS IS NOT A DATA LINE # THEN BEGIN # JUMP TO NEXT BLOCK TO CONTINUE SEARCH.RELEASE THIS ONE # # # KDLSTOP[0] = KDSTAIL[KCOUNT]; P = KDLSTOP[0]; KCOUNT = 0; # AND RELEASE THE ONE JSUT PASSED # P = KDFP[0]; KBACK = BACKPTR[0] ; KDFP[0]=NEXTPTR[0] ; IF KDORIG[0] THEN BEGIN # THIS IS OUR FIRST AND SPECIAL BUFFER # BACKPTR[0] = LOC(KORIGBP[0]) ; # SO WE SAVE IT # NEXTPTR[0] = BACKPTR[0] ; BLKID [0] = DRIDVALUE ; KORIGBP[0] = P ; # SAVE ADDRESS IN COMMON # KORIGFP[0] = P ; END ELSE KREL = P ; P = KDFP[0]; BACKPTR[0] = KBACK; # AND RELEASE IT (IF IT IS NOT THE ORIGINAL) # IF KDORIG[0] THEN KDORIG[0] = FALSE ; ELSE MRELS(KREL) ; END # # ELSE # THIS IS A REGULAR DATA LINE IN PREVIOUS MESSAGE # BEGIN IF K2 EQ KLINES THEN KDONE = TRUE ; # WE ADVANCED EXACTLLY ENOUGH LINES # ELSE BEGIN IF K312[KCOUNT] EQ 0 THEN K2=K2+1; # ZERO BYTE,MEANS WE GOT ONE MORE LINE IN HAND # # AND INCREMENT THE WORDS COUNTER IN BOTH CASES # KCOUNT = KCOUNT + 1 ; END END END # NOW KCOUNT HAS NUMBER OF WORDS (IN JUST THE UPMOST BLOCK) THAT THE DATA POINTER(KDISTOP) SHOULD BE MOVED # KDLSTOP[0] = KDLSTOP[0] + KCOUNT ; GOTO RJMAIN; # RETURN TO CALLING ROUTINE # ERRX: PARAMS1 = RLG"ISM" ; KEXIT: GOTO RJMAIN ; END TERM