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


// ‚лЄ«оз Ґ¬ Їа®ўҐаЄг б⥪  Ё гЄ § вҐ«Ґ©

#pragma check_stack( off )
#pragma check_pointer( off )

// Њ Єа® ¤«п Ї®¤ зЁ §ўгЄ®ў®Ј® бЁЈ­ « 

#define BEEP() _asm { \
								_asm xor  bx, bx    \
								_asm mov  ax, 0E07h \
								_asm int  10h       \
						  }

// “Є § вҐ«Ё ­  бв алҐ ®Ўа Ў®взЁЄЁ ЇаҐалў ­Ё©

void (_interrupt _far *old8)(void);  // ’ ©¬Ґа
void (_interrupt _far *old9)(void);  // Љ« ўЁ вга 
void (_interrupt _far *old28)(void); // ‡ ­пв®бвм DOS
void (_interrupt _far *old2f)(void); // Њг«мвЁЇ«ҐЄб®а

// Ќ®ўлҐ ®Ўа Ў®взЁЄЁ ЇаҐалў ­Ё©

void _interrupt _far new8(void);
void _interrupt _far new9(void);
void _interrupt _far new28(void);
void _interrupt _far new2f(unsigned _es, unsigned _ds,
									unsigned _di, unsigned _si,
									unsigned _bp, unsigned _sp,
									unsigned _bx, unsigned _dx,
									unsigned _cx, unsigned _ax,
									unsigned _ip, unsigned _cs,
									unsigned flags);

int iniflag; // ”« Ј § Їа®б  ­  ўлў®¤ нЄа ­  ў д ©«
int outflag; // ”« Ј ­ з «  ўлў®¤  ў д ©«
int name_counter; // Ќ®¬Ґа ⥪г饣® ўлў®¤Ё¬®Ј® д ©« 
char _far *crit;  // Ђ¤аҐб д« Ј  ЄаЁвЁзҐбЄ®© ᥪ樨 DOS


// =======================================

void main(void);
void main(void) {

	 union REGS inregs, outregs;
	 struct SREGS segregs;

	 unsigned size; // ђ §¬Ґа १Ё¤Ґ­в­®© з бвЁ
						 // TSR-Їа®Ја ¬¬л

	// ‚л§лў Ґ¬ ЇаҐалў ­ЁҐ ¬г«мвЁЇ«ҐЄб®а  б AX = FF00
	// …б«Ё Їа®Ја ¬¬  GRAB 㦥 § ЇгбЄ «бм, в® ­®ўл©
	// ®Ўа Ў®взЁЄ ЇаҐалў ­Ёп ¬г«мвЁЇ«ҐЄб®а  ўҐа­Ґв
	// ў ॣЁбвॠAX §­ зҐ­ЁҐ 00FF.
	// ’ ЄЁ¬ бЇ®б®Ў®¬ ¬л Ё§ЎҐЈ Ґ¬ Ї®ўв®а­®Ј® Ё§¬Ґ­Ґ­Ёп
	// ᮤҐа¦Ё¬®Ј® ўҐЄв®а­®© в Ў«Ёжл ЇаҐалў ­Ё©.

	inregs.x.ax = 0xff00;
	int86(0x2f, &inregs, &outregs);

	if(outregs.x.ax == 0x00ff) {
		printf("\nЏа®Ја ¬¬  GRAB 㦥 § Ја㦥­ \n");
		hello();
		exit(-1);
	}

	// ‚л¤ Ґ¬ Ё­бвагЄжЁо Ї® а Ў®вҐ б Їа®Ја ¬¬®© GRAB

	hello();

	// ‚лзЁб«пҐ¬ а §¬Ґа Їа®Ја ¬¬л ў Ї а Ја д е
	// „®Ў ў«пҐ¬ 1 Ї а Ја д ­  б«гз ©
	// ­ҐЄа в­®© Ї а Ја дг ¤«Ё­л

	size = (12000 >> 4) + 1;


	// “бв ­ ў«Ёў Ґ¬ ­ з «м­лҐ §­ зҐ­Ёп д« Ј®ў

	outflag=iniflag=0;

	// ‘Ўа блў Ґ¬ бзҐвзЁЄ д ©«®ў. ЏҐаўл© д ©« Ўг¤Ґв
	// Ё¬Ґвм Ё¬п GRAB0.DOC. ‚ ¤ «м­Ґ©иҐ¬ нв®в бзҐвзЁЄ
	// Ўг¤Ґв 㢥«ЁзЁў вм бў®Ґ §­ зҐ­ЁҐ ­  1.

	name_counter=0;

	// Џ®«гз Ґ¬ гЄ § вҐ«м ­  д« Ј ЄаЁвЁзҐбЄ®© ᥪ樨 DOS.
	// Љ®Ј¤  нв®в д« Ј а ўҐ­ 0, TSR-Їа®Ја ¬¬  ¬®¦Ґв
	// Ї®«м§®ў вмбп дг­ЄжЁп¬Ё DOS

	inregs.h.ah = 0x34;
	intdosx( &inregs, &outregs, &segregs );
	crit=(char _far *)FP_MAKE(segregs.es,outregs.x.bx);

	// “бв ­ ў«Ёў Ґ¬ б®Ўб⢥­­лҐ ®Ўа Ў®взЁЄЁ ЇаҐалў ­Ё©.

	old9 = _dos_getvect(0x9);
	_dos_setvect(0x9, new9);

	old8 = _dos_getvect(0x8);
	_dos_setvect(0x8, new8);

	old28 = _dos_getvect(0x28);
	_dos_setvect(0x28, new28);

	old2f = _dos_getvect(0x2f);
	_dos_setvect(0x2f, new2f);


	// ‡ ўҐаи Ґ¬ Їа®Ја ¬¬г Ё ®бв Ґ¬бп ў Ї ¬пвЁ

	_dos_keep(0, size);
}

