// DATE 080222
// NOHALT
*
*** RUN MAINT.
*
// LOAD $MAINT,F1
// RUN
// COPY FROM-READER,TO-F1,RETAIN-R,LIBRARY-S,NAME-$DLPR
       MACRO
       $DLPR
.*
.*     5703-XM1 LIST OUTPUT INTERFACE SUBROUTINE
.*
       TEXT
       TITLE 'DLPRNT -- LIST OUTPUT INTERFACE'
***********************************************************************
* 5703-XM1      COPYRIGHT IBM CORP. 1970                              *
*               REFER TO INSTRUCTIONS ON COPYRIGHT NOTICE, 120-2083   *
*                                                                     *
***********************************************************************
*STATUS                                                               *
*   VERSION 1 MODIFICATION 0                                          *
*                                                                     *
*FUNCTION                                                             *
*   * DLPRNT PROVIDES FOR DEVICE INDEPENDENCE FOR OUTPUT FROM         *
*     LIST ORIENTED PROGRAMS.                                         *
*   * FOR CRT OUTPUT, ROLL SPEED AND POP FEATURES ARE SUPPORTED.      *
*     IN ADDITION DLPRNT WILL FLASH COMMAND LIGHT 13 WHEN IN          *
*     STOP MODE.                                                      *
*   * IF A 50LMP MATRIX PRINTER IS TO BE USED, ALL PRINTED LINES      *
*     ARE ANALYZED FOR LENGTH TO PROVIDE MAXIMUM LINE THROUGHPUT.     *
*     THIS IS DONE BY PRINTING RIGHT ONLY AS FAR AS REQUIRED TO       *
*     PRINT THE NEXT LINE FROM RIGHT TO LEFT.  THE 50LMP I/O          *
*     INTERFACE IS SUPPLIED BY DLPRNT.                                *
*   * OUTPUT MAY BE DIRECTED TO THE CRT, THE MATRIX PRINTER, OR       *
*     THE CURRENT SYSTEM OUTPUT DEVICE(S).                            *
*                                                                     *
*ENTRY POINTS                                                         *
*   DLPRNT HAS ONE ENTRY POINT.  THIS ENTRY POINT IS USED WHEN A      *
*   LINE IS TO BE PRINTED FOLLOWED BY A NORMAL CARRIER RETURN.        *
*   THE CALLING SEQUENCE IS:                                          *
*                                                                     *
*        B     DLPRNT                                                 *
*        DC    AL2(PPLA)                                              *
*   WHERE PPLA IS A TWO BYTE ADDRESS OF THE LEFT BYTE OF A PRINT      *
*   PARAMETER LIST.                                                   *
*                                                                     *
*INPUT                                                                *
*   * BEFORE USING DLPRNT THE ONE BYTE INDICATOR, DLPTYP, MUST        *
*     BE SET TO INDICATE WHICH DEVICE IS TO BE USED FOR OUTPUT.       *
*     THE CORRESPONDING VALUES AND THEIR FUNCTION FOLLOWS:            *
*        DLPMPR - MATRIX PRINTER IS TO BE USED FOR OUTPUT.            *
*        DLPCRT - THE DISPLAY STATION IS TO BE USED FOR OUTPUT.       *
*                 ROLL SPEED AND POP FUNCTIONS WILL BE CONTROLED.     *
*        DLPSPT - THE SYSTEM PRINTER(S) IS TO OE USED FOR OUTPUT.     *
*                 THIS IS THE DEFAULT VALUE.                          *
*   * A 244 BYTE BUFFER MUST BE ALLOCATED FOR DLPRNTS USE STARTING    *
*     AT LOCATION DLIBUF.                                             *
*   * A FOUR BYTE PRINT PARAMETER LIST (PPL) MUST BE PASSED VIA       *
*     A TWO BYTE COME ADDRESS FOLLOWING THE CALL.  THIS PPL IS OF     *
*     THE SAME FORMAT AS THE PPL SENT TO DPRINT WITH THE FOLLOWING    *
*     RESTRICTIONS:                                                   *
*        *  ONLY 'PRINT AND RETURN' CONTROL CODES ARE ALLOWED FOR     *
*           PRINTING.                                                 *
*        *  WAIT FUNCTIONS SHOULD NOT BE USED EXCEPT AFTER THE LAST   *
*           LINE HAS BEEN PRINTED.  IT IS THEN REQUIRED TO TERMINATE  *
*           DLPRNT'S FUNCTION.                                        *
*OUTPUT                                                               *
*   UPON COMPLETION THE GENERAL REGISTERS AND PPL WILL BE THE SAME    *
*   AS AT ENTRY, THE LINE TO BE PRINTED WILL BE PRINTED (OR BUFFERED  *
*   IN THE CASE OF THE LINE PRINTER).  THE CALLING PROGRAM MAY        *
*   MODIFY THE LINE UPON RETURN.                                      *
*                                                                     *
*EXTERNAL REFERENCES                                                  *
*        $PRDEV - SYSTEM PRINTER INDICATOR.                           *
*        DLIBUF - LOCATION OF BUFFER.                                 *
*        $$PLYN - ENTRY TO DSPLYN.                                    *
*        $$PRNT - ENTRY TO DPRINT.                                    *
*        $CRTIN - ROLL INDICATORS.                                    *
*        $IOIND - LINE PRINTER INDICATOR.                             *
*        $UNMSK - ENTRY TO UNMASK INQUIRY REQUEST.                    *
*        $$PSIO - LOCATION OF CONTROL BYTE IN DPRINT SIG.             *
*        $$PCNT - LOCATION OF COUNT BYTE IN DPRINT I/O LIST.          *
*                                                                     *
*EXITS, NORMAL                                                        *
*   EXIT IS TO THE CALLING PROGRAM FOLLOWING THE PPL ADDRESS.         *
*                                                                     *
*EXITS, ERROR                                                         *
*   N/A                                                               *
*                                                                     *
*TABLES/WORK AREAS                                                    *
*   N/A                                                               *
*                                                                     *
*ATTRIBUTES                                                           *
*   RELOCATABLE                                                       *
*   REUSABLE                                                          *
*                                                                     *
*CHARACTER CODE DEPENDENCY                                            *
*   N/A                                                               *
*                                                                     *
*NOTES                                                                *
*   ERROR PROCEDURES                                                  *
*      N/A                                                            *
*                                                                     *
*   REGISTER USAGE                                                    *
*      REGISTERS 1 AND 2 ARE USED FOR BASE ADDRESSING.                *
*                                                                     *
*   SAVED/RESTORED AREAS                                              *
*      N/A                                                            *
*                                                                     *
*   MODIFICATION CONSIDERATIONS                                       *
*      DLPRNT DIRECTLY MODIFIES DPRINT WHEN USING THE LINE PRINTER    *
*      FUNCTION.  CARE MUST BE TAKEN WHEN MODIFING EITHER DLPRNT OR   *
*      DPRINT.                                                        *
*                                                                     *
*   REQUIRED MODULES                                                  *
*        @SYSEQ - GENERAL SYSTEM EQUATES                              *
*        @FXDEQ - NUCLEUS LOCATION EQUATES                            *
*        @HDWEQ - HARDWARE VALUE EQUATES                              *
*        @CANEQ - TRANSCIENT LOCATION EQUATES                         *
*                                                                     *
*   OTHER                                                             *
*      N/A                                                            *
***********************************************************************
       EJECT
       USING DLPBSE,@BR                BASE SPECIFICATION
