asembler,dyskietka i bootsektor

0

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.

0

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...

0

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

0

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?

0

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.

0

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.

0

zarzuć kodem

0

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?

0

a nie lepiej użyć przerwania 13h ??

http://www.ctyme.com/intr/rb-0607.htm

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0