home *** CD-ROM | disk | FTP | other *** search
- .MODEL SMALL,PASCAL
- .STACK 500h
- .DATA
-
- S_Punto STRUC
- Coor_X DB ?
- Coor_Y DB ?
- Coor_Z DB ?
- S_Punto ENDS
-
- R_circulo DB 43
- Dist_plano DB 50
- R_esfera DB ?
-
- Pto_Q S_Punto <0,0,0>
- Pto_P S_Punto <0,0,0>
- Pto_I S_Punto <0,0,0>
-
- Pos_MX DW 0
- Pos_MY DW 0
-
- Distancia DW ?
-
- Ventana1 EQU 0A000h
- NombreTGA DB 'LENTE.TGA',0
- HandleTGA DW ?
-
- Desp_Mat_T DW 0
- Ancho_Img DW 90
- Ancho_Pant DW 320
- Alto_Pant DB 200
- Area DW 8100
- Buffer_Fuente DB 8100 DUP(?)
- Buffer_Destino DB 8100 DUP(?)
- MatrizTrans DW 8100 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 al,Valor
- imul al
- 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 cl
- 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 USES ax bx
- 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 USES ax
- xor ax,ax
- push Distancia
- call Raiz ; Calculamos SQRT(D)
- add al,1 ; Calculamos 1+SQRT(D)
- mov Pto_Q.Coor_Z, al ; Asignamos el valor a la variable
- ret
- Calc_Qz ENDP
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para calcular Pto_I.Coor_X
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Ix PROC USES ax bx
- xor ax,ax
- mov al, Pto_Q.Coor_Z
- add al, Dist_Plano ; Calculamos (Qz + d)
- push ax
- xor ax,ax
- mov al, Dist_Plano
- imul Pto_P.Coor_X ; Calculamos (d * Px)
- pop bx
- idiv bl ; Calculamos (d*Px) / (Qz +d)
- mov Pto_I.Coor_X, al ; Asignamos el valor a la variable
- ret
- Calc_Ix ENDP
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para calcular Pto_I.Coor_Y
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Calc_Iy PROC USES ax bx
- xor ax,ax
- mov al, Pto_Q.Coor_Z
- add al, Dist_Plano ; Calculamos (Qz + d)
- push ax
- xor ax,ax
- mov al, Dist_Plano
- imul Pto_P.Coor_Y ; Calculamos (d * Py)
- pop bx
- idiv bl ; Calculamos (d*Py) / (Qz +d)
- mov Pto_I.Coor_Y, al ; 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:BYTE, Cateto: BYTE
- 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
- mov al, Medio_Ancho
- add al, Pto_I.Coor_Y
- imul Ancho
- push ax
- mov al, Medio_Ancho
- add al, Pto_I.Coor_X
- pop bx
- cbw
- add ax,bx
- mov Desp_Mat_T,ax
- ret
- Trans_Pto ENDP
-
- ;##################################################
- ; Crear_Matriz modifica la matriz de transformacion
- ;##################################################
- Crear_Matriz PROC USES bx cx dx, Ancho : BYTE
- LOCAL Cnt_X: BYTE,Cnt_Y:BYTE, Desp_Pant :WORD, Desp_Mat :WORD, \
- Medio_Ancho :BYTE
-
- mov al, Ancho
- shr al,1 ; Dividimos por dos el Ancho
- mov Medio_Ancho, al ; Lo almacenamos en Medio_Ancho
- xor cx,cx
- mov dx,ds
- mov es,dx
- mov di,OFFSET MatrizTrans
- @Bucle_for1: ; Bucle FOR Cnt_X = 0 TO Ancho para
- ; la coordenada X
- mov Cnt_Y,cl
- xor cx,cx
- @Bucle_for2: ; Bucle FOR Cnt_Y = 0 TO Ancho -1 para
- ; la coordenada Y
- mov Cnt_X,cl
- mov cl,Cnt_Y
- sub cl,Medio_Ancho
- xor bx,bx
- mov bl,Cnt_X
- sub bl,Medio_Ancho
- mov Pto_P.Coor_X, bl
- mov Pto_P.Coor_Y, cl
- mov Pto_Q.Coor_X, bl
- mov Pto_Q.Coor_Y, cl
- push bx ; Paso de parametros del procedimiento
- push cx ; Cateto que devuelve un valor en AX
- call Dar_Cateto
- xor bx,bx
- xchg bx,ax ; Cambiamos el valor de sitio
- mov al,Cnt_Y ; Calculamos el desplazamiento dentro de la
- imul Ancho ; matriz de transformacion
- push ax
- mov al,Cnt_X ;\
- cbw ;/
- pop cx
- add ax,cx ; Cnt_Y * Medio_Ancho + Cnt_X
- mov Desp_Mat,ax
- cmp R_Circulo, bl ; El punto esta fuera del circulo de
- jle @Es_Menor ; corte del plano con la esfera
- ;; El punto esta en la lupa
- xor bx,bx
- mov bl,Cnt_X
- push bx
- mov bl,Cnt_Y
- push bx
- mov bl,Ancho
- push bx
- call Trans_Pto
- mov ax,Desp_Mat_T
- @Es_Menor: ; corte del plano con la esfera
- ;mov bx,Desp_Mat
- ;shl bx,1
- stosw
-
- ;mov MatrizTrans[bx], ax ; Asignamos el nuevo
- ; valor
- mov cl,Cnt_X
- inc cl
- cmp cl,Ancho
- jl @Bucle_for2
- mov cl,Cnt_Y
- inc cl
- mov ch,Ancho
- cmp cl, ch
- 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_Destino
- mov cx, Area
- cld
- xor bh,bh
- @@HazPunto:
- lodsw
- mov bx,ax
- mov al,OFFSET [Buffer_Fuente+bx]
- stosb
- dec cx
- jnz @@HazPunto
- ret
- TransfBuffer ENDP
-
- Codigo PROC
- mov ax,@data
- mov ds,ax
-
- mov ax, Ancho_img
- push ax
- call Crear_Matriz
-
- Modo13
- mov dx, OFFSET NombreTGA
- push dx
- mov dx, OFFSET BufferTGA
- push dx
- call CargaTGA
-
- mov ax, Ancho_img
- push ax
- call Crear_Matriz
-
- mov ax,0
- int 33h
- mov ax,0007h
- mov cx,0
- mov dx,600
- int 33h
- mov ax,0008h
- mov cx,0
- mov dx,150
- int 33h
- mov ax,3
- int 33h
- mov Pos_MX,cx
- mov Pos_MY,dx
-
- @Bucle_Prin:
- push Pos_MX
- push Pos_MY
- mov dx,OFFSET Buffer_Fuente
- push dx
- call CargarBuffer
-
- call TransfBuffer
-
- push Pos_MX
- push Pos_MY
- mov dx,OFFSET Buffer_Destino
- push dx
- call MostrarBuffer
- @Movimiento:
- mov ax,3
- int 33h
- shr cx,1
- cmp Pos_MX,cx
- jnz @SeMovio
- cmp Pos_MY,dx
- jnz @SeMovio
- mov ah,6
- mov dl,0ffh
- int 21h
- jz @Movimiento
- jmp @Salir
- @SeMovio:
- push dx
- push cx
- push Pos_MX
- push Pos_MY
- mov dx, OFFSET Buffer_Fuente
- push dx
- call MostrarBuffer
- pop cx
- pop dx
- mov Pos_MX,cx
- mov Pos_MY,dx
- jmp @Bucle_Prin
- @Salir:
- Salir
- Codigo ENDP
-
- END Codigo
-