home *** CD-ROM | disk | FTP | other *** search
- .MODEL COMPACT, PASCAL
- .STACK 500h
- .FARDATA Datos
-
- S_Punto STRUC ; Este estructura representa un punto
- Coor_X DB ? ; con sus tres coordenadas
- Coor_Y DB ?
- Coor_Z DB ?
- S_Punto ENDS
-
- NuevaLinea DB 0Dh,0Ah,'$' ; Proboca un salto de linea
-
- R_circulo DB 43 ; Radio de la circunferencia
- Dist_plano DB 50 ; Distancia al plano de la imagen
- R_esfera DB ? ; Radio de la esfera de la que es seccion la
- ; lupa
- Ped_Radio DB ' Introduzca el radio (menor de 45) : $'
- Ped_Dist DB ' Introduzca la distancia al plano( menor 60 ¿100?): $'
- Menu DB ' Elija una de las siguientes opciones. $'
- Menu_op1 DB ' 1.- Manejo con Raton (ensucia) $'
- Menu_op2 DB ' 2.- Manejo con Raton (parpadeo) $'
- Menu_op3 DB ' 3.- Movimiento automatico (salva pantalla) $'
- Menu_op4 DB ' 4.- Efecto de acercamiento $'
- Menu_Pide DB ' Opcion : $'
- Opcion DB 1
-
- Pto_Q S_Punto <0,0,0> ; Punto Transformado
- Pto_P S_Punto <0,0,0> ; Punto a transformar
- Pto_I S_Punto <0,0,0> ; Punto de interseccion
-
- Pos_MX DW 0 ; Posicion X de la lupa
- Pos_MY DW 0 ; Posicion Y de la lupa
-
-
- Distancia DW ? ; Distancia del plano a la superficie de la
- ; esfera
-
- Ventana1 EQU 0A000h ; Segmento de memoria de video
- Ancho_Pant DW 320 ; Dimensiones de la pantalla en
- Alto_Pant DW 200 ; modo 13
-
- NombreTGA DB 'LENTE.TGA',0 ;Imagen a ampliar
- NombreTGA2 DB 'PRESENTA.TGA',0 ;Imagen de presentacion
- NombreTGA3 DB 'LENTE2.TGA',0
- BufferTGA DB 1024 DUP(?)
-
- Margen DW 5 ; Margen entre la lupa y la imagen
- ; capturada
- Desp_Mat_T DW 0
- Ancho_Img DW 90 ; El ancho de la imagen a capturar
- Area DW 10000 ; Longitud de los buffers
- Buffer_Fuente DB 10000 DUP(?) ; Buffer sin transformar
- Buffer_Destino DB 10000 DUP(?) ; Buffer transformado
- MatrizTrans DW 10000 DUP(0) ; Matriz de transformacion
-
- .FARDATA Imagen
- ImagenBak DB 64000 DUP(?) ; Aqui se almacena la imagen
- ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
- .CODE
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para imprimir una cadena
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ImprimeCad MACRO Cadena
- mov ah,09h ; Imprime cadena
- mov dx, Cadena
- int 21h
- ENDM
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; 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 activar el modo de texto
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ModoTx MACRO
- mov ax,0003h ; Modo texto
- int 10h
- ENDM
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para esperar una tecla
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- KeyPressed MACRO
- push ax
- mov ah,08h ; Lee un caracter del teclado
- int 21h
- pop ax
- ENDM
-
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para salir al sistema
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Salir MACRO
- ModoTx ; Ponemos en modo texto
- mov ax,4C00h ; Funcion 4Ch: Salir al sistema
- int 21h
- ENDM
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro para esperar el retrazo vertical
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- RetrazoVert MACRO
- mov dx,3DAh
- @Paso1:
- in al,dx
- test al,8
- jnz @Paso1
- @Paso2:
- in al,dx
- test al,8
- jz @Paso2
- ENDM
- ;###############################
- ; Este procedimiento carga una images
- ; en formato TGA 256 colores
- ;###############################
-
- CargaTGA PROC NEAR USES ax bx cx dx ds es di si, Nombre_TGA:WORD,Buffer:WORD,\
- SegDest:WORD,DespDest:WORD
- LOCAL Handle_TGA:WORD
- mov ax,3D00h ; Funcion 3Dh: Abrir un fichero modo lectura
- mov dx,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, 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, 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, Buffer ; y destino para emplear las instruciones
- mov di, 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, 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
- push ds ; Guardamos el segmento de datos actual
- mov ds,SegDest ; Ponemos el nuevo segmento
- mov dx,DespDest ; Ponemos el desplazamiento
- int 21h
- pop ds ; Recuperamos el antiguo segmento de datos
- mov ah, 3Eh ; Funcion 3Eh: Cerrar un fichero
- mov bx, Handle_TGA ; Identificador del fichero
- int 21h
- ret
- CargaTGA ENDP
-
-
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- ; Macro que devuelve en AX el
- ; cuadrado del valor
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- Cuadrado MACRO Valor
- xor ax,ax ; Limpiamos AX
- mov al,Valor ; Ponemos el valor en AL
- imul al ; multiplicamos y AX <- AL * AL
- ENDM
- ;###############################
- ; Raiz devuelve en AX el valor de la raiz entera
- ;###############################
- Raiz PROC NEAR USES cx bx , Operando:WORD
- mov bx, Operando ; Ponemos el valor en BX
- jns @Continua ; Si no es negativo saltar
- neg bx ; Si era negativo , volver positivo
- @Continua:
- xor cx,cx ; Limpiar CX
- @bucle:
- inc cl ; Un contador desde 0 hasta SQRT(Operando)
- Cuadrado cl ; AX <- CL * CL
- cmp ax,bx ; Comparamos Operando con AX
- jle @bucle ; Repetir hasta que AX sea mayor que Operando
- dec cl ; Reducir en uno CL , mayor entero cuyo
- ; cuadrado no supera Operando
- xor ax,ax ; Limpiar AX
- mov al,cl ; Devolver el resultado en AL
- ret
- Raiz ENDP
-
- ;###############################
- ; Procedimiento que calcula el valor de la variable Distancia
- ;###############################
- Calc_Dist PROC NEAR USES ax bx
- xor ax,ax
- xor bx,bx
- Cuadrado ds:Dist_plano ; Obtenemos d^2
- push ax
- Cuadrado ds:Pto_P.Coor_X ; Obtenemos Px^2
- push ax
- Cuadrado ds:Pto_P.Coor_Y ; Obtenemos Py^2
- pop bx
- add ax,bx ; Calculamos Px^2 + Py^2
- push ax
- Cuadrado ds: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 ds:Distancia, ax ; Asignamos el valor a Distancia
- ret
- Calc_Dist ENDP
-
- ;###############################
- ; Procedimiento para calcular Pto_Q.Coor_Z
- ;###############################
- Calc_Qz PROC NEAR USES ax
- xor ax,ax
- push ds:Distancia
- call Raiz ; Calculamos SQRT(D)
- add al,1 ; Calculamos 1+SQRT(D)
- mov ds:Pto_Q.Coor_Z, al ; Asignamos el valor a la variable
- ret
- Calc_Qz ENDP
- ;###############################
- ; Procedimiento para calcular Pto_I.Coor_X
- ;###############################
- Calc_Ix PROC NEAR USES ax bx
- xor ax,ax
- mov al, ds:Pto_Q.Coor_Z
- add al, ds:Dist_Plano ; Calculamos (Qz + d)
- push ax
- xor ax,ax
- mov al, ds:Dist_Plano
- imul ds:Pto_P.Coor_X ; Calculamos (d * Px)
- pop bx
- idiv bl ; Calculamos (d*Px) / (Qz +d)
- mov ds:Pto_I.Coor_X, al ; Asignamos el valor a la variable
- ret
- Calc_Ix ENDP
-
- ;###############################
- ; Procedimiento para calcular Pto_I.Coor_Y
- ;###############################
- Calc_Iy PROC NEAR USES ax bx
- xor ax,ax
- mov al, ds:Pto_Q.Coor_Z
- add al, ds:Dist_Plano ; Calculamos (Qz + d)
- push ax
- xor ax,ax
- mov al, ds:Dist_Plano
- imul ds:Pto_P.Coor_Y ; Calculamos (d * Py)
- pop bx
- idiv bl ; Calculamos (d*Py) / (Qz +d)
- mov ds: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 ; Sumamos la Base^2 y Cateto^2
- push ax
- call Raiz ; Caluculamos la raiz de la suma
- ret ; El resultado se devuelve en AX
- Dar_Cateto ENDP
-
- ;###############################
- ; Transformacion de un punto ,devuelve en AX
- ;###############################
- Trans_Pto PROC NEAR 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 ds:Pto_I.Coor_Z, 0
- mov al, Medio_Ancho
- add al, ds:Pto_I.Coor_Y
- imul Ancho
- push ax
- mov al, Medio_Ancho
- add al, ds:Pto_I.Coor_X
- pop bx
- cbw
- add ax,bx
- mov ds:Desp_Mat_T,ax
- ret
- Trans_Pto ENDP
-
- ;###############################
- ; Crear_Matriz modifica la matriz de transformacion
- ;###############################
- Crear_Matriz PROC NEAR 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 ds: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 ds:Pto_P.Coor_X, bl
- mov ds:Pto_P.Coor_Y, cl
- mov ds:Pto_Q.Coor_X, bl
- mov ds: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 ds: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,ds:Desp_Mat_T
- @Es_Menor: ; corte del plano con la esfera
- ;mov bx,Desp_Mat
- ;shl bx,1
- stosw
-
- ;mov ds: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 NEAR USES ax cx si di ds es , Pos_X :WORD, Pos_Y:WORD, \
- Dest :WORD
- LOCAL Ancho_I:WORD, Ancho_P:WORD
-
- mov ax, ds:Ancho_Pant
- mov Ancho_P,ax ; Asignamos a las variables locales
- mov ax, ds:Ancho_Img
- mov Ancho_I,ax
- mov dx,@data ; Obtenemos el segmento de datos
- push dx
- pop es ; El segemtno Extra es igual al de datos
- mov ax,SEG Imagen ; Hacemos el segmento de datos se Imagen
- mov ds,ax
- mov si, Pos_Y ; Preparamos SI para que almacene el
- mov ax, Ancho_P ; desplazamiento del primer punto de la
- mul si ; imagen :
- mov si, ax ; SI <- (PosY * Ancho_Img) + PosX
- add si, Pos_X
- mov di, Dest ; Preparamos DI para que tenga el desplaza_
- ; miento del buffer donde se almacenara
- mov cx, Ancho_I ; Las filas a leer ( es un cuadrado )
- @@CopiaFila:
- push si ; Salvaguardamos SI y CX
- push cx
- mov cx, Ancho_I ; Los puntos de una linea
- cld ; Borra el flag de acarreo
- rep movsb ; Repite Ancho_I veces ES:DI <- DS:SI hasta
- ; que CX sea 0
- pop cx ; Recuperamos los valores antiguos
- pop si
- add si, Ancho_P ; Desplazamos SI una linea entera
- dec cx ; Queda una linea menos que pasar
- jnz @@CopiaFila
- ret
- CargarBuffer ENDP
-
- ;############################################################################
- ; Procedimiento que toma un buffer y lo muestra en pantalla
- ;############################################################################
- MostrarBuffer PROC NEAR USES ax cx si di ds es , Pos_X :WORD, Pos_Y:WORD, \
- Dest :WORD
- LOCAL Ancho_I:WORD, Ancho_P:WORD
-
- mov ax, ds:Ancho_Pant
- mov Ancho_P,ax ; Asignamos a las variables locales
- mov ax, ds:Ancho_Img
- mov Ancho_I,ax
-
- mov ax, Ventana1 ; Segemento de Video
- mov es, ax ; El segemtno Extra es igual al de video
-
- mov di, Pos_Y ; Preparamos DI para que almacene el
- mov ax, Ancho_P ; desplazamiento del primer punto de la
- mul di ; imagen :
- mov di, ax ; DI <- (PosY * Ancho_Img) + PosX
- add di, Pos_X
- mov si, Dest ; Preparamos SI para que tenga el desplaza_
- ; miento del buffer donde se almacenara
- mov cx, Ancho_I
- @@CopiaFila:
- push di ; Salvaguardamos DI y CX
- push cx
- mov cx, Ancho_I ; Los puntos de una linea
- cld ; Borra el flag de acarreo
- rep movsb ; Repite Ancho_I veces ES:DI <- DS:SI hasta
- ; que CX sea 0
- pop cx ; Recuperamos los valores antiguos
- pop di
- add di, Ancho_P ; Desplazamos DI una linea entera
- dec cx ; Queda una linea menos que pasar
- jnz @@CopiaFila
- ret
- MostrarBuffer ENDP
-
- ;############################################################################
- ; Procedimiento que transforma un trozo de imagen de un buffer
- ;############################################################################
- TransfBuffer PROC NEAR USES dx es ds si di ax bx cx
- mov dx, @data ; Actualizamos el valor del segmento
- mov es, dx ; extra al de datos
- mov si, OFFSET ds:MatrizTrans
- mov di, OFFSET ds:Buffer_Destino
- mov cx, ds:Area ; Contador de operaciones
- cld ; Borra el flag de direccion
- xor bh,bh
- @@HazPunto:
- lodsw ; Leemos el indice de la matriz Transformada
- mov bx,ax ; Cambiamos de sitio
- mov al,OFFSET ds:[Buffer_Fuente+bx] ; Tomamos el punto indicado
- ; por el indice
- stosb ; Lo almacenamos en Buffer_Dest
- dec cx ; Decrementamos el contador
- jnz @@HazPunto
- ret
- TransfBuffer ENDP
- ;###############################
- ; Procedimiento que mueve 64k
- ;###############################
- Copy64k PROC USES ax cx di si ds ,SegOrg: WORD,SegDes:Word
- mov ax,SegOrg ; Actualizar DS al Segmento Origen
- mov ds,ax
- mov ax,SegDes ; Actualizar ES al Segmento Destino
- mov es,ax
- xor di,di ; Los puntero a cero
- xor si,si
- mov cx,32000 ; Contador , la mitad para leer palabras
- rep movsw ; Repite CX-veces ES:DI <- DS:SI
- ret
- Copy64k ENDP
-
- ;###############################
- ;Procedimiento que pide los parametros
- ;###############################
- Captura PROC NEAR USES bx cx dx , Cadena:WORD
- ImprimeCad Cadena
- xor bx,bx ; Aqui guardamos el valor del parametro
- @bucle:
- mov ah, 01h
- int 21h ; En AL esta el caracter leido
-
- cmp al, 0Dh ; Salir si se pulsa ENTER
- je @Fin
-
- sub al,30h ; Le restamos el valor ASCII del caracter 0
- cbw ; Combertimos AL de BYTE a WORD
- mov cx,ax ; Lo cambiamos de sitio
- mov ax,10 ; Base del sistema decimal
- mul bx ; Lo que habimos almacenado se multiplica
- add ax,cx ; Le sumamos el nuevo caracter
- mov bx,ax ; y lo situamos en BX para comenzar el bucle
- jmp @bucle
- @Fin:
- mov cx, OFFSET ds:NuevaLinea
- ImprimeCad cx
- mov ax,bx ; El resultado se devuelve en AX
- ret
- Captura ENDP
- ;##############################################
- ; Este procedimiento pide todos los parametros
- ; y calcula el resto
- ;##############################################
- Param PROC USES ax bx dx
- mov dx, OFFSET ds:Ped_Radio ;Vamos a pedir el radio
- push dx
- call Captura
- mov ds:R_Circulo, al ;Ponemos el nuevo valor
- mov bx, ds:Margen ;Puesto que es necesario que el ancho
- add bx,ax ;sea algo superior , este sera el doble
- mov ax, 2 ;del radio + 2
- mul bx
- mov ds:Ancho_Img, ax
- imul al ;Calculamos el area de la imagen a tomar
- mov ds:Area,ax
-
- mov dx, OFFSET ds:Ped_Dist ;Vamos a pedir la distancia al plano
- push dx
- call Captura
- mov ds:Dist_Plano, al
- ret
-
- Param ENDP
-
- ;##############################################
- ; Este procedimiento muestra un menu para seleccionar
- ; las opciones del programa
- ;##############################################
- Mi_Menu PROC USES ax bx cx ds
- @Comienzo:
- mov cx, OFFSET ds:NuevaLinea ; Se muestran los mensajes
- ImprimeCad cx
- mov bx, OFFSET ds:Menu
- ImprimeCad bx
- ImprimeCad cx
- mov bx, OFFSET ds:Menu_op1
- ImprimeCad bx
- ImprimeCad cx
- mov bx, OFFSET ds:Menu_op2
- ImprimeCad bx
- ImprimeCad cx
- mov bx, OFFSET ds:Menu_op3
- ImprimeCad bx
- ImprimeCad cx
- mov bx, OFFSET ds:Menu_op4
- ImprimeCad bx
- ImprimeCad cx
- mov bx, OFFSET ds:Menu_Pide
- ImprimeCad bx
- mov ah,01h ; Leemos el número seleccionado
- int 21h
- cmp al,'5'
- jg @Comienzo ; Vuelta a empazar si es mayor de 4
- cmp al,'0'
- jl @Comienzo ; Vuelta a empezar si es menor que 1
- mov ds:Opcion,al ; Guardamos la opcion elegida
- ret
- Mi_Menu ENDP
- ;##############################################
- ; Este procedimiento seleciona el programa a ejecutar
- ;##############################################
- Seleccion PROC USES ax
- mov al, ds:Opcion ; Lee la opcion
- cmp al, '1' ; Si es 1 hacer Raton1
- jne @No_Opcion1
- call Raton1
- jmp @Salir
- @No_Opcion1:
- cmp al, '2' ; Si es 2 hacer Raton2
- jne @No_Opcion2
- call Raton2
- jmp @Salir
- @No_Opcion2:
- cmp al, '3' ; Si es 3 hacer MovAuto
- jne @No_Opcion3
- call MovAuto
- jmp @Salir
- @No_Opcion3:
- call Efecto ; Sino hacer Efecto
- @Salir:
- ret
- Seleccion ENDP
- ;##############################################
- ; Este procedimiento permite mover la lupa
- ; mediante el uso del ratón ( Esta versión tiene el
- ; problema de que cuando se mueve demasiado deprisa
- ; se ensucia la imagen )
- ;##############################################
- Raton1 PROC USES ax bx cx dx ds es
-
- mov ax, 0 ; Inicializa el raton
- int 33h
- mov ax, 0007h ; Seleccionar limites horizontales
- mov cx, 0 ; Superior
- mov dx, 550
- sub dx, ds:Ancho_Img
- int 33h
- mov ax, 0008h ; Seleccionar limites verticales
- mov cx, 0 ; Izquierda
- mov dx, 150 ; Derecha
- int 33h
- mov ax, 3 ; Obtener la posicion y el estado del raton
- int 33h
- shr cx, 1
- mov ds:Pos_MX, cx ; En CX se devuelve la coordenada horizontal
- mov ds:Pos_MY, dx ; En DX se devuelve la coordenada vertical
-
- @Bucle_Prin:
- push ds:Pos_MX ; Pasamos los parametros a CargarBuffer
- push ds:Pos_MY
- mov dx,OFFSET ds:Buffer_Fuente
- push dx
- call CargarBuffer ; Leemos el trozo de imagen
-
- call TransfBuffer ; Lo transformamos
-
- push ds:Pos_MX
- push ds:Pos_MY
- mov dx,OFFSET ds:Buffer_Destino
- push dx
-
- ; RetrazoVert ; Esperamos al retrazo vertical
- call MostrarBuffer ; Y finalmente lo mostramos
- @Movimiento:
- mov ax, 3 ; Miramos la posicion del raton
- int 33h
- shr cx, 1 ; Dividimos la coordenada horizontal por 2
- cmp ds:Pos_MX, cx ; Comparamos para ver si se ha movido la X
- jnz @SeMovio
- cmp ds:Pos_MY, dx ; Comparamos para ver si se ha movido la X
- jnz @SeMovio
- mov ah, 6 ; Miramos si se pulso alguna tecla
- mov dl, 0ffh
- int 21h ; Si se pulso se ve en el Flag Zero
- jz @Movimiento
- jmp @Salir
- @SeMovio:
- mov ds:Pos_MX, cx ; Almacenamos las nuevas coordenadas
- mov ds:Pos_MY, dx
- jmp @Bucle_Prin ; Vuelta a empezar
- @Salir:
- ret
- Raton1 ENDP
- ;##############################################
- ; Este procedimiento permite mover la lupa
- ; mediante el uso del ratón ( Esta versión tiene el
- ; problema de que produce un molesto parpadeo al
- ; mover le raton debido a tener que poner la region
- ;anterior antes de desplazar la nueva lupa
- ;##############################################
- Raton2 PROC USES ax bx cx dx ds es
- mov ax, 0 ; Inicializa el raton
- int 33h
- mov ax, 0007h ; Seleccionar limites horizontales
- mov cx, 0 ; Superior
- mov dx, 550
- sub dx, ds:Ancho_Img
- int 33h
- mov ax, 0008h ; Seleccionar limites verticales
- mov cx, 0 ; Izquierda
- mov dx, 150 ; Derecha
- int 33h
- mov ax, 3 ; Obtener la posicion y el estado del raton
- int 33h
- shr cx, 1
- mov ds:Pos_MX, cx ; En CX se devuelve la coordenada horizontal
- mov ds:Pos_MY, dx ; En DX se devuelve la coordenada vertical
-
- @Bucle_Prin:
- push ds:Pos_MX ; Pasamos los parametros a CargarBuffer
- push ds:Pos_MY
- mov dx,OFFSET ds:Buffer_Fuente
- push dx
- call CargarBuffer ; Leemos el trozo de imagen
-
- call TransfBuffer ; Lo transformamos
-
- push ds:Pos_MX
- push ds:Pos_MY
- mov dx,OFFSET ds:Buffer_Destino
- push dx
-
- call MostrarBuffer ; Y finalmente lo mostramos
-
- @Movimiento:
- mov ax, 3 ; Miramos la posicion del raton
- int 33h
- shr cx, 1 ; Dividimos la coordenada horizontal por 2
- cmp ds:Pos_MX, cx ; Comparamos para ver si se ha movido la X
- jnz @SeMovio
- cmp ds:Pos_MY, dx ; Comparamos para ver si se ha movido la X
- jnz @SeMovio
- mov ah, 6 ; Miramos si se pulso alguna tecla
- mov dl, 0ffh
- int 21h ; Si se pulso se ve en el Flag Zero
- jz @Movimiento
- jmp @Salir
- @SeMovio:
- push dx ; Guardamos por si se modifican
- push cx
- push ds:Pos_MX ; Pasamos parametros
- push ds:Pos_MY
- mov dx, OFFSET ds:Buffer_Fuente
- push dx
- RetrazoVert ; Esperamos al retrazo vertical
- call MostrarBuffer ; Mostramos la imagen antigua
- pop cx ; Recuperamos la nueva posicion
- pop dx
- mov ds:Pos_MX,cx ; Asignamos los valores a las variables
- mov ds:Pos_MY,dx
- jmp @Bucle_Prin
- @Salir:
- ret
- Raton2 ENDP
-
- ;##############################################
- ; Este procedimiento mueve la lupa automaticamente
- ; como si revotara en las paredes
- ;##############################################
- MovAuto PROC USES ax bx cx dx
- LOCAL Increm_X:BYTE, Increm_Y:BYTE
- mov Increm_X,0fh ; Estas veriables indican con su signo la
- mov Increm_Y,0fh ; direccion del movimiento.
-
- mov bx, ds:Ancho_Pant ; Centramos la lupa en la pantalla
- shr bx, 1
- mov ds:Pos_MX, bx
- mov cx, ds:Alto_Pant
- shr cx, 1
- mov ds:Pos_MY, cx
- @Bucle_Prin:
- push bx ; Paso de parametros
- push cx
- mov dx,OFFSET ds:Buffer_Fuente
- push dx
- call CargarBuffer ; Leemos una zona de pantalla
-
- call TransfBuffer ; La transformamos
-
- push bx ; Paso de parametros
- push cx
- mov dx,OFFSET ds:Buffer_Destino
- push dx
- call MostrarBuffer ; La mostramos
- cmp Increm_X,0 ; Miramos el signo
- jl @Derecha_X
- push bx ; Si es positivo
- add bx, ds:Ancho_Img ; Sumo a la posicion el ancho
- cmp bx, ds:Ancho_Pant ; y miro si es mayor que la pantalla
- pop bx ; Recupero la posicion
- jge @Revota_Izq_X ; Si es menor que el fin de pantalla
- inc bx ; me acerco uno mas
- jmp @Mueve_Y
- @Revota_Izq_X: ; Estoy fuera de la pantalla
- neg Increm_X ; Cambio el sentido del movimiento
- inc bx ; hago un ultimo incremento
- jmp @Mueve_Y
- @Derecha_X: ; Si era negativo el sentido del movimiento
- cmp bx,0 ; Miro si estoy al comienzo de la pantalla
- jle @Revota_Der_X ; No he llegado al principio todavia
- dec bx ; me acerco uno mas
- jmp @Mueve_Y
- @Revota_Der_X: ; Estoy en el comienzo de pantalla
- neg Increm_X ; cambio el sentido
- dec bx ; hago un ultimo decremento
- jmp @Mueve_Y
- @Mueve_Y: ; Para el movimiento en Y es
- cmp Increm_Y,0 ; exactamente lo mismo
- jl @Subir_Y
- push cx
- add cx, ds:Ancho_Img
- cmp cx, ds:Alto_Pant
- pop cx
- jge @Revota_Sub_Y
- inc cx
- jmp @Fin_Mueve
- @Revota_Sub_Y:
- neg Increm_Y
- inc cx
- jmp @Fin_Mueve
- @Subir_Y:
- cmp cx,0
- jle @Revota_Baj_Y
- dec cx
- jmp @Fin_Mueve
- @Revota_Baj_Y:
- neg Increm_Y
- dec cx
- jmp @Fin_Mueve
- @Fin_Mueve:
-
- mov ah,6 ; Miro si se ha pulsado alguna tecla
- mov dl,0ffh
- int 21h ; se ve en el Flag Zero
- jz @Bucle_Prin
- ret
- MovAuto ENDP
- ;##############################################
- ; Este procedimiento incrementa y decrementa
- ; tanto el radio como la distancia al plano
- ;##############################################
- Efecto PROC USES ax bx cx dx
- LOCAL Separar:BYTE, Dist_Ini:BYTE
- mov Separar, 0fh ; El signo de esta veriable indica si se
- ; acerca o se separa la lente
- mov ax, ds:Ancho_Pant ; Centramos la lupa en la pantalla
- shr ax, 1
- mov ds:Pos_MX, ax
- mov ax, ds:Alto_Pant
- shr ax, 1
- mov ds:Pos_MY, ax
-
- push ds:Pos_MX
- push ds:Pos_MY
- mov dx,OFFSET ds:Buffer_Fuente
- push dx
- call CargarBuffer ; Leemos una unica vez de la pantalla
-
- xor cx,cx
- mov cl, ds:Dist_Plano ; Leemos la distancia al plano
- mov Dist_Ini, cl ; Empleamos una variable local para guardar
- ; el valor antiguo
- @Bucle_Prin:
- mov ds:Dist_Plano, cl
- push cx
- mov ax, ds:Ancho_img
- push ax
- call Crear_Matriz ; Creamos una nueva matriz con el nuevo valor
-
- call TransfBuffer ; Transformamos la imagen
-
- push ds:Pos_MX
- push ds:Pos_MY
- mov dx,OFFSET ds:Buffer_Destino
- push dx
- call MostrarBuffer ; La colocamos
- pop cx
- cmp cx,0 ; Miramos si hemos llegado a pagar la lente
- ; a la imagen
- jle @Modifica
- cmp cl, Dist_Ini ; O si se ha separado del todo
- jge @Modifica
- jmp @Modificada
- @Modifica:
- neg Separar ; Cambiamos la direccion
- @Modificada:
- cmp Separar, 0 ; Vemos cual es la direccion a seguir
- jge @Acercar ; y dependiendo de esta
- dec cx ; se decrementa la distancia al plano
- jmp @Fin_Mov
- @Acercar:
- inc cx ; o se incrementa
- @Fin_Mov:
- mov ah,6 ; Miramos si se ha pulsado alguna tecla
- mov dl,0ffh
- int 21h
- jz @Bucle_Prin
- ret
- Efecto ENDP
- ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- ; ▓▓▓ ▓▓▓ ▓▓ ▓▓ ▓▓ ▓ ▓ ▓▓ ▓▓▓ ▓▓▓ ▓ ▓ ▓ ▓▓ ▓ ▓▓▓ ▓▓ ▓
- ; ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓▓ ▓▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓
- ; ▓▓▓ ▓▓▓ ▓ ▓ ▓ ▓▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓▓▓ ▓▓▓ ▓ ▓▓ ▓ ▓ ▓ ▓▓▓ ▓ ▓ ▓
- ; ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓▓▓▓ ▓ ▓ ▓▓▓▓ ▓ ▓ ▓ ▓ ▓ ▓▓ ▓ ▓ ▓ ▓ ▓▓▓▓ ▓
- ; ▓ ▓ ▓ ▓▓ ▓▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓▓▓ ▓ ▓ ▓ ▓ ▓▓▓▓
- ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- Codigo PROC
- mov dx,@DATA ; Actualizar al valor del segemto de datos
- mov ds,dx
-
- Modo13 ; Establecer el modo de video 320x200x256
-
- mov dx, OFFSET ds:NombreTGA2 ; Pantalla de presentacion
- push dx
- mov dx, OFFSET ds:BufferTGA
- push dx
- mov dx, Ventana1 ; Directamente a pantalla
- push dx
- mov dx,0
- push dx
- call CargaTGA ; Mostrar la imagen de presentacion
-
- KeyPressed ; Hasta pulsar una tecla
- ModoTx ; Modo de texto para pedir los parametros
-
- call Param ; Pedir parametros
- call Mi_Menu ; Mostrar el menu de seleccion
-
- mov ax, ds:Ancho_img
- push ax
- call Crear_Matriz ; Crea la matriz de transformacion
-
- Modo13 ; Activa el modo de video
-
-
- mov dx, OFFSET ds:NombreTGA ; Imagen para el programa
- push dx
- mov dx, OFFSET ds:BufferTGA
- push dx
- mov dx, SEG Imagen ; A un segemento aparate
- push dx
- mov dx,0
- push dx
- call CargaTGA ; Mueve la imagen al segmento
-
- mov dx, SEG Imagen ; De donde voy a mover la imagen
- push dx
- mov dx,Ventana1 ; Donde la voy a colocar
- push dx
- call copy64k ; Mueve 64000 bytes de uno a otro
-
- call Seleccion ; Realizar la operacion deseada
- Salir
- Codigo ENDP
- END Codigo
-