Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Операционная система MS-DOS / 1-2 Том / 276 / DBSP1A / LIBSRC / DISK_CFG
.C/**
*.Name disk_cfg
*
*.Title ЋЇаҐ¤Ґ«Ёвм Є®дЁЈга жЁо ¤ЁбЄ®ў®© Ї®¤бЁб⥬л
*
*.Descr ”гЄжЁп § Ї®«пҐв бвагЄвгаг, ®ЇЁблў ойго
* Є®дЁЈга жЁо ¤ЁбЄ®ў®© Ї®¤бЁб⥬л:
*
* typedef struct _DISK_CONFIG_ {
* int n_floppy;
* int n_hard;
* int t_floppy1;
* int t_floppy2;
* int t_hard1;
* int t_hard2;
* } DISK_CONFIG;
*
*.Proto void disk_cfg(DISK_CONFIG* cfg);
*
*.Params DISK_CONFIG* cfg - гЄ § вҐ«м § Ї®«пҐ¬го
* бвагЄвгаг
*
*.Return ЌЁзҐЈ®
*
*.Sample discshow.c
**/
#include <stdio.h>
#include <dos.h>
#include "sysp.h"
void disk_cfg(DISK_CONFIG* cfg) {
char unsigned _far *modptr;
char unsigned pc_type;
char cfg_byte;
int cfg_word;
union REGS inregs, outregs;
// ЋЇаҐ¤Ґ«пҐ¬ вЁЇ Є®¬ЇмовҐа
modptr = FP_MAKE(0xf000,0xfffe);
pc_type = *modptr;
// ‚ § ўЁбЁ¬®бвЁ ®в вЁЇ Є®¬ЇмовҐа ўлЎЁа Ґ¬
// бЇ®б®Ў ®ЇаҐ¤Ґ«ҐЁп Є®дЁЈга жЁЁ ¤ЁбЄ®ў®©
// Ї®¤бЁб⥬л
switch (pc_type) {
case 0xfc:
// „«п IBM AT бзЁвлў Ґ¬ Є®дЁЈга жЁо ¤ЁбЄ®ў®©
// Ї®¤бЁбвҐ¬л Ё§ ЉЊЋЏ-Ї ¬пвЁ
// ‘зЁвлў Ґ¬ Ў ©в Є®дЁЈга жЁЁ
outp(0x70, 0x14);
cfg_byte = inp(0x71);
// ЋЇаҐ¤Ґ«пҐ¬ Є®«ЁзҐбвў® гбв ®ў«Ґле д«®ЇЇЁ-¤ЁбЄ®ў
if((cfg_byte & 1) == 0) {
// …б«Ё ¬« ¤иЁ© ЎЁв Ў ©в Є®дЁЈга жЁЁ а ўҐ 0,
// д«®ЇЇЁ-¤ЁбЄЁ Ґ гбв ®ў«Ґл
cfg->n_floppy = 0;
cfg->t_floppy1 = 0;
cfg->t_floppy2 = 0;
}
else {
// ЋЇаҐ¤Ґ«пҐ¬ Є®«ЁзҐбвў® гбв ®ў«Ґле
// д«®ЇЇЁ-¤ЁбЄ®ў
cfg->n_floppy = ((cfg_byte >> 6) & 3) + 1;
// ЋЇаҐ¤Ґ«пҐ¬ вЁЇл д«®ЇЇЁ-¤ЁбЄ®ў
outp(0x70, 0x10);
cfg_byte = inp(0x71);
cfg->t_floppy2 = cfg_byte & 0xf;
cfg->t_floppy1 = (cfg_byte >> 4) & 0xf;
}
// ЋЇаҐ¤Ґ«пҐ¬ Є®дЁЈга жЁо ¦ҐбвЄЁе ¤ЁбЄ®ў
outp(0x70, 0x12);
cfg_byte = inp(0x71);
if(cfg_byte == 0) {
// …б«Ё ®ЎҐ вҐва ¤л а ўл г«о, бЁб⥬
// Ґ ᮤҐа¦Ёв ¦ҐбвЄЁе ¤ЁбЄ®ў
cfg->n_hard = 0;
cfg->t_hard1 = 0;
cfg->t_hard2 = 0;
}
else {
// ЋЇаҐ¤Ґ«пҐ¬ вЁЇ ЇҐаў®Ј® ¤ЁбЄ - ¤ЁбЄ C:
if((cfg_byte & 0xf) != 0xf)
cfg->t_hard1 = cfg_byte & 0xf;
else {
outp(0x70, 0x19);
cfg->t_hard1 = inp(0x71);
}
// ЋЇаҐ¤Ґ«пҐ¬ вЁЇ ўв®а®Ј® ¤ЁбЄ - ¤ЁбЄ D:
if((cfg_byte & 0xf0) != 0xf0)
cfg->t_hard2 = (cfg_byte >> 4) & 0xf;
else {
outp(0x70, 0x1a);
cfg->t_hard2 = inp(0x71);
}
}
// ‚лзЁб«пҐ¬ Є®«ЁзҐбвў® гбв ®ў«Ґле
// ў бЁб⥬Ґ ¦ҐбвЄЁе ¤ЁбЄ®ў
cfg->n_hard = 0;
if(cfg->t_hard1 != 0) cfg->n_hard++;
if(cfg->t_hard2 != 0) cfg->n_hard++;
// „«п ҐЄ®в®але б®ў¬ҐбвЁ¬ле б IBM AT ¬ иЁ Ґў®§¬®¦®
// ®ЇаҐ¤Ґ«Ёвм вЁЇ ¤ЁбЄ , в Є Є Є ў ЉЊЋЏ-Ї ¬пвЁ ¤«п
// вЁЇ ¤ЁбЄ гбв ®ў«Ґ® § 票Ґ 0, Ґб¬®вап в®,
// зв® ¤ЁбЄ гбв ®ў«Ґ ( ЇаЁ¬Ґа ¬ иЁ Bondwell,
// ¬®¤Ґ«м ‚-300). ‚ в ЄЁе б«гз пе ¬®¦® ®ЇаҐ¤Ґ«Ёвм
// «ЁзЁҐ ¦ҐбвЄ®Ј® ¤ЁбЄ , ЁбЇ®«м§гп б«®ў®
// Є®дЁЈга жЁЁ, ў®§ўа й Ґ¬®Ґ ЇаҐалў ЁҐ¬ INT 11h.
if(cfg->n_hard == 0) {
int86(0x11, &inregs, &outregs);
cfg_word = outregs.x.ax;
// ЋЇаҐ¤Ґ«пҐ¬ «ЁзЁҐ ¦ҐбвЄ®Ј® ¤ЁбЄ
if((cfg_word & 1) != 0) {
cfg->n_hard = 1;
// ‘зЁв Ґ¬, зв® вЁЇ ЁбЇ®«м§гҐ¬®Ј® ¦ҐбвЄ®Ј®
// ¤ЁбЄ Ґ®ЇаҐ¤Ґ«Ґ
cfg->t_hard1 = 0;
cfg->t_hard2 = 0;
}
}
break;
default:
// „«п ®бв «мле вЁЇ®ў Є®¬ЇмовҐа®ў ўл§лў Ґ¬
// ЇаҐалў ЁҐ INT 11h, ЁбЇ®«м§гҐ¬ ў®§ўа й Ґ¬л©
// нвЁ¬ ЇаҐалў ЁҐ¬ Ў ©в Є®дЁЈга жЁЁ
int86(0x11, &inregs, &outregs);
cfg_word = outregs.x.ax;
// ЋЇаҐ¤Ґ«пҐ¬ Є®«ЁзҐбвў® гбв ®ў«Ґле
// д«®ЇЇЁ-¤ЁбЄ®ў
cfg->n_floppy = ((cfg_word >> 6) & 3) + 1;
// ‘зЁв Ґ¬, зв® вЁЇ ЁбЇ®«м§гҐ¬®Ј® д«®ЇЇЁ-¤ЁбЄ
// Ґ®ЇаҐ¤Ґ«Ґ
cfg->t_floppy1 = 0;
cfg->t_floppy2 = 0;
// ЋЇаҐ¤Ґ«пҐ¬ «ЁзЁҐ ¦ҐбвЄ®Ј® ¤ЁбЄ
if((cfg_word & 1) != 0) {
cfg->n_hard = 1;
// ‘зЁв Ґ¬, зв® вЁЇ ЁбЇ®«м§гҐ¬®Ј® ¦ҐбвЄ®Ј®
// ¤ЁбЄ Ґ®ЇаҐ¤Ґ«Ґ
cfg->t_hard1 = 0;
cfg->t_hard2 = 0;
}
break;
}
}