// =======================================

// Ќ®ўл© ®Ўа Ў®взЁЄ ЇаҐалў ­Ёп ¬г«мвЁЇ«ҐЄб®а .
// €бЇ®«м§гҐвбп ¤«п ЇаҐ¤®еа ­Ґ­Ёп Їа®Ја ¬¬л
// ®в Ї®ўв®а­®Ј® ўбва Ёў ­Ёп ў бЁб⥬㠪 Є १Ё¤Ґ­в­®©.

void _interrupt _far new2f(unsigned _es, unsigned _ds,
									unsigned _di, unsigned _si,
									unsigned _bp, unsigned _sp,
									unsigned _bx, unsigned _dx,
									unsigned _cx, unsigned _ax,
									unsigned _ip, unsigned _cs,
									unsigned flags)
{
		// …б«Ё ЇаҐалў ­ЁҐ ўл§ў ­® б ᮤҐа¦Ё¬л¬
		// ॣЁбва  AX, а ў­л¬ FF00, ў®§ўа й Ґ¬
		// ў ॣЁбвॠAX §­ зҐ­ЁҐ 00FF,
		// ў Їа®вЁў­®¬ б«гз Ґ ЇҐаҐ¤ Ґ¬ гЇа ў«Ґ­ЁҐ
		// бв а®¬г ®Ўа Ў®взЁЄг ЇаҐалў ­Ёп

		if(_ax != 0xff00) _chain_intr(old2f);
		else _ax = 0x00ff;

}

// =======================================

// Ќ®ўл© ®Ўа Ў®взЁЄ  ЇЇ а в­®Ј® ЇаҐалў ­Ёп в ©¬Ґа 

void _interrupt _far new8(void) {

	// ‚л§лў Ґ¬ бв ал© ®Ўа Ў®взЁЄ

	(*old8)();

	// …б«Ё Ўл«  ­ ¦ в  Є®¬ЎЁ­ жЁп Є« ўЁи Ctrl+PrtSc
	// (iniflag ЇаЁ н⮬ гбв ­ ў«Ёў Ґвбп ў 1
	// ­®ўл¬ ®Ўа Ў®взЁЄ®¬ ЇаҐалў ­Ёп 9) Ё
	// § ЇЁбм ў д ©« 㦥 ­Ґ ­ з « бм,
	// в® ЇаЁ §­ зҐ­ЁЁ д« Ј  ЄаЁвЁзҐбЄ®© ᥪ樨
	// DOS, а ў­®¬ 0, ўлў®¤Ё¬ ᮤҐа¦Ё¬®Ґ нЄа ­ 
	// ў д ©«

	if((iniflag != 0) && (outflag == 0) && *crit == 0) {

		outflag=1;   // “бв ­ ў«Ёў Ґ¬ д« Ј ­ з «  ўлў®¤ 
		_enable();   // ђ §аҐи Ґ¬ ЇаҐалў ­Ёп

		write_buf(); // ‡ ЇЁблў Ґ¬ ᮤҐа¦Ё¬®Ґ
						 // ЎгдҐа  нЄа ­  ў д ©«

		outflag=0;   // ‘Ўа блў Ґ¬ д« ЈЁ ў Ёб室­®Ґ
		iniflag=0;   //    б®бв®п­ЁҐ
	}
}

