; Procedury wczytywania sektorow z dyskietki i wyswietlania BMP 320x200x256 ; ; Autor: Bogdan 'bogdro' Drozdowski ; Data/Wersja: 11.04.2006 global _secrd_int13h global _secwrt_int13h global _disp_bmp ; int secrd_int13h ( const unsigned long int nr_sek, char **dane ); _secrd_int13h: push ebp mov ebp, esp pushfd push ebx push ecx push edx push es %define sektor ebp+8 %define adres ebp+12 mov ax, [sektor] les bx, [adres] ; sek/sci : 18 ; sek/cyl : gl*sek/sci = 36 ; sek/gl : cyl*sek/sci = 80*18 = 1440 push ax dec ax ; z 1-36 na 0-35 mov cl, 36 ; sek/cyl=36, ale bez zmiany glowicy =18 xor dx, dx ; glowica 0, dysk 0 (a:) div cl mov ch, al ; al=cylinder, ah="przesuniecie" wzgledem poczatku cylindra, czyli sektor cmp ah, 18 jb .sec_ok ; gdy 0-35, to "jb" sub ah, 18 xor dh, 1 ; zmieniamy glowice .sec_ok: mov cl, ah mov ax, 0201h ; odczytaj 1 sektor 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 mov eax, 0 ; zakladamy brak bledu jnc .juz or eax, -1 .juz: pop es pop edx pop ecx pop ebx popfd leave ret ; ========================================== ; int secrd_int13h ( const unsigned long int nr_sek, char **dane ); _secwr_int13h: push ebp mov ebp, esp pushfd push ebx push ecx push edx push es %define sektor ebp+8 %define adres ebp+12 mov ax, [sektor] les bx, [adres] ; sek/sci : 18 ; sek/cyl : gl*sek/sci = 36 ; sek/gl : cyl*sek/sci = 80*18 = 1440 push ax dec ax ; z 1-36 na 0-35 xor dx, dx ; glowica 0, dysk 0 (a:) mov cl, 36 ; sek/cyl=36, ale bez zmiany glowicy =18 div cl mov ch, al ; al=cylinder, ah="przesuniecie" wzgledem poczatku cylindra, czyli sektor cmp ah, 18 jb .sec_ok ; gdy 0-35, to "jb" sub ah, 18 xor dh, 1 ; zmieniamy glowice .sec_ok: mov cl, ah inc cl and cl, 3fh ; ektor (bity 0-5) mov ax, 0301h ; zapisz 1 sektor int 13h mov eax, 0 ; zakladamy brak bledu jnc .juz or eax, -1 .juz: pop es pop edx pop ecx pop ebx popfd leave ret ; ================================================================= ; void disp_bmp ( const char * dane) _disp_bmp: push ebp mov ebp, esp push eax push ebx push ecx push esi push edi push es %define dane ebp+8 ; sprawdzamy tryb graficzny: mov ah, 0fh int 10h ; pobierz tryb graficzny, niszczy BH. cmp al, 13h je .graf_ok mov ax, 13h int 10h ; ustawiamy tryb 320x200x256 .graf_ok: mov esi, [dane] add esi, 54 ; pomijamy naglowek xor edi, edi .czytaj_pal: ; ustawiamy palete: mov al, [esi] shr al, 2 mov [paleta+di+2], al inc esi mov al, [esi] shr al, 2 mov [paleta+di+1], al inc esi mov al, [esi] shr al, 2 mov [paleta+di], al inc esi inc esi ; jeszcze 1 bajt pomijamy ('z') add di, 3 cmp di, 256*3 jb .czytaj_pal ; ================================================= ; wysylanie palety do karty graficznej: ; ================================================= xor ax, ax xor di, di ; SI = wskaznik do palety mov dx, 3c8h ; port karty graficznej .wyslij_palete: out dx, al ; wysylamy numer inc dx ; DX = port 3C9h push ax mov al, [paleta+di] out dx, al mov al, [paleta+di+1] out dx, al mov al, [paleta+di+2] out dx, al pop ax add di, 3 dec dx ; DX z powrotem 3C8h inc ax cmp ax, 256 jb .wyslij_palete ; ================================================= ; wczytywanie obrazka: ; ================================================= mov ax, 0a000h mov es, ax mov di, 64000-320 mov cx, 320 ; z pliku czytamy po 1 bajcie .obrazek: rep movsb ; DS:SI -----> ES:DI sub di, 320 + 320 ; 2 razy, bo REP przesuwa DI w przod jnc .obrazek pop es pop edi pop esi pop ecx pop ebx pop eax leave ret section .data paleta times 768 db 0 b db 0 g db 0 r db 0