home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 9 / CDACTUAL9.iso / share / Dos / VARIOS / lente / BAK / IMAGEN_4.ASM < prev    next >
Encoding:
Assembly Source File  |  1996-05-31  |  15.1 KB  |  483 lines

  1. .MODEL SMALL,PASCAL
  2. .STACK 500h 
  3. .DATA
  4.  
  5. S_Punto STRUC
  6.         Coor_X DW ?
  7.         Coor_Y DW ?
  8.         Coor_Z DW ?
  9. S_Punto ENDS
  10.  
  11.         R_circulo DW 28
  12.         Dist_plano DW 15
  13.         R_esfera DW ?
  14.  
  15.         Pto_Q S_Punto <0,0,0>
  16.         Pto_P S_Punto <0,0,0>
  17.         Pto_I S_Punto <0,0,0>
  18.  
  19.         Distancia DW ?
  20.  
  21.         Ventana1        EQU 0A000h
  22.         NombreTGA       DB  'LENS.TGA',0
  23.         HandleTGA       DW  ?
  24.  
  25.         Ancho_Img       DW 50
  26.         Ancho_Pant      DW 320
  27.         Alto_Pant       DW 200
  28.         Area            DW 2500
  29.         Buffer_Fuente   DB 2500 DUP(0)
  30.         Buffer_Destino  DB 2500 DUP(0)
  31.         Buffer_Trans    DW 2500 DUP(0)
  32.         MatrizTrans     DW 2500 DUP(0)
  33.         BufferTGA       DB 1024 DUP(?)
  34. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  35. .CODE
  36.  
  37. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  38. ; Macro para activar el modo de video 320 x 200 x 256
  39. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  40. Modo13 MACRO
  41.         mov ax,0013h    ; Modo de video 
  42.         int 10h
  43. ENDM
  44. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  45. ; Macro para desactivar el modo 13h y salir al sistema
  46. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  47. Salir MACRO
  48.         mov ax,0003h    ; Modo texto
  49.         int 10h
  50.         mov ax,4C00h    ; Funcion 4Ch: Salir al sistema
  51.         int 21h
  52. ENDM
  53. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  54. ;#####################################
  55. ; Este procedimiento carga una images
  56. ; en formato TGA 256 colores 
  57. ;#####################################
  58.  
  59. CargaTGA PROC USES ax bx cx dx ds es di si, Nombre_TGA:PTR BYTE, \
  60. Buffer:PTR BYTE
  61.  
  62. LOCAL Handle_TGA:WORD
  63.  
  64.         mov ax,3D00h            ; Funcion 3Dh: Abrir un fichero modo lectura
  65.         mov dx,offset Nombre_TGA        ; Direccion de comienzo del nombre
  66.         int 21h
  67.  
  68.         mov Handle_TGA, ax      ; Al abrir el fichero se devuelve en ax el
  69.                                 ; handle del fichero
  70.  
  71.         mov ah, 3Fh             ; Funcion 3Fh: Leer los CX elementos del 
  72.         mov bx, Handle_TGA      ; fichero y escribirlos en R
  73.         mov cx, 18
  74.         mov dx, OFFSET Buffer   ; Leemos la cabecera del fichero
  75.         int 21h
  76.  
  77.         mov ah, 3Fh             ; Funcion 3Fh: Leer los CX elementos del
  78.         mov bx, Handle_TGA      ; fichero y escribirlos en R
  79.         mov cx, 768
  80.         mov dx, OFFSET Buffer   ; Leemos la paleta de colores
  81.         int 21h
  82.  
  83.         mov cx, 256             ; Elementos de la paleta
  84.  
  85.         mov ax, @DATA           ; Preparamos los registros de segmentos                       
  86.         mov es, ax              ; y los de desplazamiento de cadena fuente
  87.         mov si, OFFSET Buffer   ; y destino para emplear las instruciones 
  88.         mov di, OFFSET Buffer   ; lods_ y stos_ que son las mas comodas
  89.         cld                     ; Borra el flag de direccion
  90.  
  91. @@ModifPal:
  92.         lodsb                   ; al <- DS:SI y INC si
  93.         shr al, 1               ; dividimos el valor entre cuatro 
  94.         shr al, 1               ; tenemos la nueva componente AZUL
  95.         mov ah, al              ; situamos el nuevo valor en AH
  96.         lodsb                   ; al <- DS:SI y INC si
  97.         shr al, 1               ; dividimos el valor entre cuatro
  98.         shr al, 1               ; tenemos la nueva componente VERDE
  99.         mov bh, al              ; situamos el nuevo valor en BH
  100.         lodsb                   ; al <- DS:SI y INC si
  101.         shr al, 1               ; dividimos el valor entre cuatro
  102.         shr al, 1               ; tenemos la nueva componente ROJA
  103.         stosb                   ; ES:DI <- al y INC di , almacenamos el ROJO
  104.         mov al, bh              ; 
  105.         stosb                   ; ES:DI <- al y INC di , almacenamos el VERDE
  106.         mov al, ah       
  107.         stosb                   ; ES:DI <- al y INC di , almacenamos el AZUL
  108.         dec cx                  ; un color menos de la Paleta
  109.         jnz @@ModifPal          ; repetir hasta cero
  110.  
  111.         mov ax, 1012h           ; Funcion 10h subfuncion 12h establecer la
  112.         mov bx, 0               ; paleta de colores situada en ES:DX
  113.         mov cx, 256             ; numero de colores
  114.         mov dx, OFFSET Buffer
  115.         int 10h 
  116.  
  117.         mov ah, 3Fh             ; Leer del fichero toda la imagen que esta
  118.         mov bx, Handle_TGA      ; sin comprimir y situarla en la Ventana1
  119.         mov cx, 64000           ; tamaño de la imagen
  120.         mov dx, Ventana1
  121.         mov ds, dx
  122.         mov dx, 0
  123.         int 21h
  124.  
  125.         mov ah, 3Eh             ; Funcion 3Eh: Cerrar un fichero 
  126.         mov bx, Handle_TGA
  127.         int 21h
  128.         ret
  129. CargaTGA ENDP
  130.  
  131.  
  132. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  133. ; Macro que devuelve en AX el cuadrado del valor
  134. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  135. Cuadrado MACRO Valor
  136.         xor ax,ax
  137.         mov ax,Valor
  138.         imul ax
  139. ENDM
  140. ;###############################################
  141. ; Raiz devuelve en AX el valor de la raiz entera
  142. ;###############################################
  143. Raiz PROC NEAR USES cx bx , Operando : WORD 
  144.         mov bx, Operando
  145.         jns @Continua
  146.         neg bx
  147. @Continua:
  148.         xor cx,cx
  149. @bucle:
  150.         inc cl
  151.         Cuadrado cx
  152.         cmp ax,bx
  153.         jle @bucle
  154.         dec cl
  155.         xor ax,ax
  156.         mov al,cl
  157.         ret
  158. Raiz ENDP
  159. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  160. ; Macro que calcula el valor de la variable Distancia
  161. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  162. Calc_Dist PROC
  163.         xor ax,ax
  164.         xor bx,bx
  165.         Cuadrado Dist_plano     ; Obtenemos d^2
  166.         push ax
  167.         Cuadrado Pto_P.Coor_X   ; Obtenemos Px^2
  168.         push ax
  169.         Cuadrado Pto_P.Coor_Y   ; Obtenemos Py^2
  170.         pop bx
  171.         add ax,bx               ; Calculamos Px^2 + Py^2
  172.         push ax
  173.         Cuadrado R_circulo      ; Obtenemos Rc^2
  174.         pop bx
  175.         sub bx,ax               ; Calculamos (Px^2 + Py^2) - Rc^2
  176.         pop ax
  177.         sub ax,bx               ; Calculamos d^2 -((Px^2 + Py^2) -Rc^2)
  178.         mov Distancia, ax       ; Asignamos el valor a Distancia
  179.         ret
  180. Calc_Dist ENDP
  181. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  182. ; Macro para calcular Pto_Q.Coor_Z 
  183. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  184. Calc_Qz PROC
  185.         xor dx,dx
  186.         xor ax,ax
  187.         push Distancia
  188.         call Raiz               ; Calculamos SQRT(D)
  189.         add ax,1                ; Calculamos 1+SQRT(D)
  190.         mov Pto_Q.Coor_Z, ax    ; Asignamos el valor a la variable
  191.         ret
  192. Calc_Qz ENDP
  193. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  194. ; Macro para calcular Pto_I.Coor_X
  195. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  196. Calc_Ix PROC
  197.         xor dx,dx
  198.         xor ax,ax
  199.         mov ax, Pto_Q.Coor_Z
  200.         add ax, Dist_Plano      ; Calculamos (Qz + d)
  201.         push ax
  202.         xor ax,ax
  203.         mov ax, Dist_Plano      
  204.         imul Pto_P.Coor_X       ; Calculamos (d * Px)
  205.         pop bx
  206.         idiv bx                  ; Calculamos (d*Px) / (Qz +d)
  207.         mov Pto_I.Coor_X, ax    ; Asignamos el valor a la variable
  208.         ret
  209. Calc_Ix ENDP
  210. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  211. ; Macro para calcular Pto_I.Coor_Y
  212. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  213. Calc_Iy PROC
  214.         xor dx,dx
  215.         xor ax,ax
  216.         mov ax, Pto_Q.Coor_Z
  217.         add ax, Dist_Plano      ; Calculamos (Qz + d)
  218.         push ax
  219.         xor ax,ax
  220.         mov ax, Dist_Plano      
  221.         imul Pto_P.Coor_Y        ; Calculamos (d * Py)
  222.         pop bx
  223.         idiv bx                  ; Calculamos (d*Py) / (Qz +d)
  224.         mov Pto_I.Coor_Y, ax    ; Asignamos el valor a la variable
  225.         ret
  226. Calc_Iy ENDP
  227.  
  228. ;################################################
  229. ; Dar_Cateto devuelve en AX el valor del cateto
  230. ; opuesto según el Teorema de Pitagoras
  231. ;################################################
  232. Dar_Cateto PROC NEAR USES bx ,Base:WORD, Cateto: WORD
  233.         Cuadrado Base
  234.         push ax
  235.         Cuadrado Cateto
  236.         pop bx
  237.         add ax,bx
  238.         push ax
  239.         call Raiz
  240.         ret
  241. Dar_Cateto ENDP
  242.  
  243. ;##################################################
  244. ; Transformacion de un punto ,devuelve en AX
  245. ;##################################################
  246. Trans_Pto PROC USES bx cx , Cnt_X :BYTE, Cnt_Y:BYTE, Ancho:BYTE
  247. LOCAL Medio_Ancho: BYTE
  248.  
  249.         mov al, Ancho
  250.         shr al,1                ; Dividimos por dos el Ancho
  251.         mov Medio_Ancho, al     ; Lo almacenamos en Medio_Ancho
  252.         xor ax,ax
  253.         call Calc_Dist  ; Calculamos el valor de D
  254.         call Calc_Qz    ; Calculamos Qz = 1 + SQRT(D)
  255.         call Calc_Ix    ; Calculamos Ix = (d * Qx )/(d + Qz)
  256.         call Calc_Iy    ; Calculamos Iy = (d * Qy )/(d + Qz)
  257.         mov Pto_I.Coor_Z, 0
  258.         xor ax,ax
  259.         mov al, Medio_Ancho
  260.         add ax, Pto_I.Coor_Y
  261.         imul Ancho
  262.         push ax
  263.         mov al, Medio_Ancho
  264.         add ax, Pto_I.Coor_X
  265.         pop bx
  266.         add ax,bx
  267.         ret
  268. Trans_Pto ENDP
  269.  
  270. ;##################################################
  271. ; Crear_Matriz modifica la matriz de transformacion
  272. ;##################################################
  273. Crear_Matriz PROC USES bx cx dx, Ancho : WORD
  274. LOCAL Cnt_X:WORD, Cnt_Y:WORD, Desp_Pant :WORD, Desp_Mat :WORD, \
  275. Medio_Ancho :WORD
  276.  
  277.         mov ax, Ancho       
  278.         shr ax,1                ; Dividimos por dos el Ancho
  279.         mov Medio_Ancho, ax     ; Lo almacenamos en Medio_Ancho
  280.         xor cx,cx
  281. @Bucle_for1:                    ; Bucle FOR Cnt_X = 0 TO Ancho para 
  282.                                 ; la coordenada X
  283.         mov Cnt_Y,cx
  284.         xor cx,cx
  285.    @Bucle_for2:                 ; Bucle FOR Cnt_Y = 0 TO Ancho -1 para
  286.                                 ; la coordenada Y
  287.                 mov Cnt_X,cx
  288.                 mov cx,Cnt_Y
  289.                 sub cx,Medio_Ancho
  290.                 xor bx,bx
  291.                 mov bx,Cnt_X
  292.                 sub bx,Medio_Ancho
  293.                 mov Pto_P.Coor_X, bx    
  294.                 mov Pto_P.Coor_Y, cx
  295.                 mov Pto_Q.Coor_X, bx
  296.                 mov Pto_Q.Coor_Y, cx
  297.                 push bx       ; Paso de parametros del procedimiento
  298.                 push cx       ; Cateto que devuelve un valor en AX 
  299.                 call Dar_Cateto
  300.                 xor bx,bx
  301.                 mov bx,ax       ; Cambiamos el valor de sitio
  302.                 mov ax,Cnt_Y    ; Calculamos el desplazamiento dentro de la
  303.                 imul Ancho       ; matriz de transformacion
  304.                ; mov cx,Cnt_X    ;\
  305.                 xchg ax,cx      ; > Para rellenar ch con 0000h 
  306.                ; cbw             ;/
  307.                 add ax,cx       ; Cnt_Y * Medio_Ancho + Cnt_X
  308.                 mov Desp_Mat,ax ; almacenamos el resultado 
  309.                ; mov cx, R_circulo       ;\
  310.                 xchg ax,cx              ; > Para rellenar ch con 0000h 
  311.                ; cbw                     ;/
  312.                 cmp ax, bx              ; El punto esta fuera del circulo de
  313.                 mov ax, Desp_Mat
  314.                 jl @Es_Menor            ; corte del plano con la esfera
  315.                                 ;; El punto esta en la lupa
  316.                         xor bx,bx
  317.                         mov bx,Cnt_X
  318.                         push bx
  319.                         mov bx,Cnt_Y
  320.                         push bx
  321.                         mov bx,Ancho
  322.                         push bx
  323.                         call Trans_Pto
  324.  
  325.               @Es_Menor:                ; corte del plano con la esfera
  326.                         mov bx,Desp_Mat
  327.                         shl bx,1
  328.                         mov MatrizTrans[bx], ax         ; Asignamos el nuevo
  329.                                                         ; valor
  330.                 mov cx,Cnt_X
  331.                 inc cx
  332.                 cmp cx,Ancho
  333.                 jl @Bucle_for2
  334.         mov cx,Cnt_Y
  335.         inc cx
  336.         mov dx,Ancho
  337. ;        dec ch
  338.         cmp cx, dx 
  339.         jl @Bucle_for1
  340.         ret
  341. Crear_Matriz ENDP
  342.  
  343. ;############################################################################
  344. ; Procedimiento que toma un trozo de la imagen y la guarda en un buffer
  345. ;############################################################################
  346. CargarBuffer PROC USES ax cx si di ds es , Pos_X :WORD, Pos_Y:WORD, \
  347. Dest :PTR BYTE
  348. LOCAL Ancho_I:WORD, Ancho_P:WORD
  349.         mov ax, Ancho_Pant
  350.         mov Ancho_P,ax
  351.         mov ax, Ancho_Img
  352.         mov Ancho_I,ax
  353.         push ds
  354.         pop es
  355.         mov ax, Ventana1
  356.         mov ds, ax
  357.         mov si, Pos_Y
  358.         mov ax, Ancho_P
  359.         mul si  
  360.         mov si, ax
  361.         add si, Pos_X
  362.         mov di, OFFSET Dest
  363.         mov cx, Ancho_I
  364. @@CopiaFila:
  365.         push si
  366.         push cx
  367.         mov cx, Ancho_I
  368.         cld
  369.         rep movsb
  370.         pop cx
  371.         pop si
  372.         add si, Ancho_P
  373.         dec cx
  374.         jnz @@CopiaFila
  375.         ret
  376. CargarBuffer ENDP
  377.  
  378. ;############################################################################
  379. ; Procedimiento que toma un buffer y lo muestra en pantalla
  380. ;############################################################################
  381. MostrarBuffer PROC USES ax cx si di ds es , Pos_X :WORD, Pos_Y:WORD, \
  382. Dest :PTR BYTE
  383. LOCAL Ancho_I:WORD, Ancho_P:WORD
  384.         mov ax, Ancho_Pant
  385.         mov Ancho_P,ax
  386.         mov ax, Ancho_Img
  387.         mov Ancho_I,ax
  388.  
  389.         mov ax, Ventana1
  390.         mov es, ax
  391.         mov di, Pos_Y
  392.         mov ax, Ancho_P
  393.         mul di
  394.         mov di, ax
  395.         add di, Pos_X
  396.         mov si, OFFSET Dest
  397.         mov cx, Ancho_I
  398. @@CopiaFila:
  399.         push di
  400.         push cx
  401.         mov cx, Ancho_I
  402.         cld
  403.         rep movsb
  404.         pop cx
  405.         pop di
  406.         add di, Ancho_P
  407.         dec cx
  408.         jnz @@CopiaFila
  409.         ret
  410. MostrarBuffer ENDP
  411.  
  412. ;############################################################################
  413. ; Procedimiento que transforma un trozo de imagen de un buffer
  414. ;############################################################################
  415. TransfBuffer PROC USES dx es ds si di ax bx cx
  416.         mov dx, ds
  417.         mov es, dx
  418.         mov si, OFFSET MatrizTrans
  419.         mov di, OFFSET Buffer_Trans
  420.         mov cx, Area
  421.         cld
  422.         xor bh,bh
  423. @@HazPunto:
  424.         lodsw
  425.         mov bx,ax
  426.         mov al,OFFSET [Buffer_Fuente+bx]
  427.         stosb
  428.         inc dx
  429.         dec cx
  430.         jnz @@HazPunto
  431.  
  432.         ret
  433. TransfBuffer ENDP
  434.  
  435. Codigo PROC
  436.         mov ax,@data
  437.         mov ds,ax
  438.  
  439.         Modo13
  440.         mov dx, OFFSET NombreTGA
  441.         push dx
  442.         mov dx, OFFSET BufferTGA
  443.         push dx
  444.         call CargaTGA
  445.  
  446.         call Crear_Matriz
  447.                 
  448.         xor cx,cx
  449.         mov cx,200
  450.         mov bx,320
  451. @Bucle_Prin:
  452.         push cx
  453.         push bx
  454.         mov dx,OFFSET Buffer_Fuente
  455.         push dx
  456.         call CargarBuffer
  457.  
  458.         xor ax,ax
  459.         mov ax, Ancho_img
  460.         push ax
  461.         call TransfBuffer
  462.  
  463.         push cx
  464.         push bx
  465.         mov dx,OFFSET Buffer_Trans
  466.         push dx
  467.         call MostrarBuffer
  468.  
  469.         push cx
  470.         push bx
  471.         mov dx,OFFSET Buffer_Destino
  472.         push dx
  473.         call MostrarBuffer
  474.  
  475.         dec cx
  476.         dec bx
  477.         loopnz @Bucle_Prin
  478.  
  479.         Salir
  480. Codigo ENDP
  481.  
  482.         END Codigo
  483.