************************************************************************
*        DSC TRACE PROGRAM (FRONT END) 4/1/77  W. W. WALLER
*
*          THIS PROGRAM CONNECTS TO BACK END OF I/O INTERRUPT HANDLER
*        AND WATCHES DCT INDEX OF I/O TRANSACTIONS.  WHEN THE
*        THE INDEX FOR THE SPECIFIED DSC APPEARS, THE AIO STATUS,
*        TDV STATUS, COMMAND DOUBLEWORD, TIME OF DAY AND DATA TRANS-
*        FERRED ARE CAPTURED AND WRITTEN TO A FILE.  A SECOND PROGRAM
*        IS RUN TO PRODUCE A FORMATTED LISTING FROM THIS FILE.
*
*             THE LIMITATIONS OF THIS PROGRAM ARE AS FOLLOWS:
*        1.   CANNOT HANDLE CHAINED I/O ... BUFFER MUST LIE IN ONE
*             PAGE OR LESS.
*        2.   MAXIMUM RECORD SIZE IS LESS THAN 772  BYTES.
*        3.   USE OF PROGRAM IS LIMITED TO DATA SET CONTROLLERS
*             PROGRAM WOULD FUNCTION FOR OTHER DEVICES...BUT A
*              CHECK IS MADE TO INSURE THE DEVICE IS A DSC.
*             ATTEMPTING TO TRACE A DISC , ETC. COULD RESULT IN A
*             RACE CONDITION.
*        4.   FOR PROPER OPERATION PROGRAM SHOULD RUN ALONE ON THE
*             SYSTEM.  THIS WILL INSURE THAT NO I/O TRANSFERS ARE LOST.
************************************************************************
         PAGE
         SYSTEM SIG7
*
*          DYNAMIC DATA
*
         CSECT 00
DYNMDATA EQU      $
DCTIDX   DATA     0                 INDEX INTO DCT FOR OUR DEVICE..ALSO
         DATA     0                 USED FOR KEYIN TO OBTAIN THE DCT IND
RFLAG    DATA     0                 KEYIN MESSAGE REPLY FLAG
RPOINT   DATA     VORIGIN           VIRTUAL POINTER TO NEXT I/O RECORD
RCOUNT   DATA     1                 NUMBER OF NEXT I/O RECORD TO BE RETR
SAVEBIAS DATA     0                 BIAS INTO PAGE FOR REPLACED INST. IN
PGFAIL   DATA     -10               NEGATIVE COUNT OF FETCH PG FAILURES
*                                     ALLOWED BEFORE WE GIVE UP
*                                     MONITOR
PHYSADDR DATA     0                 WORD ADDR. OF PAGE OBTAINED FROM MON
*                                   TO HOLD INTERRUPT ROUTINE AND DATA
PHYSPAGE DATA     0                 PAGE NUMBER OF THE PAGE
*
BSZ      RES      1                 BYTE SIZE TO BE WRITTEN TO DISC
*********************************************************************
         PAGE
*        STATIC DATA
*
         CSECT 01
STATDATA EQU      $
MESS1    DATA     X'13154040'       GREETING MESSAGE
         TEXT     'DSC TRACE - A00 '
*
MESS2    DATA     X'2B154040'       MESSAGE FOR INSUFFICIENT PRIV.
         TEXT     'YOU ARE DENIED ACCESS TO THIS PROGRAM!!!'
*
MESS3    DATA     X'1B154040'       PROMPT FOR DCTINDEX
         TEXT     'ENTER DCT INDEX FOR DSC '
*
MESS4    DATA     X'27154040'       BAD DCT INDEX MESSAGE
         TEXT     'DCT INDEX DOES NOT SPECIFY RBT DEVICE'
*
MESS5    DATA     X'13154040'       BEGIN TRACE MESSAGE
         TEXT     'TRACE STARTED   '
*
MESS6    DATA     X'13154040'       END OF JOB MESSAGE
         TEXT     'TRACE COMPLETED '
*
         TEXT     'CANT GET A PAGE '
