home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / HARDWARE / WDIGITAL.ZIP / WDFMT.BAK < prev    next >
Encoding:
Text File  |  1987-07-02  |  9.3 KB  |  459 lines

  1.  
  2. /*
  3.         Western Digital Corp. Format Routine
  4.  
  5.         Author: Dave Evans
  6.  
  7.         Creation Date:    08/08/86
  8.         Revision Date:    05/08/87
  9.         Revision: 1.01
  10.  
  11.     Formats drive based on #cylinders, #heads, #sectors, and
  12.     interleave entered at command line.  Does low-level format
  13.     followed by a Read-verify of the entire drive.  Shows errors
  14.     detected, then allows user to enter additional blocks to
  15.     format with bad block marks.  The program may be aborted
  16.     with an Escape at both the Format prompt and at the Format
  17.     Bad Block prompt.
  18.  
  19.     Rev. 1.01 -- 05/08/87 -- dle
  20.     Added ability to format drive D:, and also the ability to
  21.     specify the precomp cylinder.
  22.     New command line format:
  23.  
  24.         WDFMT drive #cyls #heads #sectors precomp-cyl
  25. */
  26. #include <stdio.h>
  27. #include <\c\ctype.h>
  28. #include <\c\math.h>
  29. #include <\c\limits.h>
  30.  
  31. #define begin {
  32. #define end   }
  33. #define then
  34. #define esc    '\x1b'
  35. #define true -1
  36. #define false 0
  37.  
  38. #define buf_length (512+10)
  39. #define hard 1
  40. #define soft 0
  41.  
  42. #define curs(a,b) pcvscp((a-1), (b-1))
  43. #define bell printf("%c", 7)
  44. #define char_ready pckchk()
  45.  
  46. /*  Global variables:
  47.  
  48.         Command parser modifies the tables, and global flags
  49.         indicate to the Main routine the requested action.
  50.  
  51. */
  52.  
  53. struct htable
  54. begin
  55.     int drv_number;
  56.     int cyl_number;
  57.     int head_number;
  58.     int sec_number;
  59.     int blk_size;
  60.     int max_cyl;
  61.     int max_head;
  62.     int max_sec;
  63.     int precomp;
  64.     int retry;
  65.     int step;
  66.     int ileave;
  67.     int ecc_len;
  68.     float bits_read;
  69. end hd_table;
  70.  
  71. struct tfile
  72. begin
  73.     int error;
  74.     int secnt;
  75.     int sector;
  76.     int cyllo;
  77.     int cylhi;
  78.     int SDH;
  79.     int status;
  80.     int secstat;
  81.     int DIR;
  82. end task_file;
  83.  
  84. struct esfile
  85. begin
  86.     int xfrlo;
  87.     int xfrhi;
  88.     int plo;
  89.     int gap;
  90.     int stat;
  91. end;
  92.  
  93.  
  94. char *rd_buffer, *wr_buffer, *fmt_buffer;
  95.  
  96. struct error
  97. begin
  98.     int cyl;
  99.     int head;
  100. end;
  101.  
  102. struct error err_table[100];
  103.  
  104. int err_count, errcnt;
  105.  
  106. main(argc, argv)
  107.  
  108. int argc;
  109. char *argv[];
  110.  
  111. begin
  112.  
  113.     char *malloc();
  114.     char resp, temp_str[8];
  115.     int bad_count, num_reads;
  116.  
  117.     wr_buffer = malloc(buf_length);
  118.     rd_buffer = malloc(buf_length);
  119.     fmt_buffer = malloc(buf_length);
  120.  
  121.     hd_table.sec_number = 1;
  122.     hd_table.blk_size = 1;
  123.     hd_table.max_cyl = 615;
  124.     hd_table.max_head = 4;
  125.     hd_table.max_sec = 17;
  126.     hd_table.precomp = 306;
  127.     hd_table.retry = 0;
  128.     hd_table.step = 0;
  129.     hd_table.ileave = 3;
  130.     hd_table.drv_number = 0;
  131.  
  132.  
  133.     argc--;
  134.     
  135.     if (argc > 0)
  136.     begin
  137.         sscanf(*++argv, "%d", &hd_table.drv_number);
  138.         argc--;
  139.     end;
  140.  
  141.     if (argc > 0)
  142.     begin
  143.         sscanf(*++argv, "%d", &hd_table.max_cyl);
  144.         argc--;
  145.     end;
  146.  
  147.     if (argc > 0)
  148.     begin
  149.         sscanf(*++argv, "%d", &hd_table.max_head);
  150.         argc--;
  151.     end;
  152.  
  153.     if (argc > 0)
  154.     begin
  155.         sscanf(*++argv, "%d", &hd_table.max_sec);
  156.         argc--;
  157.     end;
  158.  
  159.     if (argc > 0)
  160.     begin
  161.         sscanf(*++argv, "%d", &hd_table.ileave);
  162.         argc--;
  163.     end;
  164.  
  165.     if (argc > 0)
  166.     begin
  167.         sscanf(*++argv, "%d", &hd_table.precomp);
  168.         argc--;
  169.     end;
  170.  
  171.     clr_scrn();
  172.     printf("                   *** Western Digital Corporation ***\n");
  173.     printf("                           Disk Format Utility\n");
  174.     printf("                                Rev. 1.01\n\n\n");
  175.     printf("     Current parameters are:\n\n");
  176.     printf("        Formatting will occur on drive: %d\n\n", hd_table.drv_number);
  177.     printf("        Cylinders:  %4d          Heads:  %2d\n",
  178.         hd_table.max_cyl, hd_table.max_head);
  179.     printf("          Sectors:  %4d     Interleave:  %2d\n",
  180.          hd_table.max_sec, hd_table.ileave);
  181.     printf("          Precomp:  %4d\n\n\n", hd_table.precomp);
  182.     printf("     To enter new parameters, return to DOS and\n");
  183.     printf("     enter a new command line as follows:\n\n");
  184.     printf(" WDFMT <drv # (0/1)> <# cyls> <# heads> <# sectors> <interleave> <precomp cyl.>");
  185.     bell; bell;
  186.     printf("\n\n\n     Warning!!!!  All data on drive %c will be destroyed",
  187.         (char)('C' + hd_table.drv_number));
  188.     printf("\n     Press ESC to return to DOS,  F  to start format");
  189.  
  190.     resp = cget();
  191.     while (toupper(resp) != 'F')
  192.     begin
  193.         if (resp == esc)
  194.             exit(0);
  195.         else
  196.             bell;
  197.         resp = cget();
  198.     end
  199.     
  200.     hd_table.max_cyl--;
  201.     hd_table.max_head--;
  202.     hd_table.precomp = (int)(hd_table.precomp/4);
  203.     at_reset();
  204.     while(at_ckbsy());
  205.  
  206.     load_task_file();
  207.     at_setp(hd_table.max_sec, hd_table.max_head);
  208.     while(at_ckbsy());
  209.  
  210.     at_rest();
  211.     while(at_ckbsy());
  212.     if (at_ckerr())
  213.         show_error();
  214.  
  215.  
  216.     do_ilt(0);
  217.     hd_table.blk_size = hd_table.max_sec;
  218.  
  219.     curs(20, 12);
  220.     printf("Formatting cylinder: ");
  221.     curs(20, 40);
  222.     printf("head:");
  223.     for(hd_table.cyl_number = 0; hd_table.cyl_number <= hd_table.max_cyl;
  224.         hd_table.cyl_number++)
  225.     begin
  226.        curs(20, 33);
  227.        printf("%4d", hd_table.cyl_number);
  228.        for(hd_table.head_number = 0;
  229.         hd_table.head_number <= hd_table.max_head;
  230.         hd_table.head_number++)
  231.        begin
  232.         load_task_file();
  233.         at_fmt();
  234.         at_wrbfr(0, wr_buffer);
  235.         while (at_ckbsy());
  236.         if (at_ckerr())
  237.             show_error();
  238.         curs(20, 46);
  239.         printf("%2d", hd_table.head_number);
  240.        end
  241.     end
  242.  
  243.     hd_table.blk_size = hd_table.max_sec;
  244.     err_count = 1;
  245.     curs(20, 12);
  246.     printf("Verifying  ");
  247.     for(hd_table.cyl_number = 0; hd_table.cyl_number <= hd_table.max_cyl;
  248.         hd_table.cyl_number++)
  249.     begin
  250.        if(err_count >= 100)
  251.         break;
  252.        curs(20, 33);
  253.        printf("%4d", hd_table.cyl_number);
  254.        for(hd_table.head_number = 0;
  255.         hd_table.head_number <= hd_table.max_head;
  256.         hd_table.head_number++)
  257.        begin
  258.         for(num_reads = 0; num_reads < 3; num_reads++)
  259.         begin
  260.             load_task_file();
  261.             at_rdver(0);
  262.             while (at_ckbsy());
  263.             if (at_ckerr())
  264.             begin
  265.                 if (err_count < 100)
  266.                 begin
  267.                     err_table[err_count].cyl = hd_table.cyl_number;
  268.                     err_table[err_count].head = hd_table.head_number;
  269.                     err_count++;
  270.                 end
  271.                 else
  272.                 begin
  273.                     bell;
  274.                     printf("\n\nError count exceeded 100 errors!!!");
  275.                 end
  276.             break;
  277.             end
  278.         end
  279.         curs(20, 46);
  280.         printf("%2d", hd_table.head_number);
  281.        end
  282.     end
  283.  
  284.     if (err_count > 1)
  285.     begin
  286.         do_errors();
  287.         printf("\n\nDo you wish to mark these blocks bad? (y/n)");
  288.         resp = cget();
  289.         while (toupper(resp) != 'Y')
  290.         begin
  291.             if (toupper(resp) == 'N')
  292.             begin
  293.                 err_count = 1;
  294.                 break;
  295.             end
  296.             else
  297.                 bell;
  298.             resp = cget();
  299.         end
  300.     end
  301.  
  302.     clr_scrn();
  303.     printf("\n\nYou may now enter additional blocks to be marked bad.");
  304.     printf("\n\nEnter cylinder and head info (seperated by spaces) at");
  305.     printf("\nthe prompt. To end entry, press  ENTER  at the prompt\n");
  306.  
  307.     for (; err_count < 100; err_count++)
  308.     begin
  309.         printf("Enter  <cylinder#> <head#>:  ");
  310.         cgets(temp_str);
  311.         if (strcmp(temp_str, "") == 0)
  312.             break;
  313.         if (sscanf(temp_str, "%d %d", &err_table[err_count].cyl, 
  314.                 &err_table[err_count].head) != 2)
  315.         begin
  316.             bell;
  317.             err_count--;
  318.         end
  319.     end
  320.  
  321.     if (err_count > 1)
  322.     begin
  323.         do_errors();
  324.         printf("\n\nReady to format bad blocks...........");
  325.         printf("\n\nPress <ESC> to abort, any other key to continue\n");
  326.         if (cget() == esc)
  327.             exit(0);
  328.         bad_count = 0;
  329.         do_ilt(128);
  330.         for (errcnt = 1; errcnt < err_count; errcnt++)
  331.         begin
  332.             hd_table.cyl_number = err_table[errcnt].cyl;
  333.             hd_table.head_number = err_table[errcnt].head;
  334.             load_task_file();
  335.             at_fmt();
  336.             at_wrbfr(0, wr_buffer);
  337.             while (at_ckbsy());
  338.             bad_count++;
  339.         end
  340.     end
  341.  
  342.     printf("\n\nFormat complete.....");
  343.     if (bad_count > 0)
  344.         printf("Bad blocks marked");
  345.     printf("\n\nRestart system before doing FDISK");
  346.  
  347. end
  348.  
  349. do_ilt(block_mark)
  350. char block_mark;
  351. begin
  352.  
  353.     int    offset,sec_count,ileave,maxcnt;
  354.     char    *p;
  355.  
  356.     p = wr_buffer;
  357.     for( sec_count=0; sec_count < 512; sec_count++ )
  358.         *p++ = 0xff;
  359.         if (hd_table.ileave > 8)
  360.     begin
  361.         ileave = hd_table.ileave - 8;
  362.         sec_count = 0;
  363.         maxcnt = hd_table.max_sec - 1;
  364.     end
  365.     else
  366.     begin
  367.         ileave = hd_table.ileave;
  368.         sec_count = 1;
  369.         maxcnt = hd_table.max_sec;
  370.     end;
  371.  
  372.     offset = 0;
  373.  
  374.     while ( sec_count <= maxcnt )
  375.     begin
  376.         if (hd_table.ileave > 8)
  377.         begin
  378.                if ( offset > maxcnt ) offset = 0;
  379.         end
  380.         else
  381.         begin
  382.             if ( offset >= maxcnt ) offset = 0;
  383.         end
  384.         p = wr_buffer + ( offset * 2 ) + 1;
  385.         if ( *p == 0xff )
  386.         begin
  387.             *p = sec_count;
  388.             *--p = block_mark;
  389.             offset += ileave;
  390.             sec_count++;
  391.         end
  392.         else offset++;
  393.     end;
  394. end
  395.  
  396.  
  397. load_task_file()
  398. begin
  399.     task_file.error = hd_table.precomp;
  400.     task_file.secnt = hd_table.blk_size;
  401.     task_file.sector = hd_table.sec_number;
  402.     task_file.cyllo = (hd_table.cyl_number % 256);
  403.     task_file.cylhi = (hd_table.cyl_number / 256);
  404.     task_file.SDH = (((hd_table.drv_number << 4) & 0x10) +
  405.         (hd_table.head_number & 0xf) + 0xa0);
  406.     at_wtskf(&task_file);
  407. end
  408.  
  409. show_error()
  410. begin
  411.     printf("\nError!!... Cyl. %4d   Head %2d  Status  %2x  Error  %2x",
  412.         hd_table.cyl_number, hd_table.head_number,
  413.         at_rstat(), at_rderr());
  414. end
  415.  
  416.  
  417. clr_scrn()
  418. begin
  419.  
  420.     char window[4];
  421.     window[0]=0; window[1]=0;
  422.     window[2]=79; window[3]=24;
  423.  
  424.     pcvsu(window,0,7);
  425.     curs(1,1);
  426.  
  427. end
  428.  
  429. do_errors()
  430. begin
  431.     clr_scrn();
  432.     printf("Errors will be marked at the following cylinder/head locations:");
  433.     printf("\n\n");
  434.     for (errcnt = 1; errcnt < err_count; errcnt++)
  435.     begin
  436.         printf("        %4d/%2d", err_table[errcnt].cyl,
  437.             err_table[errcnt].head);
  438.         if ((errcnt % 5) == 0)
  439.             printf ("\n");
  440.     end
  441. end
  442.  
  443. dump_5lines(buffer)
  444.  
  445. char *buffer;
  446.  
  447. begin
  448.     int num_bytes, count;
  449.  
  450.     for (count = 0; count < 80; count++)
  451.     begin
  452.         if ((count % 16) == 0)
  453.             printf("\n%04x    ", count);
  454.         printf("%02x  ", buffer[count]);
  455.     end;
  456.     printf("\n");
  457. end
  458.  
  459.