Вы находитесь на странице: 1из 5

Este es un programa residente que fue propuesto y resuelto en clase.

Con las siguientes diferencias:


1.- La rutina para salvar y recuperar el rea de video es la misma, slo que en este caso se utiliza la variable de control SW1=0
para decidir si se escribe de la RAM de video hacia el buffer del programa residente y SW1=1 para escribir del buffer del
programa residente hacia la RAM de video.
2.- Para el acceso a las variables se utiliza en la instruccin el registro de segmento que se desea utilizar, por ejemplo:
MOV CS:SW1,AH
MOV AH,ES:FILA2
etc. de no hacerse as el acceso a las variables nos es el deseado.
Esto fue mencionado en clase.
3.- Para convertir el archivo en .COM se debe hacer el ensamblaje normal con el TASM as: TASM nombre del programa, pero
para hacer el link se debe hacer as: TLINK/t nombre del programa.
NOTA: Compare el programa hecho en clase con este, y coloque lo pertinente al nombre de las variables, ejectelo y haga un
programa para probar al programa residente. Luego ejecute este programa y prubelo con el mismo programa.
De todos modos, junto con el programa residente se le enva un programa para que prueben.
Por ltimo, lo que se ha salvado en el buffer del programa residente, puede ser recuperado tantas veces como se desee, hasta que se
mande a salvar otra porcin.
Comment |
******************************************************************
Proposito: Este programa TSR actua como una funcion, para salvar o recuperar
areas de la RAM de video. Contiene dos funciones las cuales
se describen a continuacion:
AH Funcion
00
Salva parte de la pantalla.
01
Recupera lo salvado.
SI
debe aputar al inicio de 4 bytes que representan
las coordenadas de los puntos diagonales.
esquina superior izquierda (fila1,columna1) y
esquina inferior derecha (fila2,columna2).
DS
Segmento donde estan las coordenadas.
Este programa TSR pasivo. Se puede usar desde otro programa
invocando la INT 78H con AH cargado con la funcion deseada.
******************************************************************|
.MODEL TINY
;Para crear un programa .COM
.386
.CODE
ORG 100H
INICIO: JMP CARGADOR
;Ve a la parte transitoria o cargador del programa TSR.
;******************************************************************
; Area para datos dentro del CODE SEGMENT.
;******************************************************************
IntUse
EQU 78H
;Interrupcion a usar
EnvBlock
EQU 2CH
ErrMsg
DB 'Lamentablemente el vector est siendo utilizado',13,10,"$"
FILA1
DB 00H
COL1
DB 00H
FILA2
DB 00H
COL2
DB 00H
CONTC
DB 00H
CONTF
DB 00H
PRIN
DW 0000H
PRIN1
DW 0000H
SW1
DB 00H
BUFF
DB 4100 DUP (?)

;******************************************************************
;
Area de programa.
;******************************************************************
;******************************************************************
; Lo siguiente es la nueva rutina de servicio para la INT 78H.
; la cual salva y recupera porciones de la pantalla.
;******************************************************************
NewInt:
PUSHA
;Guarda todos los registros.
CMP AH,00H
MOV CS:SW1,AH
;Desea salvar la pantalla?
JNE NI1
;No, continua
CALL GUARDA
;Si, guardar.
JMP NI9
NI1:
CMP AH,01H
;Desea recuperar la pantalla?
JNE NI9
;No, continua
CALL RECUPERA
;Si, recupera
NI9:
POPA
;Recupera todos los registros.
IRET
;Retorna de la INT 78H

;******************************************************************
; Salva la pantalla.
;******************************************************************
GUARDA:
PUSH ES
PUSH CS
POP ES
MOV CX,0002H
MOV DI,OFFSET FILA1
L1:
MOV AX,DS:[SI]
MOV ES:[DI],AX
ADD SI,0002H
ADD DI,0002H
LOOP L1
PUSH DS
MOV AX,0B800H
MOV DS,AX
MOV AH,ES:FILA2
SUB AH,ES:FILA1
INC AH
MOV ES:CONTF,AH
MOV AH,ES:COL2
SUB AH,ES:COL1
INC AH
MOV ES:CONTC,AH
MOV AL,ES:FILA1
MOV BL,0A0H
MUL BL
MOV CX,0000H
MOV CL,ES:COL1
ADD CX,CX
ADD AX,CX
MOV ES:PRIN,AX
MOV ES:PRIN1,AX
L0:
MOV DI,OFFSET BUFF
MOV CX,0000H
MOV CL,ES:CONTF
L4:
MOV BL,ES:CONTC
MOV SI,ES:PRIN
L5:
CMP ES:SW1,00
JNE L2

