home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gdb-4.16-base.tgz / gdb-4.16-base.tar / fsf / gdb / utils / amd-udi / mondfe / commands.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-23  |  19.0 KB  |  603 lines

  1. static char _[] = " @(#)commands.c    5.23 93/08/23 15:30:30, Srini, AMD ";
  2. /******************************************************************************
  3.  * Copyright 1992 Advanced Micro Devices, Inc.
  4.  *
  5.  * This software is the property of Advanced Micro Devices, Inc  (AMD)  which
  6.  * specifically  grants the user the right to modify, use and distribute this
  7.  * software provided this notice is not removed or altered.  All other rights
  8.  * are reserved by AMD.
  9.  *
  10.  * AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS
  11.  * SOFTWARE.  IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL
  12.  * DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR
  13.  * USE OF THIS SOFTWARE.
  14.  *
  15.  * So that all may benefit from your experience, please report  any  problems
  16.  * or  suggestions about this software to the 29K Technical Support Center at
  17.  * 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131  in  the  UK,  or
  18.  * 0031-11-1129 in Japan, toll free.  The direct dial number is 512-462-4118.
  19.  *
  20.  * Advanced Micro Devices, Inc.
  21.  * 29K Support Products
  22.  * Mail Stop 573
  23.  * 5900 E. Ben White Blvd.
  24.  * Austin, TX 78741
  25.  * 800-292-9263
  26.  *****************************************************************************
  27.  *      Engineer: Srini Subramanian.
  28.  *****************************************************************************
  29.  **       This file contains the functions associated with
  30.  **       commands used by the main program.  In general,
  31.  **       the commands in this file are fairly simple and
  32.  **       were not given a source file of their own.
  33.  *****************************************************************************
  34.  */
  35.  
  36. #include <stdio.h>
  37. #include <ctype.h>
  38. #include "memspcs.h"
  39. #include "main.h"
  40. #include "monitor.h"
  41. #include "macros.h"
  42. #include "help.h"
  43. #include "miniint.h"
  44. #include "error.h"
  45.  
  46. #ifdef MSDOS
  47. #include <stdlib.h>
  48. #include <string.h>
  49. #else
  50. #include <strings.h>
  51. #endif
  52.  
  53.  
  54. extern    int   get_addr_29k PARAMS((char *, struct addr_29k_t *));
  55. extern    int   addr_29k_ok PARAMS((struct addr_29k_t *));
  56.  
  57. extern    int   get_word PARAMS((char *, INT32 *));
  58.  
  59. /*
  60. ** Global variables
  61. */
  62.  
  63. static char *processor_name[] = {
  64.    /*  0 */   "Am29000",
  65.    /*  1 */   "Am29005",
  66.    /*  2 */   "Am29050",
  67.    /*  3 */   "Am29035",
  68.    /*  4 */   "Am29030",
  69.    /*  5 */   "Am29200",
  70.    /*  6 */   "Am29240",
  71.    /*  7 */   "Cougar",
  72.    /*  8 */   "TBA",
  73.    /* 9 */    "TBA"
  74.    };
  75. #define    NO_PROCESSOR    9
  76.  
  77. static char *coprocessor_name[] = {
  78.    /*  0 */   "None",
  79.    /*  1 */   "Am29027 (revision A)",
  80.    };
  81.  
  82. static char *io_control_name[] = {
  83.    /*  0 */   "Console controlled by target.",
  84.    /*  1 */   "Console controlled by host."
  85.    };
  86.  
  87.  
  88.  
  89. /*
  90. ** This command is used to print out the configuration
  91. ** of the system.  This includes both host and target
  92. ** configurations.
  93. **
  94. ** This command also re-allocates the message buffers
  95. ** and the breakpoint array.  This permits this command
  96. ** to be used to re-configure the host for a new target
  97. ** without restarting the monitor.  This is useful in cases
  98. ** where the target is reset or changed.
  99. */
  100.  
  101. INT32
  102. config_cmd(token, token_count)
  103.    char   *token[];
  104.    int     token_count;
  105.    {
  106.    int     processor;
  107.    int     coprocessor;
  108.    char    revision;
  109.    char        prtbuf[256];
  110.  
  111.    INT32    retval;
  112.  
  113.  
  114.    /* Get target CONFIG */
  115.    if ((retval = Mini_config_req(&target_config, &versions_etc)) != SUCCESS) {
  116.      return(retval);
  117.    }; 
  118.    /* If returned SUCCESSfully do the rest */
  119.    
  120.  
  121.  
  122.    /* Print out configuration information
  123.    ** Note:  a -1 is no coprocessor present, 0 is an
  124.    **        Am29027 (revision A), etc ...  To get
  125.    **        the array index for the coprocessor_name,
  126.    **        add one to the target_config.coprocessor.
  127.    */
  128.  
  129. /* ----------------------------------------------------------------- */
  130.    sprintf(&prtbuf[0], "\n");
  131.    sprintf(&prtbuf[strlen(prtbuf)], "                MiniMON29K R 3.0 Debugger Front End.\n");
  132.    if (io_config.echo_mode == (INT32) TRUE)
  133.       fprintf (io_config.echo_file, "%s", &prtbuf[0]);
  134.    fprintf (stderr, "%s", &prtbuf[0]);
  135.  
  136. /* ----------------------------------------------------------------- */
  137.    sprintf(&prtbuf[0], "            Copyright 1993 Advanced Micro Devices, Inc.\n");
  138.    sprintf(&prtbuf[strlen(prtbuf)], "                       Version %s (%s)\n",
  139.           host_config.version,
  140.           host_config.date);
  141.    if (io_config.echo_mode == (INT32) TRUE)
  142.       fprintf (io_config.echo_file, "%s", &prtbuf[0]);
  143.    fprintf (stderr, "%s", &prtbuf[0]);
  144.  
  145. /* ----------------------------------------------------------------- */
  146.    sprintf(&prtbuf[0], "\n");
  147.    if (target_config.processor_id == (UINT32) -1)
  148.       sprintf(&prtbuf[strlen(prtbuf)], "\tProcessor type:            %s \n", processor_name[NO_PROCESSOR]);
  149.  
  150.    else {
  151.  
  152.       if ((target_config.processor_id & 0x58) == 0x58) {
  153.     revision = (char) ('A' + (target_config.processor_id & 0x07));
  154.         sprintf(&prtbuf[strlen(prtbuf)], "\tProcessor type:            %s (revision %c)\n", "Am29205", (char) revision);
  155.  
  156.       } else {
  157.  
  158.       processor = (int) (target_config.processor_id >> 4);
  159.       revision = (char) ('A' + (target_config.processor_id & 0x0f));
  160.       sprintf(&prtbuf[strlen(prtbuf)], "\tProcessor type:            %s (revision %c)\n", processor_name[processor], revision);
  161.  
  162.       }
  163.  
  164.    }
  165.  
  166.    if (io_config.echo_mode == (INT32) TRUE)
  167.       fprintf (io_config.echo_file, "%s", &prtbuf[0]);
  168.    fprintf (stderr, "%s", &prtbuf[0]);
  169. /* ----------------------------------------------------------------- */
  170.       coprocessor = (int) target_config.coprocessor + 1;
  171.       sprintf(&prtbuf[0], "\tCoprocessor:               %s\n",
  172.           coprocessor_name[coprocessor]);
  173. /* ----------------------------------------------------------------- */
  174.    if ((target_config.ROM_start == (ADDR32) -1) && 
  175.                 (target_config.ROM_size == (INT32) -1)) {
  176.       sprintf(&prtbuf[strlen(prtbuf)], "\tROM range:                 Unavailable\n");
  177.    } else {
  178.       sprintf(&prtbuf[strlen(prtbuf)], "\tROM range:                 0x%lx to 0x%lx (%luK)\n",
  179.           target_config.ROM_start,
  180.           (target_config.ROM_start + (ADDR32) target_config.ROM_size - 1),
  181.           (unsigned long) target_config.ROM_size/1024);
  182.    }
  183.    if (io_config.echo_mode == (INT32) TRUE)
  184.       fprintf (io_config.echo_file, "%s", &prtbuf[0]);
  185.    fprintf (stderr, "%s", &prtbuf[0]);
  186. /* ----------------------------------------------------------------- */
  187.    if ((target_config.I_mem_start == (ADDR32) -1) &&
  188.             (target_config.I_mem_size == (INT32) -1)) {
  189.       sprintf(&prtbuf[0], "\tInstruction memory range:  Unavailable\n");
  190.    } else {
  191.       sprintf(&prtbuf[0], "\tInstruction memory range:  0x%lx to 0x%lx (%luK)\n",
  192.           target_config.I_mem_start,
  193.           (target_config.I_mem_start + (ADDR32) target_config.I_mem_size - 1),
  194.           (unsigned long) target_config.I_mem_size/1024);
  195.    }
  196. /* ----------------------------------------------------------------- */
  197.    if ((target_config.D_mem_start == (ADDR32) -1) &&
  198.             (target_config.D_mem_size == (INT32) -1)) {
  199.       sprintf(&prtbuf[strlen(prtbuf)], "\tData memory range:         Unavailable\n");
  200.    } else {
  201.       sprintf(&prtbuf[strlen(prtbuf)], "\tData memory range:         0x%lx to 0x%lx (%luK)\n",
  202.           target_config.D_mem_start,
  203.           (target_config.D_mem_start + (ADDR32) target_config.D_mem_size - 1),
  204.           (unsigned long) target_config.D_mem_size/1024);
  205.    }
  206.    if (io_config.echo_mode == (INT32) TRUE)
  207.       fprintf (io_config.echo_file, "%s", &prtbuf[0]);
  208.    fprintf (stderr, "%s", &prtbuf[0]);
  209. /* ----------------------------------------------------------------- */
  210.    sprintf(&prtbuf[0], "\n");
  211.    sprintf(&prtbuf[strlen(prtbuf)], "\t        (Enter 'h' or '?' for help)\n");
  212.    sprintf(&prtbuf[strlen(prtbuf)], "\n");
  213.    if (io_config.echo_mode == (INT32) TRUE)
  214.       fprintf (io_config.echo_file, "%s", &prtbuf[0]);
  215.    fprintf (stderr, "%s", &prtbuf[0]);
  216. /* ----------------------------------------------------------------- */
  217.  
  218.    return (SUCCESS);
  219.  
  220.    }  /* end config_cmd() */
  221.  
  222.  
  223.  
  224.  
  225. /*
  226. ** This command is used to print out help information.
  227. */
  228.  
  229. INT32
  230. help_cmd(token, token_count)
  231.    char   *token[];
  232.    int     token_count;
  233.    {
  234.    int   i;
  235.    char **help_ptr;
  236.  
  237.    if (((strcmp(token[0], "h") != 0) &&
  238.         (strcmp(token[0], "?") != 0)) ||
  239.        (token_count > 2))
  240.       return (EMSYNTAX);
  241.  
  242.    if (token_count == 1) {
  243.       help_ptr = help_main;
  244.       }
  245.    else
  246.    /* Print command-specific help line */
  247.    if (token_count == 2) 
  248.       switch (*token[1]) {
  249.          case 'a':  help_ptr = help_a;
  250.                     break;
  251.          case 'b':  help_ptr = help_b;
  252.                     break;
  253.          case 'c':  
  254.             if (strcmp(token[1], "caps") == 0)
  255.               help_ptr = help_caps;
  256.             else if (strcmp(token[1], "cp") == 0)
  257.               help_ptr = help_cp;
  258.             else if (strcmp(token[1], "con") == 0)
  259.               help_ptr = help_con;
  260.             else if (strcmp(token[1], "ch0") == 0)
  261.               help_ptr = help_ch0;
  262.             else 
  263.               help_ptr = help_c;
  264.                     break;
  265.          case 'd':  help_ptr = help_d;
  266.             if (strcmp(token[1], "disc") == 0)
  267.               help_ptr = help_disc;
  268.             else if (strcmp(token[1], "dp") == 0)
  269.               help_ptr = help_dp;
  270.                     break;
  271.          case 'e':  help_ptr = help_e;
  272.             if (strcmp(token[1], "ex") == 0)
  273.               help_ptr = help_ex;
  274.             else if (strcmp(token[1], "esc") == 0)
  275.               help_ptr = help_esc;
  276.             else if (strcmp(token[1], "eon") == 0)
  277.               help_ptr = help_eon;
  278.             else if (strcmp(token[1], "eoff") == 0)
  279.               help_ptr = help_eon;
  280.                     break;
  281.          case 'f':  help_ptr = help_f;
  282.                     break;
  283.          case 'g':  help_ptr = help_g;
  284.                     break;
  285.          case 'h':  help_ptr = help_h;
  286.                     break;
  287.          case 'i':  help_ptr = help_i;
  288.             if (strcmp (token[1],"init") == 0)
  289.               help_ptr = help_init;
  290.                     break;
  291.          case 'k':  help_ptr = help_k;
  292.                     break;
  293.          case 'l':  help_ptr = help_l;
  294.             if (strcmp (token[1], "logon") == 0)
  295.               help_ptr = help_logon;
  296.             else if (strcmp (token[1], "logoff") == 0)
  297.               help_ptr = help_logon;
  298.                     break;
  299.          case 'm':  help_ptr = help_m;
  300.                     break;
  301.      case 'p':  help_ptr = help_pid;
  302.             break;
  303.          case 'q':  help_ptr = help_q;
  304.             if (strcmp(token[1], "qon") == 0)
  305.               help_ptr = help_qoff;
  306.             else if (strcmp(token[1], "qoff") == 0)
  307.               help_ptr = help_qoff;
  308.                     break;
  309.          case 'r':  help_ptr = help_r;
  310.                     break;
  311.          case 's':  help_ptr = help_s;
  312.             if (strcmp(token[1], "sid") == 0)
  313.               help_ptr = help_sid;
  314.                     break;
  315.          case 't':  help_ptr = help_t;
  316.             if (strcmp(token[1], "tip") == 0)
  317.               help_ptr = help_tip;
  318.                     break;
  319.          case 'x':  help_ptr = help_x;
  320.                     break;
  321.          case 'y':  help_ptr = help_y;
  322.                     break;
  323.      case 'z':  help_ptr = help_zc;
  324.             if (strcmp(token[1], "ze") == 0)
  325.               help_ptr = help_ze;
  326.             else if (strcmp(token[1], "zl") == 0)
  327.               help_ptr = help_zl;
  328.             break;
  329.          default:   help_ptr = help_main;
  330.                     break;
  331.          }  /* end switch */
  332.    else
  333.       /* Too many parameters */
  334.       return (EMSYNTAX);
  335.  
  336.  
  337.    i=0;
  338.    while (*help_ptr[i] != '\0') {
  339.       fprintf(stderr, "\n%s", help_ptr[i]);
  340.       if (io_config.echo_mode == (INT32) TRUE)
  341.          fprintf (io_config.echo_file, "\n%s", help_ptr[i]);
  342.       i=i+1;
  343.       }  /* end while */
  344.    fprintf(stderr, "\n");
  345.    if (io_config.echo_mode == (INT32) TRUE)
  346.       fprintf(io_config.echo_file, "\n");
  347.  
  348.    return (SUCCESS);
  349.    }  /* end help_cmd() */
  350.  
  351.  
  352.  
  353. /*
  354. ** This command toggles control of the keyboard between
  355. ** TERM_USER and TERM_29K.
  356. **
  357. **  IMPORTANT NOTE
  358. **   This command is no longer used.  It was an attempt to
  359. ** toggle control between the host and the target when the
  360. ** target is displaying output and accepting input.
  361. **  The UDI methodology allows this control to be handled by the
  362. ** UDIWait procedures.  Hence, this io_toggle_cmd is not used.
  363. **  It is left here only as an historical anomoly
  364. **
  365. **  The i command is now used for ix, ia, il the 2903x cashe
  366. ** which is contained in the monitor.c code.
  367. **  END OF IMPORTANT NOTE
  368. */
  369.  
  370. INT32
  371. io_toggle_cmd(token, token_count)
  372.    char   *token[];
  373.    int     token_count;
  374.    {
  375.  
  376.    if ((strcmp(token[0], "io_toggle") != 0) ||
  377.        (token_count != 1))
  378.       return (EMSYNTAX);
  379.  
  380.    if (io_config.io_control == TERM_29K)
  381.       io_config.io_control = TERM_USER;
  382.    else
  383.    if (io_config.io_control == TERM_USER)
  384.       io_config.io_control = TERM_29K;
  385.    else
  386.       return(EMFAIL);
  387.  
  388.    fprintf(stderr, "%s\n", io_control_name[io_config.io_control]);
  389.    if (io_config.echo_mode == (INT32) TRUE)
  390.      fprintf(io_config.echo_file, "%s\n", io_control_name[io_config.io_control]);
  391.  
  392.    return(0);
  393.  
  394.    }  /* end io_toggle_cmd() */
  395.  
  396.  
  397.  
  398.  
  399. /*
  400. ** This command send a BREAK message to the target.  This
  401. ** should halt execution of user code.  A HALT message should
  402. ** be returned by the target.  This function deos not, however,
  403. ** wait for the HALT message.
  404. */
  405.  
  406. INT32
  407. kill_cmd(token, token_count)
  408.    char   *token[];
  409.    int     token_count;
  410.    {
  411.    int result;
  412.    INT32    retval;
  413.  
  414.    result = -1;
  415.    if ((strcmp(token[0], "k") != 0) ||
  416.        (token_count != 1))
  417.       return (EMSYNTAX);
  418.  
  419.    if ((retval = Mini_break()) != SUCCESS) {
  420.       return(FAILURE);
  421.    };
  422.    return(SUCCESS);
  423.  
  424.    }  /* end kill_cmd() */
  425.  
  426.  
  427.  
  428. /*
  429. ** This command send a RESET message to the target.  This
  430. ** should restart the target code.  A HALT message should
  431. ** be returned by the target.  This function deos not, however,
  432. ** wait for the HALT message.
  433. */
  434.  
  435. INT32
  436. reset_cmd(token, token_count)
  437.    char   *token[];
  438.    int     token_count;
  439.    {
  440.    int result;
  441.    INT32    retval;
  442.  
  443.    result = -1;
  444.    if ((strcmp(token[0], "r") != 0) ||
  445.        (token_count != 1))
  446.       return (EMSYNTAX);
  447.  
  448.    if ((retval = Mini_reset_processor()) != SUCCESS) {
  449.       return(FAILURE);
  450.    } else
  451.       return(SUCCESS);
  452.  
  453.    }  /* end reset_cmd() */
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461. /*
  462. ** This command is used to display the versions of the various
  463. ** MINIMON 29K modules.  First the version of the host code and
  464. ** its date is printed from the global data structure "host_config".
  465. ** Next the montip version field and date is printed from
  466. ** the VERSION_SPACE UDIRead call.  This is an ascii zero terminated 
  467. ** field of ** less than 11 characters.
  468. ** Next the "version" field in the "target_config" data structure is
  469. ** printed.  This "version field is encoded as follows:
  470. **
  471. **           Bits  0 -  7:  Target debug core version
  472. **           Bits  8 - 15:  Configuration version
  473. **           Bits 16 - 23:  Message system version
  474. **           Bits 24 - 31:  Communication driver version
  475. **
  476. ** Each eight bit field is further broken up into two four bit
  477. ** fields.  The first four bits is the "release" number, the
  478. ** second is the "version" number.  This is typically printed
  479. ** as <version>.<release>.  i.e. version=2, release=6 is
  480. ** printed as "2.6".
  481. **
  482. */
  483.  
  484. /*
  485. **  The os version number is coded into the eighth word of the 
  486. **configuration message.  It is in the lower 8 bits. 
  487. **        Bits 0 - 7: OS version  
  488. **
  489. */
  490.  
  491. INT32
  492. version_cmd(token, token_count)
  493.    char   *token[];
  494.    int     token_count;
  495.    {
  496.    int comm_version;
  497.    int message_version;
  498.    int config_version;
  499.    int debug_core_version;
  500.    char tip_version[12];
  501.    char tip_date[12];
  502.    int os_version;        /* eighth word of config message */
  503.    INT32    junk;
  504.    char    prtbuf[256];
  505.    INT32    retval;
  506.  
  507.    if ((strcmp(token[0], "ver") != 0) ||
  508.        (token_count != 1))
  509.       return (EMSYNTAX);
  510.  
  511. /*  byte count is 40 because 4 bytes for target version
  512.                  4 bytes for os version
  513.                  12 bytes for tip version
  514.                  12 bytes for tip date 
  515.                  4 for msgbuf size
  516.                  4 for max bkpts */
  517.    if ((retval = Mini_read_req ((INT32) VERSION_SPACE,
  518.             (ADDR32) 0,
  519.             (INT32) 1,
  520.             (INT16) 40,
  521.             (INT32 *) &junk,
  522.             (BYTE *) &(versions_etc.version),
  523.             TRUE)) != SUCCESS)
  524.     return (FAILURE);
  525.  
  526.    comm_version = (int) ((versions_etc.version >> 24) & 0x00ff);
  527.    message_version = (int) ((versions_etc.version >> 16) & 0x00ff);
  528.    config_version = (int) ((versions_etc.version >> 8)  & 0x00ff);
  529.    debug_core_version = (int) ((versions_etc.version) & 0x00ff);
  530.    strcpy(tip_version,versions_etc.tip_version);
  531.    strcpy(tip_date,versions_etc.tip_date);
  532.    os_version = (int) ((versions_etc.os_version )  & 0x00ff); 
  533.  
  534.  
  535.    sprintf(&prtbuf[0], "\n");
  536.    sprintf(&prtbuf[strlen(prtbuf)], "\n");
  537.    sprintf(&prtbuf[strlen(prtbuf)], "                  MiniMON29K R3.0\n");
  538.    if (io_config.echo_mode == (INT32) TRUE)
  539.       fprintf (io_config.echo_file, "%s", &prtbuf[0]);
  540.    fprintf (stderr, "%s", &prtbuf[0]);
  541.    sprintf(&prtbuf[0], "            Copyright 1993 Advanced Micro Devices, Inc.\n");
  542.    sprintf(&prtbuf[strlen(prtbuf)], "\n");
  543.  
  544.    if (io_config.echo_mode == (INT32) TRUE)
  545.       fprintf (io_config.echo_file, "%s", &prtbuf[0]);
  546.    fprintf (stderr, "%s", &prtbuf[0]);
  547.    sprintf(&prtbuf[0], "\t Host code:\n");
  548.    sprintf(&prtbuf[strlen(prtbuf)], "\t\t Version  %s\n",
  549.           host_config.version);
  550.    sprintf(&prtbuf[strlen(prtbuf)], "\t\t Date:    %s\n",
  551.           host_config.date);
  552.    sprintf(&prtbuf[strlen(prtbuf)], "\n");
  553.    if (io_config.echo_mode == (INT32) TRUE)
  554.       fprintf (io_config.echo_file, "%s", &prtbuf[0]);
  555.    fprintf (stderr, "%s", &prtbuf[0]);
  556.  
  557.    sprintf(&prtbuf[0], "\t Tip code:\n");
  558.    sprintf(&prtbuf[strlen(prtbuf)], "\t\t Version  %s\n",
  559.           tip_version);
  560.    sprintf(&prtbuf[strlen(prtbuf)], "\t\t Date:    %s\n",
  561.           tip_date);
  562.    sprintf(&prtbuf[strlen(prtbuf)], "\n");
  563.    if (io_config.echo_mode == (INT32) TRUE)
  564.       fprintf (io_config.echo_file, "%s", &prtbuf[0]);
  565.    fprintf (stderr, "%s", &prtbuf[0]);
  566.  
  567.    sprintf(&prtbuf[0], "\t Target code:\n");
  568.    sprintf(&prtbuf[strlen(prtbuf)], "\t\t Debug core version:            %d.%d\n",
  569.           ((debug_core_version >> 4) & 0x0f),
  570.            (debug_core_version & 0x0f));
  571.    sprintf(&prtbuf[strlen(prtbuf)], "\t\t Configuration version:         %d.%d\n",
  572.           ((config_version >> 4) & 0x0f),
  573.            (config_version & 0x0f));
  574.    sprintf(&prtbuf[strlen(prtbuf)], "\t\t Message system version:        %d.%d\n",
  575.           ((message_version >> 4) & 0x0f),
  576.            (message_version & 0x0f));
  577.    sprintf(&prtbuf[strlen(prtbuf)], "\t\t Communication driver version:  %d.%d\n",
  578.           ((comm_version >> 4) & 0x0f),
  579.            (comm_version & 0x0f));
  580.  
  581.    sprintf(&prtbuf[strlen(prtbuf)], "\t\t OS system version:              %d.%d\n",
  582.           ((os_version >> 4) & 0x0f),        
  583.            (os_version & 0x0f));        
  584.  
  585.  
  586.    sprintf(&prtbuf[strlen(prtbuf)], "\n");
  587.    if (io_config.echo_mode == (INT32) TRUE)
  588.       fprintf (io_config.echo_file, "%s", &prtbuf[0]);
  589.    fprintf (stderr, "%s", &prtbuf[0]);
  590.  
  591.    fprintf(stderr, "Maximum message buffer size on target: 0x%lx\n",versions_etc.max_msg_size);
  592.    if (io_config.echo_mode == (INT32) TRUE)
  593.      fprintf(io_config.echo_file, "Maximum message buffer size on target: 0x%lx\n",versions_etc.max_msg_size);
  594.    fprintf(stderr, "Maximum number of breakpoints on target: %ld\n", versions_etc.max_bkpts);
  595.    if (io_config.echo_mode == (INT32) TRUE)
  596.       fprintf(io_config.echo_file, "Maximum message buffer size on target: 0x%lx\n",versions_etc.max_msg_size);
  597.    return (SUCCESS);
  598.  
  599.    }  /* end version_cmd() */
  600.  
  601.  
  602.  
  603.