DLPRNT EQU   *                         ENTRY
       ST    DLP480+@OP1,@BR           SAVE BR
       LA    DLPBSE,@BR                LOAD BASE REG
       ST    DLP500+@OP1(,@BR),@XR     SAVE XR
       A     DLPONE(,@BR),@ARR         CALCULATE PPL ADDR POINTER
       ST    DLP100+@OP1,@ARR          GET PARM ADDR
       A     DLPONE(,@BR),@ARR         CALCULATE RETURN ADDR
       ST    DLP520+@OP1(,@BR),@ARR    SAVE RETURN ADDR
DLP100 L     *-*,@XR                   XR POINTS TO PPL
       MVC   DLPWK2+@PDATA(@PPLNG,@BR),@PDATA(,@XR)  MOVE IN PPL
       MVI   DLPEXT-1(,@BR),X'20'      INITIALIZE DSPLYN ADDR     *****
       ALC   DLPEXT-1(1,@BR),$EXFTR    GET DSPLYN ADDR
       J     *-*                       GO TO CORRECT INTERFACE
DLPTYP EQU   *-1                       I/O DEVICE INDR LOCATION
       ORG   DLPTYP                    SET INSTR CNTR
       DC    AL1(DLPSPT)               SET DEFAULT TO SYSTEM PRINTER
