Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Assembly: Näytön kääntäminen (asm)

Antti Laaksonen [08.07.2002 15:11:35]

#

Tämä Assembly-koodi sisältää kaksi aliohjelmaa näytön kuvan kääntämiseen pysty- ja vaakasuunnassa. Aliohjelma KaannaNayttoX kääntää näytön x-akselin suuntaisesti ylösalaisin, ja KaannaNayttoY kääntää y-akselin suuntaisesti. Koodin pitäisi olla melko hyvin kommentoitua.

Koodissa on optimointivaraa varmasti runsaasti, mutta siitä huolimatta kuva kääntyy jopa 486:lla melkein ilman viivettä.

;aliohjelma, joka vaihtaa kahden ruudulla olevan pisteen paikan
VaihdaPiste proc x1:WORD, y1:WORD, x2:WORD, y2:WORD
	;lasketaan ensimmäisen pisteen paikka näyttömuistissa
	mov ax,x1
	mov bx,y1
	mov dx,bx
	shl dx,8h
	shl bx,6h
	add bx,dx
	add bx,ax
	;siirrytään näyttömuistiin
	mov ax,0a000h
	mov ds,ax
	;cl = ensimmäisen pisteen väri, bx pinoon (1)
	mov cl,[bx]
	push bx
	;lasketaan toisen pisteen paikka näyttömuistissa
	mov ax,x2
	mov bx,y2
	mov dx,bx
	shl dx,8h
	shl bx,6h
	add bx,dx
	add bx,ax
	;siirrytään näyttömuistiin
	mov ax,0a000h
	mov ds,ax
	;ch = toisen pisteen väri, ch:n paikkaan laitetaan cl:n väri
	mov ch,[bx]
	mov [bx],cl
	;kohdassa (1) pinoon laitettu arvo palautetaan,
	;cl:n paikkaan laitetaan ch:n väri
	pop bx
	mov [bx],ch
	ret
VaihdaPiste endp

;näytön kääntäminen x-akselin suunnassa
KaannaNayttoX proc
	;näytön korkeus
	mov ax,0
	mov bx,200
kkl:	mov cx,0
knl:	push ax ;pinoon...
	push bx
	push cx
	;vaihdetaan pisteiden paikka
	invoke VaihdaPiste,cx,ax,cx,bx
	pop cx ;... ja takaisin
	pop bx
	pop ax
	;suurennetaan cx, jos cx:n arvo on pienempi kuin 320
	;(näytön leveys), palataan knl-nimiöön
	inc cx
	cmp cx,320
	jl knl
	;suurennetaan ax, pienennetään bx, jos ax on pienempi
	;kuin bx (ollaan alle puolivälissä), palataan kkl-nimiöön
	inc ax
	dec bx
	cmp ax,bx
	jl kkl
	ret
KaannaNayttoX endp

;näytön kääntäminen y-akselin suunnassa
KaannaNayttoY proc
	mov ax,0
	mov bx,320
kkl:	mov cx,0
knl:	push ax
	push bx
	push cx
	invoke VaihdaPiste,ax,cx,bx,cx
	pop cx
	pop bx
	pop ax
	inc cx
	cmp cx,200
	jl knl
	inc ax
	dec bx
	cmp ax,bx
	jl kkl
	ret
KaannaNayttoY endp

Vastaus

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

Tietoa sivustosta