home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 9 / CDACTUAL9.iso / share / Dos / VARIOS / lente / BAK / INTERMA1.ASM < prev    next >
Encoding:
Assembly Source File  |  1996-06-05  |  11.6 KB  |  405 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.         Cad_Null DB'$'
  11.         Cad_Dist DB 'Esta es la distancia d^2 -Px^2-Py^2+Rc^2 $'
  12.         Cad_Px   DB 'Esta es Px ( Cont_X - Med ) $'
  13.         Cad_Py   DB 'Esta es Py ( Cont_Y - Med ) $'
  14.         Cad_Qz   DB 'Esta es Qz (1 + SQRT(Dist) $'
  15.         Cad_Ix   DB 'Esta es Ix (d * Qx)/(d+ Qz) $'
  16.         Cad_Iy   DB 'Esta es Iy (d * Qy)/(d+ Qz) $'
  17.         Cad_Desp DB 'Desplazamiento (Px*Ancho + Py) $'
  18.  
  19.  
  20.         R_circulo DB 18
  21.         Dist_plano DB 9
  22.         R_esfera DB ?
  23.  
  24.         Pto_Q S_Punto <0,0,0>
  25.         Pto_P S_Punto <0,0,0>
  26.         Pto_I S_Punto <0,0,0>
  27.  
  28.         Distancia DW ?
  29.         Desplaza_Mat DW 0
  30.         Ventana1        EQU 0A000h
  31.         NombreTGA       DB  'LENS.TGA',0
  32.         HandleTGA       DW  ?
  33.  
  34.         Ancho_Img       DW 40
  35.         Ancho_Pant      DW 320
  36.         Alto_Pant       DB 200
  37.         Area            DW 1600
  38.         Buffer_Fuente   DB 1600 DUP(?)
  39.         Buffer_Destino  DB 1600 DUP(?)
  40.         MatrizTrans     DW 1600 DUP(0)
  41.         BufferTGA       DB 1024 DUP(?)
  42. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  43. .CODE
  44. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  45. ; Macro para desactivar el modo 13h y salir al sistema
  46. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  47. Salir MACRO
  48.         mov ax,4C00h    ; Funcion 4Ch: Salir al sistema
  49.         int 21h
  50. ENDM
  51. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  52.  
  53. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  54. ; Macro que devuelve en AX el cuadrado del valor
  55. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  56. Cuadrado MACRO Valor
  57.         xor ax,ax
  58.         mov al,Valor
  59.         imul al
  60. ENDM
  61. ;###############################################
  62. ; Raiz devuelve en AX el valor de la raiz entera
  63. ;###############################################
  64. Raiz PROC NEAR USES cx bx , Operando : WORD 
  65.         mov bx, Operando
  66.         jns @Continua
  67.         neg bx
  68. @Continua:
  69.         xor cx,cx
  70. @bucle:
  71.         inc cl
  72.         Cuadrado cl
  73.         cmp ax,bx
  74.         jle @bucle
  75.         dec cl
  76.         xor ax,ax
  77.         mov al,cl
  78.         ret
  79. Raiz ENDP
  80. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  81. ; Macro que calcula el valor de la variable Distancia
  82. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  83. Calc_Dist PROC
  84.         xor ax,ax
  85.         xor bx,bx
  86.         Cuadrado Dist_plano     ; Obtenemos d^2
  87.         push ax
  88.         Cuadrado Pto_P.Coor_X   ; Obtenemos Px^2
  89.         push ax
  90.         Cuadrado Pto_P.Coor_Y   ; Obtenemos Py^2
  91.         pop bx
  92.         add ax,bx               ; Calculamos Px^2 + Py^2
  93.         push ax
  94.         Cuadrado R_circulo      ; Obtenemos Rc^2
  95.         pop bx
  96.         sub bx,ax               ; Calculamos (Px^2 + Py^2) - Rc^2
  97.         pop ax
  98.         sub ax,bx               ; Calculamos d^2 -((Px^2 + Py^2) -Rc^2)
  99.         mov Distancia, ax       ; Asignamos el valor a Distancia
  100. ;        push ax
  101. ;        mov bx, OFFSET Cad_Dist
  102. ;        push bx
  103. ;        call Imprime
  104.         ret
  105. Calc_Dist ENDP
  106. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  107. ; Macro para calcular Pto_Q.Coor_Z 
  108. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  109. Calc_Qz PROC USES ax bx 
  110.         xor ax,ax
  111.         push Distancia
  112.         call Raiz               ; Calculamos SQRT(D)
  113.         add al,1                ; Calculamos 1+SQRT(D)
  114.         mov Pto_Q.Coor_Z, al    ; Asignamos el valor a la variable
  115. ;        cbw
  116. ;        push ax
  117. ;        mov bx, OFFSET Cad_Qz
  118. ;        push bx
  119. ;        call Imprime
  120.         ret
  121. Calc_Qz ENDP
  122. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  123. ; Macro para calcular Pto_I.Coor_X
  124. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  125. Calc_Ix PROC USES ax bx
  126.         xor ax,ax
  127.         mov al, Pto_Q.Coor_Z
  128.         add al, Dist_Plano      ; Calculamos (Qz + d)
  129.         push ax
  130.         xor ax,ax
  131.         mov al, Dist_Plano      
  132.         imul Pto_P.Coor_X       ; Calculamos (d * Px)
  133.         pop bx
  134.         idiv bl                  ; Calculamos (d*Px) / (Qz +d)
  135.         mov Pto_I.Coor_X, al    ; Asignamos el valor a la variable
  136. ;        cbw
  137. ;        push ax
  138. ;        mov bx, OFFSET Cad_Ix
  139. ;        push bx
  140. ;        call Imprime
  141.  
  142.         ret
  143. Calc_Ix ENDP
  144. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  145. ; Macro para calcular Pto_I.Coor_Y
  146. ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  147. Calc_Iy PROC USES ax bx 
  148.         xor ax,ax
  149.         mov al, Pto_Q.Coor_Z
  150.         add al, Dist_Plano      ; Calculamos (Qz + d)
  151.         push ax
  152.         xor ax,ax
  153.         mov al, Dist_Plano      
  154.         imul Pto_P.Coor_Y        ; Calculamos (d * Py)
  155.         pop bx
  156.         idiv bl                  ; Calculamos (d*Py) / (Qz +d)
  157.         mov Pto_I.Coor_Y, al    ; Asignamos el valor a la variable
  158.  ;       cbw
  159.  ;       push ax
  160.  ;       mov bx, OFFSET Cad_Iy
  161.  ;       push bx
  162.  ;       call Imprime
  163.  
  164.         ret
  165. Calc_Iy ENDP
  166.  
  167. ;################################################
  168. ; Dar_Cateto devuelve en AX el valor del cateto
  169. ; opuesto según el Teorema de Pitagoras
  170. ;################################################
  171. Dar_Cateto PROC NEAR USES bx ,Base:BYTE, Cateto: BYTE
  172.         Cuadrado Base
  173.         push ax
  174.         Cuadrado Cateto
  175.         pop bx
  176.         add ax,bx
  177.         push ax
  178.         call Raiz
  179.         ret
  180. Dar_Cateto ENDP
  181.  
  182. ;##################################################
  183. ; Transformacion de un punto ,devuelve en AX
  184. ;##################################################
  185. Trans_Pto PROC USES bx cx , Cnt_X :BYTE, Cnt_Y:BYTE, Ancho:BYTE
  186. LOCAL Medio_Ancho: BYTE
  187.  
  188.         mov al, Ancho
  189.         shr al,1                ; Dividimos por dos el Ancho
  190.         mov Medio_Ancho, al     ; Lo almacenamos en Medio_Ancho
  191.         xor ax,ax
  192.         call Calc_Dist  ; Calculamos el valor de D
  193.         call Calc_Qz    ; Calculamos Qz = 1 + SQRT(D)
  194.         call Calc_Ix    ; Calculamos Ix = (d * Qx )/(d + Qz)
  195.         call Calc_Iy    ; Calculamos Iy = (d * Qy )/(d + Qz)
  196.         mov Pto_I.Coor_Z, 0
  197.         mov al, Medio_Ancho
  198.         add al, Pto_I.Coor_Y
  199.         imul Ancho
  200.         push ax
  201.         mov al, Medio_Ancho
  202.         add al, Pto_I.Coor_X
  203.         pop bx
  204.         cbw
  205.         add ax,bx
  206. ;        push ax
  207. ;        mov dx, OFFSET Cad_Desp
  208. ;        push dx
  209. ;        call Imprime
  210.         ret
  211. Trans_Pto ENDP
  212.  
  213. Calc_Pxy PROC USES bx cx dx, Medio_Ancho:BYTE,Cnt:WORD
  214.                 mov ax,Cnt
  215.                 mov cl,ah
  216.                 sub cl,Medio_Ancho
  217.                 xor bx,bx
  218.                 mov bl,al
  219.                 sub bl,Medio_Ancho
  220. ;                xchg ax,cx
  221. ;                cbw
  222. ;                xchg ax,cx
  223. ;                push cx
  224. ;                mov dx, OFFSET Cad_Py
  225. ;                push dx
  226. ;                call Imprime
  227. ;                xchg ax,bx
  228. ;                cbw
  229. ;                xchg ax,bx
  230. ;:                push bx
  231. ;:                mov dx, OFFSET Cad_Px
  232. ;                push dx
  233. ;                call Imprime
  234.                 mov Pto_P.Coor_X, bl    
  235.                 mov Pto_P.Coor_Y, cl
  236.                 mov Pto_Q.Coor_X, bl
  237.                 mov Pto_Q.Coor_Y, cl
  238.                 ret
  239. Calc_Pxy ENDP
  240. ;##################################################
  241. ; Crear_Matriz modifica la matriz de transformacion
  242. ;##################################################
  243. Crear_Matriz PROC USES bx cx dx, Ancho : BYTE
  244. LOCAL Cnt_X: BYTE,Cnt_Y:BYTE, Desp_Pant :WORD, Desp_Mat :WORD, \
  245. Medio_Ancho :BYTE
  246.  
  247.         mov al, Ancho       
  248.         shr al,1                ; Dividimos por dos el Ancho
  249.         mov Medio_Ancho, al     ; Lo almacenamos en Medio_Ancho
  250.         xor cx,cx
  251. @Bucle_for1:                    ; Bucle FOR Cnt_X = 0 TO Ancho para 
  252.                                 ; la coordenada X
  253.         mov Cnt_Y,cl
  254.         xor cx,cx
  255.    @Bucle_for2:                 ; Bucle FOR Cnt_Y = 0 TO Ancho -1 para
  256.                                 ; la coordenada Y
  257.                 mov Cnt_X,cl
  258.                 xor ah,ah
  259.                 mov al, Medio_Ancho
  260.                 push ax
  261.                 mov ah,Cnt_Y
  262.                 mov al,Cnt_X
  263.                 push ax
  264.                 call Calc_Pxy
  265.                 xor ah,ah
  266.                 mov al, Pto_P.Coor_X
  267.                 push ax
  268.                 mov al, Pto_P.Coor_Y
  269.                 push ax
  270.  
  271.                       ; Paso de parametros del procedimiento
  272.                       ; Cateto que devuelve un valor en AX 
  273.                 call Dar_Cateto
  274.                 xor bx,bx
  275.                 mov bx,ax       ; Cambiamos el valor de sitio
  276.                 mov al,Cnt_Y    ; Calculamos el desplazamiento dentro de la
  277.                 imul Ancho       ; matriz de transformacion
  278.                 mov cl,Cnt_X    ;\
  279.                 xchg ax,cx      ; > Para rellenar ch con 0000h 
  280.                 cbw             ;/
  281.                 add ax,cx       ; Cnt_Y * Medio_Ancho + Cnt_X
  282.                 mov Desp_Mat,ax ; almacenamos el resultado 
  283.                 mov cl, R_circulo       ;\
  284.                 xchg ax,cx              ; > Para rellenar ch con 0000h 
  285.                 cbw                     ;/
  286.                 cmp ax, bx              ; El punto esta fuera del circulo de
  287.                 mov ax, Desp_Mat
  288.                 jle @Es_Menor            ; corte del plano con la esfera
  289.                                 ;; El punto esta en la lupa
  290.                         xor bx,bx
  291.                         mov bl,Cnt_X
  292.                         push bx
  293.                         mov bl,Cnt_Y
  294.                         push bx
  295.                         mov bl,Ancho
  296.                         push bx
  297.                         call Trans_Pto
  298.  
  299.               @Es_Menor:                ; corte del plano con la esfera
  300.                         mov bx,Desp_Mat
  301.                         shl bx,1
  302.                         mov MatrizTrans[bx], ax         ; Asignamos el nuevo
  303.                                                         ; valor
  304.                 mov cl,Cnt_X
  305.                 inc cl
  306.                 cmp cl,Ancho
  307.                 jl @Bucle_for2
  308.         mov cl,Cnt_Y
  309.         inc cl
  310.         mov ch,Ancho
  311.         cmp cl, ch 
  312.         jl @Bucle_for1
  313.         ret
  314. Crear_Matriz ENDP
  315.  
  316. ;###############################
  317. ;Procedimiento que imprime el valor
  318. ;###############################
  319. Imprime PROC USES ax bx cx dx si, Valor:WORD, Cadena:PTR BYTE 
  320.  
  321.         mov ah ,09h
  322.         mov dx ,OFFSET Cadena
  323.         int 21h
  324.  
  325.         mov ax,Valor
  326.         cmp ax,0h
  327.         jg @Sigue
  328.         neg ax
  329.         push ax
  330.         mov ah, 0Eh
  331.         mov al,'-'
  332.         int 10h
  333.         pop ax
  334. @Sigue:
  335.         mov bx,10000
  336.         mov si,0
  337. @Bucle:
  338.         xor dx,dx
  339.         div bx
  340.         cmp ax,0
  341.         jnz @Imp_Num
  342.         cmp si,0
  343.         jz @Cero
  344. @Imp_Num:
  345.         mov si,1
  346.         mov cx,'0'
  347.         add ax,cx
  348.         mov ah, 0Eh
  349.         int 10h
  350. @Cero:
  351.         push dx
  352.         mov ax,bx
  353.         xor dx,dx
  354.         mov cx,10
  355.         div cx
  356.         cmp ax,0
  357.         jz @Fin
  358.         mov bx,ax
  359.         pop ax
  360.         jmp @Bucle
  361. @Fin:
  362.         pop ax
  363.         mov al, si
  364.         cmp al, 0
  365.         jnz @NoCero
  366.  
  367.         mov ah, 0Eh
  368.         mov al, 0ah
  369.         int 10h
  370. @Nocero:
  371.         mov ah, 01h
  372.         int 21h
  373.         ret
  374. Imprime ENDP 
  375.  
  376.  
  377.  
  378. Codigo PROC
  379.         mov ax,@data
  380.         mov ds,ax
  381.  
  382.         mov al, Ancho_img
  383.         push ax
  384.         call Crear_Matriz
  385.         mov cx, Area
  386.         shl cx,1
  387.         xor bx,bx
  388. @Bucle:
  389.         push cx
  390.         mov ax,MatrizTrans[bx]
  391.         push ax
  392.         mov dx,OFFSET R_Circulo
  393.         push dx
  394.         call imprime
  395.         inc bx
  396.         inc bx
  397.         pop cx
  398.         cmp bx,cx
  399.         jl @Bucle
  400.  
  401.         Salir
  402. Codigo ENDP
  403.  
  404.         END Codigo
  405.