*DECK LISTPPM 
          IDENT  LISTPPM
          SST 
          SYSCOM B1 
          B1=1
          COMMENT  LISTPPM - LIST PERIPHERAL PROCESSOR MEMORY DUMP. 
          SPACE  3
***       LISTPPM - LIST PERIPHERAL PROCESSOR MEMORY DUMP 
* 
*         J.C. LEE   CDC - SVLOPS      80/04/15 
* 
*         ADAPTED FROM DSDI (EXPRESS DEADSTART DUMP INTERPRETER). 
          SPACE  3
***              LISTPPM IS A CONTROL CARD CALLABLE UTILITY WHICH 
*         PRODUCES LISTABLE OUTPUT FROM A PIP - PPU MEMORY DUMP FILE. 
*         THE PPU MEMORY DUMP FILE ZZZZZPP WAS CREATED BY NIP DURING
*         NIP-S REPRIEVE PROCESSING WHEN IT DETECTED THE NPU DRIVER,
*         PIP HAD DUMPED ITS MEMORY CONTENTS FOR SUBSEQUENT DEBUGGING.
*         THE PPU MEMORY DUMP FILE MUST EXIST AS A LOCAL FILE WHEN
*         LISTPPM IS CALLED.
* 
*         FORMAT OF THE PROGRAM CALL CARD 
*         ------------------------------- 
* 
*                LISTPPM [,P1] [,P2]. 
* 
*         WHERE PI IS A KEYWORD EQUATED TO A VALUE, IT CAN BE ONE OF
*         THE FOLLOWING:  
* 
*                B = LFNB,   LFNB IS THE LOCAL FILE NAME OF THE PIP 
*                            MEMORY DUMP FILE.
*                 OMITTED,   ZZZZZPP IS THE LOCAL FILE NAME OF THE PIP
*                            MEMORY DUMP FILE.
* 
*                L = LFNO,   OUTPUT IS PLACED ON FILE LFNO. 
*                 OMITTED,   OUTPUT IS PLACED ON FILE OUTPUT. 
* 
          SPACE  3
***              DAYFILE MESSAGES ISSUED -
* 
*         * LISTPPM - INVALID DUMP FILE.* 
*         * LISTPPM - ARGUMENT ERROR.*
*         * LISTPPM COMPLETE.*
* 
 OPL      XTEXT  COMCWOD
          LIST   F
          ENTRY  LISTPPM
          EJECT 
  
*         LOCAL SYMBOLS 
  
 DBUFL    EQU    2001B       DUMP FILE BUFFER LENGTH
 OBUFL    EQU    2001B       OUTPUT FILE BUFFER LENGTH
*CALL LPMCOM
  
*         FETS
  
 D        BSS    0           DUMP FILE
 ZZZZZPP  FILEB  DBUF,DBUFL,FET=6 
  
 O        BSS    0           OUTPUT FILE
 OUTPUT   FILEB  OBUF,OBUFL,FET=6 
  
*         LOCAL VARIABLES 
  
 PPORD    DATA   1
 NUMAPIP  BSSZ   1           NUMBER OF PIP DUMP IN ZZZZZPP
  
*         DUMP FILE HEADER
  
 PDRHDR   BSS    0
 PDHDR    BSSZ   PDFHDRL
  
*         OUTPUT FILE HEADER
  
 OHDR     BSS    0
          DATA   10H1 
          CON    0
          DUP    4,2
          DATA   10H- 
          CON    0
          DATA   10H
          DATA   10HPIP DUMPS 
          CON    0
          DATA   10H- 
          CON    0
          DATA   10H
          DATA   10HDATE -
 OHDATE   CON    0           DATE OF DUMP TAKEN IN DC 
          CON    0
          DATA   10H0 
          CON    0
          DATA   10H
          DATA   10HTIME -
 OHTIME   CON    0           TIME OF DUMP TAKEN IN DC 
          CON    0
 OHDRL    EQU    *-OHDR 
  
*         PIP DUMP RECORD HEADER
  
 PPHDR    DATA   10H1 
          CON    0
          DATA   10H0 
          CON    0
          DUP    5,1
          DATA   10H
          DATA   10HDUMP OF PI
 PIPO     DATA   10HP NUMBER N
          CON    0
          DATA   10H0 
          CON    0
 PPHDRL   EQU    *-PPHDR
          EJECT 
*         MAIN PROGRAM
  
 LISTPPM  BSS    0
          SB1    1
          RJ     PRS         PROCESS CONTROL CARD ARGUMENTS 
* 
          REWIND D,R         REWIND DUMP FILE 
* 
          READ   D,R         READ FIRST RECORD OF DUMP FILE 
