; Program zczytuje zawartosc dyskietki 1,44 MB (stacja A:) do pliku "dysk.txt" ; ; Autor: Bogdan D. ; kontakt: bogdandr (at) op (dot) pl ; ; nasm -O999 -o dysk_rd.com -f bin dysk_rd.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 mov ds, ax mov es, ax ; ES = DS = CS xor si, si ; SI bedzie zawierac numer ; czytanego sektora xor bp, bp ; licznik bledow operacji na dyskietce mov dx, plik ; DX -> nazwa pliku xor cx, cx mov ah, 3ch ; funkcja tworzenia pliku int 21h ; tworzymy nowy plik jnc plik_ok ; sprawdzamy, czy blad push ax mov dx, plik_blad ; wyswietl info o bledzie mov ah, 9 int 21h pop ax ; AX = numer bledu mov cl, 4 mov bl, al shr al, cl call pch ; wyswietlamy starsza cyfre AL mov al, bl and al, 0fh call pch ; wyswietlamy starsza cyfre AL jmp juz_koniec ; wychodzimy z programu plik_ok: inc si ; numer sektora mov di, ax ; uchwyt pliku mov bx, bufor ; dokad pisac czyt_petla: mov ax, si ; 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 ; numer sektora z przedzialu 1-36 ; zamieniam na 0-35 mov cl, 36 ; liczba sektorow/cylinder=36, ale bez ; zmiany glowicy =18 xor dx, dx ; glowica 0, dysk 0 (a:) div cl ; dzielimy numer sektora przez 36, ; teraz: mov ch, al ; AL=cylinder, AH="przesuniecie" ; wzgledem poczatku cylindra, czyli ; sektor w aktualnym cylindrze cmp ah, 18 ; jesli sektor > 18, to trzeba ; zmienic glowice jb sec_ok ; gdy 0-35, to "jb" sub ah, 18 inc dh ; zmieniamy glowice sec_ok: mov cl,ah ; CL = sektor mov ax,0212h ; odczytaj 18 sektorow inc cl czytaj_dysk: push dx ;; and cl, 3fh ;sektor (bity 0-5) stc int 13h ; czytaj sti pop dx ; niektore biosy niszcza DX, nie ; ustawiaja CF, lub ; czyszcza IF jnc juz2 ; sprawdzamy, czy nie ma bledu ; procedura "dysk_blad" push ax mov dx, blad_dysk mov ah, 9 int 21h ; wyswietlamy info, ze wystapil blad pop ax inc bp ; zwieksz licznik ilosci bledow push bx ; wypiszemy liczbe pieciocyfrowa ; w AX (numer bledu): mov cl, 4 mov bl, al shr al, cl call pch ; wypisujemy starsze 4 bity AL mov al, bl and al, 0fh call pch ; wypisujemy mlodsze 4 bity AL mov al, 'h' int 10h pop bx cmp bp, 5 ; sprawdzamy, czy nie mamy 5 ; bledow z rzedu je koniec ; jesli tak, to koniec pracy jmp short czyt_petla juz2: xor bp, bp ; po udanym czytaniu zerujemy ; licznik bledow push bx mov dx, bufor ; co zapisac do pliku mov bx, di ; przywracamy uchwyt do pliku mov cx, 200h*18 ; zapisac 18 sektorow * 512 bajtow mov ah, 40h int 21h ; zapisz do pliku jnc plik_zapis_ok ; sprawdz, czy nie ma bledu push ax mov dx, plik_blad mov ah, 9 int 21h ; wyswietl info, ze wysapil blad pop ax ; teraz wyswietlimy numer bledu mov cl, 4 mov bl, al shr al, cl call pch ; wyswietl 4 starsze bity AL mov al, bl and al, 0fh call pch ; wyswietl 4 mlodsze bity AL mov al, 'h' int 10h pop bx jmp short koniec ; po bledzie wychodzimy z programu plik_zapis_ok: cmp si, 2880-18 ; sprawdzamy, czy juz odczytalismy ; cala dyskietke: pop bx ; jesli jestesmy 18 sektorow od konca ; dysku, to koniec jae koniec add si, 18 ; czytaj kolejne 18 sektorow jmp czyt_petla koniec: mov ah, 3eh mov bx, di ; przywracamy uchwyt do pliku int 21h ; zamkniecie pliku jnc juz_koniec ; jest blad? push ax mov dx, plik_blad mov ah, 9 int 21h ; wyswietl info, ze jest blad pop ax mov cl, 4 mov bl, al shr al, cl call pch ; wyswietl 4 starsze bity AL mov al, bl and al, 0fh call pch ; wyswietl 4 mlodsze bity AL mov al, 'h' int 10h juz_koniec: mov ax, 4c00h ; wyjscie z programu int 21h ;====================================================== pch: ; wypisuje cyfre 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 cr equ 13 lf equ 10 plik_blad db cr,lf,'Blad operacji na pilku. Kod bledu: $' plik db 'dysk.txt',0 blad_dysk db cr,lf,'Blad dysku. Kod bledu: $'