*
MESS8    DATA     X'0F154040'           CVM ERROR
         TEXT     'CVM REJECTED'
*
MESS9    DATA     X'23154040'       WE DONT MATCH THE CURRENT MONITOR
         TEXT     'LOADED WITH WRONG MONSTK..RELOAD'
*
         BOUND    8
DIGITS   DATA     X'F0'
         DATA     X'F9'             CLM CHECK FOR EBCDIC DIGIT
CHAR     DATA     X'C1'
         DATA     X'C6'             CLM CHECK FOR EBCDIC A-->F
*
BRANCH   BCR,0    0                 BRANCH INST. TO BE USED IN HOOKING
*                                   INTO MONITOR....
************************************************************************
         PAGE
*
*        REFS AND DEFS
*
         REF      RBLIMS            NEED TO CHECK DCT INDEX
         REF      T:FPP             RELEASE PHYS. PG. TO MONITOR
         REF      NEWQ              USED TO CHECK AGREEMENT WITH MONITOR
*
*        FOLLOWING ARE USED IN INT. ROUTINE
*
         REF      DCT12             AIO STATUS
         REF      DCT13             TDV STATUS
         REF      TINC              CLOCK PULSE ADDR...FOR TIME
         REF      C:CTUN            CURRENT CLOCK INTERRUPT INTERVAL--TI
         REF      C:MSM             TICS SINCE MIDNIGHT..LAST CLOCK INTE
         REF      IOQ:              THE ROUTINE WE HOOK INTO...
*********************************
         REF      JB:PRIV           PRIVILEDGE OF USER
         REF      TSTACK            MONITOR STACK
         DEF      DYNMDATA          DYNAMIC DATA
         DEF      STATDATA          STATIC DATA
         DEF      PROCEDUR          MAINLINE PROCEDURE
         DEF      INTROUTI          INTERRUPT ROUTINE..TO BE RELOCATED
         DEF      IDLELOOP          PLACE WHERE WE IDLE FOR I/O ACTIVITY
************************************************************************
         PAGE
*
*
PROCEDUR EQU      $
START    EQU      $
         M:TYPE   (MESS,MESS1)      TELL'EM WE'VE STARTED
*
         LB,8     JB:PRIV           GET USER PRIVILEDGE
         CI,8     X'C0'              OK ??
         BGE      HESOK             YES...
         M:TYPE   (MESS,MESS2)      NO..TELL 'EM
         M:ERR                      AND ABORT
*
*
HESOK    M:KEYIN  (MESS,MESS3),(REPLY,DCTIDX),(SIZE,3),(ECB,RFLAG)
*                   GET THE DCT INDEX FOR OUR USE
         MTW,0    RFLAG
         BLZ      $-1               LOOP 'TIL DONE
*
         LB,8     DCTIDX            GET SIZE
         CI,8     2                   AT LEAST TWO CHAR ???
         BL       HESOK             NO...ASK AGAIN
*
         LW,9     DCTIDX            GET THE WHOLE THING
         LI,6     0                 SUM OF DCT INDEX..0 TO START
         LI,5     2                 DIGIT COUNT
         SLS,9    8                 SCRUB SIZE
*
LOOP1    LI,8     0
         SLD,8    8                 GET CHAR.
         CI,8     X'15'             EOL ???
         BE       DCTDONE            YES...
         CI,8     X'0D'             CR ?...
         BE       DCTDONE            YES....
         SLS,6    4                 MAKE ROOM FOR NEXT DIGIT
         CLM,8    DIGITS            0-->9 ?????
         BCS,8    HESOK             BIGGER THAN 9..BAD
         BCR,1    SUM               BETWEEN 0 & 9 ..DIGIT
*
         CLM,8    CHAR              A--->F ??????
         BCS,9    HESOK             NO...BAD CHARACTER
         AI,8     9                 CONVERT TO HEX DIGIT
*
SUM      LS,6     8                 MOVE NEXT DIGIT IN
         BDR,5    LOOP1               LOOP TO END