* 
          READW  D,PDHDR,PDFHDRL   READ DUMP FILE HEADER
          ZR     X1,LPM1     JIF NOT EOR/EOF
* 
 LPM0     BSS    0
          SA0   =C* LISTPPM - INVALID DUMP FILE.* 
          EQ     LPM5        TERMINATE OUTPUT 
* 
 LPM1     BSS    0           VALIDATE DUMP FILE HEADER
          SA1    PDHDR
          MX0    54 
          BX6    -X0*X1 
          SA6    NUMAPIP     SAVE NUMBER OF PIP DUMP
          ZR     X6,LPM4     NO PIP ACTIVE IN DUMP FILE 
          BX1    X0*X1       PUT BLANK INTO X1
          SX2    55B
          BX1    X1+X2
          SA2    PDFHDR 
          BX3    X1-X2
          NZ     X3,LPM0     JIF A VALID FILE HEADER
* 
          SA1    A1+B1       (X1) = DATE OF DUMP IN DC
          BX6    X1 
          SA6    OHDATE 
          SA1    A1+B1       (X1) = TIME OF DUMP TAKEN IN DC
          BX6    X1 
          SA6    OHTIME 
* 
          WRITEW O,OHDR,OHDRL      WRITE OUTPUT FILE HEADER 
* 
 LPM2     BSS    0           PROCESS PIP DUMP RECORD
          READW  D,PDRHDR,PDRHDRL 
          NZ     X1,LPM0     JIF EOR/EOF REACHED
* 
          SA1    PDRHDR      PIP DUMP RECORD HEADER WORD
          LX1    6
          MX0    54 
          BX2   -X0*X1
          SX3    X2-PDRID 
          NZ     X3,LPM3     JIF NO PIP DUMP IN CURRENT RECORD
* 
          SA1    PPORD       PIP NUMBER 
          SX6    X1+33B 
          SA1    PIPO 
          BX6    -X0*X6 
          BX1    X0*X1
          BX6    X1+X6
          SA6    A1          SET PIP NUMBER IN DUMP RECORD HEADER 
          WRITEW O,PPHDR,PPHDRL    WRITE HEADER TO OUTPUT FILE
* 
          RJ     FPD         FORMAT PPU DUMP
* 
          SA4    NUMAPIP
          SX6    X4-1        ONE ACTIVE PIP IS PROCESSED
          ZR     X6,LPM4     NO MORE TO PROCESS 
          SA6    X4          STILL SOME PIP TO BE PROCESSED 
  
 LPM3     BSS    0
          SA1    PPORD       ORDINAL OF NEXT PIP
          SX6    X1+B1
          SA6    A1          UPDATE NEXT PIP NUMBER 
          SA1    B1+D 
          SX6    X1 
          SA6    A1+B1
          SA6    A6+B1       FIRST=IN=OUT 
* 
          READ   D,R         READ NEXT DUMP FILE RECORD 
          EQ     LPM2        CONTINUE 
* 
 LPM4     BSS    0
          SA0   =C* LISTPPM COMPLETE.*
 LPM5     BSS    0
          MESSAGE  A0,7,R          DAYFILE MESSAGE
          WRITER O,R         END OUTPUT FILE
          ENDRUN
          EJECT 
**        PRS  - PROCESS CONTROL CARD ARGUMENTS 
* 
*         ENTRY  NONE 
* 
*         EXIT   NONE 
* 
*         CALLS  LAP, BAP 
          SPACE  2
 PRS      BSSZ   1           ENTRY/EXIT 
          SA1    ACTR 
          SX7    X1          (X7) = ARGUMENT COUNT
          ZR     X7,PRS      RETURN IF NO ARGUMENTS SPECIFIED 
* 
          SA1    ARGR        (X1) = FIRST ARGUMENT
          MX0    42 
* 
 PRS1     BSS    0
          BX2    X0*X1       (X2) = ARGUMENT KEYWORD
          SA3    ARGTAB      (A3) = FWA OF ARGUMENT TABLE 
* 
 PRS2     BSS    0           SCAN ARGUMENT TABLE
          ZR     X3,PRS4     UNKNOWN KEYWORD, DAYFILE ERROR 
* 
          BX4    X0*X3       VALID KEYWORD IN ARGUMENT TABLE
          BX5   -X0*X3       ARGUMENT PROCESSOR ADDRESS 
          SB5    X5 
          SA3    A3+B1       (X3) = NEXT ENTRY IN ARGUMENT TABLE
          BX5    X4-X2
          NZ     X5,PRS2     CONTINUE TABLE SCAN IF NO MATCH
* 
 PRS3     JP     B5          PROCESS ARGUMENT 
* 
 PRS4     SA0   =C* LISTPPM - ARGUMENT ERROR.*
          EQ     LPM5        DAYFILE ERROR
