ورود

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



Open-Source
چهارشنبه 20 خرداد 1388, 16:09 عصر
اول از هر چیز سلام.:لبخندساده:

من میخوام یه screen saver رو در حافظه مقیم کنم که بعد از زدن یه کلید(مثلا F10)فعال یا غیر فعال بشه.

من خود Screen Saver رو تموم کردم ولی نمیدونم چطوری باید تو حافظه مقیمش کنم؟!!؟؟:متفکر:

اگه میشه یه راهنمایی (درباره اینکه از چه وقفه هایی استفاده کنم) یا یه نمونه برنامه(مثلا یه برنامه مقیم که هر 10 ثانیه یه کاراکتر چاپ کن)، که خیلی نیاز دارم:افسرده::افسرده:

راستی من از TASM استفاده میکنم و چند تا برنامه(حتی تو خود انجمن) پیدا کردم ولی مشکل داشتند.

tdkhakpur
چهارشنبه 20 خرداد 1388, 19:43 عصر
سلام
وقفه 27hبرنامه شما را در حافظه اگه داشته و به برنامه سیستم قبلی برمیگردد.
در استفاده از وقفه فوق باید dx آدرس شروع تابع اصلی ذر یرنامه مقیم شما باشد.
موفق باشید.
باز مشکلی شد ارسال کنید

Delphi Coder
چهارشنبه 20 خرداد 1388, 20:54 عصر
من یه Sample کوچیک برات میذارم. کارش این هست که توی مد 80x25 ساعت سیستم رو نشون میده. تو DOS درست کار میکرد ولی تو Command Prompt های ویندوزهای NT Base معمولا مشکل داره به خاطر اینکه اینجا مستقیم رو VIDEO RAM که در DOS تو آدرس B800:0000 شروع میشه مینویسه. تو امولاتور فکر کنم بازم درست جواب بده.
به هر صورت کارکرد خودش اهمیتی نداره مهم resident بودنشه.

Open-Source
پنج شنبه 21 خرداد 1388, 12:05 عصر
دوست من برنامه شما را نتونستم با tasm و fasm کامپایل کنم یعنی error داد(هیچی هم سر در نیاوردم).

اگه میشه در مورد فقط مقیم کردن یه توضیحی بدی دعات میکنم.

tdkhakpur
پنج شنبه 21 خرداد 1388, 13:27 عصر
سلام
دوست گرامی یک ساختار از برنامه مقیم با مد com کدش رو قرار قرار میدم.


PUSHALL MACRO
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DS
PUSH ES
PUSH BP
PUSH DI
PUSH SI
ENDM
POPALL MACRO
POP SI
POP DI
POP BP
POP ES
POP DS
POP DX
POP CX
POP BX
POP AX
ENDM
PUTCHAR MACRO X, Y, CHAR, COLOR, BKCOLOR
LOCAL LABEL_ , WRD
JMP LABEL_
WRD DW ?
LABEL_:
PUSH AX
PUSH BX
PUSH DX
PUSH ES
MOV AX, X
MOV BX, 2
MUL BX
MOV WORD PTR WRD ,AX
MOV AX, Y
MOV BX, 160
MUL BX
ADD WORD PTR WRD ,AX
MOV BX, 0b800h
PUSH BX
POP ES
MOV BX, WRD
MOV DL, CHAR
MOV DH, COLOR
OR DH, BKCOLOR
MOV WORD PTR ES:[BX] ,DX
POP ES
POP DX
POP BX
POP AX
ENDM
KEEP MACRO ARG
LEA DX, ARG
INT 27H
ENDM
SETVECTOR MACRO INTERRUPT, PROCEDURE, OLD_INT_ADDRESS
PUSH AX
PUSH BX
PUSH DX
PUSH ES
CLI
MOV AX, 0
MOV ES, AX
MOV AX, INTERRUPT
MOV BX, 4
MUL BX
MOV BP, AX
MOV BX, WORD PTR ES:[BP]
MOV AX, WORD PTR ES:[BP+2]
MOV WORD PTR OLD_INT_ADDRESS,BX
MOV WORD PTR OLD_INT_ADDRESS[2],AX
MOV DX, OFFSET PROCEDURE
MOV WORD PTR ES:[BP], DX
MOV WORD PTR ES:[BP+2], CS
STI
POP ES
POP DX
POP BX
POP AX
ENDM
codes segment
assume cs:codes
org 100h
begin:jmp INIT
old_time dd ?
counter dw 0
chr db 'a'
start proc;------------------------------------------------------------
PUSHALL
cli
pushf
call cs:old_time
;------------------
add counter, 1
cmp counter, 1000
jne far ptr exit
mov counter, 0
add chr, 1
PUTCHAR 40, 12, chr, 15, 0
;--------------------
exit:
sti
POPALL
iret
start endp
;/////////////////////////////////////////////////////////////////////////////
INIT: ;-- this procedure keep top programs in memory ---------------
jmp init_jmp
timer dw 1ch
init_jmp:
push cs
pop ds
cli
SETVECTOR timer, start, old_time
sti
mov dx ,offset INIT
int 27h
;///////////////
codes ends
end begin