**
*
DCTDONE  M:SYS                      GO MASTER.....
*
         CI,10    NEWQ              R10 HAS NEWQ ADDR. ON RETURN..
         BE       LOADOK             IT BETTER MATCH ...
*
         M:SLAVE
         M:TYPE  (MESS,MESS9)       IT DOESNT ..STOP QUICK
         M:ERR
*
*
LOADOK   CLM,6    RBLIMS              CHECK OUR INDEX WITH RBT LIMITS
         BCR,9    DCTOK             ...CC .NE. 9 MEANS OK
*
         M:SLAVE
         M:TYPE   (MESS,MESS4)      GIVE USER BAD NEWS
         M:ERR                         AND ABORT
*
**
DCTOK    M:SLAVE                    RETURN TO SLAVE
         STW,6    DCTIDX            SAVE OUR DCT INDEX
         M:OPEN   F:1,(SAVE)         OPEN OUTPUT DCB
*                   MONITOR WILL HANDLE ALL ERRORS
         M:XCON     EXITCODE,LAST
*                     ALSO USED WHEN OPERATOR ABORTS TO END EXECUTION
*
GETPAGE  M:SYS                      BACK TO MASTER
*
         BAL,2    T:GPP               GET A PHYSICAL PAGE...
         CI,3     0                  CHECK PG ADDR
         BLE      NOPAGE            0..WE DIDN'T GET ONE....
         CI,3     X'FF'             CHECK FOR A PAGE >128K
         BG       NOPAGE            YUP, GO TRY AGAIN
*
         STW,3    PHYSPAGE          SAVE NUMBER
         SLS,3    9                   MAKE WORD ADDR.
         STW,3    PHYSADDR             SAVE ADDRESS
*
         M:SLAVE                    RETURN TO SLAVE PROCESSING
         B        CONTINUE             AND CONTINUE
*
NOPAGE   M:SLAVE
*
         MTW,1    PGFAIL            COUNT FAILURE..EXPECT ONE ONCE AND A
         BGEZ     NOPAGE2              WHEN IT GOES POSITIVE GIVE UP....
         M:WAIT   1                 STILL SOME TIME....0RY LATER
*
*
NOPAGE2  M:TYPE   (MESS,MESS7)
         M:CLOSE  F:1,(SAVE)
         M:XCON     0
         M:ERR
***
**
*
CONTINUE M:CVM    *PHYSADDR,MAGICADR   MAP OUR PAGE TO 'MAGIC' VIRTUAL A
*
         BCS,8    CVMFAIL           CVM DIDNT WORK
*
         LI,7     INTSZ             GET SIZE OF INTERRUPT CODE
         LW,10    ENTRY-1,7         LOAD CODE...
         STW,10   MAGICADR-1,7       STORE IN OUR PAGE
         BDR,7    $-2                  AND LOOP 'TIL ALL IS MOVED
         LI,7     RELOCSZ           GET SIZE OF RELOCATION TABLE
         LW,8     PHYSADDR          NEW BASE
         AI,8     -ENTRY            OLD BASE .. DIFF. IS RELOC. BIAS
*
         LW,6     RELOCTBL-1,7      GET LAST ONE
         AWM,8    MAGICADR,6          RELOCATE IT...
         BDR,7    $-2                    AND DO THE REST
*
         LI,7     PATCHPNT          GET ADDR. WHERE WE HOOK IN...
         SLS,7    -9                ISOLATE PAGE NO.
         SLS,7    9                 MAKE IT ADDR. AGAIN
         M:CVM    *7,MAGICAD2       MAP INTO THAT PAGE.....
*
         BCS,8    CVMFAIL           CVM FAILED.....
*
         LCW,7    7                 INVERT ADDRESS
         AI,7     PATCHPNT          ADD PATCH ADDR. --> BIAS PAST PG.
         LW,8     MAGICAD2,7        FETCH INST. TO BE REPLACED
         STW,8    VINST             MOVE TO VIRTUAL AREA
*
         LW,8     DCTIDX            GET INDX
         AWM,8    MAGICADR          ADD TO CI IN INT. ROUTINE