* 
 PRS5     BSS    0
          SX7    X7-1        DECREMENT ARGUMENT COUNT 
          ZR     X7,PRS      RETURN IF ALL ARGUMENT PROCESSED 
* 
          SA1    A1+B1       PROCESS NEXT ARGUMENT
          EQ     PRS1 
          SPACE  3
**        ARGUMENT TABLE
          SPACE  2
 ARGTAB   BSS    0
          VFD    42/0LB,18/BAP         DUMP FILE ARGUMENT 
          VFD    42/0LL,18/LAP         OUTPUT FILE ARGUMENT 
          CON    0
          EJECT 
*         DUMP FILE ARGUMENT PROCESSOR
          SPACE  2
 BAP      BSS    0
          BX2   -X0*X1       (X2) = SEPARATOR 
          SX2    X2-2 
          NZ     X2,PRS4     ERROR IF NOT AN EQUIVALENCE
* 
          SX7    X7-1        DECREMENT ARGUMENT COUNT 
          ZR     X7,PRS4     ERROR, MORE ARGUMEN0 SHOULD FOLLOW 
* 
          SA1    A1+B1       SECOND WORD OF ARGUMENT
          SA5    D
          BX6    X0*X1       ARGUMENT VALUE 
          BX5   -X0*X5
          BX6    X5+X6
          SA6    A5          UPDATE PIP DUMP FILE NAME
          EQ     PRS5 
          SPACE  4
*         OUTPUT FILE ARGUMENT PROCESSOR
          SPACE  2
 LAP      BSS    0
          BX2   -X0*X1       (X2) = SEPARATOR 
          SX2    X2-2 
          NZ     X2,PRS4     ERROR IF NOT AN EQUIVALENCE
* 
          SX7    X7-1        DECREMENT ARGUMENT COUNT 
          ZR     X7,PRS4     ERROR, MORE ARGUMENT SHOULD FOLLOW 
          SA1    A1+B1       SECOND WORD OF ARGUMENT
          SA5    O
          BX6    X0*X1       ARGUMENT VALUE 
          BX5   -X0*X5
          BX6    X5+X6
          SA6    A5          UPDATE OUTPUT FILE NAME
          EQ     PRS5 
          EJECT 
**        FPD - FORMAT PPU DUMP.
* 
*         ENTRY  (HDR)= PPU HEADER WORD.
* 
*         EXIT   NONE.
* 
*         USES   B - 2,6,7. 
*                A - 0,1,3,4,6,7. 
*                X - ALL. 
* 
*         CALLS  WTW=,RDW=,WOD,WTS=,SFN,SOC.
  
  
  
 FPD      SUBR               ENTRY/EXIT 
          READW  D,FPDC,1          START FIRST WORD CONVERSION. 
          SB6    FPDC+1 
          SX5    PBUF        INITIALIZE PPU MEMORY BUFFER 
  
*         STORE PPU MEMORY CONVERTED TO DISPLAY CODE. 
*         PUT OCTAL DISPLAY IN UPPER 24 BITS, BINARY IN LOW 12 BITS.
  
 FPD1     SA1    B6-B1       CONVERT 5 BYTES
          SB2    X5 
          RJ     WOD
          SA4    A1                GET ORIGINAL WORD AGAIN
          MX0    4*6
          BX1    X6 
          MX3    12 
          BX6    X0*X6       WORD 1 
          LX1    4*6
          BX5    X3*X4             GET BINARY 
          LX5    12 
          IX6    X6+X5
          LX4    12 
          SA6    B2 
          BX2    X7 
          BX6    X0*X1       WORD 2 
          LX1    4*6
          BX5    X3*X4             GET BINARY 
          LX5    12 
          IX6    X6+X5
          LX4    12 
          SA6    A6+B1
          BX7    X3*X1       TOP OF WORD 3
          BX6    X3*X2       BOTTOM OF WORD 3 
          LX2    2*6
          LX6    -12
          BX7    X7+X6
          BX6    X0*X2       WORD 4 
          BX5    X3*X4             GET BINARY 
          LX5    12 
          IX7    X7+X5
          LX4    12 
          SA7    A6+B1
          LX2    4*6
          BX5    X3*X4             GET BINARY 
          LX5    12 
          IX6    X6+X5
          LX4    12 
          SA6    A7+B1
          BX7    X0*X2       WORD 5 
          BX5    X3*X4
          LX5    12 
          IX7    X7+X5
          SA7    A6+1 
          SX5    B2+5        ADVANCE BUFFER ADDRESS 
          READW  D,FPDC,1 
          ZR     X1,FPD1     IF NOT EOR 
  
          SA1    STAR 
          BX7    X1 
          SB2    A7-DBUF+2
 FPD1A    SA7    A7+B1
          SB2    B2+B1       USE ASTERISK FILL FOR REMAINDER OF BUFFER
          NG     B2,FPD1A 
  
