Скачиваний:
38
Добавлен:
01.05.2014
Размер:
4.12 Кб
Скачать
/**
*.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;

	}

}
Соседние файлы в папке LIBSRC