// DATE 250520
// NOHALT
*
*** RUN MAINT.
*
// LOAD $MAINT,F1
// RUN
// COPY FROM-READER,TO-F1,RETAIN-R,LIBRARY-S,NAME-$DL2P
       MACRO
       $DL2P
.*
.*     5703-XM1 LOGICAL IOCR ROUTINE
.*
       TEXT
       TITLE 'DL2ICS - TWO TRACK LOGICAL IOCR'
***********************************************************************
*  5703-XM1  COPYRIGHT IBM CORP 1970                                  *
*            REFER TO INSTRUCTIONS ON COPYRIGHT NOTICE. 120-2083      *
*                                                                     *
***********************************************************************
*STATUS -                                                             *
*   VERSION 1 MODIFICATION 0                                          *
*                                                                     *
*FUNCTION                                                             *
*   * DL2ICS CONVERTS A RELATIVE DISK ADDRESS TO A PHYSICAL DISK      *
*     ADDRESS AND COMBINES IT WITH A BASE ADDRESS PLACED IN DL2RAD    *
*     BY THE CALLER.                                                  *
*   * THE RELATIVE DISK ADDRESS IS A TWO BYTE CYLINDER SECTOR COUNT   *
*     IN THE CALLERS DISK PARAMETER LIST (DPL).                       *
*   * THE COUNT IS A CYLINDER SECTOR DISPLACEMENT FROM THE BASE       *
*     ADDRESS PLACED IN DL2RAD                                        *
*   * DL2ICS IS USED TO PROCESS DATA ON THE FIXED OR REMOVABLE DISK   *
*     ON EITHER DRIVE AND PROVIDES THE INTERFACE TO $DISKN.           *
*   * THE PHYSICAL DISK ADDRESS IS PLACED IN A COPY OF THE USERS DPL  *
*     IN DL2ICS AND A CALL IS MADE TO $DISKN TO PERFORM THE REQUESTED *
*     OPERATION.                                                      *
*                                                                     *
*ENTRY POINTS                                                         *
*   * THE ENTRY IS DL2ICS. THE BASE REGISTER IS SAVED AND RESTORED    *
*     ON RETURN. THE INDEX REGISTER IS NOT USED.                      *
*   * THE FORMAT OF THE CALLING SEQUENCE IS AS FOLLOWS:               *
*        B   DL2ICS                                                   *
*        DC  AL2(PARMLT)                                              *
*     WHERE PARMLT IS THE ADDR OF THE PARAMETER LIST TO BE PROCESSED. *
*                                                                     *
*INPUT                                                                *
*   * THE INPUT IS A TWO BYTE BASE DISK ADDRESS PLACED IN             *
*     DL2RAD AND A SIX BYTE DPL. THE SAME FORMAT AS THE DPL FOR       *
*     $DISKN EXCEPT FOR THE DISK ADDRESS WHICH IS A RELATIVE CYLINDER *
*     AND SECTOR DISPLACEMENT FROM THE BASE ADDRESS IN DL2RAD.        *
*                                                                     *
*OUTPUT                                                               *
*     NONE.                                                           *
*                                                                     *
*EXTERNAL REFERENCES                                                  *
*     $DISKN - ENTRY TO PHYSICAL DISK ROUTINE IS THE SYSTEM NUCLEUS.  *
*                                                                     *
*EXITS, NORMAL                                                        *
*     NORMAL - EXIT IS TO THE FIRST INSTRUCTION FOLLOWING THE POINTER *
*     TO THE DPL. THE BASE REGISTER IS RESTORED. THE RETURN ADDRESS   *
*     IS THE ADDRESS RECALL REGISTER (ARR) +2.                        *
*                                                                     *
*EXITS, ERROR                                                         *
*     NONE                                                            *
*                                                                     *
*TABLES/WORK AREAS                                                    *
*   * THE CONSTANTS AND WORK AREAS RESIDE AT THE END OF THE EXECUTABLE*
*     CODE AND ARE REFERENCED BY A DISPLACEMENT RELATIVE TO THE VALUE *
*     IN INDEX REGISTER 1 (@BR).                                      *
*   * DL2SEC AND DL2SAD ARE EQUATED TO OPERAND LOCATIONS IN THE       *
*     EXECUTABLE CODE TO ELIMINATE EXCESS WORKING STORAGE.            *
*                                                                     *
*ATTRIBUTES                                                           *
*   * DL2ICS IS 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                                                  *
*      NONE                                                           *
*                                                                     *
*   REGISTER USAGE                                                    *
*      INDEX REGISTER 1 (@BR) IS SAVED AND RESTORED. THIS REGISTER IS *
*      USED DURING EXECUTION. REGISTER 2 (@BR) IS NOT USED.           *
*                                                                     *
*   SAVED/RESTORED AREAS                                              *
*      NONE                                                           *
*                                                                     *
*   MODIFICATION CONSIDERATIONS                                       *
*      NONE                                                           *
*                                                                     *
*   REQUIRED MODULES                                                  *
*     @SYSEQ - COMMON SYSTEM EQUATES.                                 *
*     @FXDEQ - SYSTEM NUCLEUS ADDRESSES AND INDICATORS VALUES EQUATES *
*                                                                     *
*   OTHER                                                             *
*      DL2ICS MAY BE USED TO CONVERT THE DISK ADDRESS ONLY AND NOT TO *
*      CALL $DISKN IF THE USER MOVES A UCB CODE TO DL2SWH.            *
*      THIS OPTION IS NOT STANDARD USAGE.                             *
***********************************************************************
       USING DL2000,@BR                ESTABLISH ADDRESSABILITY