DLPBSD EQU   *                         DISPLACEMENT BASE
**
DLPSPI EQU   *                         SYSTEM PRINTER INTERFACE
       CLI   $PRDEV-1,X'07'            SYSPRINT = MATRIX PRINT    *****
       JE    DLPNPT                    DO LIME PRINTER INTERFACE
       MVC   DLP120+@OP1(@CADDR,@BR),DLPEXT(,@BR)  GET DSPLYN ADDR
DLP120 B     *-*                       GO TO DSPLYN
       DC    AL2(DLPWK2)               PPL ADDRESS
       CLI   $PRDEV,X'00'              IS PRINTER REQUIRED TOO    *****
       JE    DLPNPT                    DO LINE PRINTER INTERFACE
       J     DLP480                    EXIT INTERFACE
DLPBSE EQU   DLP120+@OP1               BASE ADDRESS
       EJECT
DLPTIF EQU   *                         ENTRY
       B     *-*                       GO TO DSPLYN
       ORG   *-2                       INITIALIZE ADDR
DLPEXT DC    AL2($$PLYN)               DSPLYN ENTRY ADDR
       DC    AL2(DLPWK2)               PPL ADDRESS
       CLI   DLPWK2+@PCTRL(,@BR),@PWAIT  WAIT FUNCTION ?
       JE    DLP360                    GO TURN OFF CMD LIGHTS
DLP140 LIO   DLPK13(,@BR),@KEYBD+@CMLON  TURN ON CMD LITE 13
       TBN   $CRTIN,$CRTSP             IN STOP MODE?
       JF    DLP240                    NO ? CONTINUE ROLL
DLP160 JC    DLP180,@NOP               JUMP IF LIGHT ON
       LIO   DLPK13(,@BR),@KEYBD+@CMOFF  TURN POP LITE OFF
       MVI   DLP160+@Q(,@BR),@UCB      SET FOR TURN ON
       J     DLP200                    GO DO TIME OUT
DLP180 MVI   DLP160+@Q(,@BR),@NOP      SET TO TURN OFF
DLP200 MVC   DLPLPC(2,@BR),DLPLIN(,@BR)  SET UP TIME COUNT
DLP220 SLC   DLPLPC(2,@BR),DLPONE(,@BR)  DECREMENT TIME COUNT
       BH    DLP220(,@BR)              LOOP UNTIL TIME OUT
       B     DLP140(,@BR)              GO TEST STOP MODE
DLP240 TBN   $CRTIN,$CRTPU             POP UP INDR ON ?
       JF    DLP260                    SKIP LINE CNT INITIALIZATION
       SBF   $CRTIN,$CRTPU             SET POP INDR OFF
       MVI   DLPCNT(,@BR),@ZERO        ZERO LINES DISPLAYED CNT
DLP260 CLI   DLPCNT(,@BR),DLPMAX       HAVE MAX NO. OF LINES BEEN ?
*                                      * DISPLAYED ?
       JNE   DLP280                    JUMP IF NOT
       SBN   $CRTIN,$CRTSP             SET ROLL STOP INDR
