Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Assembly: Rotozoom 2D

Sivun loppuun

KemXy [03.02.2005 13:30:53]

#

Rotozoom 2D
by Mika Kemppainen

Demokilpailun voittajademossa oli taustalla ihan hieno efekti, joten päätin väsätä sellaisen itsekin. Elikkäs jokin toistuva kuvio, jota pyöritellään ja zoomaillaan. Tein tästä aluksi C/SDL version, mutta päätin kääntää sen lopulta assemblyksi.

Muuten olen ihan tyytyväinen, mutta kuvio pyörii jokseenkin liikaa toisella kulmalla. Tärkeimmät muuttujat ovat angle ja zoom. Kulmaa (anglea) lisätään muuttujan ang_d arvolla, joten siitä voi säätää nopeutta.

En ole tätä liiemmin testaillut, vain omalla koneellani (700Mhz). MoSlo:a tms. voi käyttää, jos toimii liian nopeasti.

Assemblointi tapahtuu ihan tavallisesti Dos-linkkerin kanssa:
ml /Cp /c /nologo roto.asm
link /nologo /tiny roto.obj, roto.com,,,,

roto.asm

; RotoZoom 1.0
; by Mika Kemppainen 2005
;
; Assemblointi tapahtuu seuraavasti DOS-linkkerin kanssa
;
; 	ml /Cp /c /nologo roto.asm
; 	link /nologo /tiny roto.obj, roto.com,,,,

.model tiny, stdcall
.386
.code
option casemap:none
org 100h

alku:
    mov ax, 0013h
    int 10h
    mov cx, 0FFh	; 256 värisävyä

;=== Asetetaan paletti ===;
pal_1:
    mov al, cl
    mov dx, 3C8h
    out dx, al
    inc dx

    mov tmp, ax
    fild tmp
    fmul JAKO		; Jaetaan, jotta saadaan
    fistp tmp		; tasainen väriliuku 0-255

    mov ax, tmp
    out dx, al  ;r	; Punainen paletti
    xor ax, ax
    out dx, al  ;g
    out dx, al  ;b
    loop pal_1

    mov ax, 0A000h
    mov es, ax


;=== Ohjelman pääsilmukka ===;
piirto:
    finit

    fld angle		; Liikutetllaan hieman "origoa"
    fcos		; (alkux, alkuy)
    mov tmp, 188
    fimul tmp
    fstp alkux

    fld angle
    fsin
    fimul tmp
    fstp alkuy

    fld zoom		; Lisätään kulmaa ja muutetaan zoomia
    fld angle
    fadd ang_d
    fst angle
    fsin
    fmul n_0_01
    fadd
    fstp zoom		; zoom += sin(angle) * n_0_01

    fld angle
    fcos
    fdiv zoom
    fstp du		; du = cos(angle)/zoom

    fld angle
    fsin
    fdiv zoom
    fstp dv		; dv = sin(angle)/zoom

    xor di, di	        ; Asetetaan DI piirron alkuun
    xor bx, bx

new_y3:			; Käydään jokainen näytön pikseli
    xor ax, ax		; läpi.
    fld alkux		; Koordinaatit "tekstuurissa" alkuun
    fstp tu
    fld alkuy
    fstp tv

new_x3:
    fld tu		; Pikselin väri tekstuurin
    fistp x		; x-, ja y-kohdan mukaan.
    fld tv
    fistp y
    mov cx, x
    xor cx, y		; väri = xor tu, tv

    mov es:[di], cl	; Kopioidaan näytölle
    inc di

    fld tu		; Siirrytään "tekstuurissa"
    fadd du
    fstp tu

    fld tv
    fsub dv
    fstp tv

    inc ax		; Lisätään x-koordinaattia
    cmp ax, 320
    jb new_x3		; Käydään läpi rivi kerrallaan

    fld alkux		; Liikutaan taas "tekstuurissa"
    fld dv		; oikeaan kohtaan
    fsub
    fstp alkux

    fld alkuy
    fsub du
    fstp alkuy

    inc bx		; Lisätään y-koordinaattia
    cmp bx, 200
    jb new_y3

    push ax		; Onko painettu ESC?
    in al, 60h
    dec al
    pop ax
    jnz piirto

;=== Ohjelman lopetus ===;
    mov ax, 0003h	; Palautetaan näyttötila
    int 10h
    int 20h		; Lopetetaan ohjelma

;=== Muuttujat ja vakiot ===;
tmp		word	0
x		word	0
y		word	0

n_0_01		real4	0.0025

alkux		real4	0.00
alkuy		real4	0.00
tv		real4	0.00
tu		real4	0.00

ang_d		real4   0.005
du		real4	0.00
dv		real4	0.00

angle		real4	0.00
zoom		real4	0.25
JAKO		real4	0.247
end alku

KemXy [03.02.2005 13:35:50]

#

Ai niin, ja käännetty ohjelma:
http://koti.mbnet.fi/~mikakem/Roto.zip

Mukana on sekä sinisellä että punaisella paletilla olevat versiot.

tejeez [03.02.2005 21:29:22]

#

Vinkki: nopeutta saat ku käytät fixedpointteja <3

Mutta joo, ihan tavallinen xor-rotozoomerihan tää vaan on. Ei tässä imo ole mitään ihmeellistä ;o

Puhveli [03.02.2005 22:36:41]

#

Vau! Nätti tosiaan!

laxative [03.02.2005 22:43:47]

#

Pirun hienoo työtä!

rndprogy [03.02.2005 23:59:04]

#

Ihan ihq <3

sooda [04.02.2005 11:46:53]

#

Vau, mite joku osaa tommosta asmilla o_O Ois kiva itekin opetella niin mäki olisin leet <3
No ei, mut hieno. :)

KemXy [04.02.2005 12:58:32]

#

Jooh.. itse asiassa tein tuon lähinnä mahdollisimman selkeäksi. Tarvittaessa saisi varmaan hyvinkin pienennettyä vielä.

Gwaur [05.02.2005 20:49:58]

#

Hieno on. Tuossa paketissa missä on noi valmiiksi käännetyt sininen tuntui menevän nopeammin :)

dungeon86 [07.02.2005 12:51:00]

#

Mistäkähän saisin ilmaiseksi tuollaisen DOS-linkkerin?

T.M. [09.02.2005 22:22:20]

#

Jostain syystä tuo linkki ei toiminut, mutta tämä taaseen toimi:
http://koti.mbnet.fi/mikakem/Roto.zip
Eli ilman tuota vänkyrää.

Helvetin pieneen tilaan oot kyl saanu noi exet :o


Sivun alkuun

Vastaus

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

Tietoa sivustosta