home *** CD-ROM | disk | FTP | other *** search
/ Zodiac Super OZ / MEDIADEPOT.ISO / FILES / 16 / FREEDOS.ZIP / FD_A4PRE.ZIP / SOURCE / MICROC.ZIP / FDFORMAT.C < prev    next >
C/C++ Source or Header  |  1995-06-27  |  5KB  |  154 lines

  1. #include <stdio.h>
  2.  
  3. #define MAXSECTOR   18          /* Maximum sectors/trk supported */
  4.  
  5. /* Global data easily accessable to asm functions */
  6. unsigned char drive, type, heads, sectors, tracks, status;
  7.  
  8. main(int argc, char *argv[])
  9. {
  10.     unsigned i, track;
  11.     unsigned char *ptr, sbuf[MAXSECTOR*4];
  12.     static char *drive_type_text[] = {
  13.         "5.25 LD", "5.25 HD", "3.5 LD", "3.5 HD" };
  14.  
  15.     if(argc < 2)
  16.         abort("Use: fdformat <drive> [t=n h=n s=n]\n");
  17.  
  18.     if(((drive = toupper(*argv[1]) - 'A') > 1) || (argv[1][1] != ':'))
  19.         abort("Please specify drive A: or B:");
  20.  
  21.     /* Get default drive parameters from BIOS */
  22.     asm {
  23.         MOV     DL,DGRP:_drive  ; Get drive number
  24.         MOV     AX,0800h        ; Get drive ID function + default=0
  25.         INT     13h             ; Call BIOS
  26.         JC      gdterr          ; Error, assume default
  27.         MOV     DGRP:_type,BL   ; Set drive type
  28.         INC     DH              ; Adjust # heads
  29.         MOV     DGRP:_heads,DH  ; Set # heads
  30.         AND     CL,1Fh          ; Remove track bits
  31.         MOV     DGRP:_sectors,CL; Set # sectors
  32.         INC     CH              ; Adjust # tracks
  33.         MOV     DGRP:_tracks,CH ; Set # tracks
  34. gdterr:
  35.     }
  36.  
  37.     if((type < 1) || (type > 4))
  38.         abort("Unable to obtain drive type from BIOS");
  39.  
  40.     for(i=2; i < argc; ++i) {
  41.         ptr = argv[i];
  42.         switch((toupper(*ptr++) << 8) | *ptr++) {
  43.             case 'H=' : heads   = atoi(ptr);    break;
  44.             case 'S=' : sectors = atoi(ptr);    break;
  45.             case 'T=' : tracks  = atoi(ptr);    break;
  46.             default:
  47.                 printf("Unknown option: %s\n", argv[i]);
  48.                 return; } }
  49.  
  50.     printf("fdformat: %s disk in drive %c (Heads=%u, Sectors=%u, Tracks=%u)\n",
  51.         drive_type_text[type-1], drive + 'A', heads, sectors, tracks);
  52.  
  53.     if(initialize_drive() || (--heads > 1))
  54.         abort("Unsupported drive parameters!");
  55.  
  56.     for(track = 0; track < tracks; ++track) {
  57.         printf("\r Track %d of %d...", track, tracks);
  58.         ptr = sbuf;
  59.         for(i=1; i <= sectors; ++i) {
  60.             *ptr++ = track;
  61.             *ptr++ = 0;
  62.             *ptr++ = i;
  63.             *ptr++ = 2; }
  64.         if(format_track(sbuf, track, 0)) {
  65.             i = -1;
  66.             goto disk_error; }
  67.         if(heads) {
  68.             ptr = sbuf + 1;
  69.             for(i=1; i <= sectors; ++i) {
  70.                 *ptr = 1;
  71.                 ptr += 4; }
  72.             if(format_track(sbuf, track, 1)) {
  73.                 i = -1;
  74.                 goto disk_error; } } }
  75.  
  76.     return;
  77.  
  78. disk_error:
  79.     printf("Un-recoverable disk error! status=%02x\n", status);
  80. }
  81.  
  82. /*
  83.  * Initialize the drive
  84.  */
  85. initialize_drive() asm
  86. {
  87. ; Reset the drive
  88.         MOV     DL,DGRP:_drive  ; Get drive id
  89.         XOR     AH,AH           ; Function 0 - reset disk
  90.         INT     13h             ; Try it out
  91. ; Select the drive type
  92.         MOV     CL,DGRP:_sectors; Get sectors
  93.         MOV     CH,DGRP:_tracks ; Get tracks
  94.         DEC     CH              ; Adjust
  95.         MOV     DL,DGRP:_drive  ; Get drive number
  96.         MOV     AH,18h          ; Set media type for format
  97.         INT     13h             ; Call BIOS
  98.         MOV     AL,AH           ; Get result
  99.         JC      error           ; Error has occured
  100. ; Copy over parameter table
  101.         MOV     SI,DI           ; Si = source offset
  102.         PUSH    DS              ; Save data seg
  103.         PUSH    ES              ; Save extra
  104.         XOR     BX,BX           ; Get zero
  105.         MOV     DS,BX           ; ES = 0
  106.         MOV     BX,0078h        ; Point to table
  107.         MOV     DI,[BX]         ; Get dest offset
  108.         INC     BX              ; Advance
  109.         INC     BX              ; One word
  110.         MOV     ES,[BX]         ; Get dest segment
  111.         POP     DS              ; Get source segment
  112.         MOV     CX,11           ; size of table
  113.     rep MOVSB                   ; Perform the move
  114.         POP     DS              ; Restore data seg
  115.         XOR     AX,AX           ; Zero result
  116. error:
  117. }
  118.  
  119. /*
  120.  * Format a track on the floppy diskette
  121.  */
  122. format_track(buffer, track, head) asm
  123. {
  124.         MOV     DI,3            ; Retry count
  125. fagain: PUSH    DS              ; Save data seg
  126.         POP     ES              ; Set extra seg
  127.         MOV     BX,8[BP]        ; Get buffer address
  128.         MOV     CH,6[BP]        ; Get track
  129.         MOV     DH,4[BP]        ; Get head
  130.         MOV     DL,DGRP:_drive  ; Get drive
  131.         MOV     AX,0501h        ; Command & interleave
  132.         INT     13h             ; Call bios
  133.         JNC     fok             ; It worked
  134.         MOV     DGRP:_status,AH ; Save command status
  135.         XOR     AH,AH           ; Reset command
  136.         INT     13h             ; Ask BIOS
  137.         DEC     DI              ; Reduce count
  138.         JNZ     fagain          ; Do it again sam
  139.         MOV     AX,-1           ; Indicate failure
  140.         JMP SHORT fexit         ; And leave
  141. fok:    XOR     AX,AX           ; Indicate success
  142. fexit:
  143. }
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.