* 
*         LIST PPU
* 
          SA0    B0                PPU BYTE ADDRESS COUNTER 
 FPD2A    BSS    0
          SA6    ALIN-1            INITIATE LINE CHAR. STRING POINTER 
          SB2    B0                HALF LINE AND END OF LINE INDICATOR
          SA7    FPDBF-1           INI. BUFFER FOR DISPLAY CODE 
          SA1    =6L PPU           LIST * PPU  *
          RJ     SOC
* 
 FPD2B    BSS    0
          SB3    10B               HALF LINE PPU BYTE COUNTER 
* 
          SX1    A0 
          RJ     WOD               PPU ADDRESS FOR DISPLAY CODE 
          MX0    4*6
          LX7    -4*6 
          BX1    X0*X7
          RJ     SOC
  
          SA1    =2L
          RJ     SOC               2 SPACES 
  
*         STRING OUT 8 PPU BYTES. 
  
 FPD2C    SA1    =1L
          RJ     SOC               1 SPACE
  
          SA1    A0+PBUF           ONE BYTE 
          MX0    4*6
          BX7    -X0*X1            GET BINARY INFO. 
          BX1    X0*X1             CLEAR BINARY INFO. 
          SA2    =4L0000
          SA7    A7+B1
          IX3    X2-X1
          NZ     X3,FPD2E          IF NOT A ZERO BYTE 
          SA1    =4L----
 FPD2E    RJ     SOC
          SB3    B3-B1
          SA0    A0+B1
          NZ     B3,FPD2C          IF NOT DONE
          SA1    =3L
          RJ     SOC               3 SPACES 
* 
          NE     B2,B0,FPD3        IF A FULL LINE HAS FORMATED
          SB2    B1 
          EQ     FPD2B             OTHERWISE, BACK FOR THE SECOND HALF
  
 FPD3     SB3    0                 INIT. DISPLAY BUFFER INDEX 
 FPD3B    SA1    FPDBF+B3          GET NEXT BYTE
          MX0    9*6
          BX2    X0*X1
          NZ     X2,FPD3E          IF LEFT CHARACTER PRESENT
          SX1    X1+5500B          ADD IN BLANK 
 FPD3E    BX2    -X0*X1 
          NZ     X2,FPD3F          IF RIGHT CHARACTER PRESENT 
          SX1    X1+1R             ADD IN BLANK 
 FPD3F    LX1    8*6
          RJ     SOC
          SB3    B3+B1
          SB2    B3-16
          MI     B2,FPD3B          IF NOT DONE WITH LINE
* 
*         LIST ONE LINE 
* 
          WRITES O,ALIN,A6-ALIN+1 
          SB2    A0-7777B 
          LT     B2,B0,FPD2A       IF NOT ALL LISTED YET
* 
          EQ     FPDX              RETURN 
  
 STAR     VFD    60/4L****
          SPACE  3
 FPDC     CON    0
          BSSZ   1
 FPDBF    BSSZ   16 
          EJECT 
**        SOC - STRING OUT CHARACTERS.
*         STOP AT 00 CHARACTER OR END OF WORD.
* 
*         ENTRY  (A6)= ADDRESS OF DESTINATION - 1.
*                (X1)= CHARACTERS TO STRING OUT.
* 
*         EXIT   (A6)= LWA OF STRUNG OUT CHARACTERS.
* 
*         USES   B - NONE.
*                A - 6. 
*                X - 1,6,7. 
* 
*         CALLS  NONE.
  
  
 SOC      SUBR               ENTRY/EXIT 
          SX7    77B         CHARACTER MASK 
 SOC1     LX1    6           ADVANCE CHARACTER
          BX6    X7*X1       EXTRACT CHARACTER
          ZR     X6,SOCX     RETURN - IF END OF STRING
          BX1    X1-X6       REMOVE CHARACTER 
          SA6    A6+B1       STORE CHARACTER
          EQ     SOC1        LOOP TO END OF STRING
          EJECT 
*         BUFFERS 
  
 PBUF     BSS    0           PPU BUFFER 
 DBUF     EQU    PBUF+4095+5       DUMP FILE BUFFER 
 OBUF     EQU    DBUF+DBUFL        OUTPUT FILE BUFFER 
 ALIN     EQU    OBUF+OBUFL+1      PPU DUMP LINE STRING BUFFER
 RFL=     EQU    ALIN+137          END OF MEMORY USED 
          ORG    RFL= 
          END    LISTPPM