DLP280 JNH   DLP320                    JUMP IF MAX LINES NOT DISPLAYED
       MVC   DLPLPC(2,@BR),DLPLIN(,@BR)  SET UP TIMING LOOP
DLP300 SLC   DLPLPC(2,@BR),DLPONE(,@BR)  DECREMENT COUNT
       BH    DLP300(,@BR)              BRANCH IF TIME NOT UP
       J     DLP340                    GO EXIT
DLP320 ALC   DLPCNT(1,@BR),DLPONE(,@BR)  BUMP LINE COUNT
DLP340 J     DLP480                    GO EXIT
DLP360 B     $$COFF                    TURN OFF CMD LIGHTS
       J     DLP480                    GO EXIT
       EJECT
DLPNPT EQU   *                         ENTRY
       TBN   $IOIND,$LNPTR             LINE PRINTER AVAILABLE
       JT    DLP400                    JUMP IF YES
DLP380 B     $$PRNT                    DO NORMAL PRINT IF NOT
       DC    AL2(DLPWK2)               PPL ADDR
       B     $$PRNT                    WAIT FOR OP COMPLETION
       DC    AL2($WAITF)               WAIT PPL ADDRESS
       J     DLP480                    GO EXIT
DLP400 CLI   DLPWK2+@PCTRL(,@BR),@PWAIT  IS THIS A WAIT FUNCTION ?
       JNE   DLP420                    JUMP IF NO
       MVI   DLPWK2+@PRCNT(,@BR),@ZERO   ZERO NEXT LINE CNT
DLP420 CLI   DLPWK1(,@BR),@PWAIT       IS THERE A LINE TO PRINT ?
       JNE   DLPPRT                    JUMP IF YES
       B     $$PRNT                    INSURE PRINT HEAD IS AT LEFT
       DC    AL2(DLPRTN)               * MARGIN
DLP440 MVC   DLPWK1+@PRCNT(2,@BR),DLPWK2+@PRCNT(,@BR)  SET NEXT PPL
       MVC   DLPWK2+@PRCNT(2,@BR),DLPRTN+@PRCNT(,@BR)  SET CARRIER RTN
       CLI   DLPWK1(,@BR),@PWAIT       WAS THIS A WAIT FUNCTION ?
       BE    DLP380(,@BR)              DO CARRIER RETURN IF YES
       LA    DLIBUF,@XR                POINT XR TO BUFFER
       MVI   DLPBLN-1(,@XR),@BLANK     SET BLANK FOR CLEAR BUF
       MVC   DLPBLN-2(DLPBLN-1,@XR),DLPBLN-1(,@XR)   CLEAR BUF TO BLNKS
       MVC   DLP460+@DD2(1,@BR),DLPWK1+@PRCNT(,@BR)  SET DATA CNT
       SLC   DLP460+@DD2(1,@BR),DLPONE(,@BR)  GET TRUE DISPLACMENT
       MVC   DLP460+@D1(2,@BR),DLP460+@DD2(,@BR) SET 0 AND DI VALUES
       L     DLPWK2+@PDATA(,@BR),@BR   BR POINTS TO DATA
DLP460 MVC   *-*(@VQ,@XR),*-*(,@BR)    MOVE DATA TO BUFFER
*
DLP480 LA    *-*,@BR                   RESTORE BR
DLP500 LA    *-*,@XR                   RESTORE XR
       B     $UNMSK                    GO CHECK FOR INQUIRY REQUEST
DLP520 B     *-*                       RETURN
       EJECT
***********************************************************************
* CONSTANTS, WORK AREAS AND EQUATES
***********************************************************************
*
DLPMPR EQU   DLPNPT-DLPBSD             MATRIX PRINTER INDR VALUE
DLPSPT EQU   DLPSPI-DLPBSD             SYSTEM PRINTER INDR VALUE
DLPCRT EQU   DLPTIF-DLPBSD             CRT INOR VALUE
DCRCNT DS    CL1                       DISPLAYED LINE CNTR
DLPCNT EQU   DCRCNT                    COMMUNICATIONS LABEL
       ORG   DLPCNT                    SET INST CNTR
       DC    XL1'01'                   INITIAL VALUE
