// DATE 250520
// NOHALT
*
*** RUN MAINT.
*
// LOAD $MAINT,F1
// RUN
// COPY FROM-READER,TO-F1,RETAIN-R,LIBRARY-S,NAME-$DL4P
       MACRO
       $DL4P
.*
.*     5703-XM1 LOGICAL IOCR ROUTINE
.*
       TEXT
       TITLE 'DL4ICS - FOUR TRACK LOGICAL IOCR'
***********************************************************************
* 5703-XM1  COPYRIGHT IBM CORP. 1970                                  *
*           REFER TO INSTRUCTIONS ON COPYRIGHT NOTICE, 120-2083       *
*                                                                     *
***********************************************************************
*STATUS                                                               *
*   VERSION 1 MODIFICATION 0                                          *
*                                                                     *
*FUNCTION                                                             *
*   * DL4ICS WILL CONVERT A RELATIVE DISK ADDRESS TO A PHYSICAL       *
*     DISK ADDRESS AND CALL $DISKN TO PERFORM THE SPECIFIED FUNCTION  *
*   * THE DISK ADDRESS IS A ONE BYTE CYLINDER ADDRESS AND A ONE BYTE  *
*     SECTOR DISPLACEMENT RELATIVE TO SECTOR 0 ON A CYLINDER          *
*     BOUNDARY                                                        *
*   * WHEN MORE THAN 1 SECTOR IS PROCESSED, DL4ICS WILL MAKE MULTIPLE *
*     CALLS TO $DISKN TO CROSS CYLINDER BOUNDARIES IF REQUIRED.       *
*   * IF 1 SECTOR ONLY IS TO BE PROCESSED, THE USER MAY OVERLAY THE   *
*     UNUSED CODE BY ORGING HIS NEXT MODULE AT DL4SPT                 *
*                                                                     *
*ENTRY POINTS                                                         *
*     DL4ICS - ENTRY TO PROCESS A 4 SURFACE FILE. THE CALLING         *
*              SEQUENCE IS AS FOLLOWS                                 *
*                  DSKL4  DPL                                         *
*              WHERE DPL IS THE LABEL OF A SIX BYTE DISK PARAMETER    *
*              LIST AS DESCRIBED FOR $DISKN EXCEPT FOR THE SECTOR     *
*              ADDRESS BYTE.                                          *
*                                                                     *
*INPUT                                                                *
*   * INPUT TO DL4ICS IS THE ADDRESS OF THE DPL TO BE PROCESSED.      *
*                                                                     *
*OUTPUT                                                               *
*   * N/A                                                             *
*                                                                     *
*EXTERNAL REFENECES                                                   *
*     $DISKN - ENTRY TO SYSTEM DISK ROUTINE                           *
*                                                                     *
*EXITS, NORMAL                                                        *
*   * NORMAL RETURN IS TO THE 1ST INSTRUCTION FOLLOWING THE TWO BYTE  *
*     ADDRESS POINTING TO THE DPL.                                    *
*                                                                     *
*EXITS, ERROR                                                         *
*   * N/A                                                             *
*                                                                     *
*TABLES/WORK AREAS                                                    *
*   * N/A                                                             *
*                                                                     *
*ATTRIBUTES                                                           *
*   * RELOCATABLE                                                     *
*   * REUSABLE                                                        *
*                                                                     *
*CHARACTER CODE DEPENDENCY                                            *
*   * THE OPERATION OF THIS MODULE DOES NOT DEPEND UPON A PARTICULAR  *
*     INTERNAL REPRESENTATION OF THE EXTERNAL CHARACTER SET.          *
*                                                                     *
*NOTES                                                                *
*   ERROR PROCEDURES                                                  *
*      N/A                                                            *
*                                                                     *
*   REGISTER USAGE                                                    *
*      @BR IS SAVED AND RESTORED ON EXIT, @XR IS NOT USED.  @ARR IS   *
*      USED TO PROVIDE THE ADDRESS OF THE PARAMETER.  THE @ARR IS     *
*      INCREMENTED BT TWO AND SAVED AS THE RETURN ADDRESS.            *
*                                                                     *
*   SAVED/RESTORED AREAS                                              *
*      N/A                                                            *
*                                                                     *
*   MODIFICATION CONSIDERATIONS                                       *
*      N/A                                                            *
*                                                                     *
*   REQUIRED MODULES                                                  *
*      @SYSEQ - SYSTEM SOFTWARE EQUATES                               *
*      @FXDEQ - SYSTEM NUCLEUS EQUATES                                *
*                                                                     *
*   OTHER                                                             *
*      NONE                                                           *
***********************************************************************
       EJECT
