?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE System : Deadstart code' ??
MODULE sym$deadstart;

{ PURPOSE:
{   This module contains deadstart procedures that are common to the boot and to system core.

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc dse$error_codes
*copyc dst$rb_system_deadstart_status
*copyc osc$processor_defined_registers
*copyc ost$iou_model_number
*copyc ost$processor_model_number
*copyc syc$ssr_system_level_number
*copyc syc$copyright
?? POP ??
*copyc clp$convert_integer_to_string
*copyc dpp$open_window
*copyc dpp$put_critical_message
*copyc dsp$get_entry_from_ssr
*copyc i#call_monitor
*copyc osp$set_status_abnormal
*copyc osp$system_error
*copyc syp$display_deadstart_message
*copyc syp$process_deadstart_status
?? EJECT ??
*copyc dpv$critical_display_id
*copyc dpv$system_core_display
*copyc dsv$mainframe_type
*copyc dsv$sub_mainframe_type
*copyc mtv$nst_p
?? OLDTITLE ??
?? NEWTITLE := 'syp$check_system_level', EJECT ??

{ PURPOSE:
{   This procedure checks that the system level in the SSR matches VCB and system core.

  PROCEDURE [XDCL] syp$check_system_level;

    VAR
      error_message: string (80),
      integer_string: ost$string,
      rb: dst$rb_system_deadstart_status,
      status: ost$status,
      sysl_entry: dst$ssr_entry;

    dpp$put_critical_message (syc$copyright_message, status);

    { Check the system level number in the SSR for compatibility between VCB and system core.

    dsp$get_entry_from_ssr (dsc$ssr_system_level_number, sysl_entry);

    IF (sysl_entry.ssln_released_level_number <> syc$ssln_released_level_number) OR
          (sysl_entry.ssln_bcu_level_number <> syc$ssln_bcu_level_number) THEN

      { Display VCB/system core and SSR level numbers, issue error message and halt system initialization.

      syp$display_deadstart_message ('System component level numbers follow:');
      syp$display_deadstart_message ('  OS level number equals:');
      clp$convert_integer_to_string (syc$ssln_released_level_number, 10, TRUE, integer_string, status);
      error_message := '    Release level number equals ';
      error_message (33, integer_string.size) := integer_string.value (1, integer_string.size);
      error_message (33+integer_string.size, 1) := '.';
      syp$display_deadstart_message (error_message);
      error_message := '    BCU level number equals ';
      error_message (29, integer_string.size) := integer_string.value (1, integer_string.size);
      error_message (29+integer_string.size, 1) := '.';
      syp$display_deadstart_message (error_message);

      syp$display_deadstart_message ('  SSR level number equals:');
      clp$convert_integer_to_string (sysl_entry.ssln_released_level_number, 10, TRUE, integer_string, status);
      error_message := '    Release level number equals ';
      error_message (33, integer_string.size) := integer_string.value (1, integer_string.size);
      error_message (33+integer_string.size, 1) := '.';
      syp$display_deadstart_message (error_message);
      error_message := '    BCU level number equals ';
      error_message (29, integer_string.size) := integer_string.value (1, integer_string.size);
      error_message (29+integer_string.size, 1) := '.';
      syp$display_deadstart_message (error_message);

      rb.reqcode := syc$rc_system_deadstart_status;
      rb.action := dsc$rb_sds_set_bct_flag;
      rb.bct_flags := dsc$rb_sds_bct_ts_by_error;
      i#call_monitor (#LOC (rb), #SIZE (rb));

      osp$set_status_abnormal (dsc$display_processor_id, dse$system_level_mismatch,
            'OS and SSR system levels do not match.', status);
      syp$process_deadstart_status ('Mismatching NOS/VE components.', TRUE, status);
    IFEND;

  PROCEND syp$check_system_level;
?? OLDTITLE ??
?? NEWTITLE := 'syp$determine_mainframe_type', EJECT ??

{ PURPOSE:
{   This procedure checks the model number in the element id register to build the mainframe type variable.

  PROCEDURE [XDCL] syp$determine_mainframe_type;

    TYPE
      t$integer_or_element_id = RECORD
        CASE boolean OF
        = TRUE =
          integer_part: integer,
        = FALSE =
          rfu: 0 .. 0ffffffff(16),
          element_number: 0 .. 0ff(16),
          model_number: 0 .. 0ff(16),
          serial_number: 0 .. 0ffff(16),
        CASEND,
      RECEND;

    VAR
      rb: dst$rb_system_deadstart_status,
      integer_or_element_id: t$integer_or_element_id;

    integer_or_element_id.integer_part := #READ_REGISTER (osc$pr_element_id);
    CASE integer_or_element_id.model_number OF
    = osc$cyber_180_model_810, osc$cyber_180_model_815, osc$cyber_180_model_825, osc$cyber_180_model_830 =
      dsv$mainframe_type := dsc$mt_lower_8xx_mainframe;
    = osc$cyber_180_model_835 =
      dsv$mainframe_type := dsc$mt_835_mainframe;
    = osc$cyber_180_model_840, osc$cyber_180_model_840s, osc$cyber_180_model_845, osc$cyber_180_model_845s,
            osc$cyber_180_model_850, osc$cyber_180_model_855, osc$cyber_180_model_855s,
            osc$cyber_180_model_860 =
      dsv$mainframe_type := dsc$mt_upper_8xx_mainframe;
    = osc$cyber_180_model_990, osc$cyber_180_model_990e =
      dsv$mainframe_type := dsc$mt_990_mainframe;
    = osc$cyber_180_model_9301, osc$cyber_180_model_9303, osc$cyber_180_model_930a, osc$cyber_180_model_930b,
            osc$cyber_180_model_930c, osc$cyber_180_model_930d, osc$cyber_900_model_9321,
            osc$cyber_900_model_9323, osc$cyber_900_model_932a, osc$cyber_900_model_932b =
      dsv$mainframe_type := dsc$mt_93x_mainframe;
    = osc$cyber_900_model_9601, osc$cyber_900_model_9603, osc$cyber_900_model_960c,
          osc$cyber_900_model_960d =
            rb.reqcode := syc$rc_system_deadstart_status;
            rb.action := dsc$rb_sds_fetch_element_id;
            i#call_monitor (#LOC (rb), #SIZE (rb));
          IF rb.iou_model = dsc$rb_model_44 THEN
            dsv$mainframe_type := dsc$mt_962_972_mainframe;
          ELSE
            dsv$mainframe_type := dsc$mt_960_970_mainframe;
          IFEND;
      IF (integer_or_element_id.model_number = osc$cyber_900_model_960c) OR
            (integer_or_element_id.model_number = osc$cyber_900_model_960d) THEN
        dsv$sub_mainframe_type := dsc$smt_soviet_mainframe;
      IFEND;
    = osc$cyber_900_model_992, osc$cyber_900_model_992a =
      dsv$mainframe_type := dsc$mt_992_mainframe;
      IF integer_or_element_id.model_number = osc$cyber_900_model_992a THEN
        dsv$sub_mainframe_type := dsc$smt_china_mainframe;
      IFEND;
    = osc$cyber_900_model_994 =
      dsv$mainframe_type := dsc$mt_994_mainframe;
    = osc$cyber_2000_model_20s1, osc$cyber_2000_model_20u1, osc$cyber_2000_model_20v1 =
      dsv$mainframe_type := dsc$mt_2000_mainframe;
    ELSE
      osp$system_error ('Unknown mainframe type', NIL);
    CASEND;

  PROCEND syp$determine_mainframe_type;
?? OLDTITLE ??
?? NEWTITLE := 'syp$prepare_deadstart_display', EJECT ??

{ PURPOSE:
{   This procedure is called during deadstart to open the deadstart display and
{   to output the copyright message.

  PROCEDURE [XDCL] syp$prepare_deadstart_display;

    VAR
      status: ost$status;

    dpp$open_window (dpc$wc_sharing, dpc$wk_interactive, 'NEPTUN', dpv$critical_display_id, status);

    dpp$open_window (dpc$wc_sharing, dpc$wk_interactive, 'NEPTUN Deadstart Command Processor.',
          dpv$system_core_display, status);

  PROCEND syp$prepare_deadstart_display;
?? OLDTITLE ??
MODEND sym$deadstart;
