; Program zapisuje na dyskietce 1,44 MB (stacja A:) dane z pliku "dysk.txt" ; Plik musi miec 1.474.560 bajtow. ; ; Autor: Bogdan D. ; kontakt: bogdandr (at) op (dot) pl ; ; nasm -O999 -o dysk_wr.com -f bin dysk_wr.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 ; zapisywanego sektora xor bp, bp ; licznik bledow operacji na dyskietce mov dx, plik ; DX -> nazwa otwieranego pliku xor cx, cx mov ah, 3dh ; funkcja otwarcia pliku int 21h ; otwieramy plik jnc plik_ok ; jest blad? push ax mov dx, plik_blad mov ah, 9 int 21h ; wyswietl info, ze wystapil blad pop ax ; teraz wypiszemy numer tego bledu mov cl, 4 mov bl, al shr al, cl call pch ; wypisz 4 starsze bity AL mov al, bl and al, 0fh call pch ; wypisz 4 mlodsze bity AL jmp juz_koniec ; nawet nie udalo sie otworzyc pliku. ; wychodzimy ; ================================== plik_ok: inc si ; numer sektora mov di, ax ; uchwyt pliku mov bx, bufor ; skad pisac na dyskietke pisz_petla: push bx mov dx, bufor ; tutaj bedziemy czytac z pliku mov bx, di ; przywracamy uchwyt do pliku mov cx, 200h*18 ; czytamy tyle, ile ma 18 sektorow ; po 512 bajtow mov ah, 3fh int 21h ; czytamy z pliku pop bx jnc plik_czyt_ok ; czy blad? push ax mov dx, plik_blad mov ah, 9 int 21h ; wyswietlamy info o tym, ze ; wystapil blad pop ax ; teraz wypiszemy numer tego bledu mov cl, 4 mov bl, al shr al, cl call pch ; wypisz 4 starsze bity AL mov al, bl and al, 0fh call pch ; wypisz 4 mlodsze bity AL mov al, 'h' int 10h pop bx jmp short koniec ; blad czytania z pliku oznacza koniec, ; bo nic nie zrobimy. plik_czyt_ok: 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 zamieniamy z 1-36 ; 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 cmp ah, 18 ; numer sektora > 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 = numer sektora 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 ; procedura "dysk_blad" push ax mov dx, blad_dysk mov ah, 9 int 21h ; wypisz info, ze wystapil blad pop ax inc bp ; zwieksz licznik bledow push bx ; wypiszemy numer bledu z AX mov cl, 4 mov bl, al shr al, cl call pch ; wypisz starsze 4 bity AL mov al, bl and al, 0fh call pch ; wypisz mlodsze 4 bity AL mov al, 'h' int 10h pop bx cmp bp, 5 je koniec ; 5 bledow pod rzad oznacza, ze ; wychodzimy z programu jmp short pisz_petla ; zapisuj kolejne sektory juz2: xor bp, bp ; po udanej operacji zerujemy ; licznik bledow cmp si, 2880-18 ; jesli jestesmy 18 sektorow ; przed koncem dyskietki, ; to oznacza, ze zapisalismy ; juz wszystko jae koniec add si,18 ; zapiszemy kolejne 18 sektorow jmp pisz_petla koniec: mov ah, 3eh mov bx, di ; przywracamy uchwyt do pliku int 21h ; zamykamy plik jnc juz_koniec ; jest blad? push ax mov dx, plik_blad mov ah, 9 int 21h ; wypisz info, ze jest blad pop ax ; wypiszemy numer bledu: mov cl, 4 mov bl, al shr al, cl call pch ; wypisz starsze 4 bity AL mov al, bl and al, 0fh call pch ; wypisz mlodsze 4 bity AL mov al, 'h' int 10h juz_koniec: mov ax, 4c00h int 21h ; wychodzimy z programu ;====================================================== 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: $'