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