Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Assembly: BMP-kuvan näyttäjä (asm)

Antti Laaksonen [22.07.2002 21:59:18]

#

Tämä assembly-ohjelma näyttää halutun 256-värisen BMP-kuvan, jonka koko on 320x200 pikseliä. Mikä tahansa BMP-kuva ei siis käy, mutta esim. pelin alkukuvan näyttämiseen ohjelma on ideaalinen.

Koodia ei ole kovin paljon kommentoitu, lähinnä koodin osien alussa on pieni kuvaus. Koodin pitäisi kuitenkin olla melko yksinkertaista suurimmalta osin. Kuvalle varataan tosi iso taulukko (64000 tavua), joka kannattaisi varmaan korvata jollain osoitin-systeemillä, mutta sen tekeminen ei tällä hetkellä kuulu taitoihini.

No, joka tapauksessa suurin tekemäni assembly-ohjelma, ja toimii. Käännetty TASMilla, kääntyy varmasti pienien muutoksien jälkeen MASMillakin. Ja kuinka ollakaan, optimointivaraa on todennäköisesti tälläkin kertaa runsaasti.

DOSSEG
	.MODEL SMALL
	.STACK 100h
	.DATA

;BMP-kuvan näyttäjä
;
;Tämä ohjelma näyttää 320x200 kokoisen 256-värisen BMP-kuvan näytöllä
;ja odottaa näppäimen painallusta
;
;(c) Antti Laaksonen, www.ohjelmointiputka.net

Tied	db	"c:\antti\320200.bmp$" ;tähän näytettävän kuvan nimi hakemistopolkuineen
Bmp	db	"Tiedosto ei ole BMP-muotoinen!$"
Kasi	db	"Kuvan tulee olla 256-värinen!$"
Koko	db	"Kuvan koon tulee olla 320x200 pikseliä!$"
Sign	db	2 dup (0)
Leveys	db	4 dup (0)
Korkeus	db	4 dup (0)
Bitit	db	2 dup (0)
Lyhyt	db	2 dup (0)
Pitka	db	4 dup (0)
Paletti	db	4 dup(0)
Pikseli	db	64000 dup(0)
Pkohta	dw	320
Pkerta	dw	0

	.CODE

	;avataan tiedosto
	mov	ax,@data
	mov	ds,ax
	mov	dx,offset Tied
	mov	ah,3dh
	mov	al,0
	int	21h

	;luetaan signeeraus
	mov	bx,ax
	mov	ah,3fh
	mov	cx,2
	mov	dx,offset Sign
	int	21h

	;luetaan neljä muuttujaa, joille ei ole käyttöä :)
	call	OtaPitka
	call	OtaPitka
	call	OtaPitka
	call	OtaPitka

	;luetaan kuvan leveys muuttujaan Leveys
	mov	ah,3fh
	mov	cx,4
	mov	dx,offset Leveys
	int	21h

	;luetaan kuvan korkeus muuttujaan Korkeus
	mov	ah,3fh
	mov	cx,4
	mov	dx,offset Korkeus
	int	21h

	;luetaan välistä yksi tarpeeton muuttuja
	call	OtaLyhyt

	;luetaan kuvan bittimäärä muuttujaan Bitit
	mov	ah,3fh
	mov	cx,2
	mov	dx,offset Bitit
	int	21h

	;vielä kuusi "turhaa" muuttujaa
	call	OtaPitka
	call	OtaPitka
	call	OtaPitka
	call	OtaPitka
	call	OtaPitka
	call	OtaPitka

	;tarkastetaan signeeraus
	cmp	[Sign],'B'
	jne	EiBmp
	cmp	[Sign+1],'M'
	jne 	EiBmp

	;tarkastetaan, että kuva on 8-bittinen eli 256-värinen
	cmp	[Bitit],8
	jne	EiKasi

	;tarkastetaan, että kuvan leveys ja korkeus on kohdallaan
	cmp	[Leveys],64
	jne	EiKoko
	cmp	[Leveys+1],1
	jne	EiKoko

	cmp	[Korkeus],200
	jne	EiKoko

	jmp	kaikkihyvin

;virheilmoitukset

EiBmp:
	mov	dx,offset Bmp
	mov	ah,9
	int	21h

	mov  	ah,4ch
	int  	21h

EiKasi:
	mov	dx,offset Kasi
	mov	ah,9
	int	21h

	mov  	ah,4ch
	int  	21h

EiKoko:
	mov	dx,offset Koko
	mov	ah,9
	int	21h

	mov  	ah,4ch
	int  	21h

kaikkihyvin:

	;siirrytään 320x200-grafiikkatilaan
	mov	ah,0
	mov	al,19
	int	10h

	;luetaan ja määritetään paletti
	mov	cl,0

palalku:
	push cx
	mov	ah,3fh
	mov	cx,4
	mov	dx,offset Paletti
	int	21h
	pop	cx
	mov	dx,3c8h
	mov	al,cl
	out	dx,al
	inc	dx
	mov	al,[Paletti+2]
	shr	al,1
	shr	al,1
	out	dx,al
	mov	al,[Paletti+1]
	shr	al,1
	shr	al,1
	out	dx,al
	mov	al,[Paletti]
	shr	al,1
	shr	al,1
	out	dx,al
	cmp	cl,255
	je	paltehty
	inc	cl
	jmp	palalku

paltehty:

	;luetaan pikselit taulukkoon
	mov	ah,3fh
	mov	cx,63998
	mov	dx,offset Pikseli
	int	21h

	;luetaan ja piirretään pikselit
	mov	bx,63998
pialku:
	mov	ax,@data
	mov	ds,ax

	dec	[Pkohta]
	cmp	[Pkohta],0
	je	uusik
	jmp	eiuk

uusik:
	add	[Pkerta],320
	mov	[Pkohta],320

eiuk:
	push	bx
	mov	bx,Pkerta
	add	bx,Pkohta

	mov	cl,[Pikseli+bx]
	pop	bx
	mov	ax,0a000h
	mov	ds,ax
	mov	[bx],cl
	dec	bx
	cmp	bx,-1
	jne	pialku

	;odotetaan näppäimenpainallusta
	mov	ah,1
	int	21h

	;palataan takaisin tekstitilaan
	mov	ah,0
	mov	al,3
	int	10h

	;suljetaan tiedosto
	mov	ah,3eh
	int	21h

	;poistutaan ohjelmasta
	mov  	ah,4ch
	int  	21h

OtaLyhyt proc
	mov	ah,3fh
	mov	cx,2
	mov	dx,offset Lyhyt
	int	21h
	ret
OtaLyhyt endp


OtaPitka proc
	mov	ah,3fh
	mov	cx,4
	mov	dx,offset Pitka
	int	21h
	ret
OtaPitka endp

   END

Olli Vanhoja [12.02.2003 18:06:08]

#

Ihan asiallinen. Ei mitään turhaa söhryä ja tuossa äkkiä silmäillessä vaikutti, että toimii.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta