PDA

View Full Version : کپی کردن فلاپی



لیلا_الف
پنج شنبه 13 بهمن 1384, 18:58 عصر
سلام. چندی پیش این سوال رو پرسیدم یکی از دوستان کمک کردن
حالا قسمت خواندن درست شده اما قسمت نوشتن مجدد روی فلاپی دیگه درست نیست در واقع تشخیص داده نمیشه که دیسک در درایو هست
برنامه رو می فرستم تا کمک کنید
مرسی
بای


;-------Print Function------
print macro msg
mov ah,9
lea dx,msg
int 21h
endm

;-------Quit function-------
quit macro
mov ah,4ch
int 21h
endm
;-----------------------------

.model small
.data

msg1 db 'insert the first floopy',13,10,'$'
msg2 db 'sucsses in reading',13,10,'$'
msg3 db 'error',13,10,'$'
;msg11 db 'insert the second floopy',13,10,'$'
msg4 db 'sucsses in writing',13,10,'$'
msg14 db "Insert another floppy, then Insert character 'c' for copying :",13,10,'$'
n db 13,10,'$'
buf db 1474560 dup(?)
buf2 db 147456 dup(?)
.code
m proc
mov ax,@data
mov ds,ax
mov es,ax

mov ax,0003h
int 10h
print msg1


mov ah,2
mov al,18 ;number of sector
mov dh,0 ;head
mov cl,8 ;track
mov ch,1 ;sector
mov dl,0 ;drive
lea bx,buf
int 13h

cmp ah,0
jne e1
print msg2

jmp e2
e1: print msg3
jmp e4

e2: print msg14

mov ah,1
int 21h

cmp al,'c'
jne e4
print n

mov ah,0dh
int 21h


mov ah,3
mov al,18 ;number of sector
mov dh,0 ;head
mov cl,8 ;track
mov ch,1 ;sector
mov dl,0 ;drive
lea bx,buf
int 13h

mov dl,ah
add dl,48
mov ah,2
int 21h

cmp ah,0
jne e3
print msg4
jmp e4
e3: print msg3

e4:
quit
m endp
end m

amin joon
جمعه 14 بهمن 1384, 00:42 صبح
سلام

اگه درست متوجه شده باشم شما میخواهید تشخیص بدید که آیا دیسک در درایو هست یا نه.
برای اینکار کافیست از دیسک درایو، یک سکتور را بخوانید و بعد بررسی کنید که آیا خطایی اتفاق افتاده یا نه......اگر خطا رخ نداده باشد به این معنی است که دیسک در درایو بوده.

کد شما چند ایراد جزئی دیگه هم داره:

اول اینکه اندازه ی سگمنت data بزرگتر از 64کیلو شده
دوم اینکه ch= شماره سیلندر و cl=شماره سکتور

بقیه ی برنامه کاملا درست هست یعنی هم میخونه و هم مینویسه.....

همون طور که قبلا گفته بودم ، اگه از وقفه های 25h و 26h برای خواندن و نوشتن استفاده کنید، دیگه با مفاهیم سخت افزاری (مثل شماره سیلندر و...) درگیر نمیشید و این، کار رو راحت میکنه.

اگه سوالت رو درست متوجه نشدم بیشتر توضیح بده.........


ْGoOd LuCk

لیلا_الف
جمعه 14 بهمن 1384, 11:24 صبح
سلام
ممنونم. استاد مربوطه گفتن با اینتراپت 13 بنوسیم و با 25 که در متاب جعفرنژاد نوشته شده اصلا کار نمی کرد.
اندازه سگمنت data رو چقدر بگیرم ؟
کاری که فرمودید رو انجام دادیم. Buf2 رو برای خواندن دیسک دوم در نظر داشتیم. یک بار این دیسک رو خوندیم و بعد Buf رو خواستیم کپی کنیم اما باز نشد
چه کار کنیم ؟!!
میشه درستش کنید ؟!!! ( ببخشید البته )
مرسی
بای

amin joon
شنبه 15 بهمن 1384, 01:50 صبح
ببینید دوست عزیز
اندازه ی هیچ سگمنتی از جمله سگمنت داده نمیتونه بیشتر از 64 کیلوبایت بشه.......بنابراین شما باید متغیر های اضافی رو پاک کنید(مثلا متغیر buf2)......اگر بخش data رو بصورت زیر تعریف کنید ، برنامه درست کار میکنه.. یعنی 18 سکتور را از دیسک منبع میخونه و در دیسک مقصد مینویسه:


.data

msg1 db 'insert the first floopy',13,10,'$'
msg2 db 'sucsses in reading',13,10,'$'
msg3 db 'error',13,10,'$'
;msg11 db 'insert the second floopy',13,10,'$'
msg4 db 'sucsses in writing',13,10,'$'
msg14 db "Insert another floppy, then Insert character 'c' for copying :",13,10,'$'
n db 13,10,'$'
buf db 63000 dup(?)


یک راه دیگه برای تعریف متغیرهای بزرگ استفاده از extra segment است.
.................................................. ...............


GoOd LuCk

لیلا_الف
شنبه 15 بهمن 1384, 08:20 صبح
سلام ممنونم از کمکتون. اما مشکل این هست که بعد از خواندن دیسک اول وقتی دیسک دوم رو می ذاریم و قرار هست کپی صورت بگیره برنامه خطا میده که درایو در حال اجرای برنامه دیگه ای هست.
در واقع باید قبل از وارد کردن دیسک 2 هد از روی دیسک 1 برداشته بشه و من دستوری رو پیدا نکردم
اگر شما سراغ دارید ممنون میشم که بگید