L2:
L3:

PS2:

MOV AX,DS:[SI]
MOV ES:[DI],AX
JMP L3
MOV AX,ES:[DI]
MOV DS:[SI],AX
ADD SI,0002H
ADD DI,0002H
DEC BL
JNZ L5
MOV AX,ES:PRIN
ADD AX,00A0H
MOV ES:PRIN,AX
LOOP L4
POP DS
POP ES
RETN

;******************************************************************
; Recupera la pantalla.
;******************************************************************
RECUPERA:
CMP ES:CONTF,01H
JE PS2
PUSH ES
PUSH CS
POP ES
PUSH DS
MOV AX,0B800H
MOV DS,AX
MOV AX,ES:PRIN1
MOV ES:PRIN,AX
JMP L0
;******************************************************************
; Hasta aqui llega la parte residente del programa.
;******************************************************************
;******************************************************************
; De aqui en adelante comienza la parte transitoria del TSR.
; La cual se descarta despues de quedar instalada la INT 78H.
;******************************************************************
CARGADOR: MOV AL,IntUse ;Recoge la INT a usar.
MOV AH,35H
INT 21H
MOV AX,ES
ADD AX,BX
;Verifica si esta todo en cero.
CMP AX,0000H
JE COLOCA
;No esta siendo utilizada, colocar la nueva.
MOV SI,OFFSET ErrMsg ;Si se esta utilizando, envia mensaje
CALL PrtString ;de error.
MOV AH,4CH
;Termina con codigo.
MOV AL,01H
INT 21H
COLOCA:

MOV DX,OFFSET NewInt ;Nuevo offset de la rutina de servicio.


MOV AL,IntUse
;Redirecciona este vector para que
MOV AH,25H
;apunte a NewInt. (DS ya esta cargado)
INT 21H
MOV ES,DS:[EnvBlock] ;Recoge el segmento del bloque de ambiente.
MOV AH,49H
;libera la memoria que no se necesita.
INT 21H
MOV DX,OFFSET CARGADOR ;Fin del area residente.

PrtString:

MOV CL,4
;Divide por 16
SHR DX,CL
;No en parrafos.
INC DX
;sumar 1 por seguridad.
MOV AL,00H
;Retorna el codigo de OK.
MOV AH,31H
;TSR function
INT 21H
MOV AH,09H
MOV DX,OFFSET ERRMSG
INT 21H
RETN
END INICIO

Este es el otro programa que sirve para probar al programa residente.


Comment |
******************************************************************
Proposito: Este programa PRUEBA al TSR INT78-2 actua como una funcion,
para salvar y recuperar areas de la RAM de video.
Entradas:
AH
Funcion
00
Salva parte de la pantalla.
01
Recupera lo salvado.
SI
debe aputar al inicio de 4 bytes que representan
las coordenadas de los puntos diagonales.
esquina superior izquierda (fila1,columna1) y
esquina inferior derecha (fila2,columna2).
DS Segmento donde estan las coordenadas.
******************************************************************|

TEXTO

BLK
FILA1
COL1
FILA2
COL2

.MODEL SMALL
;Para crear un programa .COM
.386
.STACK 100H
.DATA
DB "Proposito: Este programa PRUEBA al TSR INT78-2 actua como una funcion,",0AH,0DH
DB "para salvar y recuperar areas de la RAM de video.",0AH,0DH
DB "Entradas:
AH
Funcion",0AH,0DH
DB "
00
Salva parte de la pantalla.",0AH,0DH
DB "
01
Recupera lo salvado.",0AH,0DH
DB "
SI
debe aputar al inicio de 4 bytes que representan",0AH,0DH
DB "
las coordenadas de los puntos diagonales.",0AH,0DH
DB "
esquina superior izquierda (fila1,columna1) y",0AH,0DH
DB "
esquina inferior derecha (fila2,columna2).",0AH,0DH
DB "
DS Segmento donde estan las coordenadas.$"
DB 50 DUP (0AH),"$"
DB 0CH
DB 00H
DB 15H
DB 40H
.CODE
MOV AX,SEG TEXTO
MOV DS,AX
MOV AH,02H
MOV BH,00H
MOV DX,0C00H
INT 10H
MOV AH,09H
MOV DX,OFFSET TEXTO

INT 21H
MOV AH,00H
INT 16H
MOV AH,00H
MOV SI,OFFSET FILA1
INT 78H
MOV AH,09H
MOV DX,OFFSET BLK
INT 21H
MOV AH,00H
INT 16H
MOV AH,01H
INT 78H
MOV AH,00H
INT 16H
MOV AX,4C00H
INT 21H
END

Вам также может понравиться