*
         M:TYPE   (MESS,MESS5)      ANNOUNCE THAT WE ARE DOING IT.....
*
*                 NOW REALLY CONNECT AND DO IT...
*
         LW,8     BRANCH            GET A NULL BRANCH...
         AW,8     PHYSADDR          ADD PAGE DISPLACEMENT --> B INTROUTI
*                 NOW TRACE IS REALLY STARTED..WE'RE LOOKING AT DCT INDE
*                   FOR EVERY I/O INTERRUPT......
*
         STW,7    SAVEBIAS          SAVE INST. BIAS IN PAGE FOR CLEANUP
********************************************************************
         PAGE
*
*            TRANSFER ROUTINE....
*
IDLELOOP LW,7     VFLAG             WAIT HERE FOR I/O TO HAPPEN
         BLEZ     $-1                 0...NOTHING HAPPENING
*
ZAP      LI,5     0                 ZAP THE FLAG
         STW,5    VFLAG               ZAPPED
*
*        ACTIVE LOOP MOVE ALL ENTRIES TO DISC...
*
ACTIVE   LW,4     *RPOINT           LOAD NEXT ENTRY..RETRIEVAL POINTER S
         CI,4     X'F7FFF'          END FLAG...CHECK
         BE       RESET              GOT ONE ..RESET POINTER TO FIRST WO
         SLD,4    -16               ISOLATE SEQUENCE NUMBER
         CW,4     RCOUNT            CHECK WITH WHAT WE EXPECT
*                                    BACK UP AND PUNT.....
         SLS,5    -16               SEQ. OK..ISOLATE SIZE
         CI,5     200                 LESS THAN 200 WORDS ?
         BG       PUNT                 IF IT ISN'T PUNT AGAIN....
*
MOVEDATA LW,6     RPOINT            GET POINTER
         AW,6     5                 CHECK END ADDR. WITHIN PAGE....
         CI,6       RPMAX                IS IT ???
         BG       PUNT                     NO..BETTER PUNT...
*
         MTW,1    RCOUNT            UPDATE COUNT IF POINTER OK
         SLS,5    2                 MAKE WORD COUNT BYTES
         STW,5    BSZ                 AND SAVE...
*
*          WRITE THIS ONE OUT
*
         M:WRITE  F:1,(BUF,*RPOINT),(SIZE,*BSZ),(WAIT)
*
         STW,6    RPOINT            UPDATE THE BUFFER POINTER...
         BDR,7    ACTIVE            LOOP .. VFLAG  IS COUNT OF ENTRIES
***
**
*           INHIBIT INTERRUPTS WHILE CHECKING..SO WE MAY BE BEHIND
*
         LW,4     VCOUNT            GET INT. ROUTINE COUNT
         CW,4     RCOUNT            CHECK RETRIEVED COUNT...
         BL       IDLELOOP             THEY MATCH..WE'RE OK..
         B        ZAP                RUN LOOP AGAIN....
**
*
RESET    LI,4     VORIGIN           LOAD VIRTUAL ORIGIN FOR BUFFERS
         STW,4    RPOINT            AND RESTORE
         B        ACTIVE              RETURN TO LOOP
**
*
PUNT     EQU      $                 ERROR DETECTED..TRY TO START TRACE
*                                    FROM SCRATCH AGAIN....
         LI,4     VORIGIN           LOAD UP NEW ORIGIN
         STW,4    RPOINT              RSET POINTER
         LW,4     *RPOINT           GET FIRST ENTRY..
         SLS,4    -16
         STW,4    RCOUNT            MAKE IT OUR COUNT...
         B        ZAP                 RUN LOOP A FEW TIMES...
*
************************************************************************
         PAGE
*
*        EXIT HANDLER.....
EXITCODE EQU      $
*
         LW,7     SAVEBIAS          GET BIAS TO BRANCH
         BEZ      FREEPAGE          0 NOT DONE YET....
         LW,8     VINST             GET REPLACED INST.
         STW,8    MAGICAD2,7          RESTORE IT...
