Files
2024-02-19 00:25:23 -05:00

185 lines
3.5 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <errno.h>
typedef struct _EBPB_
{
unsigned sectsize;
char clustsize;
unsigned ressecs;
char fatcnt;
unsigned rootsize;
unsigned totsecs;
char media;
unsigned fatsize;
unsigned seccnt;
unsigned headcnt;
unsigned hiddensec_low;
unsigned hiddensec_hi;
unsigned long drvsecs;
} EBPB;
typedef struct _TRK_LY_
{
unsigned no;
unsigned size;
} TRK_LY;
typedef struct _DPB_
{
char spec;
char devtype;
unsigned devattr;
unsigned numofcyl;
char media_type;
EBPB bpb;
char reserved[6];
unsigned trkcnt;
TRK_LY trk[100];
} DPB;
typedef struct _DPB_FORMAT_
{
char spec;
unsigned head;
unsigned track;
} DPB_FORMAT;
int main(void)
{
union REGS reg;
struct SREGS segreg;
DPB far *dbp;
DPB_FORMAT far *dbp_f;
int sectors, i;
printf("\n<EFBFBD>ணࠬ¬  ã­¨ç⮦¨â ᮤ¥à¦¨¬®¥"
"\n81-© ¤®à®¦ª¨ ¤¨áª  €:."
"\n†¥« ¥â¥ ¯à®¤®«¦¨âì? (Y,N)\n");
i = getch();
if((i != 'y') && (i != 'Y'))
return(-1);
// ‡ ª §ë¢ ¥¬ ¯ ¬ïâì ¤«ï ¡«®ª  ¯ à ¬¥â஢ ãáâனá⢠
dbp = (DPB far*)farmalloc(sizeof(DPB));
// ‡ ª §ë¢ ¥¬ ¯ ¬ïâì ¤«ï ¡«®ª  ¯ à ¬¥â஢ ãáâனá⢠,
// ª®â®àë© ¡ã¤¥â ¨á¯®«ì§®¢ ­ ¤«ï ä®à¬ â¨à®¢ ­¨ï
dbp_f = (DPB_FORMAT far*)
farmalloc(sizeof(DPB_FORMAT));
if(dbp == NULL || dbp_f == NULL)
{
printf("\nŒ «® ¯ ¬ïâ¨");
return(-1);
}
// <20>®«ãç ¥¬ ⥪ã騥 ¯ à ¬¥âàë ¤¨áª  €:
dbp->spec = 0;
reg.x.ax = 0x440d;
reg.h.bl = 1;
reg.x.cx = 0x0860;
reg.x.dx = FP_OFF(dbp);
segreg.ds = FP_SEG(dbp);
intdosx(&reg, &reg, &segreg);
if(reg.x.cflag != 0)
{
printf("\nŽè¨¡ª : %d", reg.x.ax);
return(-1);
}
// ‡ ¯®«­ï¥¬ ¡«®ª ¯ à¬¥â஢ ¤«ï ä®à¬ â¨à®¢ ­¨ï
dbp->spec = 5;
// ‘ç¨â뢠¥¬ ¨§ BPB ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  ¤®à®¦ª¥
sectors = dbp->bpb.seccnt;
// <20>®¤£®â ¢«¨¢ ¥¬ â ¡«¨æã, ®¯¨á뢠îéãî ä®à¬ â ¤®à®¦ª¨
// ‡ ¯¨á뢠¥¬ ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  ¤®à®¦ª¥
dbp->trkcnt = sectors;
// „«ï ª ¦¤®£® ᥪâ®à  ­  ¤®à®¦ª¥ ¢ â ¡«¨æã
// § ¯¨á뢠¥¬ ¥£® ­®¬¥à ¨ à §¬¥à.
for(i = 0; i < sectors; i++)
{
dbp->trk[i].no = i+1;
dbp->trk[i].size = 512;
}
// “áâ ­ ¢«¨¢ ¥¬ ­®¢ë¥ ¯ à ¬¥âàë ¤«ï ¤¨áª  €:
reg.x.ax = 0x440d;
reg.h.bl = 1;
reg.x.cx = 0x0840;
reg.x.dx = FP_OFF(dbp);
segreg.ds = FP_SEG(dbp);
intdosx(&reg, &reg, &segreg);
if(reg.x.cflag != 0)
{
printf("\nŽè¨¡ª : %d", reg.x.ax);
return(-1);
}
// ƒ®â®¢¨¬ ¡«®ª ¯ à ¬¥â஢ ãáâனá⢠,
// ª®â®àë© ¡ã¤¥â ¨á¯®«ì§®¢ ­ ¯à¨ ¢ë§®¢¥
// ®¯¥à æ¨¨ ¯à®¢¥àª¨ ¢®§¬®¦­®á⨠ä®à¬ â¨à®¢ ­¨ï
// ¤®à®¦ª¨
dbp_f->spec = 1;
dbp_f->head = 0;
dbp_f->track = 81;
reg.x.ax = 0x440d;
reg.h.bl = 1;
reg.x.cx = 0x0842;
reg.x.dx = FP_OFF(dbp_f);
segreg.ds = FP_SEG(dbp_f);
intdosx(&reg, &reg, &segreg);
if(reg.x.cflag != 0)
{
printf("\nŽè¨¡ª : %d", reg.x.ax);
return(-1);
}
// …᫨ 㪠§ ­­ë© ä®à¬ â ¤®à®¦ª¨ ¯®¤¤¥à¦¨¢ ¥âáï,
// ¯®«¥ ᯥ樠«ì­ëå ä㭪権 ¡ã¤¥â ᮤ¥à¦ âì 0.
// <20>஢¥à塞 íâ®
if(dbp_f->spec != 0)
{
printf("\n”®à¬ â ¤®à®¦ª¨ ­¥ ¯®¤¤¥à¦¨¢ ¥âáï");
return(-1);
}
// ‡ ¯®«­ï¥¬ ¡«®ª ¯ à ¬¥â஢ ¤«ï ¢ë¯®«­¥­¨ï
// ®¯¥à æ¨¨ ä®à¬ â¨à®¢ ­¨ï
dbp_f->spec = 0;
dbp_f->head = 0;
dbp_f->track = 81;
// ”®à¬ â¨à㥬 ¤®à®¦ªã á ­®¬¥à®¬ 81, £®«®¢ª  0
reg.x.ax = 0x440d;
reg.h.bl = 1;
reg.x.cx = 0x0842;
reg.x.dx = FP_OFF(dbp_f);
segreg.ds = FP_SEG(dbp_f);
intdosx(&reg, &reg, &segreg);
if(reg.x.cflag != 0)
{
printf("\nŽè¨¡ª : %d", reg.x.ax);
return(-1);
}
// Žá¢®¡®¦¤ ¥¬ ¯ ¬ïâì
farfree(dbp);
farfree(dbp_f);
return(0);
}