*
DL2E01 EQU   X'01'                     FIELD LENGTH OF 1
DL2E02 EQU   X'02'                     FIELD LENGTH OF 2
DL2E18 EQU   X'18'                     HEX TRACK SECTOR COUNT
DL2E60 EQU   X'60'                     PHYSICAL SECTOR COUNT
DL2TSD EQU   X'83'                     MASK OFF TRACK SPINDLE DISK
DL2E7C EQU   X'7C'                     MASK OUT SECTOR COUNT
DL2ICS EQU   *                         ENTRY POINT
       ST    DL2900+@OP1,@BR           SAVE OLD BASE
DL2000 EQU   *                         START PROCESSING
       LA    DL2000,@BR                SET BASE ADORESS
       A     DL2C01(,@BR),@ARR         BUMP TO RIGHT BYTE OF ADDR
       ST    DL2001+@DOP2(,@BR),@ARR   ADDR OF PARAM
       A     DL2C01(,@BR),@ARR         BUMP TO RETURN ADDR
       ST    DL2910+@OP1(,@BR),@ARR    SAVE RETURN ADDR
*
DL2001 MVC   DL2002+@DOP2(@DADDR,@BR),*-*  SETUP ADDR OF DPL
       ALC   DL2002+@DOP2(@CADDR,@BR),DL2C05(,@BR)  DUMP TO RIGHT END
DL2002 MVC   DL2DPL(@DPLNG,@BR),*-*    MOVE USER DPL TO WORK AREA
DL2005 SLC   DL2LST+@DSAD(DL2E01,@BR),DL2C48(,@BR)  ADJUST SCTR/CYL
       JM    DL2006                    GO TO RESTORE TO CONTINUE
       ALC   DL2LST+@DCYL(DL2E01,@BR),DL2C01(,@BR)  BUMP CYLINDER COUNT
       B     DL2005(,@BR)              BACK FOR NEXT CYLINDER
DL2006 ALC   DL2LST+@DSAD(DL2E01,@BR),DL2C48(,@BR)  RESTORE POSITIVE
*
*      GET THE LOGICAL SECTOR FROM THE DPL. THE NUMBER IS LEFT ADJUSTED
*      TO COMAE IT MTN THE POINTER ESTABLISHED PRIOR TO AN ENTRY.
       MVC   DL2SEC(DL2E01,@BR),DL2LST+@DSAD(,@BR)  GET SECTOR NUMBER
       MVI   DL2LST+@DSAD(,@BR),@ZERO  CLEAR SECTOR BYTE
