ESTE ES EL CODIGO EL CUAL HACE Q LA IMAGEN CORRA DE UN LADO PERO SI YO KIERO Q SE MUEVE PARA EL OTRO LADO XIALES N ENCUENTRO EL CORRIMIENTO O Q FUNCION SE LE MUEVE A "ax" TAMBIEN UTILIZA MACROS EL CUAL SE ENCUENTRA AL FINAL DE ESTE...
la imagen se mueve para estelado-------------->>>>>>>
yo quiero q se mueva para este otro <<<<---------
; ************************************************************
; MANIPULACION DE IMAGENES --> MACROS
; ************************************************************
; Definici¢n del tipo de estructura del archivo PCX
TEncabezadoPCX STRUC
Manufacturer DB ?
Version01 DB ?
Encoding DB ?
BitsPerPixel DB ?
XMin DW ?
YMin DW ?
XMax DW ?
YMax DW ?
HRes DW ?
VRes DW ?
Palette DB 48 DUP ( ? )
Reserved DB ?
ColourPlanes DB ?
BytesPerLine DW ?
PaletteType DW ?
Filler DB 58 DUP ( ? )
TEncabezadoPCX ENDS
;
; ******* Secci¢n de definici¢n de macros *********
;
INCLUDE macarch.asm
;
; ******************** Cuerpo del programa ************************
;
.MODEL SMALL
; Definici¢n del segmento de la pila
.STACK
; Definici¢n del segmento de datos
.DATA
; Definici¢n de la paleta de colores
Paleta DB 768 Dup (?)
; Variable para emular un ciclo (200)
Cont DW ?
; Variable de suma para la formula de columnas
Sum DW ?
; Definicion de la paleta temporal
PaletaTemporal DB 768 DUP (0)
; Definici¢n de los datos del encabezado
EncabezadoPCX TEncabezadoPCX ?
; Definicion de la bandera que controla el ciclo externo
Bandera DB, 0
; Definici¢n de los datos asociados con la imagen
Alto DW ?
Ancho DW ?
Bytes DW ?
; Definici¢n de la variable asociada con el archivo
ManejadorArchivo DW 0
; Definici¢n de la variable asociada con el buffer de lectura
Buffer DB ?
; Definici¢n de la variable que contiene los bytes leidos en
; una operaci¢n de lectura
BytesLeidos DW ?
; Definici¢n de la constante con el nombre del archivo
NombreArchivo DB 'rhwin.PCX', 0
; Definici¢n de la constante para el modo de acceso al archivo
ModoAcceso Db 0 ; Acceso s¢lo de lectura
; Definici¢n de la variable que indica el n£mero de bits por pixel
Bits Db ?
; Definici¢n de la variable que contiene las repeticiones de un patr¢n
Repeticiones DB ?
; Definici¢n del mensaje de error con respecto al byte control de la paleta
ErrorByteControl DB 'El primer byte de la paleta no es el de control', 0ah, 0dH, '$'
; Definici¢n del mensaje de error de cerrado del archivo
MensajeErrorCerrado DB 'Existi¢ un error al cerrar el archivo', 0aH, 0dh, '$'
; Definici¢n del mensaje del error de lectura
MensajeErrorLectura DB 'Existe un error en la operaci¢n de lectura', 0AH, 0DH, '$'
; Definici¢n del mensaje del error de apertura
MensajeErrorApertura DB 'Existe un error en la operaci¢n de apertura', 0AH, 0DH, '$'
; Definici¢n del mensaje para el posicionamiento
ErrorPosicionamiento DB 'Existi¢ un error de posicionamiento en el archivo', 0AH, 0DH, '$'
; Definici¢n de mensajes respecto al archivo PCX
NoEsArchivoPCX DB 'Este no es un archivo PCX', 0AH, 0DH, '$'
NoEsVersion DB 'La versi¢n no corresponde a un archivo para 256 colores', 0AH, 0DH, '$'
BitsPerPixelIncorrectos DB 'No existen los bits por pixel adecuados', 0AH, 0DH, '$'
; Definici¢n del salto de l¡nea
SaltaLinea DB 0DH, 0AH, '$'
; Definici¢n del mensaje del alto
MensajeAlto DB 'El alto es de $'
; Definici¢n del segmento de c¢digo
.CODE
;
; ************ Definici¢n del programa principal ****************
;
ProgramaPrincipal PROC NEAR
; Asignaci¢n de los valores iniciales a SS, SP y DS
.STARTUP
; Apertura del archivo PCX
MAbreArchivo <OFFSET NombreArchivo>, ModoAcceso, <OFFSET MensajeErrorApertura>, ManejadorArchivo
; Lectura del encabezado
MLeeArchivo ManejadorArchivo, 128, <OFFSET EncabezadoPCX>, <OFFSET MensajeErrorLectura>, BytesLeidos
; Validaci¢n del fabricante en el encabezado
CMP EncabezadoPCX.Manufacturer, 0AH
JE ValidaVersion
; Impresi¢n del mensaje de error
MOV DX, OFFSET NoEsArchivoPCX
MOV AH, 09
INT 21H
; Detenci¢n de la ejecuci¢n del programa
.EXIT
; Validaci¢n de la versi¢n del paintbrush
ValidaVersion:
CMP EncabezadoPCX.Version01, 5
JE CalculaBitsPerPixel
; Impresi¢n del mensaje de error
MOV DX, Offset NoEsVersion
MOV AH, 09
INT 21H
; Detenci¢n de la ejecuci¢n del programa
.EXIT
; C lculo de los bits por pixel
CalculaBitsPerPixel:
CMP EncabezadoPCX.BitsPerPixel, 1
JNE AsignaBitsPerPixel
MOV AL, EncabezadoPCX.ColourPlanes
MOV Bits, AL
JMP SHORT ValidaBitsPorPixel
AsignaBitsPerPixel:
MOV AL, EncabezadoPCX.BitsPerPixel
MOV Bits, AL
; Validaci¢n de los bits por pixel
ValidaBitsPorPixel:
CMP Bits, 8
JE CalculoAltoImagen
; Impresi¢n del mensaje de error
MOV DX, OFFSET BitsPerPixelIncorrectos
MOV AH, 09
INT 21H
; Detenci¢n de la ejecuci¢n del programa
.EXIT
; C lculo del alto de la imagen
CalculoAltoImagen:
MOV AX, EncabezadoPCX.YMax
SUB AX, EncabezadoPCX.YMin
ADD AX, 1
MOV Alto, AX
; C lculo del valor de los bytes por l¡nea
MOV AX, EncabezadoPCX.BytesPerLine
MOV Bytes, AX
; ***** Localizaci¢n de la paleta de colores ******
; Posicionamiento del apuntador al final del archivo
LocalizacionPaleta:
MOV CX, 0
MOV DX, 0 ; Distancia a mover en bytes
MOV AL, 02 ; A partir del final del archivo
MOV BX, ManejadorArchivo
MOV AH, 42H ; Funci¢n de posicionamiento
INT 21H
; Validaci¢n del error de posicionamiento
JNC GeneraDesplazamiento
MOV BL, AL
MOV DX, Offset ErrorPosicionamiento
MOV AH, 09
INT 21H
; Impresi¢n del n£mero del error
MOV DL, BL
ADD DL, 30H
MOV AH, 02
INT 21H
; Detenci¢n de la ejecuci¢n del programa
.EXIT
; Generaci¢n de la posici¢n del inicio de la etiqueta
GeneraDesplazamiento:
SUB AX, 769
SBB DX, 0
; Posicionamiento al inicio de la paleta de colores
MOV CX, DX
MOV DX, AX
MOV AL, 00 ; A partir del inicio del archivo
MOV BX, ManejadorArchivo
MOV AH, 42H
INT 21H
; Validaci¢n del error de posicionamiento
JNC LecturaByteControl
MOV BL, AL
MOV DX, OFFSET ErrorPosicionamiento
MOV AH, 09
INT 21H
; Impresi¢n del n£mero del error
MOV DL, BL
ADD DL, 30H
MOV AH, 02
INT 21H
; Detenci¢n de la ejecuci¢n del programa
.EXIT
; Lectura del byte de control
LecturaByteControl:
MLeeArchivo ManejadorArchivo, 1, <OFFSET buffer>, <OFFSET MensajeErrorLectura>, BytesLeidos
; Validaci¢n del byte de control
CMP Buffer, 0CH
JE LecturaPaleta
; Impresi¢n del comentario de error
MOV DX, OFFSET ErrorByteControl
MOV AH, 09
INT 21H
; Detenci¢n de la ejecuci¢n del programa
.EXIT
; Lectura de la paleta
LecturaPaleta:
MLeeArchivo ManejadorArchivo, 768, <OFFSET Paleta>, <OFFSET MensajeErrorLectura>, BytesLeidos
; Adecuaci¢n del contenido de la paleta
AjustaPaleta:
MOV SI, 0
IniciaAjustePaleta:
CMP SI, 768
JUMPS
JE EstableceModo
NOJUMPS
SHR Byte PTR Paleta[SI],1
SHR Byte PTR Paleta[SI],1
INC SI
JMP SHORT IniciaAjustePaleta
; Establecimiento del modo VGA19
EstableceModo:
MOV AL, 13H
MOV AH, 00
INT 10H
;-------------------------------------------------------------------------
; ****** Configuraci¢n de la paleta **********
ConfiguraPaletaVGA:
MOV AX, DS
MOV ES, AX
MOV AX, 1012H
MOV BX, 0
MOV CX, 256
MOV DX, OFFSET Paleta
INT 10H
; Posicionamiento del apuntador del archivo al inicio de la imagen
PosicionaInicioImagen:
MOV CX, 0
MOV DX, 128 ; Distancia a mover en bytes
MOV AL, 0 ; A partir del final del archivo
MOV BX, ManejadorArchivo
MOV AH, 42H ; Funci¢n de posicionamiento
INT 21H
; Validaci¢n del error de posicionamiento
JNC ImprimeContenidoImagen
MOV BL, AL
MOV DX, OFFSET ErrorPosicionamiento
MOV AH, 09
INT 21H
; ***** Impresi¢n del contenido de la imagen *****
ImprimeContenidoImagen:
; Asignaci¢n del valor al registro ES
MOV AX, 0A000H
MOV ES, AX
; Inicializaci¢n del contador de l¡neas
MOV CX, 0
; Inicializaci¢n del valor de SI
MOV SI, 0
; Ciclo de impresi¢n de la l¡neas de la imagen
InicioCicloImpresionLineas:
; Verificaci¢n del valor del contador de l¡neas
CMP CX, Alto
JUMPS
JE EsperaPulsacionCaracter
NOJUMPS
; Inicializaci¢n de DI
SUB DI, DI
; Preservaci¢n del registro SI
PUSH SI
; Inicializaci¢n de las posiciones de la memoria de video
IniciaCicloMemVideo:
; Validaci¢n del valor del contador
CMP DI, Bytes
JUMPS
JE AsignaValoresContadores
NOJUMPS
; Asignaci¢n del valor a la memoria de video
MOV BYTE PTR ES:[SI],0
; Incremento de SI y DI
INC SI
INC DI
JMP SHORT IniciaCicloMemVideo
; Asignaci¢n de los valores a los contadores
AsignaValoresContadores:
SUB DI, DI
POP SI
; Lectura de los datos de la l¡nea
InicioCicloLinea:
; Lectura de un byte de la l¡nea en el archivo
MLeeArchivo ManejadorArchivo, 1, <OFFSET buffer>, <OFFSET MensajeErrorLectura>, BytesLeidos
; Verificaci¢n del tipo de byte leido
MOV AL, buffer
MOV AH, 0
AND AX, 00C0H
CMP AX, 00C0H
JUMPS
JNE AlmacenaLiteral
NOJUMPS
; Obtenci¢n de los bytes de repetici¢n
AND Buffer, 00111111B
MOV AL, buffer
MOV Repeticiones, AL
; Lectura del byte a repetir
MLeeArchivo ManejadorArchivo, 1, <OFFSET buffer>, <OFFSET MensajeErrorLectura>, BytesLeidos
; Asignaci¢n del valor del caracter a AL
MOV AL, Buffer
; Repetici¢n del caracter de datos
InicioCicloRepeticiones:
CMP Repeticiones, 0
JUMPS
JE ComparaDI
NOJUMPS
; Guardado del caracter de repetici¢n de la memoria de video
MOV ES:[SI], AL
; Incremento de SI
INC SI
; Incremento de DI
INC DI
; Decremento de las repeticiones
DEC Repeticiones
JMP SHORT InicioCicloRepeticiones
; Almacenamiento del valor de la literal
AlmacenaLiteral:
MOV AL, Buffer
MOV ES:[SI], AL
INC SI
INC DI
; Validaci¢n del contenido de DI
ComparaDI:
CMP DI, Bytes
JUMPS
JNE InicioCicloLinea
NOJUMPS
; Incremento del valor de SI
MOV AX, 320
SUB AX, DI
ADD SI, AX
; Incremento del valor de CX
INC CX
; Salto al inicio del ciclo de la l¡neas
JMP InicioCicloImpresionLineas
EsperaPulsacionCaracter:
; Inicializacion del contador de lineas
MOV sum,0
MOV BX,0
SUB SI,SI
SUB DI,DI
Corrimiento:
CMP Sum,319
JE Salir
; Asignacion de direccion base a Es
MOV Ax,Ds
PUSH Ax
MOV AX,0A000h
MOV ES,AX
MOV DI,64000
; Inicio direccion fuente
MOV AX,0A000h
MOV DS,Ax
MOV SI,63999
; Inidicar un rrecorrido ascendente
STD
; Indicacion standar
MOV CX,32000
; Corrimiento
REP MOVSW
POP AX
MOV DS,AX
CLD
MOV AX,319
MOV BX,0;1
MUL BX
MOV DI,AX
MOV AX,0
MOV CX,160
REP STOSW
INC Sum
;Borrado del priemer pixel
MOV SI,320
MOV AL,0
MOV DS: [SI],AL
JMP Corrimiento
Salir:
; Establecimiento del modo VGA 3
MOV AX, 0003
INT 10H
; Cerrado del archivo
MCierraArchivo ManejadorArchivo, <OFFSET MensajeErrorCerrado>
; Terminaci¢n de la ejecuci¢n del programa
.EXIT
ProgramaPrincipal ENDP
END ProgramaPrincipal
-----------------------------------------------------FIN DELPROGRAMA
INICIO DE LA MACRO-------------------------------------------------
; Definici¢n de la macro que abre un archivo existente
; DS = Segmento de NombreArchivo.
; DX = Offset de NombreArchivo
; AH = 3D ( Funci¢n de apertura del archivo )
; AL = ModoAcceso
; NombreArchivo = Nombre del archivo y debe terminar con nulo.
MAbreArchivo MACRO NombreArchivo, ModoAcceso, MensajeError, ManejadorArchivo
LOCAL @@AperturaExitosa
; Preservaci¢n de los registros AX y DX
PUSH AX
PUSH CX
PUSH DX
; Asignaci¢n del modo de acceso a AL
MOV al, ModoAcceso
; Asignaci¢n del valor a la funci¢n a AH
MOV ah, 3dH
; Asignaci¢n del offset a DX del offset de NombreArchivo
MOV DX, NombreArchivo
; Solicitud del servicio proporcionado por la interrupci¢n 21H
INT 21H
; Verificaci¢n del ‚xito de la solicitud del servicio
JNC SHORT @@AperturaExitosa
; Guardado del valor generado por la interrupci¢n 21H
MOV cx, ax
; Impresi¢n del salto del error cometido en la apertura
MOV dx, MensajeError
MOV ah, 09
INT 21h
; Impresi¢n del n£mero de error
Mov DL, CL
Add DL, 30H
Mov AH, 02
Int 21H
; Detenci¢n de la ejecuci¢n del programa.
.exit
@@AperturaExitosa:
; Asignaci¢n del valor al manejador del archivo
MOV ManejadorArchivo, AX
; Restauraci¢n de los valores de los registros
POP DX
POP CX
POP AX
ENDM
; Definici¢n de la macro que lee el contenido de un archivo
MLeeArchivo MACRO ManejadorArchivo, NumBytesLeer, Buffer, MensajeError, BytesLeidos
LOCAL LecturaExitosa
; Preservaci¢n de los valores de los registros de prop¢sito general
PUSH ax
PUSH cx
PUSH dx
; Asignaci¢n del valor a AH
MOV ah, 3FH ; Funci¢n 3F de lectura del archivo
MOV al, 00 ; Ajuste del valor de AL
; Asignaci¢n del valor al registro BX
MOV bx, ManejadorArchivo
; Asignaci¢n del valor al registro CX
MOV cx, NumBytesLeer
; Asignaci¢n del valor al registro DX
MOV dx, Buffer
; Emisi¢n de la interrupci¢n
INT 21H
; Verificaci¢n del valor de la funci¢n
JNC LecturaExitosa
; Guardado temporal del valor de AX
MOV cx, ax
; Impresi¢n del salto de l¡nea
MOV dx, MensajeError
MOV ah, 09
INT 21h
; Impresi¢n del n£mero de error
Mov DL, CL
Add DL, 30H
Mov AH, 02
Int 21H
; Detenci¢n de la ejecuci¢n del programa.
.exit
LecturaExitosa:
; Asignaci¢n del valor al n£mero de bytes leidos
MOV BytesLeidos, AX
; Restauraci¢n de los valores de los registros
POP dx
POP cx
POP ax
ENDM
; Definici¢n de la macro que cierra un archivo.
MCierraArchivo MACRO ManejadorArchivo, MensajeError
LOCAL CerradoExitoso
; Preservaci¢n de los valores de los registros
PUSH ax
PUSH cx
PUSH dx
; Asignaci¢n del valor al registro AH
MOV ah, 3EH
; Ajuste del valor de AL
MOV al, 00
; Asignaci¢n del valor al registro BX
MOV bx, ManejadorArchivo
; Emisi¢n de la interrupci¢n 21H
INT 21H
; Verificaci¢n del valor de la funci¢n
JNC CerradoExitoso
; Guardado temporal del valor de AX
MOV cx, ax
; Impresi¢n del salto de l¡nea
MOV dx, MensajeError
MOV ah, 09
INT 21h
; Impresi¢n del n£mero de error
Mov DL, CL
Add DL, 30H
Mov AH, 02
Int 21H
; Detenci¢n de la ejecuci¢n del programa.
.exit
CerradoExitoso:
; Restauraci¢n de los valores de los registros
POP dx
POP cx
POP ax
ENDM
;definicion de la macro que detiene la imagen
ConfiguraPaleta Macro Paleta, Byteinicial,NumeroBytes
LOCAL IniciaConfiguracion,TerminaConfiguracion
;; Preservacion de los registros utilizados
Push AX
Push DX
Push SI
;; Inicializacion del Contador
XOR SI,SI
;; Espera del refrace vertical
WaitSync
;; Configuracion del Puerto 3c8h
Mov DX,3c8h
Mov AL,ByteINicial
Out DX,AL
;; ESpecificacion del Puerto 3c9h
INC DX
;; Modificacion del contenido de la paleta de colores
IniciaConfiguracion:
CMP SI,NumeroBytes
JE TerminaConfiguracion
;; Extracion del Valor de la paleta temporal
Mov AL,&Paleta&[SI]
;; Configuracion del registro equivalente de la paleta del Hardware
Out DX,AL
;; Incremento de Contador
INC SI
;; Regreso al inicio del ciclo
Jmp Short IniciaConfiguracion
TerminaConfiguracion:
;; Restauracio de los registros
POP SI
POP DX
POP AX
ENDM
;Definicion de la Macro Waitsync
Waitsync Macro
LOCAL WaitVr1,WaitVr2
;; Cuerpo de la Macro
MOV DX,3dah
WaitVr1:
IN AL,DX
TEST AL,8
JNE WaitVr1
WaitVr2:
IN AL,DX
TEST AL,8
JE WaitVr2
ENDM
; Macro para pintar un pixel determinado en una columna,renglon
PintaPixel MACRO Renglon, Columna, Color
;; Preservacion de los registros
Push Ax
Push Bx
Push Dx
Push Es
;; Calculo del offset
Mov Ax, Renglon
Mov Cl, 6
Shl Ax, Cl
Mov Bx, Ax
Shl Bx, 1
Shl Bx, 1
Add Bx, Ax
Add Bx, Columna
;; Pintar el pixel del color seleccionado
Mov Ax, 0A000h
Mov Es, Ax
Mov Al, Color
Mov Es:[Bx], Al
;; Restauracion de los registros
Pop Es
Pop Dx
Pop Bx
Pop Ax
EndM
; Macro que genera un numero aleatorio
Aleatorio Macro A, C, M, XN, XN1
Local
;;Preservacion de los registros
Push Ax
Push Bx
Push Cx
Push Dx
;;Obtencion del producto
Mov Ax, A
Mov Bx, XN
Mul Bx
;;Adicion del termino C
Add Ax, C
AdC Dx, 0
;;Obtencion del residuo con respecto a M
Mov Bx, M
Div Bx ; residuo queda en dx y el cociente en Ax
;;Asignacion del residuo a XN1
Mov XN1, Dx
;;restauracion de los registros utilizados
Pop Dx
Pop Cx
Pop Bx
Pop Ax
EndM
;Definicion de una macro que imprime una matriz en la memoria de video
IMPRIMEMATRIZ MACRO NUMRENSPRITE,NUMCOLSPRITE,RENGLONA,COLUMNAA,RENGLON,COLUMNA,OFFSETSPRITE
LOCAL InicioCiclorenglones,SalidaCicloRenglones,InicioCicloColumnas,SalidaCicloColumnas
; Preservacion de los valores de los registros
Push ax
Push bx
Push cx
Push dx
; Inicializacion del renglon
MOV RENGLON,0
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
; Simula el ciclo de renglones
InicioCicloRenglones:
MOV CL,NUMRENSPRITE
SUB CL,1
CMP CL,RENGLON
JL SalidaCicloRenglones
;Inicializacion del valor de la columna del sprite
MOV COLUMNA,0
;Simulacion ciclo columnas
InicioCicloColumnas:
MOV CH,NUMCOLSPRITE
SUB CH,1
CMP CH,COLUMNA
JL SalidaCicloColumnas
MOV AX,0A000H
MOV ES,AX
MOV AX,RENGLONA
ADD AL,RENGLON
ADC AH,0
MOV DX,320
MUL DX
ADD AX,COLUMNAA
ADD AL,COLUMNA
ADC AH,0
MOV BX,AX
MOV AX,NUMCOLSPRITE
MUL RENGLON
ADD AL,COLUMNA
ADC AH,0
ADD AX,OFFSETSPRITE
MOV SI,AX
MOV AL,[SI]
MOV BYTE PTR ES:[BX],AL
INC COLUMNA
JMP InicioCicloColumnas
SalidaCicloColumnas:
inc renglon
JMP InicioCicloRenglones
SalidaCicloRenglones:
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
Waitsync
;Restauracion de los registros de proposito general
Pop dx
Pop cx
Pop bx
Pop ax
ENDM