در فوق برنامه خودتون رو داخل کادر زیر میتوانید قرار دهیدو
;-----------------------------------------
برنامه شما
;-----------------------------------------
دوست عزیر اگر تونستیدmasm , link, exe2bin رو بصورت zip آپلود کن لازمشون دارم.
موفق باشید.

Delphi Coder
پنج شنبه 21 خرداد 1388, 20:56 عصر
دوست من برنامه شما را نتونستم با tasm و fasm کامپایل کنم یعنی error داد(هیچی هم سر در نیاوردم).

اگه میشه در مورد فقط مقیم کردن یه توضیحی بدی دعات میکنم.
با TASM 4 به راحتی کمپایل میشه.
مقیم کردنشم هیچی همون دو سه خط اول

MOV AX,251Ch
MOV DX,OFFSET PRINT_CLOCK
INT 21h
MOV DX,OFFSET FINISH
INT 27hبا استفاده از تابع 25 وقفه DOS بردار وقفه رو SET کرده با وقفه 27 هم مقیم شده. در مورد وقفه ها و پارامتر هاشون هم اگر مشکلی بود میتوانید از این http://barnamenevis.org/forum/showthread.php?t=90984 استفاده کنید.

Open-Source
جمعه 22 خرداد 1388, 11:34 صبح
من توی ویندوز باید برنامه رو اجرا کنم.
این برنامه ها در داس درست جواب میدن.
من چند مدل دیگه هم گرفتم ولی فایده نداشت.:افسرده:

من یه برنامه مقیم میخوام که هر 5 ثانیه یک بار یه کاراکتر توی صفحه چاپ کنه(از این ساده تر نمیشه) و در حافظه مقیم باشه.:گریه:

tdkhakpur
جمعه 22 خرداد 1388, 12:25 عصر
سلام
برنامه های داس برای ویندوز ساخته نمیشود بلکه ویندوز هست که محبت کرده و اونها رو اجرا میکند.
و این امکان وجود نداره که بردار وقفه ها در ویندوز که در حالت حفاظت شده قرار دارد فراخوانی بشود.
موفق باشید.

Delphi Coder
دوشنبه 25 خرداد 1388, 18:52 عصر
من توی ویندوز باید برنامه رو اجرا کنم.
این برنامه ها در داس درست جواب میدن.
من چند مدل دیگه هم گرفتم ولی فایده نداشت.:افسرده:

من یه برنامه مقیم میخوام که هر 5 ثانیه یک بار یه کاراکتر توی صفحه چاپ کنه(از این ساده تر نمیشه) و در حافظه مقیم باشه.:گریه:
ببینید شما بالاخره یا برنامه رو میخواید تو DOS استفاده(اجرا) کنید یا توی Windows اگر برنامه رو تو DOS اجرا کنید قطعا درست جواب میده اون چیزی که تو ویندوز به عنوان Commnd Prompt میشناسید با DOS فرق داره و بنده با عیار چشمی خودم میگم که 50% سازگاری نداره با محیط DOS واقعی. برنامه هایی مثل DosBox سازگاریشون با DOS به مراتب بیشتر از اون چیزی هست که تو ویندوز می بینید.
در ضمن چیزی که شما نیاز دارید در command prompt ویندوز هم شدنی هست به شرطی که بسته نشه. یعنی اول برید تو command prompt و بعد برنامتونو اجرا کنید. برای این کار کافیه ار توابع وقفه 10h استفاده کنید برای نوشتن تو صفحه.
در ضمن اینم اضافه کنم در interrupt handler که شما مینویسید (قطعا برای وقفه 8 یا 1C)مجاز به عوض کردن محتوای رجیسترها نیستید چون در هر لحظه به طور سخت افزاری call میشه و اگر محتوای رجیستر هارو عوض کنید در کار سیستم اخلال به وجود میاد پس هر رجیستری بخواید استفاده کنید باید اول تو stack نگرش دارید و موقع خروج اونها رو POP کنید.