home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 9 / CDACTUAL9.iso / share / Dos / VARIOS / lente / BAK / IMAGEN_6.ASM < prev    next >
Encoding:
Assembly Source File  |  1996-06-03  |  15.6 KB  |  514 lines

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