Witam
Pisze w asemblerze program ,który zapisuje coś na dyskietke i mam
dwa pytania ,które dla starych wyjadaczy zapewne są błachostką.
1)Jak programowo sprawdzić czy dyskietka jest zabezpieczona przed zapisem?
2)Jak programowo sprawdzić czy w stacji jest dyskietka?
Z góry dzieki.
czy dyskietka jest w stacji sprawdza odpowiednia funkcja - na razie nie podam jaka bo jestem poza domem a nie pamietam. a sprawdzic czy jest zabezpieczona to mozna poprzez probe utworzenia pliku - jezeli sie uda to niezabezpieczona (usunac utworzony plik), a jazeli sie nie uda to znaczy ze zabezpieczona...
oki znalazłem kod błędu który mowi,że dyskietka jest zabezpieczona przed zapisem.(Tej funkcji ,o dyskietkaktórej piszesz ,sprawdzającej czy jest w stacji ,nie mogę znależć)
Teraz niestety pojawił się problem innego typu
przy pomocy funkcji 02h przerwania 13h wczytuje bootsektor dyskietki do pamieci.
0d 4 do 11 bajtu bootsektora powinna być nazwa systemu jako łańcuch
ASCII.Odczytuje go znak po znaku i wyswietla mi sie coś takiego:
+!MseIHC
co może być zle? Na90% odczytuje prawidłowe bajty
sprawdziłeś, czy w ogóle czytasz z dyskietki, i czy próba odczytu nie kończy się błędem? piszesz pod DOS, czy któregoś Windowsa?
Na Bank czytam z dyskietki,ponieważ wszytskie inne pozycje boot sektora się zgadzają, a zapisaną pod 36h
nazwę typu fat odcztuje normalnie jako FAT12.
Co do błędów to nie ma przy odczycie żadnego (flaga CF=0).
PS. nadal nie mogę znależć funkcji ,która sprawdza czy w stacji jest dyskietka.
I w biosie takiej funkcji nie znajdziesz. Jeśli dyskietki nie ma to funkcje czytające/zapisujące zwracaja błąd... Najlepszym sposobem jest chyba int 21h ah=4eh (findfirst z cpp/pascal)
//albo jeszcze lepiej pobranie info o wolnej przestrzeni... int 21h ah=36h, dl=nr dysku (0 roboczy, 1 - a , 2 - b, 3 -c , ...)- zwraca ax=ffffh gdy blad.
zarzuć kodem
czytanie sektora
SECTOR_READ_DOS MACRO Buffer ,Sector_Num,ile
XOR AL,AL ;okreťl numer stacji dyskˇw
MOV DX, Sector_Num ;ustaw logiczny numer sektora do
;odczytu
MOV CX, ile ;okreťl liczbŕ sektorˇw do odczytu
;(tu - 1)
MOV BX, OFFSET Buffer ;za│aduj offset bufora operacji
INT 25h ;wywo│aj program odczytu sektorˇw
POPF
ENDM
instrukcja wywołania powyższego makra
SECTOR_READ_DOS boot ,0 ,1
wypisanie nazwy
;--nazwa systemu
mov bx,offset boot
add bx,03h
pisz sys ;macro pisz wypisuje danyc tekst
wypisz 9 ;
wypisz MACRO ile
LOCAL wroc;
mov cx,ile
wroc:
mov dl,[bx]
mov ah,02h
int 21h
inc bx
loop wroc
ENDM
Czy o to chodziło?
a nie lepiej użyć przerwania 13h ??
Na samym początku próbowałem 13 ,efekt był ten sam.
(w czym 13h jest lepsze od 25h?)
//
No dobra w przypadku 1 dyskietki na 5 nazwa systemu została wyświetlona poprawnie,więc to raczej nie jest wina programu a raczej dyskietek(może zalezy jak były formatowane). Nie będę udawał ,ze wiem dlaczego tak jest.Dzięki za zainteresowanie tematem ,generalnie
juz dowiedziałem się czego potrzebowałem.
To ja na koniec tylko odpowiem na to Twoje pytanie dotyczące różnicy 13h i 25h. Tak więc przerwanie 13h to przerwanie BIOSu i używając go prawie bezpośrednio odczytujesz dane z dysku, natomiast 25h to przerwanie DOSa więc pomyślałem, ze to z nim jest coś nie tak.
Acha, do takich zabaw przydałby Ci się jakiś programik potrafiący czytać dowolne sektory z dysku i stacji dyskietek, wtedy byś wiedział co powinien odczytać Twój program. Polecam Norton Diskedit.
Podepnę się do wątku:
a może ktoś mi powiedzieć jak odczytać cokolwiek z dyskietki ??? potrzebuje np offset 3600
przerwanie 13h
ze przerwanie 13h to wiem :)
mam takie cos:
mov AH,02H ; read sector service number
mov AL,01H ; number of sectors to read
mov DL,00H ; drive number 0=a: floppy drive
mov DH, 0 ; set the head
mov CH, 0 ; set the track
mov CL, 1 ; set the sector
mov bx,offset bufor
int 13H ; BIOS Disk services
i nie dziala :(
mov bx, 0
mov ah, 2 ; Load disk data to ES:BX
mov al, 5 ; Load 5 sectors
mov ch, 0 ; Cylinder=0
mov cl, 2 ; Sector=2
mov dh, 0 ; Head=0
mov dl, 0 ; Drive=0
int 13h ; Read!
takie komendy rowniez nie dzialaja
potrzebuje dobrac sie do FAT12 aby "przekopiowac" plik ale niestety nic nie moge odczytac :(
gdy wpisuje powyzsze linie kodu w trakcie debugowania wychodzi do windowsa
A, że tak zapytam, jakiego windowsa używasz?
mam XP i 98 a takze DOSa
Udało się coś przeczytać, jednak zastanwiam się do którego rejestru mam wpisać poczatkowy sektor od ktorego chce czytać i w jakim formacie 0200 to sektor 2 czy 02h wystarczy ?
Kolejna sprawa czy do bufora typu db moge zaladowac tylko dwa sektory 2x512 ?
pozdrawiam
flabra napisał(a)
I w biosie takiej funkcji nie znajdziesz. Jeśli dyskietki nie ma to funkcje czytające/zapisujące zwracaja błąd... Najlepszym sposobem jest chyba int 21h ah=4eh (findfirst z cpp/pascal)
//albo jeszcze lepiej pobranie info o wolnej przestrzeni... int 21h ah=36h, dl=nr dysku (0 roboczy, 1 - a , 2 - b, 3 -c , ...)- zwraca ax=ffffh gdy blad.
Zenon napisał(a)
ze przerwanie 13h to wiem :)
mam takie cos:
mov AH,02H ; read sector service number
mov AL,01H ; number of sectors to read
mov DL,00H ; drive number 0=a: floppy drive
mov DH, 0 ; set the head
mov CH, 0 ; set the track
mov CL, 1 ; set the sector
mov bx,offset bufor
int 13H ; BIOS Disk servicesi nie dziala :(
mov bx, 0
mov ah, 2 ; Load disk data to ES:BX
mov al, 5 ; Load 5 sectors
mov ch, 0 ; Cylinder=0
mov cl, 2 ; Sector=2
mov dh, 0 ; Head=0
mov dl, 0 ; Drive=0
int 13h ; Read!takie komendy rowniez nie dzialaja
Takie coś mi działa:
mov ah,02h ;When ah=, int13 reads a disk sector
mov al,4 ;Al is how many sectors to read
mov ch,0 ;The track to read from
mov cl,2 ;Sector Id
mov dh,0 ;Head
mov dl,0 ;Drive (0 is floppy)
mov bx,0x1000 ;Es and Bx put together are where to load the program too (see jmp 0x1000:0x00)
mov es,bx
mov bx,0x100
int 13h ;Int 13 is all functions for disks
jmp 0x1000:0x100
KOd pochodzi stąd:http://www.free2code.net/plugins/articles/read.php?id=36