*                                   WE ARE NOW UNHOOKED
FREEPAGE M:SYS                      GET MASTER MODE
         LW,3     PHYSPAGE          GET PAGE ADDR.
         BEZ      SLAVEME           DON'T RELASE ..IF IT DOESN'T EXIST
         BAL,2    T:FPP
*
SLAVEME  M:SLAVE                    RETURN TO SLAVE MODE
         M:CLOSE  F:1,(SAVE)        SAVE OUR FILE
         M:TYPE   (MESS,MESS6)      GOODBY MESSAGE...
         M:EXIT                        AND GOODBYE
*
************************************************************************
         M:TYPE   (MESS,MESS8)      SEND MESSAGE
         M:ERR                      ABORT..VIA EXIT CONTROL
**
************************************************************************
         PAGE
*
*           INTERRUPT ROUTINE
*
*        THIS ROUTINE WILL BE RELOCATED AT RUN TIME INTO A PHYSICAL PAGE
*        BORROWED FROM THE MONITOR...
*
         CSECT 01
INTROUTI EQU      $
ENTRY    EQU      $
         CI,7     0                 CHECK DCT INDEX...STORED HERE AFTER
*                                   ROUTINE IS RELOCATED
R1       BNE      EXIT9             NOT INDEX WE'RE AFTER RETURN TO MONI
*
         LCI,2    0
         PSM,0    TSTACK            PUSH ALL REGISTERS TO STACK
*
         LD,2     DCT13,7           GET TDV STATUS
         LW,1     DCT12,7           GET AIO STATUS
*
         LCW,6    TINC              GET NEGATIVE OF TICS REMAINING
         AW,6     C:CTUN            ADD TICS AT START OF INTERVAL
         AW,6     C:MSM             ADD TICS PAST MIDNIGHT...
*                                    RESULT IS ACTUAL TICS PAST MIDNIGHT
*
         LI,0     X'FFF'            GET MASK
         AND,0    3                 GET REMAINING BYTE COUNT
         LCW,0    0                 INVERT
         LI,7     X'FFF'            MASK
         AND,7    5                 REQUESTED BYTE COUNT
         AW,0     7                 DIFFERENCE IS ACTUAL BYTE COUNT
         CI,0     772               CHECK MAX SIZE
R13      BLE      $+2
         LI,0     772               IF GR MAKE EQUAL
*
         AI,0     31                ROUND ENTRY SIZE FOR STATUS WORDS &
*                                     TO WORD BOUNDARY
         SLS,0    -2                SHIFT TO WORD SIZE
*
         LI,9     X'1FF'            GET PAGE BIAS
R2       LS,8     POINTER             VIA MASK FOR LAST 9 BITS
R3       LW,7     POINTER
         AW,8     0                 COMPUTE LAST ADDR.
         CI,8     X'200'             IN PAGE ????
R4       BL       SPAVAIL           YES...CONTINUE
*
         LI,8     X'F7FFF'          LOAD END FLAG
         STW,8    *7                STORE AT END OF LAST ENTRY
*                                   RETRIEVE ROUTINE RESETS POINTER WHEN
*                                   END FLAG IS DETECTED
*
R5       LI,7     ORIGIN            LOAD UP NEW START ADDR.
R6       STW,7    POINTER             AND SAVE IT....
*
SPAVAIL  LW,8     0                 FETCH COUNT
R7       AWM,8    POINTER             COMPUTE NEXT BUFFER ADDR.
R8       MTW,1    COUNTER           BUMP COUNTER....
R9       LW,9     COUNTER             GET IT...
         STH,9    0                     PLACE IN 0 WITH SIZE
*
         LCI,2    7                 SET UP TO STORE
         STM,0    0,7                 SAVE STATUS INFO.
         AI,7     7                 ADJUST POINTER
         AI,8     -7                AND COUNT
         LI,6     X'7FFFF'          MASK
         AND,6    4             GET THE I/O ADDR.
         SLS,7    2                 MAKE DEST. A BYTE ADDR.
         SLS,8    2                 MAKE COUNT A BYTE COUNT
         LI,5     X'FF'             LOAD A 255 COUNT
