PROCEDURE dum$select_active_job_list, select_active_job_list, selajl (
  ajl_ordinal, ao: integer = $required
  output, o: file = $output
  status)

  VAR
    cctqm: string 1..256 = '???????????????????????????????? !"#$%&''()*+,-./0123456789:;'//..
          '<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~????????????????'//..
          '???????????????????????????????????????????????????????????????????????????????????'//..
          '??????????????????????????????'
    jmv$jcb: integer = 300000000(16)              "($sa(jmv$jcb))
    job_fixed_seg_num: integer = 14(16)           "relative to monitor address space
    job_monitor_xcb_offset: integer = 100(16)     "from start of job fixed
  VAREND

  VAR
    ajl: integer
    ajl_entry: integer
    ajl_entry_size: integer
    ajl_p: integer
    field_length: integer
    field_offset: integer
    ijle_p_offset: integer
    job_name: integer
    line: string
    local_status: status
    number_of_entries: integer
    output_file: file
    pva: integer
    system_ajl_ordinal: integer
    user_id: integer
  VAREND

  IF $file(output open_position) = '$BOI' THEN
    delete_file f=output status=local_status
  IFEND
  output_file = output.$eoi

  jmt$job_control_block field=JOBNAME offset=field_offset length=field_length
  job_name = field_offset/8            "offset into job control block
  jmt$job_control_block field=USER_ID offset=field_offset length=field_length
  user_id = field_offset/8             "offset into job control block

  change_default e=monitor am=pva
  ajl_p = $symbol_address(jmv$ajl_p)
  ajl = $memory(ajl_p)
  IF $nil_pva(ajl) THEN
    put_line l=' The active job list has not yet been established.' o=output_file
    EXIT PROCEDURE
  IFEND

  ajl_entry_size = $memory(ajl_p+14 4)
  system_ajl_ordinal = $memory(ajl_p+10 4)
  number_of_entries = $memory(ajl_p+6 4) / ajl_entry_size

  change_processor_register ..
        jps=$rma(((system_ajl_ordinal + job_fixed_seg_num)*100000000(16))+job_monitor_xcb_offset)
  change_default e=job

  IF ajl_ordinal > (system_ajl_ordinal + number_of_entries - 1) THEN
    put_line l=' The selected ordinal is beyond the end of the active job list.' o=output_file
    EXIT PROCEDURE
  IFEND

  ajl_entry = ajl + (ajl_ordinal * ajl_entry_size)

  IF $memory(ajl_entry, 3) <= 0 THEN
    put_line l=' ajl entry '//$strrep(ajl_ordinal)//' is not currently active.' o=output_file
    EXIT PROCEDURE
  IFEND

  line = ' '//$strrep(ajl_ordinal)//'. '
  pva = ((ajl_ordinal + job_fixed_seg_num) * 100000000(16)) + job_monitor_xcb_offset
  change_processor_register jps=$rma(pva monitor)
  change_default e=job
  IF ajl_ordinal <> system_ajl_ordinal THEN
    line = line//', jn = '//$trim($translate(cctqm $memory_string(jmv$jcb+job_name 31)))
  IFEND
  line = line//', user id = '//$trim($translate(cctqm $memory_string(jmv$jcb+user_id 31)))
  put_line l=line o=output_file

  IF $variable(duv$ajl_entry, declared) = 'UNKNOWN' THEN
    VAR
      duv$ajl_entry: (UTILITY) integer
    VAREND
  ELSE
    VAR
      duv$ajl_entry: (XREF) integer
    VAREND
  IFEND
  duv$ajl_entry = ajl_entry

  jmt$active_job_list_entry field=ijle_p offset=field_offset length=field_length
  ijle_p_offset = field_offset/8          "offset into job control block

  IF $variable(duv$ijl_entry, declared) = 'UNKNOWN' THEN
    VAR
      duv$ijl_entry: (UTILITY) integer
    VAREND
  ELSE
    VAR
      duv$ijl_entry: (XREF) integer
    VAREND
  IFEND
  duv$ijl_entry = $mem(duv$ajl_entry+ijle_p_offset)

  put_line l=' ajl = '//$strrep(duv$ajl_entry 16)//', ijl = '//$strrep(duv$ijl_entry 16) o=output_file

PROCEND dum$select_active_job_list
