115 lines
2.4 KiB
C++
115 lines
2.4 KiB
C++
#include <stdio.h>
|
||
#include <dos.h>
|
||
#include <bios.h>
|
||
|
||
typedef struct _DPT_
|
||
{
|
||
unsigned char srt_hut;
|
||
unsigned char dma_hlt;
|
||
unsigned char motor_w;
|
||
unsigned char sec_size;
|
||
unsigned char eot;
|
||
unsigned char gap_rw;
|
||
unsigned char dtl;
|
||
unsigned char gap_f;
|
||
unsigned char fill_char;
|
||
unsigned char hst;
|
||
unsigned char mot_start;
|
||
} DPT;
|
||
|
||
DPT far *get_dpt(void);
|
||
|
||
// <20>®¬¥à ä®à¬ â¨à㥬®© ¤®à®¦ª¨
|
||
#define TRK 20
|
||
|
||
// Š®¤ à §¬¥à ᥪâ®à - 512 ¡ ©â
|
||
#define SEC_SIZE 2
|
||
|
||
union REGS inregs, outregs;
|
||
char diskbuf[512];
|
||
|
||
void main(void)
|
||
{
|
||
struct diskinfo_t di;
|
||
unsigned status;
|
||
unsigned char old_sec_size,
|
||
old_fill_char, old_eot;
|
||
int i, j;
|
||
DPT _far *dpt_ptr;
|
||
|
||
// <20>®«ãç ¥¬ ¤à¥á â ¡«¨æë ¯ à ¬¥â஢ ¤¨áª¥âë
|
||
dpt_ptr = get_dpt();
|
||
|
||
// ‘®åà 塞 áâ àë¥ § ç¥¨ï ¨§ â ¡«¨æë ¯ à ¬¥â஢
|
||
old_sec_size = dpt_ptr->sec_size;
|
||
old_fill_char = dpt_ptr->fill_char;
|
||
old_eot = dpt_ptr->eot;
|
||
|
||
// “áâ ¢«¨¢ ¥¬ ¢ â ¡«¨æ¥ ¯ à ¬¥â஢ ¤¨áª¥âë
|
||
// ª®¤ à §¬¥à ᥪâ®à , ᨬ¢®« § ¯®«¥¨ï ¯à¨
|
||
// ä®à¬ â¨à®¢ ¨¨, ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤®à®¦ª¥
|
||
dpt_ptr->sec_size = SEC_SIZE;
|
||
dpt_ptr->fill_char = 0xf8;
|
||
dpt_ptr->eot = 15;
|
||
|
||
// “áâ ¢«¨¢ ¥¬ ⨯ ¤¨áª¥âë
|
||
inregs.h.ah = 0x17;
|
||
inregs.h.al = 3; // ¤¨áª¥â ¢ë᮪®© ¯«®â®áâ¨
|
||
// ¢ <20>ƒŒ„ ¢ë᮪®© ¯«®â®áâ¨
|
||
inregs.h.dl = 0;
|
||
int86(0x13, &inregs, &outregs);
|
||
|
||
// “áâ ¢«¨¢ ¥¬ á।㠤«ï ä®à¬ â¨à®¢ ¨ï
|
||
inregs.h.ah = 0x18;
|
||
inregs.h.ch = TRK;
|
||
inregs.h.cl = dpt_ptr->eot;
|
||
inregs.h.dl = 0;
|
||
int86(0x13, &inregs, &outregs);
|
||
|
||
// <20>®¤£®â ¢«¨¢ ¥¬ ¯ à ¬¥âàë ¤«ï
|
||
// äãªæ¨¨ ä®à¬ â¨à®¢ ¨ï
|
||
di.drive = 0;
|
||
di.head = 0;
|
||
di.track = TRK;
|
||
di.sector = 1;
|
||
di.nsectors = 15;
|
||
di.buffer = (void far*)diskbuf;
|
||
|
||
// <20>®¤£®â ¢«¨¢ ¥¬ ¡ãä¥à ä®à¬ â ¤«ï 15 ᥪâ®à®¢
|
||
for(i=0, j=1; j<16; i += 4, j++)
|
||
{
|
||
diskbuf[i] = TRK;
|
||
diskbuf[i+1] = 0;
|
||
diskbuf[i+2] = j;
|
||
diskbuf[i+3] = SEC_SIZE;
|
||
}
|
||
|
||
// ‚ë§ë¢ ¥¬ äãªæ¨î ä®à¬ â¨à®¢ ¨ï ¤®à®¦ª¨
|
||
status = _bios_disk(_DISK_FORMAT, &di) >> 8;
|
||
|
||
printf("\n”®à¬ â¨à®¢ ¨¥ § ¢¥à訫®áì "
|
||
"á ª®¤®¬: %d", status);
|
||
|
||
// ‚®ááâ ¢«¨¢ ¥¬ áâ àë¥ § ç¥¨ï ¢
|
||
// â ¡«¨æ¥ ¯ à ¬¥â஢ ¤¨áª¥âë
|
||
dpt_ptr->sec_size = old_sec_size;
|
||
dpt_ptr->fill_char = old_fill_char;
|
||
dpt_ptr->eot = old_eot;
|
||
}
|
||
|
||
/**
|
||
* get_dpt
|
||
*
|
||
* ‚ëç¨á«¨âì ¤à¥á â ¡«¨æë ¯ à ¬¥â஢ ¤¨áª¥âë
|
||
*
|
||
* ”ãªæ¨ï ¢®§¢à é ¥â 㪠§ ⥫ì â ¡«¨æã
|
||
* ¯ à ¬¥â஢ ¤¨áª¥âë
|
||
*
|
||
**/
|
||
DPT far *get_dpt(void)
|
||
{
|
||
void far * far *ptr;
|
||
ptr = (void far * far *)MK_FP(0x0, 0x78);
|
||
return(DPT far*)(*ptr);
|
||
}
|