PROC display_hpa_tape_detail, dishtd (
  input, i: file = $local.$engineering_log
  output, o: file = $output
  status)

  "       Proc Display_hpa_tape_detail converts error information for tapes from
  "       the binary Engineering_Log to a format reminiscient of the 170
  "       HPA detail reports (without any analysis).
  "       parameters are as follows:
  "            Input or i = name of file containing previously terminated
  "                         engineering_log.  Default is current log.
  "            Output or o =name of file to receive the listing of errors.

  time_study = false

  IF time_study THEN
    display_job_data output=$null "            preset job data statistics"
  IFEND

  create_variable convert_variable kind=string value=''
  create_variable blanks k=string v='                    '
  create_variable byte_status k=(string, 2) d=0..34 v=''
  create_variable out_file_2 k=string v=$unique
  create_variable out_file_4 k=string v=$unique
  create_variable out_name k=string v=''
  create_variable statistic_counter k=integer v=0
  create_variable (date, code, line) k=string v=''
  create_variable stat_count k=integer
  create_variable stat_line k=string v='' d=1..17
  create_variable tape_status k=string v='' dimension=1..16
  create_variable output_line k=string v='' d=0..13
  create_variable column_pointer k=integer v=97
  create_variable line_pointer k=integer v=1
  create_variable hardware_function k=string v='    '
  create_variable local_status k=status
  create_variable unrec_failure k=boolean

  display_binary_log i=$value(input) o=$value(output)
  " define_group tape0 CM351000
  define_group tape2 CM5100
  define_group tape4 CM5101
  generate_group_file tape2 $fname(out_file_2)
  generate_group_file tape4 $fname(out_file_4)
  " generate_group_file tape0 $fname(out_file_2)
  QUIT