*
LOOP     CI,8     255               CHECK FOR LAST LOOP...
R10      BLE      LASTLOOP            LESS THAN 255 LEFT RUN LAST ONE
         AI,8     -255              NOT LAST DECR. COUNT
         STB,5    7                   MOVE 255 COUNT TO 7
         MBS,6    0                 MOVE 255 BYTES
R11      B        LOOP                RETURN FOR MORE
*
LASTLOOP CI,8     0                 ARE WE ALREADY DONE ???
R14      BLE      SETFLAG             YES...
         STB,8    7                 NO..STORE REMAINING COUNT IN 7
         MBS,6    0                 AND MOVE THE REST....
*
*
*
SETFLAG  EQU      $
R12      MTW,1    FLAG              SET FLAG..TELL RETRIEVE ROUTINE TO G
         PLM,0    TSTACK            RESTORE ALL REGS
*
EXIT9    NOP                        THIS INST. GETS REPLACED BY MONITOR'
         B        PATCHPNT+1        RETURN TO MONITOR
*
*
*        DATA     AREA
*
FLAG     DATA     0                 FLAG >0 MEANS DATA READY...
R15      EQU      $
POINTER  DATA     ORIGIN            WHERE TO STORE DATA ..
COUNTER  DATA     0                 COUNTER OF BLOCKS TRANSFERRED
ORIGIN   EQU      $                 THE ORIGIN OF DATA BUFFERS
*
**
*        FOLLOWING IS DATA DEFS AND RELOCATION BIAS
*
MAGICADR EQU      X'1A000'          VIRTUAL ADDR. OF OUR PHYS. PAGE
RPMAX    EQU      X'1A1FF'          HIGHEST ADDR. IN OUR VIRTUAL PAGE
MAGICAD2 EQU      X'1A200'          ADDR. OF VIRTUAL MAP TO PAGE IN
*                                   MONITOR WHERE WE CONNECT....
*        NOTE:  ALL THREE OF THE ABOVE MAY NEED CHANGING IF THE
*
INTSZ    EQU      ORIGIN-ENTRY      SIZE OF THIS ROUTINE
RELOCSZ  EQU      RELOCEND-RELOCTBL   RELOCATION TABLE SIZE (BELOW)
VFLAG    EQU      MAGICADR+FLAG-ENTRY   ADDR. OF FLAG IN VIRTUAL SPACE
VPOINT   EQU      MAGICADR+POINTER-ENTRY ADDR. OF POINTER IN VIRTUAL SPA
VCOUNT   EQU      MAGICADR+COUNTER-ENTRY  ADDR. OF COUNTER IN VIRT.
VINST    EQU      EXIT9-ENTRY+MAGICADR   ADDR. OF INST. REPLACED IN MONI
VORIGIN  EQU      ORIGIN-ENTRY+MAGICADR   VIRTUAL ADDR. OF THE ORIGIN..
**************************************************************
PATCHPNT EQU      IOQ:+X'2D9'       WHERE WE HOOK INTO MONITOR...
*
*                 IOQ:+.2D9----> F00
*                 IOQ:+.2AB----> E01
**************************************************************
RELOCTBL EQU      $                 RELOCATION BIAS
         DATA     R1-ENTRY
         DATA     R2-ENTRY
         DATA     R3-ENTRY
         DATA     R4-ENTRY
         DATA     R5-ENTRY
         DATA     R6-ENTRY
         DATA     R7-ENTRY
         DATA     R8-ENTRY
         DATA     R9-ENTRY
         DATA     R11-ENTRY
         DATA     R12-ENTRY
         DATA     R13-ENTRY
         DATA     R14-ENTRY
         DATA     R15-ENTRY
RELOCEND EQU      $
*
*********************************************************************
         PAGE
*
*          DCB SECTION
*
F:1      DSECT 2
F:1      M:DCB    (FILE,'DSCTRACE'),(OUT),(SAVE),(CONSEC)
*
************************************************************************
         END      START
