Скачиваний:
37
Добавлен:
01.05.2014
Размер:
6.39 Кб
Скачать
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include "sysp.h"

#define CYL 0

void main(void);
void fdc_out(unsigned char byte);
int  fdc_inp(void);
void int_wait(void);
void dma_init(char *);

void main(void) {

	unsigned i;
	long l;
	char buffer[512];
	char status[7], main_status;
	DPT _far *fdpt;
	FILE *sect;

	printf("\n"
			 "\nђ Ў®в  б Є®­ва®««Ґа®¬ ЌѓЊ„"
			 "\n  (C)”а®«®ў Ђ., 1991"
			 "\n");


// ќв  Їа®Ја ¬¬  ЇаҐ¤­ §­ зҐ­  в®«мЄ® ¤«п IBM AT

	if(pc_model() != 0xfc) {
		printf("ќв  Їа®Ја ¬¬  ЇаҐ¤­ §­ зҐ­  в®«мЄ® ¤«п IBM AT\n");
		exit(-1);
	}

// ЋвЄалў Ґ¬ д ©«, ў Є®в®ал© Ўг¤Ґ¬ § ЇЁблў вм
// ᮤҐа¦Ё¬®Ґ б ¬®Ј® ЇҐаў®Ј® бЄв®а  ­  ¤ЁбЄҐвҐ

	sect = fopen("!sector.dat","wb+");

// “бв ­ ў«Ёў Ґ¬ гЄ § вҐ«м ­  в Ў«Ёжг
// Ї а ¬Ґва®ў ¤ЁбЄҐвл

	fdpt = get_dpt();

// ‚Є«оз Ґ¬ ¬®в®а ¤ЁбЄ®ў®¤  Ђ:
// ЏҐаҐ¤ нвЁ¬ а §аҐи Ґ¬ ЇаҐалў ­Ёп

//   _enable();
	outp(0x3F2, 0x1C);

// ‚лЇ®«­пҐ¬ § ¤Ґа¦Єг ¤«п а §Ј®­  ¤ўЁЈ вҐ«п

	for(l=0;l<200000;l++);

// Џ®Є §лў Ґ¬ ᮤҐа¦Ё¬®Ґ ॣЁбва  ®б­®ў­®Ј®
// б®бв®п­Ёп Є®­ва®««Ґа 

	printf("Њ®в®а ўЄ«о祭.\t\t");
	printf("Ћб­®ў­®Ґ б®бв®п­ЁҐ: %02.2X\n",inp(0x3F4));

// ЏҐаҐ¤ з⥭ЁҐ¬ ᥪв®а  ­Ґ®Ўе®¤Ё¬® гбв ­®ўЁвм
// Ј®«®ўЄг ­  ­г¦­го ¤®а®¦Єг, ў ­ иҐ¬ б«гз Ґ нв®
// ¤®а®¦Є  б ­®¬Ґа®¬ CYL.

// ‚л¤ Ґ¬ Є®­ва®««Ґаг Є®¬ ­¤г "Џ®ЁбЄ"

	fdc_out(0xf);

// „«п Є®¬ ­¤л "Џ®ЁбЄ" вॡгҐвбп ¤ў  Ў ©в  Ї а ¬Ґва®ў:
// ­®¬Ґа Ј®«®ўЄЁ/­®¬Ґа ­ Є®ЇЁвҐ«п Ё ­®¬Ґа ¤®а®¦ЄЁ.
// Њл а Ў®в Ґ¬ б ­г«Ґў®© Ј®«®ўЄ®© ­ Є®ЇЁвҐ«п Ђ:,
// Ї®н⮬㠯Ґаўл© Ї а ¬Ґва а ўҐ­ 0, ўв®а®© - CYL

	fdc_out(0);
	fdc_out(CYL);

// Џ®Є §лў Ґ¬ ᮤҐа¦Ё¬®Ґ ॣЁбва  ®б­®ў­®Ј®
// б®бв®п­Ёп Є®­ва®««Ґа 

	printf("\n<<<Џ®ЁбЄ>>> \t\t");
	printf("Ћб­®ў­®Ґ б®бв®п­ЁҐ: %02.2X\n",inp(0x3F4));

// Ћ¦Ё¤ Ґ¬ ЇаҐалў ­ЁҐ Ї® § ўҐа襭Ёо ®ЇҐа жЁЁ

	int_wait();

// ‡ ¤Ґа¦Є  ¤«п Ї®§ЁжЁ®­Ёа®ў ­Ёп Ј®«®ўЄЁ

	for(l=0;l<20000;l++);

// „«п Їа®ўҐаЄЁ १г«мв в  ўлЇ®«­Ґ­Ёп Є®¬ ­¤л
// "Џ®ЁбЄ" ўл¤ Ґ¬ Є®­ва®««Ґаг Є®¬ ­¤г
// "—⥭ЁҐ б®бв®п­Ёп ЇаҐалў ­Ёп"

// ‚лў®¤Ё¬ ᮤҐа¦Ё¬®Ґ ॣЁбва  б®бв®п­Ёп
// ST0  Ё ­®¬Ґа ¤®а®¦ЄЁ Ї®б«Ґ ўлЇ®«­Ґ­Ёп Є®¬ ­¤л
// "Џ®ЁбЄ" 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(buffer);

// ‚л¤ Ґ¬ Є®¬ ­¤г "—⥭ЁҐ ¤ ­­ле"

	fdc_out(0x66);
	fdc_out(0x0);     // ­ Є®ЇЁвҐ«м 0, Ј®«®ўЄ  0

	fdc_out(CYL);     // жЁ«Ё­¤а CYL
	fdc_out(0);       // Ј®«®ўЄ  0
	fdc_out(1);       // ­®¬Ґа ᥪв®а  - 1

// ЏҐаҐ¤ Ґ¬ Є®­ва®««Ґаг вҐе­ЁзҐбЄЁҐ Ї а ¬Ґвал
// ¤ЁбЄ®ў®¤ , ЎҐаҐ¬ Ёе Ё§ в Ў«Ёжл Ї а ¬Ґва®ў ¤ЁбЄҐвл.
// ќв® в ЄЁҐ Ї а ¬Ґвал:
//    - а §¬Ґа ᥪв®а ;
//    - ­®¬Ґа Ї®б«Ґ¤­ҐЈ® ᥪв®а  ­  ¤®а®¦ЄҐ;
//    - а §¬Ґа Їа®¬Ґ¦гвЄ ;
//    - зЁб«® бзЁвлў Ґ¬ле/§ ЇЁблў Ґ¬ле Ў ©в®ў

	fdc_out(fdpt->sec_size);
	fdc_out(fdpt->eot);
	fdc_out(fdpt->gap_rw);
	fdc_out(fdpt->dtl);

// Ћ¦Ё¤ Ґ¬ ЇаҐалў ­ЁҐ Ї® § ўҐа襭Ёо ®ЇҐа жЁЁ

	int_wait();

// ‘зЁвлў Ґ¬ Ё ўлў®¤Ё¬ ­  нЄа ­ Ў ©вл १г«мв в 
// ®ЇҐа жЁЁ "—⥭ЁҐ ¤ ­­ле"

	printf("\n<<<—⥭ЁҐ ᥪв®а >>> \n");
	printf("   Ѓ ©вл б®бв®п­Ёп (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);
}


// ‚лў®¤ Ў ©в  ў Є®­ва®««Ґа ¤ЁбЄ®ў®¤ 

void fdc_out(unsigned char parm) {

	_asm {
		mov   dx,3F4h     // Џ®ав ®б­®ў­®Ј® б®бв®п­Ёп
loop_fdc_out:

		in    al,dx
		test  al,80h      // Џа®ўҐа塞 Ј®в®ў­®бвм
		jz loop_fdc_out   //   Є®­ва®««Ґа 

		inc   dx          // ‚лў®¤Ё¬ Ў ©в ў Ї®ав ¤ ­­ле
		mov   al, parm    //   Є®­ва®««Ґа 
		out   dx, al
	}
}

// ‚ў®¤ Ў ©в  Ё§ Ї®ав  ¤ ­­ле Є®­ва®««Ґа  ¤ЁбЄ®ў®¤ 

int fdc_inp(void) {

	_asm {
		mov   dx,3F4h     // Џ®ав ®б­®ў­®Ј® б®бв®п­Ёп
loop_fdc_inp:
		in    al,dx
		test  al,80h      // Џа®ўҐа塞 Ј®в®ў­®бвм
		jz loop_fdc_inp   //   Є®­ва®««Ґа 

		inc   dx          // ‚ўҐ¤Ґ­­л© Ў ©в § ЇЁблў Ґ¬
		in    al, dx      // ў ॣЁбва AX
	}
}

// Ћ¦Ё¤ ­ЁҐ ЇаҐалў ­Ёп ®в Є®­ва®««Ґа 

void int_wait(void) {

// ђ §аҐи Ґ¬ ЇаҐалў ­Ёп

	_enable();
	_asm {
		mov   ax,40h         // Џ®б«Ґ ЇаЁе®¤  ЇаҐалў ­Ёп
		mov   es,ax          // Їа®Ја ¬¬  ®Ўа Ў®вЄЁ ЇаҐалў ­Ёп
		mov   bx,3Eh         // гбв ­ ў«Ёў Ґв ў 1 бв аиЁ© ЎЁв
wait_loop:                 // Ў ©в  ў ®Ў« бвЁ ¤ ­­ле BIOS
		mov   dl,es:[bx]     // Ї®  ¤аҐбг 0040:003E.
		test  dl,80h         // Њл ¦¤Ґ¬, Є®Ј¤  нв®в ЎЁв Ўг¤Ґв
		jz    wait_loop      // гбв ­®ў«Ґ­ ў 1,   § вҐ¬
									// бЎа блў Ґ¬ ҐЈ®.
		and   dl,01111111b
		mov   es:[bx],dl
	}
}

// €­ЁжЁ «Ё§ жЁп Є ­ «  ЇаאַЈ® ¤®бвгЇ  Є Ї ¬пвЁ

void dma_init(char *buf) {

	unsigned long f_adr;
	unsigned sg, of;

// ‚лзЁб«пҐ¬ 24-а §ап¤­л©  ¤аҐб ЎгдҐа  ¤«п ¤ ­­ле

	f_adr = ((unsigned long)_psp << 4)
				+ (((unsigned long)buf) & 0xffff);

// ђ б饯«пҐ¬  ¤аҐб ­  ­®¬Ґа бва ­Ёжл
// Ё ᬥ饭ЁҐ

	sg = (f_adr >> 16) & 0xff;
	of = f_adr & 0xffff;

// Ќ  ўаҐ¬п Їа®Ја ¬¬Ёа®ў ­Ёп Є®­ва®««Ґа  ЇаאַЈ®
// ¤®бвгЇ  § ЇаҐй Ґ¬ ЇаҐалў ­Ёп

	_disable();

	_asm {
		mov   al,46h   // Љ®¬ ­¤  з⥭Ёп ¤ ­­ле ®в
							// Є®­ва®««Ґа  ЌѓЊ„.

		out   12,al    // ‘Ўа®б ваЁЈЈҐа -гЄ § вҐ«п Ў ©в 
							// ¤«п а Ў®вл б 16-а §ап¤­л¬Ё Ї®ав ¬Ё.
							// ‘«Ґ¤гойЁ© Ў ©в, ўлў®¤Ё¬л© ў 16-а §ап¤­л©
							// Ї®а⠡㤥⠨­вҐаЇаҐвЁа®ў вмбп
							// Є Є ¬« ¤иЁ©.

		out   11,al    // “бв ­®ўЄ  ०Ё¬  Є®­ва®««Ґа  Џ„Џ

		mov   ax,of    // ‘¬ҐйҐ­ЁҐ ЎгдҐа , ¬« ¤иЁ© Ў ©в
		out   4,al
		mov   al,ah    // ‘¬ҐйҐ­ЁҐ ЎгдҐа , бв аиЁ© Ў ©в
		out   4,al

		mov   ax,sg    // Ќ®¬Ґа бва ­Ёжл
		out   81h,al

		mov   ax,511   // „«Ё­  ЇҐаҐ¤ ў Ґ¬ле ¤ ­­ле
		out   5,al
		mov   al,ah
		out   5,al

		mov   al,2     // ђ §Ў«®ЄЁа®ўЄ  Є ­ «  2 Є®­ва®««Ґа  Џ„Џ
		out   10,al
	}

// €­ЁжЁ «Ё§ жЁп Є®­ва®««Ґа  § Є®­зҐ­ ,
// а §аҐи Ґ¬ ЇаҐалў ­Ёп.

	_enable();
}
Соседние файлы в папке DISK_CTL