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 alkuAi niin, ja käännetty ohjelma:
http://koti.mbnet.fi/~mikakem/Roto.zip
Mukana on sekä sinisellä että punaisella paletilla olevat versiot.
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
Vau! Nätti tosiaan!
Pirun hienoo työtä!
Ihan ihq <3
Vau, mite joku osaa tommosta asmilla o_O Ois kiva itekin opetella niin mäki olisin leet <3
No ei, mut hieno. :)
Jooh.. itse asiassa tein tuon lähinnä mahdollisimman selkeäksi. Tarvittaessa saisi varmaan hyvinkin pienennettyä vielä.
Hieno on. Tuossa paketissa missä on noi valmiiksi käännetyt sininen tuntui menevän nopeammin :)
Mistäkähän saisin ilmaiseksi tuollaisen DOS-linkkerin?
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
Aihe on jo aika vanha, joten et voi enää vastata siihen.