DLPLPC DS    CL2                       TIMING LOOP CNTR
DLPLIN DC    XL1'3B'                   INITIAL LOOP CNT
DLPK13 DC    AL1(@CKY13)               CMD LIGHT 13 CONTROL
DLPMAX EQU   13                        MAX LINES TO BE DISPLAYED
DLPWK1 EQU   *                         CURRENT PPL
       DC    2XL1'FF'                  CTRL AND DATA CNT
       DC    AL2(DLIBUF)               BUFFER ADDR
DLPWK2 EQU   *                         NEXT PPL
       DS    CL(@PPLNG)
DLPNDX DC    AL1(@INDEX)               INDEX PPL
DLPONE DC    XL2'0001'                 CONSTANT OF ONE
DLPRES DS    CL1                       RESIDUAL CNT
DLPWTH DC    XL2'00'                   WIDTH OF PRINT LINE
DLPNXT DS    CL1                       NEXT LINE CNT
DLPREM DS    CL1                       ADDITIONAL CNT FOR NEXT LINE
DLPRTN EQU   *                         ADDR OF RETURN PPL
       DC    2AL1(@RETRN)              RETURN CARRIER PPL
DLPPNT EQU   X'01'                     LINE PRINTER CONTROL BYTE
       EJECT
***********************************************************************
* THIS ROUTINE PRINTS THE CURRENT LINE IN THE CORRECT DIRECTION AND
* SETS UP THE NEXT LINE CNT.
***********************************************************************
       USING DLPBS2,@BR                NEW BASE VALUE
DLPPRT EQU   *                         ENTRY TO PRINT
       LA    DLPBS2,@BR                LOAD BASE REGISTER
       B     $$PRNT                    WAIT FOR PRINTER READY
       DC    AL2($WAITF)               WAIT PPL
       MVI   $CIMSK,@NOP               MASK IR FOR THIS FUNCTION
       MVC   DLPWTH(1,@BR),$RMRGN      SET RIGHT MARGIN VALUE
       SLC   DLPWTH(1,@BR),$LMRGN      CALCULATE WIDTH
       MVC   DLPNXT(1,@BR),DLPWK2+@PRCNT(,@BR)  SET NEXT LINE CNT
       MVI   DLPRES(,@BR),@ZERO        ZERO RESIDUAL CNT
       CLC   DLPWK1+@PRCNT(1,@BR),DLPWTH(,@BR)  CNT > WIDTH ?
       JNH   DLP540                    JUMP IF NO
       MVC   DLPRES(1,@BR),DLPWK1+@PRCNT(,@BR)  SAVE CNT
       SLC   DLPRES(1,@BR),DLPWTH(,@BR)  CALCULATE RESIDUAL CNT
       MVC   DLPWK1+@PRCNT(1,@BR),DLPRES(,@BR)  SET CNT TO WIDTH
       MVC   DLPNXT(1,@BR),DLPRES(,@BR)  SET NEXT LINE CNT = RESIDUAL
DLP540 CLC   $LMRGN(1),$PRPOS          ARE WE AT LEFT MARGIN ?
       JNE   DLPPRL                    JUMP TO PRINT LEFT IF NOT
*
* SET UP FOR PRINT RIGHT OPERATION
*
       CLC   DLPWK1+@PRCNT(1,@BR),DLPNXT(,@BR)  CNT > NEXT CNT ?
       JNL   DLP560                    JUMP IF CURRENT CNT > NEXT CNT