// =======================================

// Ќ®ўл© ®Ўа Ў®взЁЄ ЇаҐалў ­Ёп 28, Є®в®а®Ґ ўл§лў Ґв
// DOS, Ґб«Ё ®­  ®¦Ё¤ Ґв ўў®¤  ®в Є« ўЁ вгал.
// ‚ нв®в ¬®¬Ґ­в TSR-Їа®Ја ¬¬  ¬®¦Ґв Ї®«м§®ў вмбп
// дг­ЄжЁп¬Ё DOS.

void _interrupt _far new28(void) {

	// …б«Ё Ўл«  ­ ¦ в  Є®¬ЎЁ­ жЁп Є« ўЁи Ctrl+PrtSc
	// (iniflag ЇаЁ н⮬ гбв ­ ў«Ёў Ґвбп ў 1
	// ­®ўл¬ ®Ўа Ў®взЁЄ®¬ ЇаҐалў ­Ёп 9) Ё
	// Ґб«Ё 㦥 ­Ґ ­ з « бм § ЇЁбм ў д ©«,
	// в® ўлў®¤Ё¬ ᮤҐа¦Ё¬®Ґ нЄа ­  ў д ©«

	if((iniflag != 0) && (outflag == 0)) {

		outflag=1; // “бв ­ ў«Ёў Ґ¬ д« Ј ­ з «  ўлў®¤ 
		_enable(); // ђ §аҐи Ґ¬ ЇаҐалў ­Ёп

		write_buf(); // ‡ ЇЁблў Ґ¬ ᮤҐа¦Ё¬®Ґ ўЁ¤Ґ®ЎгдҐа 
						 // ў д ©«

		outflag=0;   // ‘Ўа блў Ґ¬ д« ЈЁ ў Ёб室­®Ґ
		iniflag=0;   //   б®бв®п­ЁҐ
	}

	// ЏҐаҐ¤ Ґ¬ гЇа ў«Ґ­ЁҐ бв а®¬г ®Ўа Ў®взЁЄг
	// ЇаҐалў ­Ёп 28

	_chain_intr(old28);
}

// =======================================

// Ќ®ўл© ®Ўа Ў®взЁЄ Є« ўЁ вга­®Ј® ЇаҐалў ­Ёп.
// Ћ­ дЁЄбЁагҐв ­ ¦ вЁҐ Є®¬ЎЁ­ жЁЁ Є« ўЁи Ctrl+PrtSc
// Ё гбв ­ ў«Ёў Ґв д« Ј iniflag, Є®в®ал© бЁЈ­ «Ё§ЁагҐв
// ® ­Ґ®Ўе®¤Ё¬®бвЁ ўлЎа вм Ї®¤е®¤пйЁ© ¬®¬Ґ­в Ё
// § ЇЁб вм ᮤҐа¦Ё¬®Ґ ўЁ¤Ґ®ЎгдҐа  ў д ©«

