home *** CD-ROM | disk | FTP | other *** search
- .MODEL SMALL,PASCAL
- .STACK 500h
- .DATA
- Ventana1 EQU 0A000h
- NombreTGA DB 'LENS.TGA',0
- HandleTGA DW ?
-
- Ancho_Img DW 70
- Ancho_Pant DW 320
- Alto_Pant DB 200
- Area DW 4900
- Buffer_Fuente DB 4900 DUP(?)
- Buffer_Destino DB 4900 DUP(?)
- Matriz_Trans DB 4900 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
-
- ;############################################################################
- ; 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 :BYTE, Pos_Y:BYTE, \
- 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 :BYTE, Pos_Y:BYTE, \
- 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
- mov dx, ds
- mov es, dx
- mov si, OFFSET Matriz_Trans
- mov di, OFFSET Buffer_Destino
- mov cx, Area
- cld
- xor bh,bh
- @@HazPunto:
- lodsw
- mov bx,ax
- mov al,OFFSET [Buffer_Fuente+bx]
- stosb
- inc dx
- dec cx
- jnz @@HazPunto
-
- ret
- TransfBuffer ENDP
-
- Codigo PROC
- mov ax,@data
- mov ds,ax
-
- Modo13
- mov dx, OFFSET NombreTGA
- push dx
- mov dx, OFFSET BufferTGA
- push dx
- call CargaTGA
-
- mov ax, 35
- push ax
- push ax
- mov dx, OFFSET Buffer_Destino
- push dx
- call CargarBuffer
-
- mov ax,120
- push ax
- push ax
- mov dx, OFFSET Buffer_Destino
- push dx
- call MostrarBuffer
-
- mov ah, 01h
- int 21h
- Salir
- Codigo ENDP
-
- END Codigo
-