; Program wyswietla na ekranie kolorowy rysunek o rozmiarze ; 320x200 w 256 kolorach, umieszczony w pliku. ; ; nasm -O999 -o bmp1.com -f bin bmp1.asm ; ; Autor: Bogdan D., bogdandr (at) op (kropka) pl ; ; 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, 13h int 10h ; uruchamiamy tryb graficzny mov ax, 3d00h ; otwieramy plik tylko do odczytu mov dx, nazwa_pliku int 21h jnc otw_ok mov ah, 9 mov dx, blad_plik ; wyswietlane, gdy wystapil blad int 21h err: mov ax, 4c01h ; wyjscie z kodem bledu=1 int 21h otw_ok: mov bx, ax ; bx = uchwyt do pliku mov ah, 3fh ; czytanie z pliku mov cx, 54 ; wyrzucamy 54 bajty naglowka mov dx, smieci int 21h jc err ; ================================================= ; wczytywanie palety z pliku: ; ================================================= xor si, si czytaj_pal: mov ah, 3fh mov cx, 4 ; czytam po 4 bajty - do b,g,r i z mov dx, b int 21h jc err ; ustawiamy palete: mov al, [r] shr al, 2 mov [paleta+si], al mov al, [g] shr al, 2 mov [paleta+si+1], al mov al, [b] shr al, 2 mov [paleta+si+2], al add si, 3 cmp si, 256*3 jb czytaj_pal ; ================================================= ; wysylanie palety do karty graficznej: ; ================================================= xor ax, ax xor si, si ; SI = wskaznik do palety mov dx, 3c8h ; port karty graficznej wyslij_palete: out dx, al ; wysylamy numer ; mov di, si ; add si, si ; si = si*2 ; add si, di ; si = si*3 inc dx ; DX = port 3C9h push ax mov al, [paleta+si] out dx, al mov al, [paleta+si+1] out dx, al mov al, [paleta+si+2] out dx, al pop ax add si, 3 dec dx ; DX z powrotem 3C8h inc ax cmp ax, 256 jb wyslij_palete ; ================================================= ; wczytywanie obrazka: ; ================================================= ; mov ax, 0a000h ; segment pamieci ekranu ; mov es, ax ; mov di, 63999 ; prawy dolny rog ; mov dx, kolor ; dokad czytamy bajty z pliku mov ax, 0a000h mov ds, ax mov dx, 64000-320 mov cx, 320 ; z pliku czytamy po 1 bajcie obrazek: mov ah, 3fh int 21h jc err ; mov al, [kolor] ; add al, [es:di] ; shl al, 1 ; mov [es:di], al ; sub di, 1 sub dx, 320 jnc obrazek ; ================================================= ; koniec programu: ; ================================================= mov ah, 3eh int 21h jc err xor ah, ah int 16h ; czekamy na klawisz mov ax, 3 int 10h ; powrot do trybu tekstowego mov ax, 4c00h int 21h ; ================================================= ; dane: ; ================================================= nazwa_pliku db 'rys1.bmp',0 blad_plik db 'Blad operacji na pliku!$' smieci times 54 db 0 paleta times 768 db 0 b db 0 g db 0 r db 0 z db 0 kolor db 0