void _interrupt _far new9(void) {

 // …б«Ё SCAN-Є®¤ а ўҐ­ 0x37 (Є« ўЁи  PrtSc),
 // ­ ¦ в  Є« ўЁи  Ctrl (ЎЁв 4 Ў ©в  б®бв®п­Ёп
 // Є« ўЁ вгал, ­ е®¤пйЁ©бп ў ®Ў« бвЁ ¤ ­­ле
 // BIOS Ї®  ¤аҐбг 0040:0017 гбв ­®ў«Ґ­ ў 1)
 // Ё Ґб«Ё ­Ґ гбв ­®ў«Ґ­ д« Ј iniflag,
 // в® гбв ­ ў«Ёў Ґ¬ д« Ј iniflag ў 1.

 if((inp(0x60) == 0x37) && (iniflag == 0) &&
	(*(char _far *)FP_MAKE(0x40,0x17) & 4) != 0) {

		// ‚л¤ Ґ¬ §ўгЄ®ў®© бЁЈ­ «

		BEEP();
		BEEP();
		BEEP();

		_disable(); // ‡ ЇаҐй Ґ¬ ЇаҐалў ­Ёп

		// ђ §Ў«®ЄЁа㥬 Є« ўЁ вгаг
		// Ё а §аҐи Ґ¬ ЇаҐалў ­Ёп

		_asm {
			in  al,61h
			mov ah,al
			or  al,80h
			out 61h,al
			xchg ah,al
			out 61h,al

			mov al,20h
			out 20h,al
		}

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

		iniflag = 1;
		_enable();  // ђ §аҐи Ґ¬ ЇаҐалў ­Ёп
 }

 // …б«Ё ­ ¦ «Ё ­Ґ Ctrl+PrtSc, в®
 // ЇҐаҐ¤ Ґ¬ гЇа ў«Ґ­ЁҐ бв а®¬г
 // ®Ўа Ў®взЁЄг ЇаҐалў ­Ёп 9

 else _chain_intr(old9);

}

// =======================================

// ”г­ЄжЁп ў®§ўа й Ґв ­®¬Ґа
// ⥪г饣® ўЁ¤Ґ®аҐ¦Ё¬ 

int get_vmode(void) {

	char _far *ptr;

	ptr = FP_MAKE(0x40,0x49); // “Є § вҐ«м ­  Ў ©в
									  // ⥪г饣® ўЁ¤Ґ®аҐ¦Ё¬ 
	return(*ptr);
}

// =======================================

// ”г­ЄжЁп ў®§ўа й Ґв ᥣ¬Ґ­в­л©  ¤аҐб
// ўЁ¤Ґ®ЎгдҐа . “зЁвлў Ґвбп ᮤҐа¦Ё¬®Ґ
// ॣЁбва®ў ᬥ饭Ёп  ¤аҐб  ўЁ¤Ґ®ЎгдҐа .

int get_vbuf(int vmode) {

	unsigned vbase;
	unsigned adr_6845;
	unsigned high;
	unsigned low;
	unsigned offs;

	// ‚ § ўЁбЁ¬®бвЁ ®в ўЁ¤Ґ®аҐ¦Ё¬  Ў §®ўл©  ¤аҐб
	// ўЁ¤Ґ®ЎгдҐа  ¬®¦Ґв Ўлвм 0xb000 Ё«Ё 0xb800

	vbase = (vmode == 7) ? 0xb000 : 0xb800;

	// Ї®«гз Ґ¬  ¤аҐб Ї®ав  ўЁ¤Ґ®Є®­ва®««Ґа  6845

	adr_6845 = *(unsigned _far *)(FP_MAKE(0x40,0x63));

	// ‘зЁвлў Ґ¬ ᮤҐа¦Ё¬®Ґ ॣЁбва®ў 12 Ё 13
	// ўЁ¤Ґ®Є®­ва®««Ґа 

	outp(adr_6845,0xc);
	high = inp(adr_6845+1);

	outp(adr_6845,0xd);
	low = inp(adr_6845+1);

	offs = ((high << 8) + low) >> 4;

	// „®Ў ў«пҐ¬ Є Ў §®ў®¬г  ¤аҐбг ўЁ¤Ґ®ЎгдҐа 
	// ᬥ饭ЁҐ, ў§п⮥ Ё§ ॣЁбва®ў ўЁ¤Ґ®Є®­ва®««Ґа 

	vbase += offs;

	return(vbase);

}

// =======================================

// ”г­ЄжЁп ў®§ўа й Ґв Є®«ЁзҐбвў® бЁ¬ў®«®ў ў бва®ЄҐ
// ¤«п ⥪г饣® ўЁ¤Ґ®аҐ¦Ё¬ 

int get_column(void) {

	return(*(int _far *)(FP_MAKE(0x40,0x4a)));
}

// =======================================

// ”г­ЄжЁп ў®§ўа й Ґв Є®«ЁзҐбвў® бва®Є
// ¤«п ⥪г饣® ўЁ¤Ґ®аҐ¦Ё¬ 

