home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Garbo
/
Garbo.cdr
/
pc
/
binedit
/
diskedt.arc
/
DISKEDIT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-02-15
|
5KB
|
188 lines
/* diskedit.c - low level disk sector viewer/editor */
/* lrs - 2/13/89 */
#include <stdio.h>
#include <bios.h>
#include <dos.h>
#include "disks.h"
#include "video.h"
#include "keys.h"
#include "devideo.h"
#include "defiles.h"
#define FALSE 0
#define TRUE ~FALSE
char WriteAllowed = FALSE;
int Drive = 0x80;
int HalfDisp = TRUE; int DispOffs = 0;
int Cyl = 0; int Head = 0; int Sec = 1;
int MaxCyl, MaxHead, MaxSec;
int scrrows;
char Done;
unsigned char SecBuf[BYTESPERSECTOR];
/*-----------------------------------------------------------------------*/
void limit (int* num, int lowest, int highest)
{
if (*num < lowest) *num = lowest;
if (*num > highest) *num = highest;
}
/*-----------------------------------------------------------------------*/
void ReadCurrent(void)
{
if (!ReadSector(Drive, Cyl, Head, Sec, (char far *) SecBuf))
{
ErrorMessage("READ ERROR!!!!");
WriteAllowed = FALSE;
ShowWriteAllowed(WriteAllowed);
}
} /* ReadCurrent */
void WriteCurrent(void)
{
if (!WriteAllowed)
ErrorMessage("Sector Updates Not Allowed! (use alt+F10 to enable)");
else
if (getkey("Are You Sure? ") == 'Y')
if (!WriteSector(Drive, Cyl, Head, Sec, (char far *) SecBuf))
ErrorMessage("WRITE ERROR!!!!");
else
ErrorMessage("Write Successful");
} /* WriteCurrent */
/*-----------------------------------------------------------------------*/
void NextSector(void)
{
if ((DispOffs == 0) && (HalfDisp))
DispOffs = 16;
else
{
DispOffs = 0;
if (++Sec > MaxSec)
{
Sec = 1;
if (++Head > MaxHead)
{
Head = 0;
if (++Cyl > MaxCyl)
Cyl = 0;
}
}
ReadCurrent();
}
DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
} /* NextSector */
void PrevSector(void)
{
if ((DispOffs != 0) && (HalfDisp))
DispOffs = 0;
else
{
if (HalfDisp) DispOffs = 16;
if (--Sec < 1)
{
Sec = MaxSec;
if (--Head < 0)
{
Head = MaxHead;
if (--Cyl < 0)
Cyl = MaxCyl;
}
}
ReadCurrent();
}
DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
} /* PrevSector */
void GotoSector(void)
{
getdec("Cylinder:",&Cyl); limit(&Cyl,0,MaxCyl);
getdec("Head:",&Head); limit(&Head,0,MaxHead);
getdec("Sector:",&Sec); limit(&Sec,1,MaxSec);
ReadCurrent();
DispOffs = 0;
DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
} /* GotoSector */
/*-----------------------------------------------------------------------*/
void ReadSectorFromFile(void)
{
char filename[80];
getline("Read from File:",filename);
ReadFile(filename, SecBuf);
DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
} /* ReadSectorFromFile */
void WriteSectorToFile(void)
{
char filename[80];
getline("Write To File:",filename);
WriteFile(filename, SecBuf);
} /* WriteSectorToFile */
/*-----------------------------------------------------------------------*/
void ModifyByte(void)
{
int address, val;
address = 0;
gethex("Modify Byte at:",&address);
limit(&address,0,BYTESPERSECTOR-1);
val = SecBuf[address];
gethex("New Value:",&val);
SecBuf[address] = val;
ErrorMessage("Don't Forget to Update!");
DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
} /* ModifyByte */
/*-----------------------------------------------------------------------*/
void DoCommand(void)
{
int ch;
ch = getcmd();
ClearErrorMessage();
switch (ch)
{
case PGDN: NextSector(); break;
case PGUP: PrevSector(); break;
case 'G': GotoSector(); break;
case 'W': WriteSectorToFile(); break;
case 'R': ReadSectorFromFile(); break;
case 'M': ModifyByte(); break;
case F10: WriteCurrent(); break;
case aF10: WriteAllowed = !WriteAllowed;
ShowWriteAllowed(WriteAllowed);
break;
case ESC: Done = TRUE;
break;
}
} /* DoCommand */
/*-----------------------------------------------------------------------*/
void SelectDrive(int drive)
{
InitDisks();
GetDiskParams(Drive, &MaxCyl, &MaxHead, &MaxSec);
ShowMaxes(MaxCyl, MaxHead, MaxSec);
}
/*-----------------------------------------------------------------------*/
main()
{
initvideo(); cursoroff();
scrrows = screenrows(); HalfDisp = (scrrows < 43);
DisplayFrame();
SelectDrive(0x80);
ReadCurrent();
DisplaySector(Drive, Cyl, Head, Sec, SecBuf, DispOffs);
Done = FALSE;
while (!Done)
DoCommand();
clearscreen(); cursoron();
cprintf("diskedit is finished.");
}
/*---- end of diskedit.c ----*/