*                                      * NEXT LINE
       MVC   DLPWK1+@PRCNT(1,@BR),DLPWTH(,@BR)  SET CURRENT CNT TO MAX
       CLC   DLPNXT(1,@BR),DLPWTH(,@BR)  NEXT LINE LESS THAN WIDTH ?
       JNL   DLP560                    JUMP IF NOT
       MVC   DLPWK1+@PRCNT(1,@BR),DLPNXT(,@BR)  SET CURRENT CNT TO
*                                      * NEXT LINE CNT
       J     DLP560                    GO DO PRINTING
*
* SET UP FOR PRINT LEFT OPERATION
*
DLPPRL EQU   *                         ENTRY TO PRINT LEFT
       MVI   $$PSIO,DLPPNT             SET DPRINT FOR LINE MODE
       MVC   DLPWK1+@PRCNT(1,@BR),$PRPOS  SET CURRENT PRINT POSITION
       SLC   DLPWK1+@PRCNT(1,@BR),$LMRGN  GET RETURN PRINT CNT
       SLC   DLPWK1+@PRCNT(1,@BR),DLPONE(,@BR)  SET UP FOR HARDWARE
*
* DO THE PRINT OPERATION
*
DLP560 MVI   DLPWK1+@PCTRL(,@BR),@PRINT  SET NO CARRIER RETURN
*                                      * PRINT LENGTH = WIDTH
       B     $$PRNT                    GO PRINT THE LINE
       DC    AL2(DLPWK1)               PPL ADDR
       MVI   $$PSIO,@ZERO              RESET SIO CTRL FOR NORMAL OPS
       MVI   $$PCNT,@ZERO              SET DPRINT PPL CNT ZERO
       B     $$PRNT                    INDEX A LINE
       DC    AL2(DLPNDX)               INDEX PPL ADDRESS
       USING DLPBSE,@BR                USE MAINLINE BASE VALUE
       LA    DLPBSE,@BR                RESTORE MAINLINE BR
       CLI   DLPRES(,@BR),@ZERO        ANY RESIDUAL DATA ?
       BE    DLP440(,@BR)              EXIT TO MAINLINE IF NOT
*
       USING DLPBS2,@BR                USE PRINT BASE ADDR
       LA    DLPBS2,@BR                SET BR
       MVI   DLPREM(,@BR),DLPBLN       SET REMAINDER TO BUF LENGTH
       SLC   DLPREM(1,@BR),DLPRES(,@BR)  GET REMAINDER FOR BLANK CNT
       LA    DLIBUF,@XR                XR POINTS TO BUFFER
       ST    DLP580+@DOP2(,@BR),@XR    SET MOVE INSTR TO BUF ADDR
       ALC   DLP580+@DOP2(@CADDR,@BR),DLPWTH(,@BR)  POINT TO RESIDUAL
DLP580 MVC   0(1,@XR),*-*              MOVE A BYTE OF RESIDUAL DATA
       LA    1(,@XR),@XR               INCREMENT DATA POINTER
       ALC   DLP580+@DOP2(@CADDR,@BR),DLPONE(,@BR) INCREMENT DATA ADDR
       SLC   DLPRES(1,@BR),DLPONE(,@BR)  DECREMENT RESIDUAL CNT
       BH    DLP580(,@BR)              DO IT AGAIN TILL DONE
DLP600 MVI   0(,@XR),@BLANK            SET REMAINING BLANKS
       LA    1(,@XR),@XR               INCREMENT
       SLC   DLPREM(1,@BR),DLPONE(,@BR)  REMAINDER ?
       BH    DLP600(,@BR)              SET ANOTHER BLANK
       MVC   DLPWK1+@PRCNT(1,@BR),DLPNXT(,@BR)  SET NEXT CNT
       B     DLPPRT(,@BR)              GO FINISH LINE
       SPACE
DLPBS2 EQU   DLPWK1                    BASE VALUE FOR PRINT OP
DLPBLN EQU   244                       LENGTH OF PRINT BUFFER
***                       END OF DLPRNT                             ***
       MEND
// CEND
// END
*
// READER CONSOLE
