home *** CD-ROM | disk | FTP | other *** search
- .MODEL SMALL,PASCAL
- .STACK 500h
- .DATA
-
- S_Punto STRUC
- Coor_X DW ?
- Coor_Y DW ?
- Coor_Z DW ?
- S_Punto ENDS
-
- R_circulo DW 28
- Dist_plano DW 15
- R_esfera DW ?
-
- Pto_Q S_Punto <0,0,0>
- Pto_P S_Punto <0,0,0>
- Pto_I S_Punto <0,0,0>
-
- Distancia DW ?
-
- Ventana1 EQU 0A000h
- NombreTGA DB 'LENS.TGA',0
- HandleTGA DW ?
-
- Ancho_Img DW 50
- Ancho_Pant DW 320
- Alto_Pant DW 200
- Area DW 2500
- Buffer_Fuente DB 2500 DUP(0)
- Buffer_Destino DB 2500 DUP(0)
- Buffer_Trans DW 2500 DUP(0)
- MatrizTrans DW 2500 DUP(0)
- BufferTGA DB 1024 DUP(?)
- ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
- .CODE
-
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para activar el modo de video 320 x 200 x 256
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Modo13 MACRO
- mov ax,0013h ; Modo de video
- int 10h
- ENDM
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para desactivar el modo 13h y salir al sistema
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Salir MACRO
- mov ax,0003h ; Modo texto
- int 10h
- mov ax,4C00h ; Funcion 4Ch: Salir al sistema
- int 21h
- ENDM
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ;#####################################
- ; Este procedimiento carga una images
- ; en formato TGA 256 colores
- ;#####################################
-
- CargaTGA PROC USES ax bx cx dx ds es di si, Nombre_TGA:PTR BYTE, \
- Buffer:PTR BYTE
-
- LOCAL Handle_TGA:WORD
-
- mov ax,3D00h ; Funcion 3Dh: Abrir un fichero modo lectura
- mov dx,offset Nombre_TGA ; Direccion de comienzo del nombre
- int 21h
-
- mov Handle_TGA, ax ; Al abrir el fichero se devuelve en ax el
- ; handle del fichero
-
- mov ah, 3Fh ; Funcion 3Fh: Leer los CX elementos del
- mov bx, Handle_TGA ; fichero y escribirlos en R
- mov cx, 18
- mov dx, OFFSET Buffer ; Leemos la cabecera del fichero
- int 21h
-
- mov ah, 3Fh ; Funcion 3Fh: Leer los CX elementos del
- mov bx, Handle_TGA ; fichero y escribirlos en R
- mov cx, 768
- mov dx, OFFSET Buffer ; Leemos la paleta de colores
- int 21h
-
- mov cx, 256 ; Elementos de la paleta
-
- mov ax, @DATA ; Preparamos los registros de segmentos
- mov es, ax ; y los de desplazamiento de cadena fuente
- mov si, OFFSET Buffer ; y destino para emplear las instruciones
- mov di, OFFSET Buffer ; lods_ y stos_ que son las mas comodas
- cld ; Borra el flag de direccion
-
- @@ModifPal:
- lodsb ; al <- DS:SI y INC si
- shr al, 1 ; dividimos el valor entre cuatro
- shr al, 1 ; tenemos la nueva componente AZUL
- mov ah, al ; situamos el nuevo valor en AH
- lodsb ; al <- DS:SI y INC si
- shr al, 1 ; dividimos el valor entre cuatro
- shr al, 1 ; tenemos la nueva componente VERDE
- mov bh, al ; situamos el nuevo valor en BH
- lodsb ; al <- DS:SI y INC si
- shr al, 1 ; dividimos el valor entre cuatro
- shr al, 1 ; tenemos la nueva componente ROJA
- stosb ; ES:DI <- al y INC di , almacenamos el ROJO
- mov al, bh ;
- stosb ; ES:DI <- al y INC di , almacenamos el VERDE
- mov al, ah
- stosb ; ES:DI <- al y INC di , almacenamos el AZUL
- dec cx ; un color menos de la Paleta
- jnz @@ModifPal ; repetir hasta cero
-
- mov ax, 1012h ; Funcion 10h subfuncion 12h establecer la
- mov bx, 0 ; paleta de colores situada en ES:DX
- mov cx, 256 ; numero de colores
- mov dx, OFFSET Buffer
- int 10h
-
- mov ah, 3Fh ; Leer del fichero toda la imagen que esta
- mov bx, Handle_TGA ; sin comprimir y situarla en la Ventana1
- mov cx, 64000 ; tamaño de la imagen
- mov dx, Ventana1
- mov ds, dx
- mov dx, 0
- int 21h
-
- mov ah, 3Eh ; Funcion 3Eh: Cerrar un fichero
- mov bx, Handle_TGA
- int 21h
- ret
- CargaTGA ENDP
-
-
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro que devuelve en AX el cuadrado del valor
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Cuadrado MACRO Valor
- xor ax,ax
- mov ax,Valor
- imul ax
- ENDM
- ;###############################################
- ; Raiz devuelve en AX el valor de la raiz entera
- ;###############################################
- Raiz PROC NEAR USES cx bx , Operando : WORD
- mov bx, Operando
- jns @Continua
- neg bx
- @Continua:
- xor cx,cx
- @bucle:
- inc cl
- Cuadrado cx
- cmp ax,bx
- jle @bucle
- dec cl
- xor ax,ax
- mov al,cl
- ret
- Raiz ENDP
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro que calcula el valor de la variable Distancia
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Dist PROC
- xor ax,ax
- xor bx,bx
- Cuadrado Dist_plano ; Obtenemos d^2
- push ax
- Cuadrado Pto_P.Coor_X ; Obtenemos Px^2
- push ax
- Cuadrado Pto_P.Coor_Y ; Obtenemos Py^2
- pop bx
- add ax,bx ; Calculamos Px^2 + Py^2
- push ax
- Cuadrado R_circulo ; Obtenemos Rc^2
- pop bx
- sub bx,ax ; Calculamos (Px^2 + Py^2) - Rc^2
- pop ax
- sub ax,bx ; Calculamos d^2 -((Px^2 + Py^2) -Rc^2)
- mov Distancia, ax ; Asignamos el valor a Distancia
- ret
- Calc_Dist ENDP
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para calcular Pto_Q.Coor_Z
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Qz PROC
- xor dx,dx
- xor ax,ax
- push Distancia
- call Raiz ; Calculamos SQRT(D)
- add ax,1 ; Calculamos 1+SQRT(D)
- mov Pto_Q.Coor_Z, ax ; Asignamos el valor a la variable
- ret
- Calc_Qz ENDP
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para calcular Pto_I.Coor_X
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Ix PROC
- xor dx,dx
- xor ax,ax
- mov ax, Pto_Q.Coor_Z
- add ax, Dist_Plano ; Calculamos (Qz + d)
- push ax
- xor ax,ax
- mov ax, Dist_Plano
- imul Pto_P.Coor_X ; Calculamos (d * Px)
- pop bx
- idiv bx ; Calculamos (d*Px) / (Qz +d)
- mov Pto_I.Coor_X, ax ; Asignamos el valor a la variable
- ret
- Calc_Ix ENDP
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para calcular Pto_I.Coor_Y
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Iy PROC
- xor dx,dx
- xor ax,ax
- mov ax, Pto_Q.Coor_Z
- add ax, Dist_Plano ; Calculamos (Qz + d)
- push ax
- xor ax,ax
- mov ax, Dist_Plano
- imul Pto_P.Coor_Y ; Calculamos (d * Py)
- pop bx
- idiv bx ; Calculamos (d*Py) / (Qz +d)
- mov Pto_I.Coor_Y, ax ; Asignamos el valor a la variable
- ret
- Calc_Iy ENDP
-
- ;################################################
- ; Dar_Cateto devuelve en AX el valor del cateto
- ; opuesto según el Teorema de Pitagoras
- ;################################################
- Dar_Cateto PROC NEAR USES bx ,Base:WORD, Cateto: WORD
- Cuadrado Base
- push ax
- Cuadrado Cateto
- pop bx
- add ax,bx
- push ax
- call Raiz
- ret
- Dar_Cateto ENDP
-
- ;##################################################
- ; Transformacion de un punto ,devuelve en AX
- ;##################################################
- Trans_Pto PROC USES bx cx , Cnt_X :BYTE, Cnt_Y:BYTE, Ancho:BYTE
- LOCAL Medio_Ancho: BYTE
-
- mov al, Ancho
- shr al,1 ; Dividimos por dos el Ancho
- mov Medio_Ancho, al ; Lo almacenamos en Medio_Ancho
- xor ax,ax
- call Calc_Dist ; Calculamos el valor de D
- call Calc_Qz ; Calculamos Qz = 1 + SQRT(D)
- call Calc_Ix ; Calculamos Ix = (d * Qx )/(d + Qz)
- call Calc_Iy ; Calculamos Iy = (d * Qy )/(d + Qz)
- mov Pto_I.Coor_Z, 0
- xor ax,ax
- mov al, Medio_Ancho
- add ax, Pto_I.Coor_Y
- imul Ancho
- push ax
- mov al, Medio_Ancho
- add ax, Pto_I.Coor_X
- pop bx
- add ax,bx
- ret
- Trans_Pto ENDP
-
- ;##################################################
- ; Crear_Matriz modifica la matriz de transformacion
- ;##################################################
- Crear_Matriz PROC USES bx cx dx, Ancho : WORD
- LOCAL Cnt_X:WORD, Cnt_Y:WORD, Desp_Pant :WORD, Desp_Mat :WORD, \
- Medio_Ancho :WORD
-
- mov ax, Ancho
- shr ax,1 ; Dividimos por dos el Ancho
- mov Medio_Ancho, ax ; Lo almacenamos en Medio_Ancho
- xor cx,cx
- @Bucle_for1: ; Bucle FOR Cnt_X = 0 TO Ancho para
- ; la coordenada X
- mov Cnt_Y,cx
- xor cx,cx
- @Bucle_for2: ; Bucle FOR Cnt_Y = 0 TO Ancho -1 para
- ; la coordenada Y
- mov Cnt_X,cx
- mov cx,Cnt_Y
- sub cx,Medio_Ancho
- xor bx,bx
- mov bx,Cnt_X
- sub bx,Medio_Ancho
- mov Pto_P.Coor_X, bx
- mov Pto_P.Coor_Y, cx
- mov Pto_Q.Coor_X, bx
- mov Pto_Q.Coor_Y, cx
- push bx ; Paso de parametros del procedimiento
- push cx ; Cateto que devuelve un valor en AX
- call Dar_Cateto
- xor bx,bx
- mov bx,ax ; Cambiamos el valor de sitio
- mov ax,Cnt_Y ; Calculamos el desplazamiento dentro de la
- imul Ancho ; matriz de transformacion
- ; mov cx,Cnt_X ;\
- xchg ax,cx ; > Para rellenar ch con 0000h
- ; cbw ;/
- add ax,cx ; Cnt_Y * Medio_Ancho + Cnt_X
- mov Desp_Mat,ax ; almacenamos el resultado
- ; mov cx, R_circulo ;\
- xchg ax,cx ; > Para rellenar ch con 0000h
- ; cbw ;/
- cmp ax, bx ; El punto esta fuera del circulo de
- mov ax, Desp_Mat
- jl @Es_Menor ; corte del plano con la esfera
- ;; El punto esta en la lupa
- xor bx,bx
- mov bx,Cnt_X
- push bx
- mov bx,Cnt_Y
- push bx
- mov bx,Ancho
- push bx
- call Trans_Pto
-
- @Es_Menor: ; corte del plano con la esfera
- mov bx,Desp_Mat
- shl bx,1
- mov MatrizTrans[bx], ax ; Asignamos el nuevo
- ; valor
- mov cx,Cnt_X
- inc cx
- cmp cx,Ancho
- jl @Bucle_for2
- mov cx,Cnt_Y
- inc cx
- mov dx,Ancho
- ; dec ch
- cmp cx, dx
- jl @Bucle_for1
- ret
- Crear_Matriz ENDP
-
- ;############################################################################
- ; Procedimiento que toma un trozo de la imagen y la guarda en un buffer
- ;############################################################################
- CargarBuffer PROC USES ax cx si di ds es , Pos_X :WORD, Pos_Y:WORD, \
- Dest :PTR BYTE
- LOCAL Ancho_I:WORD, Ancho_P:WORD
- mov ax, Ancho_Pant
- mov Ancho_P,ax
- mov ax, Ancho_Img
- mov Ancho_I,ax
- push ds
- pop es
- mov ax, Ventana1
- mov ds, ax
- mov si, Pos_Y
- mov ax, Ancho_P
- mul si
- mov si, ax
- add si, Pos_X
- mov di, OFFSET Dest
- mov cx, Ancho_I
- @@CopiaFila:
- push si
- push cx
- mov cx, Ancho_I
- cld
- rep movsb
- pop cx
- pop si
- add si, Ancho_P
- dec cx
- jnz @@CopiaFila
- ret
- CargarBuffer ENDP
-
- ;############################################################################
- ; Procedimiento que toma un buffer y lo muestra en pantalla
- ;############################################################################
- MostrarBuffer PROC USES ax cx si di ds es , Pos_X :WORD, Pos_Y:WORD, \
- Dest :PTR BYTE
- LOCAL Ancho_I:WORD, Ancho_P:WORD
- mov ax, Ancho_Pant
- mov Ancho_P,ax
- mov ax, Ancho_Img
- mov Ancho_I,ax
-
- mov ax, Ventana1
- mov es, ax
- mov di, Pos_Y
- mov ax, Ancho_P
- mul di
- mov di, ax
- add di, Pos_X
- mov si, OFFSET Dest
- mov cx, Ancho_I
- @@CopiaFila:
- push di
- push cx
- mov cx, Ancho_I
- cld
- rep movsb
- pop cx
- pop di
- add di, Ancho_P
- dec cx
- jnz @@CopiaFila
- ret
- MostrarBuffer ENDP
-
- ;############################################################################
- ; Procedimiento que transforma un trozo de imagen de un buffer
- ;############################################################################
- TransfBuffer PROC USES dx es ds si di ax bx cx
- mov dx, ds
- mov es, dx
- mov si, OFFSET MatrizTrans
- mov di, OFFSET Buffer_Trans
- mov cx, Area
- cld
- xor bh,bh
- @@HazPunto:
- lodsw
- mov bx,ax
- mov al,OFFSET [Buffer_Fuente+bx]
- stosb
- inc dx
- dec cx
- jnz @@HazPunto
-
- ret
- TransfBuffer ENDP
-
- Codigo PROC
- mov ax,@data
- mov ds,ax
-
- Modo13
- mov dx, OFFSET NombreTGA
- push dx
- mov dx, OFFSET BufferTGA
- push dx
- call CargaTGA
-
- call Crear_Matriz
-
- xor cx,cx
- mov cx,200
- mov bx,320
- @Bucle_Prin:
- push cx
- push bx
- mov dx,OFFSET Buffer_Fuente
- push dx
- call CargarBuffer
-
- xor ax,ax
- mov ax, Ancho_img
- push ax
- call TransfBuffer
-
- push cx
- push bx
- mov dx,OFFSET Buffer_Trans
- push dx
- call MostrarBuffer
-
- push cx
- push bx
- mov dx,OFFSET Buffer_Destino
- push dx
- call MostrarBuffer
-
- dec cx
- dec bx
- loopnz @Bucle_Prin
-
- Salir
- Codigo ENDP
-
- END Codigo
-