PDA

View Full Version : برنامه مقیم در حافظه



vbc
شنبه 15 مرداد 1384, 14:30 عصر
سلام دوستان
چه جوری میشه یه برنام مقیم در حافظه با سی پلاس پلاس نوشت؟

Semir
شنبه 15 مرداد 1384, 16:01 عصر
سلام دکتر جون
برو تو help کمپایلر ++C و تابع ()keep و interrupt و ()setvec و ()getvec رو سرچ کن خودش مثال داره ولی اگه خواستی بگو برات چند تا برنامه فرستم

mr_esmaily
شنبه 15 مرداد 1384, 16:12 عصر
سلام
میشه در مورد این برنامه های مقیم حافظه کمی توضیح بدین؟

sasan_vm
شنبه 15 مرداد 1384, 17:40 عصر
:)


/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ INCLUDE FILE @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#include <dos.h>
#include <bios.h>
#include <stdio.h>
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GLOBAL VARIABLES @@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
extern unsigned _heaplen = 0x100;
extern unsigned _stklen = 0x200;
char screen[4000];
unsigned char Stack[0x500];
char far * VideoMem;
char far * DosActive;
int sp, ss;
int KeyCode=0, KeyNum=0;
int C_col, C_row, C_start, C_end;
int CharInRow=0, RowInPage=0;
char Key=0, Busy=0, BiosFlag=0;
/*@@@@@@@@@@@@@@@@@@@@ PROTOTYPE INTERRUPT FUNCTIONS @@@@@@@@@@@@@@@@@@@@@@@*/
void interrupt ( *old_65 ) (__CPPARGS);
void interrupt ( *old_1c ) (__CPPARGS);
void interrupt ( *old_Idle ) (__CPPARGS);
void interrupt ( *old_Timer ) (__CPPARGS);
void interrupt ( *old_Stroke ) (__CPPARGS);
void interrupt ( *old_BiosDisk ) (__CPPARGS);
void interrupt new_1c (__CPPARGS);
void interrupt new_Idle (__CPPARGS);
void interrupt new_Timer (__CPPARGS);
void interrupt new_Stroke (__CPPARGS);
void interrupt new_BiosDisk (__CPPARGS);
/*@@@@@@@@@@@@@@@@@@ PROTOTYPE FUNCTIONS USE IN TASK TSR @@@@@@@@@@@@@@@@@@@*/
void Cls(void);
void Mode(void);
void PressKey(void);
void Message1(void);
void Message2(void);
void Message3(void);
void Message4(void);
void Message5(void);
void Keyboard(void);
void ActiveTsr(void);
void Gotoxy(int, int);
void SaveCursor(void);
void SaveScreen(void);
void RestorScreen(void);
void SetCursor(char, char);
void Puttext(int, int, char, char *);
/*@@@@@@@@@@@@@@@@@@@@@@@@ NEW ROUTINE INTERRUPTS @@@@@@@@@@@@@@@@@@@@@@@@@@*/
void interrupt new_Timer(__CPPARGS)
{
old_Timer();
if ( !*DosActive && Key && !Busy && !BiosFlag )
ActiveTsr();
}
void interrupt new_Idle(__CPPARGS)
{
old_Idle();
if ( Key && !Busy && !BiosFlag )
ActiveTsr();
}
void interrupt new_BiosDisk(__CPPARGS)
{
BiosFlag=1;
old_BiosDisk();
BiosFlag=0;
}
void interrupt new_1c(__CPPARGS)
{
static unsigned char C1=0,C2=0;
C1++ ;
if (!C1)
C2++ ;
if (C1+(int)C2*256 > CharInRow)
C1 = C2 = 0;
outportb(0x3d4,12);
outportb(0x3d5,C2);
outportb(0x3d4,13);
outportb(0x3d5,C1);
}
void interrupt new_Stroke(__CPPARGS)
{
int far *EndBuffer=(int far *) 0x41a; // end buffer keyboard
char far *StartBuffer=(char far *) 0x41a;// start buffer keyboard
old_Stroke();
if ( *StartBuffer!=(*StartBuffer+2) ) // is buffer isn't empty
{
StartBuffer += *StartBuffer-30+5; // goto address key stroke
switch( *StartBuffer )
{
case 0x6e: Key=1; break;
case 0x6d: Key=2; break;
case 0x6c: Key=3; break;
case 0x6b: Key=4; break;
case 0x6f: Key=5; break;
default: Key=0; break;
}
if ( Key )
*(EndBuffer+1)=*EndBuffer;
}
}
/*@@@@@@@@@@@@@@@@@@@@@@ FUNCTIONS USE IN TASK TSR @@@@@@@@@@@@@@@@@@@@@@@@@*/
void Puttext(int Col, int Row, char Attrib, char *Text)
{
union REGS Regs;
int i;
Regs.h.ah=0x9;
Regs.h.bh=0;
Regs.x.cx=1;
Regs.h.bl=Attrib;
for (i=0; Text[i]; ++i)
{
Gotoxy(Col++, Row);
Regs.h.al=Text[i];
int86(0x10,&Regs,&Regs);
}
}
void Gotoxy(int Col, int Row)
{
union REGS Regs;
Regs.h.ah=0x2;
Regs.h.bh=0;
Regs.h.dh=Row;
Regs.h.dl=Col;
int86(0x10,&Regs,&Regs);
}
void SetCursor(char Start, char End)
{
union REGS Regs;
Regs.h.ah=0x1;
Regs.h.ch=Start;
Regs.h.cl=End;
int86(0x10,&Regs,&Regs);
}
void SaveCursor(void)
{
union REGS Regs;
Regs.h.ah=0x3;
Regs.h.bh=0;
int86(0x10,&Regs,&Regs);
C_col=Regs.h.dl;
C_row=Regs.h.dh;
C_end=Regs.h.cl;
C_start=Regs.h.ch;
}
void Cls(void)
{
union REGS Regs;
Regs.x.ax=0x600;
Regs.h.bh=0x7;
Regs.x.cx=0;
Regs.x.dx=0x184f;
int86(0x10,&Regs,&Regs);
}
void Mode(void)
{
union REGS r;
r.h.ah=0xf;
int86(0x10,&r,&r);
switch( r.h.al )
{
case 1: CharInRow=40; RowInPage=25; break;
case 3: CharInRow=80; RowInPage=25; break;
case 4:
case 5: CharInRow=320; RowInPage=200; break;
case 6: CharInRow=640; RowInPage=200; break;
case 18: CharInRow=640; RowInPage=480; break;
}
}
void PressKey(void)
{
asm {
mov ah,00h
int 16h
}
}
void SaveScreen(void)
{
int i;
for(i=0; i<4000; i++)
screen[i] = *(VideoMem + i);
SaveCursor();
SetCursor(-1, 0);
Cls();
}
void RestorScreen(void)
{
int i;
for(i=0; i<4000; i++)
*(VideoMem + i) = screen[i];
Gotoxy(C_col, C_row);
SetCursor(C_start, C_end);
}
static void Keyboard(void)
{
union AnyName{int RawCode; char Code[3];}Keystroke;
char TempKey=0;
if (bioskey(1)==0) { KeyCode=0; return; }
Keystroke.RawCode= bioskey(0);
TempKey= Keystroke.Code[0];
if (TempKey!=0)
{
KeyCode=1; KeyNum=TempKey; return;
}
if (TempKey==0)
{
KeyCode=2; KeyNum=Keystroke.Code[1]; return;
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@*/ ("")
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@ OPERATOR TSR @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
// FUNCTION: ActiveTSR
// This Function is operator TSR,
// call task of TSR or clear TSR from memory
void ActiveTsr(void)
{
disable(); // CLI
ss=_SS; // store SS
sp=_SP; // store SP
_SS=_DS; // store DS in SS
_SP=(unsigned)&Stack[0x500]; // store Stack in SP
enable(); // STI
if ( !Busy )
{
Busy=!Busy;
switch ( Key )
{
case 1: // call task TSR
Message1(); break;
case 2:
Message2(); break;
case 3:
Message3(); break;
case 4:
Message4(); break;
case 5:
puts("\n The TSR program has just uninstalled !");
puts(" Press Enter..."); // set old service interrup
setvect(0x8,old_Timer);
setvect(0x9,old_Stroke);
setvect(0x28,old_Idle);
setvect(0x13,old_BiosDisk);
setvect(0x1c,old_1c);
setvect(0x65,NULL);
freemem(peek(_psp,0x2c)); // free block psp
freemem(_psp); // free psp
break;
}
disable();
_SP=sp; // restore registers
_SS=ss;
enable();
Busy=!Busy;
Key=0;
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ TASK TSR @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
// FUNCTION Message1
// This function is one of task 1 TSR
void Message1(void)
{
SaveScreen();
FILE * fp ;
fp = fopen( "SCR.TIF", "w" );
fwrite( screen, 4000, 1, fp );
fclose( fp );
RestorScreen();
/*
SaveScreen();
for(int i=1, c=0, j; i<23; i +=2)
{
c=(i==11) ? 128 : 0;
Puttext(1,i,0x20+c," ¢‏ّھ÷ ôںگ¥ُ ‘ê¯َ ");
Puttext(21,i+1,0x4e+c," ¢‏ّھ÷ ôںگ¥ُ ‘ê¯َ ");
Puttext(41,i,0x30+c," ¢‏ّھ÷ ôںگ¥ُ ‘ê¯َ ");
Puttext(61,i+1,0x5e+c," ¢‏ّھ÷ ôںگ¥ُ ‘ê¯َ ");
}
PressKey();
RestorScreen();
*/
}
// FUNCTION Message2
// This function is one of task 2 TSR
void Message2(void)
{
char far *FarDate=(char far *)MK_FP(0xF000, 0xFFF0);
unsigned char Ch, Date[15];
int i;
SaveScreen();
for(i=0;i<15;i++)
{
Ch=(unsigned char) *(FarDate + i);
if( (Ch >='0' && Ch <= '9') || Ch=='/')
Date[i]=Ch;
else Date[i]=' ';
}
Date[15]=NULL;
Puttext(2,2,0x07," BIOS create in: ");
Puttext(20,2,0x07,Date);
Ch=(unsigned char)peekb(0xF000, 0xFFFE);
switch( Ch )
{
case 0xFE: Puttext(2,3,0x07," This computer is an XT"); break;
case 0xFC: Puttext(2,3,0x07," This computer is an AT"); break;
case 0xFF:
default: Puttext(2,3,0x07," This computer is an PC"); break;
}
SetCursor(6,7);
Puttext(2,5,0x07," Press a key... ");
PressKey();
RestorScreen();
}
// FUNCTION Message3
// This function is one of task 2 TSR
void Message3(void)
{
Mode();
setvect(0x1c,new_1c);
}
// FUNCTION Message4
// This function is one of task 2 TSR
void Message4(void)
{
setvect(0x1c,old_1c);
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ MAIN PROGRAM @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
int main(void)
{
union REGS Regs;
struct SREGS SRegs;
old_65=getvect(0x65); // Store old service interrupt
old_1c=getvect(0x1c);
old_Idle=getvect(0x28);
old_Timer=getvect(0x8);
old_Stroke=getvect(0x9);
old_BiosDisk=getvect(0x13);
if (old_65 != NULL) // if TSR in memory then exit
{
printf(" The TSR has been installed. \n");
printf(" Use ALT-F8 Key to uninstall it. \n");
return 1;
}
setvect(0x65,old_Idle); // keep new interrupt service
setvect(0x28,new_Idle);
setvect(0x8,new_Timer);
setvect(0x9,new_Stroke);
setvect(0x13,new_BiosDisk);
VideoMem=(char far *)MK_FP(0xb800,0); // get video memory
Regs.h.ah=0x34;
int86x(0x21,&Regs,&Regs,&SRegs);
DosActive=(char far *)MK_FP(SRegs.es, Regs.x.bx); // interrupt dos is active
printf(" The TSR program has install.\n");
printf(" Use ALT-F5...F7 for active task.\n");
printf(" ALT-F4 <--> ALT-F5. ");
printf(" Use ALT-F8 key for uninstalling.\n");
keep(0, _SS + (_SP/16) - _psp); // keep TSR in memory
return 0;
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ END CODE @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

sasan_vm
شنبه 15 مرداد 1384, 17:57 عصر
#include "dos.h"
#include "bios.h"
#include "stdio.h"

mr_esmaily
شنبه 15 مرداد 1384, 18:54 عصر
سلام
هدر های فوق رو از کجا میشه پیدا کرد؟

vbc
شنبه 15 مرداد 1384, 19:24 عصر
سلام
خیلی ممنون
ولی یه جوری توضیح میدادی منم میفهمیدم
یه کد ساده

sasan_vm
شنبه 15 مرداد 1384, 19:34 عصر
سلام
این برنامه رو با BC++ یا TC++ باید کمپایل کرد. فایلها در مسیر INCLUDE نصب کمپایلر میباشد.
این برنامه یک مقدار شلوغ بود چون چند کار انجام میدهد.
یک برنامه ساعت که ساده است براتون می فرستم.




#include "dos.h"
#include "stdlib.h"
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
#define ATTR 0x3000 // (black on cyan)
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@
extern unsigned _heaplen=512;
extern unsigned _stklen=206;
char Stack[0x200];
int Count=0, ss, sp;
unsigned (far * Screen)[25][80];
char Hour1, Hour2, Min1, Min2, Sec1, Sec2;
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@
void Bell(void);
void Print(char *);
int Find_psp(void);
void Uninstall(void);
void interrupt ( *OldTimer ) (__CPPARGS);
void interrupt NewTimer (__CPPARGS);
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@
void Bell(void)
{
sound(500);
delay(200);
nosound();
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@
void Print(char *Text)
{
union REGS r;
r.h.ah=9;
r.x.dx=(unsigned) Text;
intdos(&r,&r);
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@
int Find_psp(void)
{
unsigned i = _psp;
char flag=0;
while ( i )
{
i--;
if ( peekb(i,0)=='M' && peek(i,8)==peek(_psp-1,8)
&& peek(i,10)==peek(_psp-1,10) )
{
if ( flag )
{
_psp=peek(i,1); return 1;
}
else flag=1;
}
}
return 0;
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@
void Uninstall(void)
{
poke(0, 0x70, peek(_psp, 0x80)); // restore offset 1ch
poke(0, 0x72, peek(_psp, 0x82)); // restore segment 1ch
freemem(peek(_psp,0x2c));
freemem(_psp);
Print("\n\r CLOCK Uninstalling finished.\n\r$");
exit(0);
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@
void interrupt NewTimer(__CPPARGS)
{
static unsigned Regulator=0;
OldTimer();
disable();
ss=_SS;
sp=_SP;
_SS=_DS;
_SP=(unsigned)&Stack[0x200];
enable();
Regulator++;
if ( Regulator!=90 && Regulator!=89 ) Count++;
else { Regulator=0; goto wer; }
if ( Count==18 ) { Count=0; Sec2++; }
if ( Sec2==58 ) { Sec2=48; Sec1++; }
if ( Sec1==54 ) { Sec1=48; Min2++; }
if ( Min2==58 ) { Min2=48; Min1++; }
if ( Min1==54 ) { Min1=48; Hour2++; Bell(); }
if ( Hour2==58 ) { Hour2=48; Hour1++; }
if ( Hour1==50 && Hour2==52 ) { Hour1=Hour2=48; }
wer:
(*Screen) [0][70] = ' ' + ATTR;
(*Screen) [0][71] = Hour1 + ATTR;
(*Screen) [0][72] = Hour2 + ATTR;
(*Screen) [0][73] = ':' + ATTR;
(*Screen) [0][74] = Min1 + ATTR;
(*Screen) [0][75] = Min2 + ATTR;
(*Screen) [0][76] = ':' + ATTR;
(*Screen) [0][78] = Sec2 + ATTR;
(*Screen) [0][77] = Sec1 + ATTR;
(*Screen) [0][79] = ' ' + ATTR;
disable();
_SS=ss;
_SP=sp;
enable();
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@
void main(void)
{
if ( Find_psp() ) Uninstall();
Print("\n\r CLOCK program install succesfuly.$");
poke(_psp, 0x80, peek(0,0x70)); // store offset 1ch in _psp offset 80h
poke(_psp, 0x82, peek(0,0x72)); // store segment 1ch in _psp offset 82h
OldTimer=getvect(0x1c);
Screen = (unsigned (far*) [25][80] ) MK_FP(0xb800,0);
struct time T;
gettime(&T);
Sec1 = 48 + (int) (T.ti_sec/10);
Sec2 = 48 + T.ti_sec % 10;
Min1 = 48 + (int) (T.ti_min/10);
Min2 = 48 + T.ti_min % 10;
Hour1 = 48 + (int) (T.ti_hour/10);
Hour2 = 48 + T.ti_hour % 10;
setvect(0x1c,NewTimer);
keep( 0, _SS + (_SP/16) - _psp );
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@

mr_esmaily
شنبه 15 مرداد 1384, 20:14 عصر
سلام
ممنون , دنبال این دوفایل در همین شاخه برای VC++.net می گشتم.

mr_esmaily
شنبه 15 مرداد 1384, 20:52 عصر
سلام
خطا های گزارش شده در مثال اول و دوم.

vbc
شنبه 15 مرداد 1384, 21:24 عصر
سلام خدمت دوستانم
من این کد رو با tbc++کامپایل کردم و چندین اررور داد
برای شما درست کار میکنه؟؟؟؟

vbc
شنبه 15 مرداد 1384, 21:52 عصر
سلام به دوستان و تشکر از جوابهای شما
من یه جور دیگه سوالم رو تکرار میکنم
من مثلا میخام یه برنامه ساده..مثلا دادن یه پیغام رو به صورت مقیم در حافظه بنویسم
یه برنامه ساده
فقط میخام بدونم کدوم قسمت برای این کار هست(مفیم کردن برنامه درحافظه)
تشکر

vbc
یک شنبه 16 مرداد 1384, 15:24 عصر
سلام
کسی نبود
برررررم؟

Semir
سه شنبه 18 مرداد 1384, 20:14 عصر
دوباره سلام
مقیم در حافظه رو واسه داس می خوای یا ویندوز؟

اگه مشکلت تو ویندوزه که اصلا مقیم کردن معنا نداره فرم برنامت رو بعد از اجرا Hide کن
اگه تو داس می خوای باید اون دو تا مثال بالا رو با ++C تحت DOS کمپایل کنی

vbc
سه شنبه 18 مرداد 1384, 21:15 عصر
سلام
میشه بگین که من چه جوری پنجرخ داس رو که تو سی پلاس هست رو مخفی کنم؟

hkiani
چهارشنبه 19 مرداد 1384, 08:41 صبح
با سلام
آیا برای محیط ویندوز هم می‌توان برنامه‌ی مقیم در حافظه نوشت و آیا کاربردی دارد یا نه؟ ممنون می‌شوم جوب من را بدهید.

sasan_vm
چهارشنبه 19 مرداد 1384, 23:37 عصر
سلام
ویندوز یک سیستم MultiTask می باشد . در DOS برای شبیه سازی MultiTask از برنامه نویسی مقیم
در حافظه استفاده میکنیم TSR - Terminate and stay resident .

:)

sasan_vm
چهارشنبه 19 مرداد 1384, 23:44 عصر
میشه بگین که من چه جوری پنجرخ داس رو که تو سی پلاس هست رو مخفی کنم؟


میشه بیشتر توضیح بدی ؟

vbc
یک شنبه 23 مرداد 1384, 00:15 صبح
سلام
ببنید وقتی ما تو سی÷لاس ورژن5 یه برنامه مثلا یه حلقه بی ÷ایان رو اجرا میکنیم یه ÷جره میاد (همون ÷نجره داس)در صورتی در برنامه ما دستور چا÷ نداشتیم

آرش_عصبانی_C++
پنج شنبه 17 شهریور 1384, 07:01 صبح
اول وقفه ها را در دست بگیر بعد با دستور keep برنامه را محافظت کن و پایان بده

مشکلی داری به من mail بزن
آدرس من همان آدرس کاربر "آرش_‍C++" است که این سایت لعنتی (منظورم مسؤولین محترمش نیست) آن را خورده
یعنی arash_9mh@yahoo.com

Reza_K
پنج شنبه 17 شهریور 1384, 12:11 عصر
سلام
ببنید وقتی ما تو سی÷لاس ورژن5 یه برنامه مثلا یه حلقه بی ÷ایان رو اجرا میکنیم یه ÷جره میاد (همون ÷نجره داس)در صورتی در برنامه ما دستور چا÷ نداشتیم

آن پنجره ای که مانند command prompt در هنگام اجرای برنامه نمایان میشه، نه توسط برنامه شما بلکه به تصمیم ویندوز ایجاد میشه. دلیل اینکار وجود flag ای در PE Header برنامه اجرایی شما میباشد. جهت خلاصی از این پنجره لازم است به جای تابع main، تابع WinMain را تعریف کنید. در ضمن کلید /subsystem:windows را هم به Linker ارسال کنید. در این صورت linker اقدام به تولید PE Header ای میکند که ویندوز با دیدن آن یک کنسول را نمایش نخواهد داد.