/* diskedit.c - low level disk sector viewer/editor */ /* lrs - 2/13/89 */ #include #include #include #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; extern 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); } /*-----------------------------------------------------------------------*/ void 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 ----*/