313 lines
6.9 KiB
C++
313 lines
6.9 KiB
C++
#ifdef __cplusplus
|
||
#define __CPPARGS ...
|
||
#else
|
||
#define __CPPARGS
|
||
#endif
|
||
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <conio.h>
|
||
#include <dos.h>
|
||
|
||
#define CYL 0
|
||
|
||
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);
|
||
void fdc_out(unsigned char byte);
|
||
int fdc_inp(void);
|
||
void int_wait(void);
|
||
void dma_init(void far *);
|
||
void tdelay(int cnt);
|
||
void interrupt IRQ6 (__CPPARGS);
|
||
void interrupt (*oldIRQ6) (__CPPARGS);
|
||
|
||
char buffer[512];
|
||
|
||
static int IRQ=0;
|
||
|
||
void main(void)
|
||
{
|
||
unsigned i;
|
||
long l;
|
||
char status[7], main_status;
|
||
DPT _far *fdpt;
|
||
FILE *sect;
|
||
|
||
printf("\n\n<EFBFBD> ¡®â á ª®â஫«¥à®¬ <20>ƒŒ„"
|
||
"\n (C)”஫®¢ €., 1995\n");
|
||
|
||
oldIRQ6 = _dos_getvect (8+6);
|
||
_dos_setvect (8+6, IRQ6);
|
||
|
||
// Žâªàë¢ ¥¬ ä ©«, ¢ ª®â®àë© ¡ã¤¥¬ § ¯¨áë¢ âì
|
||
// ᮤ¥à¦¨¬®¥ á ¬®£® ¯¥à¢®£® ᥪâ®à ¤¨áª¥âë
|
||
sect = fopen("!sector.dat","wb+");
|
||
|
||
// “áâ ¢«¨¢ ¥¬ 㪠§ ⥫ì â ¡«¨æã
|
||
// ¯ à ¬¥â஢ ¤¨áª¥âë
|
||
fdpt = get_dpt();
|
||
|
||
// ‚ª«îç ¥¬ ¬®â®à ¤¨áª®¢®¤ €:
|
||
// <20>¥à¥¤ í⨬ à §à¥è ¥¬ ¯à¥àë¢ ¨ï
|
||
_enable();
|
||
outp(0x3F2, 0x1C);
|
||
|
||
// ‚믮«ï¥¬ § ¤¥à¦ªã ¤«ï à §£® ¤¢¨£ ⥫ï
|
||
tdelay(18);
|
||
|
||
// <20>®ª §ë¢ ¥¬ ᮤ¥à¦¨¬®¥ ॣ¨áâà ®á®¢®£®
|
||
// á®áâ®ï¨ï ª®â஫«¥à
|
||
printf("Œ®â®à ¢ª«îç¥.\t\t");
|
||
printf("Žá®¢®¥ á®áâ®ï¨¥: %02.2X\n",inp(0x3F4));
|
||
|
||
// <20>¥à¥¤ ç⥨¥¬ ᥪâ®à ¥®¡å®¤¨¬® ãáâ ®¢¨âì
|
||
// £®«®¢ªã ã¦ãî ¤®à®¦ªã, ¢ 襬 á«ãç ¥ íâ®
|
||
// ¤®à®¦ª á ®¬¥à®¬ CYL
|
||
|
||
// ‚ë¤ ¥¬ ª®â஫«¥àã ª®¬ ¤ã "<22>®¨áª"
|
||
fdc_out(0xf);
|
||
|
||
// „«ï ª®¬ ¤ë "<22>®¨áª" âॡã¥âáï ¤¢ ¡ ©â ¯ à ¬¥â஢:
|
||
// ®¬¥à £®«®¢ª¨/®¬¥à ª®¯¨â¥«ï ¨ ®¬¥à ¤®à®¦ª¨.
|
||
// Œë à ¡®â ¥¬ á ã«¥¢®© £®«®¢ª®© ª®¯¨â¥«ï €:,
|
||
// ¯®í⮬㠯¥à¢ë© ¯ à ¬¥âà à ¢¥ 0, ¢â®à®© - CYL
|
||
fdc_out(0);
|
||
fdc_out(CYL);
|
||
|
||
// <20>®ª §ë¢ ¥¬ ᮤ¥à¦¨¬®¥ ॣ¨áâà ®á®¢®£®
|
||
// á®áâ®ï¨ï ª®â஫«¥à
|
||
printf("\n<<<<3C>®¨áª>>> \t\t");
|
||
printf("Žá®¢®¥ á®áâ®ï¨¥: %02.2X\n",inp(0x3F4));
|
||
|
||
// ަ¨¤ ¥¬ ¯à¥àë¢ ¨¥ ¯® § ¢¥àè¥¨î ®¯¥à 樨
|
||
int_wait();
|
||
|
||
// ‡ ¤¥à¦ª ¤«ï ¯®§¨æ¨®¨à®¢ ¨ï £®«®¢ª¨
|
||
tdelay(1);
|
||
|
||
// „«ï ¯à®¢¥àª¨ १ã«ìâ ⠢믮«¥¨ï ª®¬ ¤ë
|
||
// "<22>®¨áª" ¢ë¤ ¥¬ ª®â஫«¥àã ª®¬ ¤ã
|
||
// "—⥨¥ á®áâ®ï¨ï ¯à¥àë¢ ¨ï"
|
||
|
||
// ‚뢮¤¨¬ ᮤ¥à¦¨¬®¥ ॣ¨áâà á®áâ®ï¨ï
|
||
// ST0 ¨ ®¬¥à ¤®à®¦ª¨ ¯®á«¥ ¢ë¯®«¥¨ï ª®¬ ¤ë
|
||
// "<22>®¨áª" PCN
|
||
fdc_out(0x8);
|
||
printf("‘®áâ®ï¨¥ ¯à¥àë¢ ¨ï:\t");
|
||
printf(" ST0: %02.2X, \t", fdc_inp());
|
||
printf("PCN: %02.2X\n", fdc_inp());
|
||
|
||
// „«ï ¡®«¥¥ £«ã¡®ª®© ¤¨ £®á⨪¨ á®áâ®ï¨ï
|
||
// ª®â஫«¥à ¢ë¤ ¥¬ ª®â஫«¥àã ª®¬ ¤ã
|
||
// "—⥨¥ á®áâ®ï¨ï ª®¯¨â¥«ï", ¢ë¢®¤¨¬
|
||
// ᮤ¥à¦¨¬®¥ ॣ¨áâà á®áâ®ï¨ï ST3
|
||
fdc_out(4);
|
||
fdc_out(0);
|
||
printf("‘®áâ®ï¨¥ ª®¯¨â¥«ï:\t ST3: %02.2X\n",fdc_inp());
|
||
|
||
// “áâ ¢«¨¢ ¥¬ ᪮à®áâì ¯¥à¥¤ ç¨ ¤ ëå 500 Š¡ ©â/á
|
||
outp(0x3F7, 0);
|
||
|
||
// ˆ¨æ¨ «¨§ æ¨ï ª « ¯àאַ£®
|
||
// ¤®áâ㯠ª ¯ ¬ïâ¨
|
||
dma_init((void far *)buffer);
|
||
|
||
// ‚ë¤ ¥¬ ª®¬ ¤ã "—⥨¥ ¤ ëå"
|
||
fdc_out(0x66);
|
||
fdc_out(0x0); // ª®¯¨â¥«ì 0, £®«®¢ª 0
|
||
|
||
fdc_out(CYL); // 樫¨¤à CYL
|
||
fdc_out(0); // £®«®¢ª 0
|
||
fdc_out(1); // ®¬¥à ᥪâ®à - 1
|
||
|
||
// <20>¥à¥¤ ¥¬ ª®â஫«¥àã â¥å¨ç¥áª¨¥ ¯ à ¬¥âàë
|
||
// ¤¨áª®¢®¤ , ¡¥à¥¬ ¨å ¨§ â ¡«¨æë ¯ à ¬¥â஢ ¤¨áª¥âë.
|
||
// <20>â® â ª¨¥ ¯ à ¬¥âàë:
|
||
// - à §¬¥à ᥪâ®à ;
|
||
// - ®¬¥à ¯®á«¥¤¥£® ᥪâ®à ¤®à®¦ª¥;
|
||
// - à §¬¥à ¯à®¬¥¦ã⪠;
|
||
// - ç¨á«® áç¨âë¢ ¥¬ëå/§ ¯¨áë¢ ¥¬ëå ¡ ©â®¢
|
||
fdc_out(fdpt->sec_size);
|
||
fdc_out(fdpt->eot);
|
||
fdc_out(fdpt->gap_rw);
|
||
fdc_out(fdpt->dtl);
|
||
|
||
// ަ¨¤ ¥¬ ¯à¥àë¢ ¨¥ ¯®á«¥ § ¢¥àè¥¨ï ®¯¥à 樨
|
||
int_wait();
|
||
|
||
// ‘ç¨âë¢ ¥¬ ¨ ¢ë¢®¤¨¬ íªà ¡ ©âë १ã«ìâ â
|
||
// ®¯¥à 樨 "—⥨¥ ¤ ëå"
|
||
printf("\n<<<—⥨¥ ᥪâ®à >>> \n");
|
||
printf(" <20> ©âë á®áâ®ï¨ï (ST0,ST1,ST2,C,H,R,N):\n");
|
||
|
||
for(i=0; i<7; i++) printf("%02.2X\t", (char) fdc_inp());
|
||
printf("\n");
|
||
|
||
// ‚뢮¤¨¬ ᮤ¥à¦¨¬®¥ áç¨â ®£® ᥪâ®à ¢ ä ©«
|
||
for(i=0; i<512; i++) fputc(buffer[i],sect);
|
||
fclose(sect);
|
||
|
||
// ‚몫îç ¥¬ ¬®â®à
|
||
outp(0x3F2, 0xC);
|
||
|
||
_dos_setvect (8+6, oldIRQ6);
|
||
}
|
||
|
||
// ‚뢮¤ ¡ ©â ¢ ª®â஫«¥à ¤¨áª®¢®¤
|
||
void fdc_out(unsigned char parm)
|
||
{
|
||
asm mov dx,3F4h // <20>®à⠮ᮢ®£® á®áâ®ï¨ï
|
||
loop_fdc_out:
|
||
|
||
asm in al,dx
|
||
asm test al,80h // <20>஢¥à塞 £®â®¢®áâì
|
||
asm jz loop_fdc_out // ª®â஫«¥à
|
||
|
||
asm inc dx // ‚뢮¤¨¬ ¡ ©â ¢ ¯®àâ ¤ ëå
|
||
asm mov al, parm // ª®â஫«¥à
|
||
asm out dx, al
|
||
}
|
||
|
||
// ‚¢®¤ ¡ ©â ¨§ ¯®àâ ¤ ëå ª®â஫«¥à ¤¨áª®¢®¤
|
||
int fdc_inp(void)
|
||
{
|
||
asm mov dx,3F4h // <20>®à⠮ᮢ®£® á®áâ®ï¨ï
|
||
loop_fdc_inp:
|
||
asm in al,dx
|
||
asm test al,80h // <20>஢¥à塞 £®â®¢®áâì
|
||
asm jz loop_fdc_inp // ª®â஫«¥à
|
||
|
||
asm inc dx // ‚¢¥¤¥ë© ¡ ©â § ¯¨áë¢ ¥¬
|
||
asm in al, dx // ¢ ॣ¨áâà AX
|
||
return _AL;
|
||
}
|
||
|
||
// ަ¨¤ ¨¥ ¯à¥àë¢ ¨ï ®â ª®â஫«¥à
|
||
void int_wait (void) {
|
||
_enable();
|
||
while (IRQ==0) {};
|
||
IRQ = 0;
|
||
}
|
||
|
||
void interrupt IRQ6 (__CPPARGS) {
|
||
IRQ = 1;
|
||
outportb (0x20, 0x20);
|
||
}
|
||
|
||
// ˆ¨æ¨ «¨§ æ¨ï ª « ¯àאַ£® ¤®áâ㯠ª ¯ ¬ïâ¨
|
||
void dma_init(void far *buf)
|
||
{
|
||
unsigned long f_adr;
|
||
unsigned sg, of;
|
||
|
||
// ‚ëç¨á«ï¥¬ 24-à §àï¤ë© ¤à¥á ¡ãä¥à ¤«ï ¤ ëå
|
||
f_adr = ((unsigned long)FP_SEG(buf) << 4)
|
||
+ (unsigned long)FP_OFF(buf);
|
||
|
||
// <20> á饯«ï¥¬ ¤à¥á ®¬¥à áâà ¨æë
|
||
// ¨ ᬥ饨¥
|
||
sg = (f_adr >> 16) & 0xff;
|
||
of = f_adr & 0xffff;
|
||
|
||
// <20> ¢à¥¬ï ¯à®£à ¬¬¨à®¢ ¨ï ª®â஫«¥à ¯àאַ£®
|
||
// ¤®áâ㯠§ ¯à¥é ¥¬ ¯à¥àë¢ ¨ï
|
||
_disable();
|
||
asm mov al,46h // Š®¬ ¤ çâ¥¨ï ¤ ëå ®â
|
||
// ª®â஫«¥à <20>ƒŒ„
|
||
|
||
asm out 12,al // ‘¡à®á âਣ£¥à -㪠§ â¥«ï ¡ ©â
|
||
// ¤«ï à ¡®âë á 16-à §àï¤ë¬¨ ¯®àâ ¬¨.
|
||
// ‘«¥¤ãî騩 ¡ ©â, ¢ë¢®¤¨¬ë© ¢ 16-à §àï¤ë©
|
||
// ¯®à⠡㤥⠨â¥à¯à¥â¨à®¢ âìáï
|
||
// ª ª ¬« ¤è¨©
|
||
|
||
asm out 11,al // “áâ ®¢ª ०¨¬ ª®â஫«¥à <20>„<EFBFBD>
|
||
|
||
asm mov ax,of // ‘¬¥é¥¨¥ ¡ãä¥à , ¬« ¤è¨© ¡ ©â
|
||
asm out 4,al
|
||
asm mov al,ah // ‘¬¥é¥¨¥ ¡ãä¥à , áâ à訩 ¡ ©â
|
||
asm out 4,al
|
||
|
||
asm mov ax,sg // <20>®¬¥à áâà ¨æë
|
||
asm out 81h,al
|
||
|
||
asm mov ax,511 // „«¨ ¯¥à¥¤ ¢ ¥¬ëå ¤ ëå
|
||
asm out 5,al
|
||
asm mov al,ah
|
||
asm out 5,al
|
||
|
||
asm mov al,2 // <20> §¡«®ª¨à®¢ª ª « 2 ª®â஫«¥à <20>„<EFBFBD>
|
||
asm out 10,al
|
||
|
||
// ˆ¨æ¨ «¨§ æ¨ï ª®â஫«¥à § ª®ç¥ ,
|
||
// à §à¥è ¥¬ ¯à¥àë¢ ¨ï.
|
||
_enable();
|
||
}
|
||
|
||
/**
|
||
* get_dpt
|
||
*
|
||
* ‚ëç¨á«¨âì ¤à¥á â ¡«¨æë ¯ à ¬¥â஢ ¤¨áª¥âë
|
||
*
|
||
* ”ãªæ¨ï ¢®§¢à é ¥â 㪠§ ⥫ì â ¡«¨æã
|
||
* ¯ à ¬¥â஢ ¤¨áª¥âë
|
||
*
|
||
**/
|
||
|
||
DPT far *get_dpt(void)
|
||
{
|
||
void far * far *ptr;
|
||
|
||
ptr = (void far * far *)MK_FP(0x0, 0x78);
|
||
return(DPT far*)(*ptr);
|
||
}
|
||
|
||
/**
|
||
* tdelay
|
||
*
|
||
* ”®à¬¨à®¢ ¨¥ ¢à¥¬¥®© § ¤¥à¦ª¨ ¯à¨ ¯®¬®é¨
|
||
* â ©¬¥à .
|
||
*
|
||
* ‚ ª ç¥á⢥ ¯ à ¬¥âà äãªæ¨¨ ¯¥à¥¤ ¥âáï
|
||
* ¤«¨â¥«ì®áâì § ¤¥à¦ª¨ ¢ ª®«¨ç¥á⢥ ¯à¥àë¢ ¨©,
|
||
* ¯®áâ㯠îé¨å ®â â ©¬¥à (â ©¬¥à £¥¥à¨àã¥â
|
||
* ¢ ®¤ã ᥪã¤ã ¯à¨¬¥à® 18 ¯à¥àë¢ ¨©)
|
||
*
|
||
**/
|
||
|
||
void tdelay(int cnt)
|
||
{
|
||
asm push bx
|
||
asm push dx
|
||
asm push si
|
||
|
||
asm mov si, cnt
|
||
asm mov ah, 0
|
||
asm int 1ah
|
||
asm mov bx, dx
|
||
asm add bx, si
|
||
|
||
delay_loop:
|
||
asm int 1ah
|
||
asm cmp dx, bx
|
||
asm jne delay_loop
|
||
|
||
asm pop si
|
||
asm pop dx
|
||
asm pop bx
|
||
}
|