Blog literacki, portal erotyczny - seks i humor nie z tej ziemi



Witam wszytkich poczatkuj±cych grafikow. Dostawalem coraz wiecej
pytan - "jak wyswietlic plik BMP?". W zwazku z tym wyszedlem naprzeciw
wyzwaniu...

Za chwilę będzie bajka o plikach BMP, ale najpierw reklama...

REKLAMA (patrz na ten napis przez ok. 5 minut :))



Za siedmioma gorami za siedmioma lasami mieszkal sobie maly
Bill. Chlopakowi sie nudzilo wiec postanowil napisac
system operacyjny. Napisal i zeby bylo fajniej zerżnal
format plikow BMP od jakichs innych OS-ow psujac
go dodatkowo. Wymyslil sobie, ze naglowek bitmapy
w 256 kolorach bedzie mial 1078 bajtow (tyle ile milimetrow mial
jego... niewazne co :)). Wsrod tych wspanialych 1078 bajtow
znajduje sie magicze 1024 (pod offsetem 54 - tyle bajtow nas nie
obchodzi - przynajmniej w tym tutku) odpowiadajace za palete kolorow RGB
(wystarczyloby 768, ale rodzice za bardzo bili malego
Billa i cierpial przerost ambicji). Dodatkowo chcial
utrudnic zycie programistom i tak format palety jest nastepujacy
(w odwrotnej kolejnosci niz nakazuje logika)


x=niewazny_znak_zarezerwowany_przez_billa_na_wszelki_wypadek_jakby_wymyslono_inny_wazny_kolor;

B,G,R,x, B,G,R,x, B,G,R,x

takich kombinacji BGRx jest 256 - tyle ile kolorow.
Bill czul sie na tyle nieposzanowany i chcial
byc podwojnie oryginalny wiec zamist od offsetu
1078 narysowac normalnie od gory do dolu, od lewej do prawej
obrazek to ten czlowiek postanowil zapisac obrazek
"do gory nogami". Stad kada bitmape przed wyswietleniem
lub przerobieniem do wlasnego formatu trzeba odwrocic.

Czyli trzeba pojsc w slady Billa. Ominac pierwsze 54 bajty
(sa tam informacje np. nt. rozmiaru bitmay). Wczytac
palete kolorow RGB. Nastepnie ustawic taka palete
w trybie 13h i wczytac obrazek. Najlepiej nie bawic sie
w odwracanie bitmapy w programie tylko przed
narysowaniem odwrocic do gory nogami plik BMP.
Teraz czas na program, ktory wyswietli bitmape w trybie 13h.

Format bitmapy to rozmiary 320x200 w 256 kolorach.


.model tiny ;
.stack 100h ;
.386 ;
ASSUME CS:KOD,DS:DANE ;
;-----------------------------------------------;
DANE SEGMENT USE16 ;
Plik db 'test.bmp',0 ;
Paleta db 768 dup (0) ;
MalyBuforek db 4 dup (0) ;
UchwytPliku dw ? ;
DANE ENDS ;
;-----------------------------------------------;
KOD SEGMENT USE16 ;
START: ;
mov ax,seg DANE ;
mov ds,ax ;
mov es,ax ;

lea dx,Plik ;moze to niesamowite, ale otworzmy
mov ax,3d02h ;plik BMP
int 21h ;
jc ZakonczProgram ;
xchg ax,bx ;
mov UchwytPliku,bx ;

lea dx,Paleta ;olewamy naglowek. Przyjmujemy, że
mov cx,54 ;plik BMP ma wielkosc 320x200 w
mov ah,3fh ;256 kolorach.
int 21h ;

mov cx,256 ;wczytuj 256 kolorow
lea di,Paleta ;
WczytujPalete: ;
push cx ;
;
mov cx,4 ;wczytaj kombinacje
lea dx,MalyBuforek ;B,G,R,x
mov ah,3fh ;x = zarezerwowane
int 21h ;
;
mov al,byte ptr [MalyBuforek+2] ;wrzuc po kolei do bufora
shr al,1 ;RGB, RGB, RGB...
shr al,1 ;
stosb ;
mov al,byte ptr [MalyBuforek+1] ;
shr al,1 ;
shr al,1 ;
stosb ;
mov al,byte ptr [MalyBuforek] ;
shr al,1 ;
shr al,1 ;
stosb ;
;
pop cx ;
loop WczytujPalete ;

mov ax,13h ;ustaw 320x200
int 10h ;

lea dx,Paleta ;ustaw palete kolorow
mov cx,256 ;
mov bx,0 ;
mov ax,1012h ;
int 10h ;

push ds ;wczytaj obrazek do bufora
mov bx,UchwytPliku ;
mov ax,seg EKRAN ;
mov ds,ax ;
mov dx,0 ;
mov cx,320*200 ;
mov ah,3fh ;
int 21h ;
pop ds ;

push ds ;
push es ;
mov ax,seg EKRAN ;i skopiuj z bufora na ekran
mov ds,ax ;
mov ax,0a000h ;
mov es,ax ;
mov si,0 ;
mov di,0 ;
mov cx,320*200/4 ;
cld ;
rep movsd ;
pop es ;
pop ds ;

mov ah,08h ;zaczekaj na klawisz
int 21h ;

mov ax,3h ;przywroc tryb tekstowy
int 10h ;

ZakonczProgram: ;
mov ax,4C01h ;
int 21h ;
;-----------------------------------------------;
KOD ENDS ;
;-----------------------------------------------;
EKRAN SEGMENT USE16 ;
db 0ffffh dup (15) ;
EKRAN ENDS ;
;-----------------------------------------------;
END START ;



Tutorial wrote by:
Paweł Kmiecik - www.asmpage.z.pl
Member of New Age ASM Group - www.naag.prv.pl$'
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • qualintaka.pev.pl
  •