home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / pc / binedit / diskedt.arc / DISKEDIT.C < prev    next >
C/C++ Source or Header  |  1989-02-15  |  5KB  |  188 lines

  1. /* diskedit.c - low level disk sector viewer/editor */
  2. /* lrs - 2/13/89 */
  3.  
  4. #include <stdio.h>
  5. #include <bios.h>
  6. #include <dos.h>
  7. #include "disks.h"
  8. #include "video.h"
  9. #include "keys.h"
  10. #include "devideo.h"
  11. #include "defiles.h"
  12.  
  13. #define FALSE 0
  14. #define TRUE  ~FALSE
  15.  
  16. char WriteAllowed = FALSE;
  17. int Drive = 0x80;
  18. int HalfDisp = TRUE; int DispOffs = 0;
  19.  
  20. int Cyl = 0; int Head = 0; int Sec = 1;
  21. int MaxCyl, MaxHead, MaxSec;
  22. int scrrows;
  23. char Done;
  24. unsigned char SecBuf[BYTESPERSECTOR];
  25.  
  26. /*-----------------------------------------------------------------------*/
  27. void limit (int* num, int lowest, int highest)
  28.   {
  29.   if (*num < lowest) *num = lowest;
  30.   if (*num > highest) *num = highest;
  31.   }
  32. /*-----------------------------------------------------------------------*/
  33. void ReadCurrent(void)
  34.     {
  35.     if (!ReadSector(Drive, Cyl, Head, Sec, (char far *) SecBuf))
  36.       {
  37.       ErrorMessage("READ ERROR!!!!");
  38.       WriteAllowed = FALSE;
  39.       ShowWriteAllowed(WriteAllowed);
  40.       }
  41.     }    /* ReadCurrent */
  42.  
  43. void WriteCurrent(void)
  44.   {
  45.   if (!WriteAllowed) 
  46.     ErrorMessage("Sector Updates Not Allowed! (use alt+F10 to enable)");
  47.   else
  48.     if (getkey("Are You Sure? ") == 'Y')
  49.       if (!WriteSector(Drive, Cyl, Head, Sec, (char far *) SecBuf))
  50.         ErrorMessage("WRITE ERROR!!!!");
  51.       else
  52.         ErrorMessage("Write Successful");
  53.   }    /* WriteCurrent */
  54.  
  55. /*-----------------------------------------------------------------------*/
  56. void NextSector(void)
  57.   {
  58.   if ((DispOffs == 0) && (HalfDisp))
  59.     DispOffs = 16;
  60.   else
  61.     {
  62.     DispOffs = 0;
  63.     if (++Sec > MaxSec) 
  64.       {
  65.       Sec = 1;
  66.       if (++Head > MaxHead) 
  67.         {
  68.         Head = 0;
  69.         if (++Cyl > MaxCyl) 
  70.           Cyl = 0;
  71.         }
  72.       }
  73.     ReadCurrent();
  74.     }
  75.   DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
  76.   }    /* NextSector */
  77.  
  78. void PrevSector(void)
  79.   {
  80.   if ((DispOffs != 0) && (HalfDisp))
  81.     DispOffs = 0;
  82.   else
  83.     {
  84.     if (HalfDisp) DispOffs = 16;
  85.     if (--Sec < 1) 
  86.       {
  87.       Sec = MaxSec;
  88.       if (--Head < 0) 
  89.         {
  90.         Head = MaxHead;
  91.         if (--Cyl < 0) 
  92.           Cyl = MaxCyl;
  93.         }
  94.       }
  95.     ReadCurrent();
  96.     }
  97.   DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
  98.   }    /* PrevSector */
  99.  
  100. void GotoSector(void)
  101.   {
  102.   getdec("Cylinder:",&Cyl); limit(&Cyl,0,MaxCyl);
  103.   getdec("Head:",&Head);    limit(&Head,0,MaxHead);
  104.   getdec("Sector:",&Sec);   limit(&Sec,1,MaxSec);
  105.   ReadCurrent();
  106.   DispOffs = 0;
  107.   DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
  108.   }    /* GotoSector */
  109.  
  110. /*-----------------------------------------------------------------------*/
  111. void ReadSectorFromFile(void)
  112.   {
  113.   char filename[80];
  114.   getline("Read from File:",filename);
  115.   ReadFile(filename, SecBuf);
  116.   DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
  117.   }    /* ReadSectorFromFile */
  118.  
  119. void WriteSectorToFile(void)
  120.   {
  121.   char filename[80];
  122.   getline("Write To File:",filename);
  123.   WriteFile(filename, SecBuf);
  124.   }    /* WriteSectorToFile */
  125.  
  126. /*-----------------------------------------------------------------------*/
  127. void ModifyByte(void)
  128.   {
  129.   int address, val;
  130.   address = 0;
  131.   gethex("Modify Byte at:",&address); 
  132.   limit(&address,0,BYTESPERSECTOR-1);
  133.   val = SecBuf[address];
  134.   gethex("New Value:",&val);
  135.   SecBuf[address] = val;
  136.   ErrorMessage("Don't Forget to Update!");
  137.   DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
  138.   }    /* ModifyByte */
  139. /*-----------------------------------------------------------------------*/
  140. void DoCommand(void)
  141.   {
  142.   int ch;
  143.  
  144.   ch = getcmd();
  145.   ClearErrorMessage();
  146.   switch (ch)
  147.     {
  148.     case PGDN: NextSector();         break;
  149.     case PGUP: PrevSector();         break;
  150.     case 'G':  GotoSector();         break;
  151.     case 'W':  WriteSectorToFile();  break;
  152.     case 'R':  ReadSectorFromFile(); break;
  153.     case 'M':  ModifyByte();         break;
  154.     case F10:  WriteCurrent();       break;
  155.     case aF10: WriteAllowed = !WriteAllowed;
  156.                ShowWriteAllowed(WriteAllowed);
  157.                break;
  158.     case ESC:  Done = TRUE;
  159.                break;
  160.     }
  161.   }    /* DoCommand */
  162.  
  163. /*-----------------------------------------------------------------------*/
  164. void SelectDrive(int drive)
  165.   {
  166.   InitDisks();
  167.   GetDiskParams(Drive, &MaxCyl, &MaxHead, &MaxSec);
  168.   ShowMaxes(MaxCyl, MaxHead, MaxSec);
  169.   }
  170.  
  171. /*-----------------------------------------------------------------------*/
  172. main()
  173. {
  174. initvideo(); cursoroff();
  175. scrrows = screenrows(); HalfDisp = (scrrows < 43);
  176. DisplayFrame();
  177. SelectDrive(0x80);
  178. ReadCurrent();
  179. DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
  180. Done = FALSE;
  181. while (!Done)
  182.    DoCommand();
  183.  
  184. clearscreen(); cursoron();
  185. cprintf("diskedit is finished.");
  186. }
  187. /*---- end of diskedit.c ----*/
  188.