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

313 lines
6.9 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.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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
}