DL4ICS EQU   *                         ENTRY TO DL4ICS
       USING DL4010,@BR                ESTABLISH BASE REGISTER USAGE
       ST    DL4900+@OP1,@BR           SAVE BASE REGISTER FOR EXIT
DL4010 EQU   *                         BASE ADDRESSABILITY
       LA    DL4010,@BR                ESTABLISH BASE
       A     DL4C01(,@BR),@ARR         BUMP TO HIGH END OF ADDR
       ST    DL4020+@DOP2(,@BR),@ARR   SET UP MOVE INSTRUCTION
       A     DL4C01(,@BR),@ARR         BUMP TO RETURN ADDR
       ST    DL4920+@OP1(,@BR),@ARR    SAVE RETURN ADDR
*
DL4020 MVC   DL4030+@DOP2(@DADDR,@BR),*-* MOVE DPL ADDR INTO MOVE
       ALC   DL4030+@DOP2(@CADDR,@BR),DL4C05(,@BR)  BUMP TO RIGHT END
DL4030 MVC   DL4DPL(@DPLNG,@BR),*-*    MOVE USER DPL TO WORK AREA
*
DL4035 MVI   DL4100+@Q(,@BR),@ZERO     CLEAR TRACK, DISK SET INST
       MVI   DL4200+@Q(,@BR),@NOP      TURN OFF TWICE INDICATOR
*
DL4040 CLI   DL4SCD(,@BR),DL4E96       TEST IF DISPLACEMENT OVER 95 ?
       JL    DL4050                    JUMP IF NOT OVER 95
       ALC   DL4CYL(1,@BR),DL4C01(,@BR)  INCREMENT CYLINDER COUNT
       SLC   DL4SCD(1,@BR),DL4C96(,@BR)  DECREMENT DISP BY 96
       B     DL4040(,@BR)              GO BACK CHECK FOR NEXT CYLINDER
*
DL4050 CLI   DL4SCD(,@BR),DL4E48       TEST IF DISP ON NEXT DISK ?
       JL    DL4060                    JUMP IF NOT OVER 48
       SBN   DL4100+@Q(,@BR),DL4EFD    TURN ON BIT FOR FIXED DISK
       SLC   DL4SCD(1,@BR),DL4C48(,@BR)  DECREMENT DISP 1 DISK
DL4060 CLI   DL4SCT(,@BR),DL4E01       IS SECTOR COUNT GREATER THEN 1 ?
       JH    DL4SPT                    GO TO SPLIT CALL
*
DL4070 CLI   DL4SCD(,@BR),DL4E24       DISPLACEMENT OVER 23 ?
       JL    DL4080                    JUMP NOT OVER 24
*
       SBN   DL4100+@Q(,@BR),DL4ETB    SET TRACK BIT ON
       SLC   DL4SCD(1,@BR),DL4C24(,@BR)  DECR DISP TO NEXT TRACK
DL4080 ALC   DL4SCD(1,@BR),DL4SCD(,@BR)  SHIFT LEFT 1 PLACE
       ALC   DL4SCD(1,@BR),DL4SCD(,@BR)  SHIFT LEFT 1 PLACE
DL4100 SBN   DL4SCD(,@BR),*-*          SET TRACK, DISK BIT
*
       B     $DISKN                    GO PERFORM DISK I/O
       DC    AL2(DL4LST)               ADDR OF DISK PARAM LIST
