PDA

View Full Version : مشکل برنامه resident



amin joon
دوشنبه 14 آذر 1384, 19:17 عصر
سلام
من میخوام یه برنامه ی فارسی ساز( تحت dos) بنویسم که البته خیلی از کارهاش رو انجام دادم(یا حد اقل بلدم) ولی تو نوشتن یه شرط ساده موندم.
من میخوام در صورت خاموش بودن SCROLL تابع 9H قبلی صدا زده بشه و در غیر این صورت هیچ کاری انجام نده یعنی کلیدی رو دریافت نکنه.
ببینید مشکل چیه

<code>
.286c
.model small
.stack
.code
.startup
org 100h


jmp end_of_prog
old_int dd ?


farsi proc far
PUSHA
mov ax,40h
mov ds,ax
mov si,17h
lodsb
and al,00010000b
cmp al,10h ;if scroll lock is on
je my_int ;********my problem********
POPA
jmp cs:dword ptr old_int ;call old intrupt handler

my_int:
;my program here
end_of_my_int:
POPA
iret

farsi endp
end_of_prog:

push ds
mov ah,35h
mov al,9h
int 21h ;gets int 9h address
mov cs:word ptr old_int[0],bx
mov cs:word ptr old_int[2],es
mov al,9h
lea dx,farsi ;proc to be execute insted of old handler
push cs
pop ds
mov ah,25h
int 21h
pop ds

mov al,0h
lea dx,end_of_prog+1 ;make program residen
mov ah,31h
int 27h

end

</code>
با این برنامه اگر یک بار scroll رو روشن و خاموش کنیم.از اون به بعد برنامه درست کار نمیکنه
اگه سورس برنامه قابل خوندن نیست. فایل .asm رو اتچ کردم
ممنون

Iran-PC
دوشنبه 14 آذر 1384, 22:09 عصر
سلام.
من فقط یه چیزی بگم.
اگر شما روتین اصلی رو اجرا نکنی دیگه کلیدی دریافت نخواهی کرد.
این بخاطر رد و بدل کردن اطلاعات بین سی پی یو و کیبورد هست که اگه روتین اصلی اجرا نشه نمیتونید به برنامه ادامه بدید.
برای اینکه کلیدی دریافت نشه شما 2 کار باید انجام بدید
1 در قسمتی از رم که مخصوص اطلاعات بایوس هست باید آدرس هد بافر صفحه کلید با آدرس دمش برابر کنید
2 در قسمتی از رم که کلیدهای کنترلی را در خود نگه میداره اطلاعات قبلی را بنویسید (البته باید از قبل وضعیتش رو در یک متغیر ذخیره کرده باشید.).
این کارها رو باید بعد از فراخوانی روتین اصلی وقفه انجام بدید.
موفق باشید.

سورس شما رو هم میخونم .
آفرین

amin joon
دوشنبه 14 آذر 1384, 22:40 عصر
با تشکر
در مورد توضیح اول شما باید بگم این کاملا منطقی هست ولی به نظر میرسه با فراخوانی یه تابع مثلا "0" از "16h" که باعت میشه یک کاراکتر از بافر صفحه کلید خوانده بشه هم بتوان به این هدف دست پیدا کرد اما باز هم جواب نمیده.
این مورد رو به روشی که گفتید چک میکنم
در مورد نکته دوم که امتحانش خواهم کرد دلیلش رو نمیدونم..یعنی چرا باید این کار را انجام داد چون ما فقط اطلاعات رو خوندیم...... فکر نکنم اثری داشته باشه
باز هم ممنون

Iran-PC
سه شنبه 15 آذر 1384, 00:26 صبح
نکته دوم رو به این خاطر گفتم که شما فرموده بودی که هیچ کلیدی فشرده نشه یا در اصل اثر نداشته باشه.
اگه براتون مهم نیست میتونید قسمت دوم را تغیر ندید.

اما اون قسمت اولی که گفتم بهترین راه حله.

amin joon
سه شنبه 15 آذر 1384, 22:46 عصر
آقا ما این رو تغییرش دادیم اما اثری نکرد:
farsi proc far
PUSHA
mov ax,40h
mov ds,ax
mov si,17h
lodsb
and al,00010000b
cmp al,10h ;if scroll lock is on
je my_int
POPA
jmp cs:dword ptr old_int ;call old intrupt handler

my_int:
mov bx,40h
mov ds,bx
mov si,80h ;begining address of buffer
lodsw ; is put into ax
mov bx,40h
mov es,bx
mov di,1ah ;head of que
stosw ; points to the beginning of buffer
stosw ;in 1ch == tail of que
; so it points to the beginning of buffer


end_of_my_int:
POPA
iret

farsi endp
ولی اشکال باید از چیز دیگه ای باشه

amin joon
سه شنبه 15 آذر 1384, 23:25 عصر
البته باید توضیح بدم که بافر صفحه کلید بصورت یک صف چرخشی هست و آدرس شروع بافر در 40h:80h وآدرس پایان آن در 40h:82h قرار داره......محتویات ادرس 40h:1ah به نوک(head) صف چرخشی اشاره میکنه و محتویات ادرس40h:1ch به ته(tail) صف چرخشی اشاره دارد.
همان طور که آقای irpc گفتندمن محتوای آدرس 80hرو در ادرس 1ah و 1ch قرار دادم.
(فکر نکنم گیر برنامه از این باشه)

amin joon
چهارشنبه 16 آذر 1384, 12:57 عصر
اقا کسی نمیخواد کمک کنه؟؟
حتما یه نکته ای داره .......... اگه میدونید ..........