Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#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();
}