*
DL4200 JC    DL4600,*-*                BRANCH OR NOP IF TWICE SET
*
DL4900 LA    *-*,@BR                   RESTORE OLD BASE TO RETURN
DL4920 B     *-*                       RETURN TO CALLER
       SPACE 1
DL4LST EQU   *                         LEFT END OF DPL
DL4DPL DS    CL(@DPLNG)                DPL SAVE AREA
DL4CYL EQU   DL4LST+@DCYL              CYLINDER COUNT BYTE
DL4SCD EQU   DL4LST+@DSAD              DISPLACEMENT SECTOR COUNT
DL4E96 EQU   96                        TWO DISK SECTOR COUNT PER CYL
DL4E48 EQU   48                        ONE DISK SECTOR COUNT PER CYL
DL4E24 EQU   24                        TRACK SECTOR COUNT
DL4E01 EQU   01                        VALUE TO TEST SECTOR COUNT
DL4EFD EQU   01                        VALUE TO SET FIXED DISK BIT
DL4ETB EQU   X'80'                     VALUE TO SET TRACK BIT
DL4C01 DC    IL2'1'                    VALUE TO INCR TO CYLINDER
DL4C05 DC    IL2'5'                    DISP TO RIGHT END OF DPL
DL4C96 EQU   DL4040+@Q                 VALUE TO DECR DISPLACEMENT
DL4C24 EQU   DL4070+@Q                 VALUE OF 1 TRACK
DL4SCT EQU   DL4LST+@DCNT              POINTER TO DPL SECTOR COUNT
DL4C48 EQU   DL4050+@Q                 VALUE TO DECR DISP BY 1 DISK
       SPACE 1
DL4500 MVC   DL4WRK(1,@BR),DL4SCT(,@BR) PICKUP SECTOR COUNT
DL4SPT EQU   DL4500                    POSSIBLE OVERLAY REFERENCE
       ALC   DL4WRK(1,@BR),DL4SCD(,@BR) BUMP BY DISPLACEMENT
       CLI   DL4WRK(,@BR),DL4E48       TEST FOR CYLINDER OVERLAP
       BNH   DL4070(,@BR)              BRANCH BACK IF NO OVERLAY
       SLC   DL4WRK(1,@BR),DL4C48(,@BR) DECREMENT WORK BY 48
       SLC   DL4SCT(1,@BR),DL4WRK(,@BR) SUBTRACT WORK FROM COUNT
       MVI   DL4200+@Q(,@BR),@UCB      SET TWICE SWITCH
       MVC   DL4SAV(1,@BR),DL4SCD(,@BR) SAVE SECTOR DISP IN WORK AREA
       TBN   DL4100+@Q(,@BR),DL4EFD    DISK BIT ON IN Q CODE ?
       BF    DL4070(,@BR)              BRANCH NOT ON
       ALC   DL4SAV(1,@BR),DL4C48(,@BR) BUMP TO NEXT DISK
       B     DL4070(,@BR)              RETURN TO CALL I/O
*
DL4600 MVC   DL4SCD(1,@BR),DL4SAV(,@BR) PICKUP NEXT HALF OF I/O
       ALC   DL4LST+@DBFR1(1,@BR),DL4SCT(,@BR)  BUMP CORE ADDRESS
       ALC   DL4SCD(1,@BR),DL4SCT(,@BR)
       MVC   DL4SCT(1,@BR),DL4WRK(,@BR) MOVE IN NEW SECTOR COUNT
       B     DL4035(,@BR)              RETURN FOR SECOND PASS
*
DL4WRK EQU   DL4020+@DOP2              1 BYTE WORK AREA FOR SPLIT CALL
DL4SAV EQU   DL4020+@DOP2-1            1 BYTE WORK AREA FOR SPLIT CALL
DL4END EQU   *                         DEFINE END OF CODE
*                       END OF DL4ICS
*** END OF EXPANSION ***
       MEND
// CEND
// END
*
// READER CONSOLE