*
*      MOVE THE RELATIVE START TO THE DFL
*
       ALC   DL2LST+@DSAD(DL2E02,@BR),DL2RAD(,@BR)  DL2RAD TO DPL
       CLI   DL2SEC(,@BR),DL2E18       IS COUNT OVER A TRACK
       JL    DL2008                    NO GO CHANGE A PHYSICAL ADOR
       ALC   DL2LST+@DSAD(DL2E02,@BR),DL2K80(,@BR)  BUMP TRACK VALUE
       SLC   DL2SEC(1,@BR),DL2K18(,@BR) DECR BY TRACK VALUE
DL2008 ALC   DL2SEC(1,@BR),DL2SEC(,@BR) SHIFT LEFT 1
       ALC   DL2SEC(1,@BR),DL2SEC(,@BR) SHIFT LEFT
       MVC   DL2SAD(DL2E01,@BR),DL2LST+@DSAD(,@BR)  GET SECTOR ADDRESS
*
*      ZERO OUT THE SECTOR COUNT AND LEAVE THE DISK. SPINDLE AND
*      TRACK BITS AS IS TO BE RE INSERTED AFTER THE SECTOR HAS BEEN
*      LOCATES.
*
       SBF   DL2LST+@DSAD(,@BR),DL2E7C  TURN OFF
       SBF   DL2SAD(,@BR),DL2TSD        OFF TRACK SPINDLE DISK
       ALC   DL2SAD(DL2E01,@BR),DL2SEC(,@BR)  COMBINE SECTOR COUNTS
DL2010 CLI   DL2SAD(,@BR),DL2E60        TEST IF TRACK CROSSED
       JL    DL2100
*
*      INCREMENT TRACK BIT. OVERFLOW INTO THE CYLINDER COUNT.
*
       ALC   DL2LST+@DSAD(DL2E02,@BR),DL2K80(,@BR)
       SLC   DL2SAD(1,@BR),DL2K60(,@BR)  DECR BY TRACK VALUE
*
DL2100 ALC   DL2LST+@DSAD(1,@BR),DL2SAD(,@BR)  INSERT SECTOR COUNT
*
DL2110 JC    DL2900,@NOP               CONVERSION SWITCH
DL2SWH EQU   DL2110+@Q                 ADDR OF Q CODE FOR SWITCH
       B     $DISKN                    GO PROCESS I/O
       DC    AL2(DL2LST)               ADDRESS OF DPL
DL2900 LA    *-*,@BR                   RESTORE CALLERS BASE
DL2910 B     *-*
**********************************************************************
*      CONSTANTS
**********************************************************************
DL2K60 DC    XL2'0060'                 SECTOR COUNT OF 24 LEFT ADJUSTD
DL2K80 DC    XL2'0080'                 BIT FOR INCREMENTING TRACK
DL2C48 DC    IL1'48'                   CYLINDER VALUE FOR 1 DISK
DL2K18 DC    XL2'18'                   HEX SECTORS PER TRACK
DL2C01 DC    IL2'1'                    CONSTANT FOR REGISTER MODE
DL2C05 DC    IL2'5'                    DISP TO RIGHT END OF DPL
**********************************************************************
*      WORK AREA
**********************************************************************
DL2LST EQU   *                         LIST HIGH END
DL2DPL DS    CL(@DPLNG)                WORKING DPL
DL2PHY EQU   DL2LST+@DSAD              POINTER TO PHYSICAL DADDR
DL2SAD EQU   DL2001+@DOP2              SAVE SECTOR BYTE FROM DPI
DL2SEC EQU   DL2002+@DOP2              WORKING SECTOR ADDRESS FIELD
DL2RAD DS    CL(@DADDR)                USER RELATIVE STARTING ADDR.
DL2END EQU   *                         END OF DL2ICS
*                       END OF DL2ICS
*** END OF EXPANSION ***
       MEND
// CEND
// END
*
// READER CONSOLE