"         build output file name for line by line output"

  out_name = $path($value(output), catalog) // '.' // ..
        $path($value(output), last) // '.'

  IF $file($value(output), permanent) THEN
    out_name = out_name // $strrep($file($value(output), cycle_number)) // ..
          '.$asis'
  ELSE
    out_name = out_name // '$asis'
  IFEND

  lines_read = 0
  accept_line line $fname(out_file_2//'.$boi') line_count=lines_read

  output_line(2) = '                                             STATUS'
  output_line(3) = ' OPCD TYP PP CH EQ  UN RTY  DEN  FCN   GS1  GS2  DS3  DS4'
  output_line(3) = output_line(3) // '  DS5  DS6  DS7  DS8 '
  output_line(4) = ' -------------------------------------------------------'
  output_line(4) = output_line(4) // '---------------------'

  PUSH_COMMANDS
  WHILE lines_read > 0 DO

    IF $substr(line, 2, 2) = 'CM' THEN "     find first line of statistic"

      "         check for change in DATE or statistic CODE type --- need new header"
      IF date <> $substr(line, 13, 7) OR code <> $substr(line, 2, 11) THEN
        date = $substr(line, 13, 7)
        code = $substr(line, 2, 11)
        output_line(0) = '  ' // code // '      ' // date

        FOR i = 0 TO 4 DO
          put_line output_line(i) output=$fname(out_name)
        FOREND

      IFEND

      number_of_counters = $integer($substr(line, 63, 2))
      IF number_of_counters <> 62 THEN "     check for sufficient counters"
        accept_line line $fname(out_file_2//'.$asis') line_count=lines_read
        CYCLE "                           cycle WHILE loop for next CM code"
      IFEND

      output_line(5) = $substr(line, 19, 8) "      get TIME of error statistic"
      output_line(5) = $substr(line, 21, 8) "      get TIME of error statistic"

      "  input all status here"
      accept_line stat_line $fname(out_file_2//'.$asis') line_count=lines_read
      output_line(5) = output_line(5) // stat_line(17)

      column_pointer = $scan_string('*UF*', stat_line(17))
      unrec_failure = (column_pointer <> 0)

      convert_base $substr(stat_line(1), 18, 3) 3, 8 ..
            convert_variable "     PPU_Number to 3 char octal string"
      output_line(6) = convert_variable
      convert_base $substr(stat_line(1), 38, 3) 3, 8, ..
            convert_variable "    Channel_Number conversion"
      output_line(6) = output_line(6) // convert_variable
      convert_base $substr(stat_line(1), 59, 2) 3, 8 ..
            convert_variable "  Equipment_Number to 3 char octal string"
      output_line(6) = output_line(6) // convert_variable
      convert_base $substr(stat_line(1), 78, 3) 4, 8, ..
            convert_variable "   Unit_Number conversion"
      output_line(6) = output_line(6) // convert_variable

      convert_base $substr(stat_line(2), 17, 4) 4, 10, ..
            convert_variable "    Equipment_Type to 4 char decimal string"
      output_line(6) = convert_variable // output_line(6)
      convert_base $substr(stat_line(2), 37, 4) 4, 10, ..
            convert_variable "     Op_Code conversion"
      output_line(6) = convert_variable // output_line(6)

      convert_base $substr(stat_line(5), 37, 4) 4, 10, ..
            convert_variable "   Retry conversion"
      output_line(6) = output_line(6) // convert_variable

      convert_base $substr(stat_line(4), 13, 8) 8, 10, ..
            convert_variable "      Current_Block_Count conversion"
      output_line(8) = ' BLK CNTS: CUR= ' // convert_variable
      convert_base $substr(stat_line(3), 33, 8) 8, 10, ..
            convert_variable "    Blocks_Read conversion"
      output_line(8) = output_line(8) // ' READ= ' // convert_variable
      convert_base $substr(stat_line(3), 13, 8) 8, 10, ..
            convert_variable "    Blocks_Written conversion"
      output_line(8) = output_line(8) // ' WRITTEN= ' // convert_variable
      convert_base $substr(stat_line(4), 33, 8) 8, 10, ..
            convert_variable "    Absolute file/tape mark from load point"
      output_line(8) = output_line(8) // ' FILE MKS= ' // convert_variable

      convert_base $substr(stat_line(4), 49, 12) 12, 8, ..
            convert_variable "                Format_Request conversion"
      output_line(7) = ' FORMAT= ' // convert_variable
      convert_base $substr(stat_line(5), 19, 2) 2, 8, ..
            convert_variable "                Recovery type performed"
      output_line(7) = output_line(7) // ' RCV TYP= ' // convert_variable // ..
            '   '
      convert_base $substr(stat_line(4), 77, 4) 5, 10, ..
            convert_variable "                    Density conversion"
      output_line(6) = output_line(6) // convert_variable
      convert_base $substr(stat_line(5), 57, 4) 5, 8, ..
            convert_variable "               Hardware Function Conversion"
      output_line(6) = output_line(6) // convert_variable // ' '

      "         Convert all status in following loop"
      stat_count = 1
      column_pointer = 61
      line_pointer = 5
      FOR i = 1 TO 4 DO
        IF column_pointer = 81 THEN
          column_pointer = 1
          line_pointer = line_pointer + 1
        IFEND

        convert_to_octal_bytes ..
              $substr(stat_line(line_pointer), column_pointer, 20), ..
              convert_variable, status=local_status
        FOR j = 0 TO 3 DO
          tape_status(stat_count) = $substr(convert_variable, (4*j+1), 4)
          stat_count = stat_count + 1
        FOREND
        column_pointer = column_pointer + 20
      FOREND

      FOR i = 1 TO 8 DO
        output_line(6) = output_line(6) // '/' // tape_status(i)
        output_line(7) = output_line(7) // '/' // tape_status(i + 8)
      FOREND

      IF unrec_failure THEN
        stat_count = 1
        column_pointer = 1
        line_pointer = 8
        FOR i = 1 TO 4 DO
          convert_to_octal_bytes ..
                $substr(stat_line(line_pointer), column_pointer, 20), ..
                convert_variable, status=local_status
          FOR j = 0 TO 3 DO
            tape_status(stat_count) = $substr(convert_variable, (4*j+1), 4)
            stat_count = stat_count + 1
          FOREND
          column_pointer = column_pointer + 20
        FOREND
        output_line(10) = '              Final status for an   '
        output_line(11) = '              unrecovered failure   '

        FOR i = 1 TO 8 DO
          output_line(10) = output_line(10) // '/' // tape_status(i)
          output_line(11) = output_line(11) // '/' // tape_status(i + 8)
        FOREND

      IFEND

      statistic_counter = statistic_counter + 1

      FOR k = 5 TO 9 DO
        put_line ' '//output_line(k) $fname(out_name)
        IF (k = 7) AND unrec_failure THEN
          put_line ' '//output_line(10) $fname(out_name)
          put_line ' '//output_line(11) $fname(out_name)
        IFEND
      FOREND

    IFEND

    line = ''
    accept_line line $fname(out_file_2//'.$asis') ..
          line_count=lines_read "try next line"

  WHILEND

  IF statistic_counter = 0 THEN
    put_line '  THERE ARE NO ATS TAPE ERRORS IN THE DESIGNATED LOG ' ..
          output=$fname(out_name)
  ELSE
    put_line '  END OF ATS TAPE ERRORS  ' output=$fname(out_name)
  IFEND

  IF time_study THEN
    put_line ' ' output=$fname(out_name)
    put_line '  THE NUMBER OF STATISTICS IS  '//$strrep(statistic_counter) ..
          output=$fname(out_name)
    display_job_data display_format=incremental output=$fname(out_name)
  IFEND

"ISMT error formatting here"

  statistic_counter = 0
  lines_read = 0
  accept_line line $fname(out_file_4//'.$boi') line_count=lines_read

  output_line(2) = '                                             STATUS'
  output_line(3) = ' OPCD TYP PP CH EQ  UN RTY DEN  FCN    GS1  GS2  DS3     '
  output_line(3) = output_line(3) // '  SENSE BYTES        '
  output_line(4) = ' --------------------------------------------------------'
  output_line(4) = output_line(4) // '---------------------'

  WHILE lines_read > 0 DO

    IF $substr(line, 2, 2) = 'CM' THEN "     find first line of statistic"

      "         check for change in DATE or statistic CODE type --- need new header"
      IF date <> $substr(line, 13, 7) OR code <> $substr(line, 2, 11) THEN
        date = $substr(line, 13, 7)
        code = $substr(line, 2, 11)
        output_line(0) = '  ' // code // '      ' // date

        FOR i = 0 TO 4 DO
          put_line output_line(i) output=$fname(out_name)
        FOREND

      IFEND

      number_of_counters = $integer($substr(line, 63, 2))
      IF number_of_counters <> 62 THEN "     check for sufficient counters"
        accept_line line $fname(out_file_4//'.$asis') line_count=lines_read
        CYCLE "                           cycle WHILE loop for next CM code"
      IFEND

      output_line(5) = $substr(line, 19, 8) "      get TIME of error statistic"
      output_line(5) = $substr(line, 21, 8) "      get TIME of error statistic"

      accept_line stat_line $fname(out_file_4//'.$asis') ..
            line_count=lines_read "  all stat"
      output_line(5) = output_line(5) // stat_line(17)

      unrec_failure = $integer($substr(stat_line(2), 56, 5)) > 0

      convert_base $substr(stat_line(1), 18, 3) 3, 8 ..
            convert_variable "     PPU_Number to 3 char octal string"
      output_line(6) = convert_variable
      convert_base $substr(stat_line(1), 38, 3) 3, 8, ..
            convert_variable "    Channel_Number conversion"
      output_line(6) = output_line(6) // convert_variable
      convert_base $substr(stat_line(1), 59, 2) 3, 8 ..
            convert_variable "  Equipment_Number to 3 char octal string"
      output_line(6) = output_line(6) // convert_variable
      convert_base $substr(stat_line(1), 78, 3) 4, 8, ..
            convert_variable "   Unit_Number conversion"
      output_line(6) = output_line(6) // convert_variable

      convert_base $substr(stat_line(2), 17, 4) 4, 10, ..
            convert_variable "    Equipment_Type to 4 char decimal string"
      output_line(6) = convert_variable // output_line(6)
      convert_base $substr(stat_line(2), 37, 4) 4, 10, ..
            convert_variable "     Op_Code conversion"
      output_line(6) = convert_variable // output_line(6)

      convert_base $substr(stat_line(5), 37, 4) 4, 10, ..
            convert_variable "   Retry conversion"
      output_line(6) = output_line(6) // convert_variable

      convert_base $substr(stat_line(4), 13, 8) 8, 10, ..
            convert_variable "      Current_Block_Count conversion"
      output_line(9) = ' BLK CNTS: CUR= ' // convert_variable
      convert_base $substr(stat_line(3), 33, 8) 8, 10, ..
            convert_variable "    Blocks_Read conversion"
      output_line(9) = output_line(9) // ' READ= ' // convert_variable
      convert_base $substr(stat_line(3), 13, 8) 8, 10, ..
            convert_variable "    Blocks_Written conversion"
      output_line(9) = output_line(9) // ' WRITTEN= ' // convert_variable
      convert_base $substr(stat_line(4), 33, 8) 8, 10, ..
            convert_variable "    Absolute file/tape mark from load point"
      output_line(9) = output_line(9) // ' FILE MKS= ' // convert_variable

      convert_base $substr(stat_line(4), 49, 12) 12, 8, ..
            convert_variable "    Format_Request conversion"
      output_line(7) = ' FORMAT= ' // convert_variable
      convert_base $substr(stat_line(5), 19, 2) 2, 8, ..
            convert_variable "                Recovery type performed"
      output_line(7) = output_line(7) // ' RCV TYP= ' // convert_variable // ..
            '   '
      convert_base $substr(stat_line(4), 77, 4) 5, 10, ..
            convert_variable "                    Density conversion"
      output_line(6) = output_line(6) // convert_variable
      convert_base $substr(stat_line(5), 57, 4) 5, 8, ..
            convert_variable "               Hardware Function Conversion"
      output_line(6) = output_line(6) // convert_variable // ' '

      output_line(8) = '                                    '
      output_line(10) = ' '

      "         Convert all 12-bit status in following loop"
      convert_to_octal_bytes $substr(stat_line(5), 61, 20), convert_variable, ..
            status=local_status
      tape_status(1) = $substr(convert_variable, 1, 4)
      tape_status(2) = $substr(convert_variable, 5, 4)
      tape_status(3) = $substr(convert_variable, 9, 4)

      output_line(6) = output_line(6) // '/' // tape_status(1) // '/' // ..
            tape_status(2) // '/' // tape_status(3) // '   '

      recovered_70_code = ($substr(tape_status(3), 3, 2) = '70')

      IF recovered_70_code Then
"  get word 10 of status to obtain adapter error code"
        convert_to_octal_bytes $substr(stat_line(6), 21, 20), convert_variable,..
               status=local_status
        output_line(7) = output_line(7) // ' ADPT ERR CODE (DS WORD 10)= '..
               // $substr(convert_variable, 5, 4) // '(8)'
      ELSE
        stat_count = 0
        line_pointer = 6
        column_pointer = 61
        FOR i = 1 TO 5 DO
          IF column_pointer = 81 THEN
            column_pointer = 1
            line_pointer = line_pointer + 1
          IFEND

          convert_base $substr(stat_line(line_pointer), column_pointer, 20), 16..
                , 16, convert_variable, status=local_status
          FOR j = 0 TO 7 DO
            byte_status(stat_count) = $substr(convert_variable, (2*j+1), 2)
            stat_count = stat_count + 1
            EXIT WHEN (stat_count = 35)
          FOREND
          column_pointer = column_pointer + 20
        FOREND

        output_line(8) = '                                    '
        FOR i = 0 TO 7 DO
          output_line(6) = output_line(6) // '/' // byte_status(i)
        FOREND
        FOR i = 8 TO 20 DO
          output_line(7) = output_line(7) // '/' // byte_status(i)
          output_line(8) = output_line(8) // '/' // byte_status(i + 14)
        FOREND
        output_line(7) = output_line(7) // '/' // byte_status(21)
      IFEND

      IF unrec_failure THEN
        output_line(11) = '              Final status for an   '
        output_line(12) = '              unrecovered failure   '
        output_line(13) = '                                    '

        convert_to_octal_bytes $substr(stat_line(8), 1, 20), convert_variable, ..
              status=local_status
        tape_status(1) = $substr(convert_variable, 1, 4)
        tape_status(2) = $substr(convert_variable, 5, 4)
        tape_status(3) = $substr(convert_variable, 9, 4)
        output_line(11) = output_line(11) // '/' // tape_status(1) // '/' // ..
              tape_status(2) // '/' // tape_status(3) // '   '

        unrecovered_70_code = ($substr(tape_status(3), 3, 2) = '70')

        IF unrecovered_70_code Then
"  get word 10 of status to get sub_error code"
          convert_to_octal_bytes $substr(stat_line(8), 41, 20), ..
                convert_variable, status=local_status
          output_line(12) = output_line(12) // ' ADPT ERR CODE (DS WORD 10)= '..
                 // $substr(convert_variable, 5, 4) // '(8)'
        ELSE
          stat_count = 0
          line_pointer = 9
          column_pointer = 1
          FOR i = 1 TO 5 DO
            IF column_pointer = 81 THEN
              column_pointer = 1
              line_pointer = line_pointer + 1
            IFEND

            convert_base $substr(stat_line(line_pointer), column_pointer, 20), ..
                  16, 16, convert_variable, status=local_status
            FOR j = 0 TO 7 DO
              byte_status(stat_count) = $substr(convert_variable, (2*j+1), 2)
              stat_count = stat_count + 1
              EXIT WHEN (stat_count = 35)
            FOREND
            column_pointer = column_pointer + 20
          FOREND

          FOR i = 0 TO 7 DO
            output_line(11) = output_line(11) // '/' // byte_status(i)
          FOREND
          FOR i = 8 TO 20 DO
            output_line(12) = output_line(12) // '/' // byte_status(i)
            output_line(13) = output_line(13) // '/' // byte_status(i + 14)
          FOREND
          output_line(12) = output_line(12) // '/' // byte_status(21)
        IFEND
      IFEND

      statistic_counter = statistic_counter + 1

      put_line ' '//output_line(5) $fname(out_name)
      put_line ' '//output_line(6) $fname(out_name)
      put_line ' '//output_line(7) $fname(out_name)
      IF NOT recovered_70_code THEN
        put_line ' '//output_line(8) $fname(out_name)
      IFEND
      IF unrec_failure THEN
        put_line ' '//output_line(11) $fname(out_name)
        put_line ' '//output_line(12) $fname(out_name)
        IF NOT unrecovered_70_code THEN
          put_line ' '//output_line(13) $fname(out_name)
        IFEND
      IFEND
      put_line ' '//output_line(9) $fname(out_name)
      put_line ' '//output_line(10) $fname(out_name)
    IFEND
    line = ''
    accept_line line $fname(out_file_4//'.$asis') ..
          line_count=lines_read "try next line"

  WHILEND

  IF statistic_counter = 0 THEN
    put_line '  THERE ARE NO ISMT TAPE ERRORS IN THE DESIGNATED LOG ' ..
          output=$fname(out_name)
  ELSE
    put_line '  END OF ISMT TAPE ERRORS  ' output=$fname(out_name)
  IFEND

  IF time_study THEN
    put_line ' ' output=$fname(out_name)
    put_line '  THE NUMBER OF STATISTICS IS  '//$strrep(statistic_counter) ..
          output=$fname(out_name)
    display_job_data display_format=incremental output=$fname(out_name)
  IFEND

  detach_file $fname(out_file_2)
  detach_file $fname(out_file_4)

PROCEND display_hpa_tape_detail