int get_row(void) {

	unsigned char ega_info;

	ega_info = *(unsigned char _far *)(FP_MAKE(0x40,0x87));

	// …б«Ё ­Ґв EGA, в® ЁбЇ®«м§гҐвбп 25 бва®Є,
	// Ґб«Ё EGA ЇаЁбгвбвўгҐв, бзЁвлў Ґ¬ зЁб«®
	// бва®Є. ќв® зЁб«® ­ е®¤Ёвбп ў ®Ў« бвЁ ¤ ­­ле
	// BIOS Ї®  ¤аҐбг 0040:0084.

	if(ega_info == 0 || ( (ega_info & 8) != 0) ) {
		return(25);
	}
	else {
		return((*(unsigned char _far *)(FP_MAKE(0x40,0x84)))+1);
	}

}

// =======================================

// ”г­ЄжЁп § ЇЁбЁ ᮤҐа¦Ё¬®Ј® ўЁ¤Ґ®ЎгдҐа  ў
// д ©«

int write_buf(void) {

// ‚Ё¤Ґ®Ї ¬пвм б®бв®Ёв Ё§ Ў ©в®ў бЁ¬ў®«®ў Ё Ў ©в®ў
//  ваЁЎгв®ў. Ќ ¬ ­г¦­л Ў ©вл бЁ¬ў®«®ў chr.

typedef struct _VIDEOBUF_ {
	 unsigned char chr;
	 unsigned char attr;
} VIDEOBUF;

	VIDEOBUF _far *vbuf;
	int i, j, k, max_col, max_row;
	FILE *out_file;
	char fname[20],ext[8];

	i=get_vmode(); // Џ®«гз Ґ¬ ­®¬Ґа ⥪г饣®
						// ўЁ¤Ґ®аҐ¦Ё¬ 

	// „«п Ја дЁзҐбЄ®Ј® ०Ё¬  ­ЁзҐЈ® ­Ґ § ЇЁблў Ґ¬

	if(i > 3 && i != 7) return(-1);

	// “бв ­ ў«Ёў Ґ¬ гЄ § вҐ«м vbuf ­  ўЁ¤Ґ®ЎгдҐа

	vbuf=(VIDEOBUF _far *)FP_MAKE(get_vbuf(i),0);

	// ЋЇаҐ¤Ґ«пҐ¬ а §¬Ґал нЄа ­ 

	max_col = get_column();
	max_row = get_row();

	// ”®а¬Ёа㥬 Ё¬п д ©«  ¤«п § ЇЁбЁ ®Ўа §  нЄа ­ 

	itoa(name_counter++,ext,10);
	strcpy(fname,"!grab");
	strcat(fname,ext);
	strcat(fname,".doc");

	out_file=fopen(fname,"wb+");

	// ‡ ЇЁблў Ґ¬ ᮤҐа¦Ё¬®Ґ ўЁ¤Ґ®ЎгдҐа  ў д ©«

	for(i=0; i<max_row; i++) {
		for(j=0; j<max_col; j++) {

			fputc(vbuf->chr,out_file);
			vbuf++;

		}

		// ‚ Є®­жҐ Є ¦¤®© бва®ЄЁ ¤®Ў ў«пҐ¬
		// бЁ¬ў®«л ЇҐаҐў®¤  бва®ЄЁ Ё
		// ў®§ўа в  Є аҐвЄЁ

		fputc(0xd,out_file);
		fputc(0xa,out_file);
	}
	fclose(out_file);
	return(0);
}

// =======================================

// ”г­ЄжЁп ўлў®¤Ёв ­  нЄа ­ Ё­бвагЄжЁо Ї®
// ЁбЇ®«м§®ў ­Ёо Їа®Ја ¬¬л GRAB

int hello(void) {
	printf("\n“вЁ«Ёв  Є®ЇЁа®ў ­Ёп ᮤҐа¦Ё¬®Ј®"
			 "\nнЄа ­  ў д ©« GRAB<n>.DOC"
			 "\nCopyright (C)Frolov A.,1990"
			 "\n"
			 "\n„«п Є®ЇЁа®ў ­Ёп ­ ¦¬ЁвҐ Ctrl+PrtSc"
			 "\n");
}
Соседние файлы в папке GRAB
  • #
    01.05.201410.17 Кб38GRAB.C
  • #
    01.05.2014586 б37GRAB.MAK
  • #
    01.05.20143.35 Кб37GRAB.OBJ