; Program czysci zawartosc dyskietki 1,44 MB (stacja A:) ; ; Autor: Bogdan D. ; kontakt: bogdandr (at) op (dot) pl ; ; nasm -O999 -o czyscdsk.com -f bin czyscdsk.asm ; ; Copyright (C) 2005-2007 Bogdan 'bogdro' Drozdowski, bogdandr @ op . pl ; ; Ten program jest wolnym oprogramowaniem; mozesz go rozpowszechniac ; i/lub modyfikowac zgodnie z licencja GNU Lesser General Public License ; (GNU LGPL) w wersji wydanej przez Fundacje Wolnego Oprogramowania; ; wedlug wersji 3 Licencji lub (jesli wolisz) jednej z pozniejszych wersji. ; ; Ten program jest udostepniany z nadzieja, ze bedzie uzyteczny, lecz ; BEZ JAKIEJKOLWIEK GWARANCJI; nawet domyslnej gwarancji PRZYDATNOSCI ; HANDLOWEJ albo PRZYDATNOSCI DO OKRESLONYCH ZASTOSOWAN. W celu uzyskania ; blizszych informacji - Licencja GNU Lesser General Public License. ; ; Z pewnoscia wraz z niniejszym programem otrzymales tez egzemplarz ; Licencji GNU Lesser General Public License; jesli nie - napisz do ; Fundacji Wolnego Oprogramowania: ; Free Software Foundation ; 51 Franklin Street, Fifth Floor ; Boston, MA 02110-1301 ; USA org 100h start: mov ax, cs xor si, si xor bp, bp ; licznik bledow mov ds, ax mov es, ax inc si ; numer sektora mov bx, bufor ; gdzie pisac pisz_petla: mov ax, si ; do AX wpisz numer sektora ; procedura "secrd" ;we: ax=sektor, es:bx -> dane, wymaga istnienia procedury ; dysk_blad ; sek/sci : 18 ; sek/cyl : gl*sek/sci = 36 ; sek/gl : cyl*sek/sci = 80*18 = 1440 ;wy: niszczone ax,cx,dx ; es:bx -> odczytany sektor ( jesli sukces ), ; **tylko z dysku a** ; pisze blad (jesli wystapil) dec ax ; z numerow 1-36 na 0-35 mov cl, 36 ; liczba sektorow/cylinder=36, ; bez zmiany glowicy =18 xor dx, dx ; glowica 0, dysk 0 (A:) div cl ; dzielimy numer sektora przez 36 mov ch, al ; al=cylinder, ah="przesuniecie" ; wzgledem poczatku cylindra, ; czyli sektor cmp ah, 18 ; gdy numer sektora > 18, to pora ; zmienic glowice jb sec_ok ; gdy 0-35, to "jb" sub ah, 18 inc dh ; zmieniamy glowice sec_ok: mov cl, ah mov ax, 0312h ; zapisz 18 sektorow inc cl push dx ; and cl,3fh ;sektor (bity 0-5) stc int 13h sti pop dx ; niektore biosy niszcza DX, nie ; ustawiaja CF, lub czyszcza IF jnc juz2 ; gdy wszystko jest ok, nie ; wypisujemy bledu ; procedura "dysk_blad" push ax mov dx, blad_dysk mov ah, 9 int 21h pop ax inc bp ; zwieksz licznik bledow push bx ; wyswietlamy numer bledu z ax: mov al, ah mov cl, 4 mov bl, ah shr al, cl call pch mov al, bl and al, 0fh call pch mov al, 'h' int 10h pop bx cmp bp, 5 ; jesli wystopilo juz 5 bledow, to ; dajemy sobie spokoj je koniec jmp short pisz_petla juz2: xor bp, bp ; wszystko ok => czyscimy ; licznik bledow cmp si, 2880-18 ; sprawdzamy, czy koniec limitu jae koniec add si, 18 ; jak nie, to przechodzimy o ; kolejne 18 sektorow ; do przodu jmp pisz_petla ; i od poczatku koniec: mov ax,4c00h int 21h ;====================================================== pch: ; procedura wysietlajaca ; liczbe 0-9 lub A-F cmp al, 9 ja hex or al, '0' jmp short pisz hex: add al, 'A'-10 pisz: mov ah, 0eh int 10h ret align 16 bufor times 200h*18 db 0 ; zapisywane sektory cr equ 13 lf equ 10 plik_blad db cr,lf,'Blad operacji na pilku. Kod bledu: $' blad_dysk db cr,lf,'Blad dysku. Kod bledu: $'