Está en la página 1de 26

;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*

;* Muestra mensaje * pro11


;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*

.MODEL TINY
.STACK
DATOS SEGMENT
saludo db "electronica!!!","$"
DATOS ENDS
CODE SEGMENT
assume cs:code,ds:datos
START PROC
mov ax,datos ;
mov ds,ax ;Inicializar
mov dx,offset saludo ;Cargar la direccion del saludo
mov ah,9 ;Opcion que va a servir a la interrupcion 21h para
;indicar que debe mostrar por pantalla el offset
;que hay en DX hasta que encuentre el caracter '$'
int 21h ;Interrupcion que lo mostrara por pantalla
mov ax,4C00h ;
int 21h ;Terminar el programa
START ENDP
CODE ENDS
END START




MODIFICADO
;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
;* Muestra mensaje * pro11a
;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
.MODEL TINY
.STACK
DATOS SEGMENT
saludo db "MICRO II !!!","$
DATOS ENDS
CODE SEGMENT
assume cs:code,ds:datos
START PROC
mov ds,datos ;
mov ax,ds ;Inicializar

mov dx,offset saludo ;Cargar la direccion del saludo
mov ah,9 ;Opcion que va a servir a la interrupcion 21h para
;indicar que debe mostrar por pantalla el offset
;que hay en DX hasta que encuentre el caracter '$'
int 21h ;Interrupcion que lo mostrara por pantalla
mov ax,4C00h ;
int 21h ;Terminar el programa
START ENDP
CODE ENDS
END START


;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
;* Salta una posicin * pro15
;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
gotoxy macro fila ,col
mov ah,02h
mov dh,fila
mov dl, col
mov bh,0h
int 10h
endm
pantalla macro que
mov ah,02h
mov dl,que
int 21h
endm
.model small
.code
.STACK
.startup
gotoxy 10,10
pantalla 1
.exit
end




MODIFICADO
;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
;* Salta una posicin con una figura * pro15a
;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
gotoxy macro fila ,col
mov ah,02h
mov dh,fila
mov dl, col
mov bh,0h
int 16h
endm
pantalla macro que
mov ah,02h
mov dl,que
int 21h
endm

.model small
.code
.STACK
.startup
gotoxy 16,16
pantalla 1
.exit
end


;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
;* Llena la pantalla con un signo * pro3
;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
pantalla EQU 0B800h ;Direccion fsica de comienzo de la pantalla
.MODEL TINY
.STACK
CODE SEGMENT
assume cs:code
START PROC
mov ax,pantalla ;Cargar la direccin de la coordenada 0,0 de la
mov ds,ax ;pantalla
xor bx,bx ;Ponemos bx a 0
pinta_caracter:
mov ds:[bx],byte ptr "H" ;Escribir el carcter en su coordenada
inc bx ;En lugar de sumar 2, se incrementa 2 veces porque
;consume menos ciclos de reloj del procesador
inc bx ;Cada posicion de la pantalla son 2 bytes,
cmp bx,2000*2 ;por eso bx va a llegar hasta 4000
jl pinta_caracter ;Si bx<4000 volvemos a pintar otro carcter
mov ax,4C00h ;
int 21h ;Terminar el programa
START ENDP
CODE ENDS
END START


MODIFICADO
;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
;* Llena la pantalla con un signo * pro3a
;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
pantalla EQU 0B800h ;Direccion fsica de comienzo de la pantalla
.MODEL TINY
.STACK
CODE SEGMENT
assume cs:code
START PROC
mov ax,pantalla ;Cargar la direccin de la coordenada 0,0 de la
mov ds,ax ;pantalla
xor bx,bx ;Ponemos bx a 0
pinta_caracter:
mov ds:[bx],byte ptr "L" ;Escribir el carcter en su coordenada
inc bx ;En lugar de sumar 2, se incrementa 2 veces porque
;consume menos ciclos de reloj del procesador
inc bx ;Cada posicion de la pantalla son 2 bytes,
cmp bx,2000*3 ;por eso bx va a llegar hasta 6000
jl pinta_caracter ;Si bx<6000 volvemos a pintar otro carcter
mov ax,6C00h ;
int 21h ;Terminar el programa
START ENDP
CODE ENDS
END START

;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
;* Mayor menor o igual *
;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
.model small
.stack
.data
var1 db ?
var2 db ?
msg1 db 'El Primero Es Mayor $'
msg2 db 'El Primero Es Menor $'
msg3 db 'Son Iguales $'
.code
.startup
mov ah,00h
mov al,03h
int 10h
mov ah,02h
mov dx,0510h
mov bh,0
int 10h
mov ah,07h
int 21h
mov ah,02h
mov dl,al
int 21h
mov var1,al
mov ah,07h
int 21h
mov ah,02h
mov dl,al
int 21h
mov var2,al

cmp var1,al
ja mayor
jb menor
je igual
mayor:
mov ah,09h
lea dx,msg1
int 21h
jmp sali
menor:
mov ah,09h
lea dx,msg2
int 21h
jmp salir

igual:
mov ah,09h
lea dx,msg3
int 21h
jmp salir

salir:
.exit
end







;----------------------------------------------------------------------;
;* V G A *;
;* *;
;* Con el programa VGA se accede a diferentes *;
;* funciones elementales, unidas al modo gr fico *;
;* de la tarjeta VGA. *;
;* *;
;* La traduccin se hizo con TASM VGA *;
;* El LINKado se hizo con TLINK VGA *;
;* *;
;* El programa es llamado con VGA *;
;*--------------------------------------------------------------------*;

; Constantes

VIO_SEG = 0A000h ;Direccin de segmento del RAM de vdeo
;en modo gr fico
LINE_LEN = 80 ;Definicin de longitud de lnea gr fica
;contiene 80 Bytes por lnea
BITMASK_REG = 8 ;Registro de m scara de Bit
MODE_REG = 5 ;Registro de modo
FUNCSEL_REG = 3 ;Registro de eleccin de funcin
MAPSEL_REG = 4 ;Registro de eleccin de mapeo
ENABLE_REG = 1 ;Registro de activacin Set/Reset
SETRES_REG = 0 ;Registro Set/Reset
GRAPH_CONT = 3CEh ;Direccin del puerto del controlador gr fico
OP_MODE = 0 ;Modos de operacin:
; 00h = Reemplazar
; 08h = Combinacin AND
; 10h = Combinacin OR
; 18h = Combinacin XOR

GR_640_480 = 12h ;Cdigo BIOS para modo gr fico de 640*480
;puntos con 16 colores
TX_80_25 = 03h ;Cdigo BIOS para modo texto
;de 80*25 caracteres

; Pila

Pila segment para stack ;Definicin del segmento de la pila

dw 256 dup (?) ;la pila abarca 256 palabras

Pila ends ;Fin del segmento de la pila

; Datos

data segment para 'DATA' ;Definicin del segmento de datos

; Datos para el programa VGA

initm db 13,10
db 13,10,13,10
db "El programa VGA es ejecutable slo con una ",13,10
db "tarjeta VGA y un monitor de alta resolucin. Si su",13,10
db "ordenador no cuenta con estos componentes, entonces",13,10
db "pulse <S>, para detener el programa.",13,10
db "De lo contrario pulse cualquier tecla,",13,10
db "para iniciar el programa",13,10,"$"

data ends ;Fin del segmento de datos

; Cdigo

code segment para 'CODE' ;Definicin del segmento de cdigo

assume cs:code, ds:data, es:data, ss:Pila

; El programa VGA

demo proc far

mov ax,data ;Cargar la direccin del segmento de datos
mov ds,ax ;y almacenar el valor en DS
mov es,ax ;igualmente almacenarlo en ES

;Mostrar mensaje de inicializacin y esperar una respuesta

mov ah,9 ;Mostrar el nmero de funcin para String
mov dx,offset initm ;Direccin del mensaje
int 21h ;Llamar a la interrupcin DOS

xor ah,ah ;Cargar nmero de funcin para tecla
int 16h ;Llamar a la interrupcin BIOS de teclado
cmp al,"s" ;Pregunta si la tecla <s> fue pulsada
je final ;En caso que SI, el programa finaliza
cmp al,"S" ;Pregunta si la tecla <S> fue pulsada
jne startdemo ;En caso que NO, el programa comienza

final: mov ax,4C00h ;Nmero de funcin para terminar el programa
int 21h ;Llamar a la interrupcin DOS 21(h)

;el modo gr fico es inicializado

startdemo label near

mov ax,GR_640_480 ;Inicializar modo gr fico 640*480 puntos
int 10h ;con 16 colores

mov ch,000100010b ;Color: Verde
mov ax,480 ;Nmero de lneas gr ficas: 480
call fillscr ;Colorear pantalla

; aparecen sobre la pantalla dos cuadrados, hasta que
; cualquier tecla sea pulsada. Apenas pulse Vd. cualquier
; tecla, el programa ser finalizado.

xor ch,ch ;Poner color a 0
d1: mov ax,100 ;lnea de inicio del primer cuadrado

inc ch ;incrementar color
and ch,15 ;filtrar los Bits 4 al 7

d2: mov bx,150 ;Columna de inicio del primer cuadrado
d3: call setpix ;Situar punto
push cx ;Salvar color
call getpix ;Cargar color del punto
;Para causar un mejor efecto el
inc ch ;color del segundo cuadrado es
inc ch ;incrementado en 2
and ch,15 ;y los Bits 4 a 7 filtrados
push ax ;Salvar las coordenadas en la pila
push bx
add bx,100 ;calcular la posicin del segundo
add ax,140 ;cuadrado
call setpix ;Situar punto (copia)
pop bx ;Cargar las coordenadas del primer
pop ax ;cuadrado desde la pila
pop cx ;tambin cargar el color
inc bx ;incrementar la pila
cmp bx,400 ;alcanzada la ltima columna?
jne d3 ;NO --> situar siguiente punto

inc ax ;SI, incrementar lnea
cmp ax,300 ;alcanzada la ltima lnea?
jne d2 ;NO --> trabajar la siguiente lnea

mov ah,1 ;Pregunta al teclado
int 16h ;Llamar a la interrupcin BIOS de teclado
je d1 ;en caso que ninguna tecla fue pulsada,
;el programa continua

mov ax,TX_80_25 ;Modo texto 80*25
int 10h ;inicializado
jmp short final ;Finalizar el programa

demo endp

; Funciones del programa VGA

; PIXPTR: calcula la direccin de un punto de la pantalla dentro de la RAM
; de vdeo, para el nuevo modo gr fico de la tarjeta VGA
; Entrada : AX = lnea gr fica
; BX = Columna gr fica
; Salida : ES:BX = Puntero al Byte en la RAM de vdeo con el punto de pantalla
; CL = Nmero de desplazamientos a derecha sobre el Byte
; = Nmero de desplazamientos sobre el Byte en ES:BX para
; que el punto de pantalla sea aislado
; AH = m scara Bit para filtrar a todos los dem s Pixels
; Registros: ES, AX, BX y CL son utilizados

pixptr proc near
push dx ;salvar DX en la pila
mov cl,bl ;Tomar el Byte bajo de la columna gr fica
mov dx,LINE_LEN ;Nmero de Bytes por lnea a DX
mul dx ;AX = lnea gr fica * LINE_LEN
shr bx,1 ;Desplazar columna gr fica tres veces a
shr bx,1 ;la derecha y con ello dividir entre 8
shr bx,1
add bx,ax ;Sumar el desplazamiento de lnea

mov ax,VIO_SEG ;Cargar direccin de segmento del RAM de
mov es,ax ;vdeo en ES
and cl,7 ;Filtrar Bits 4 a 7 de la col. gr fica
xor cl,7 ;voltear los Bits 0 a 3, que es igual
;a la resta de 7 - CL
mov ah,1 ;Despus del desplazamiento dejar slo
;el Bit 0

pop dx ;Cargar DX nuevamente de la pila
ret ;retornar
pixptr endp

; SETPIX: Situa un punto gr fico dentro del nuevo modo gr fico
; de la tarjeta VGA
; Entrada : AX = lnea gr fica
; BX = Columna gr fica
; CH = Color del punto
; Salida : ninguna
; Registros: ES, DX y CL son utilizados

setpix proc near

push ax ;salvar las coordenadas en la
push bx ;pila

call pixptr ;Calcular el puntero hacia el Pixel

mov dx,GRAPH_CONT ;Cargar direccin del puerto del cont. Graf.

;-- situar la posicin Bit en el registro de m scara de Bit ------

shl ah,cl ;M scara para el Bit a modificar
mov al,BITMASK_REG ;Referenciar registro de m scara de Bit
out dx,ax ;escribir en el registro

;-- Poner en modo Read 0 y en modo Write 2 ----------------------

mov ax,MODE_REG + (2 shl 8) ;Escribir nmero de registro y valor
out dx,ax ;de modo en el registro
;-- Definir el modo de combinacin entre el contenido anterior ---
;-- de los Latches y el Byte de la UCP -----

mov ax,FUNCSEL_REG + (OP_MODE shl 8) ;Escribir el nmero de reg.
out dx,ax ;y combinacin en el registro

; situar puntos

mov al,es:[bx] ;cargar los Latches
mov es:[bx],ch ;poner el color en los Bit Planes

; Poner los registros modificados nuevamente en su estado
; est ndar (default) (estado de la BIOS)

mov ax,BITMASK_REG + (0FFh shl 8) ;poner m scara Bit antigua
out dx,ax ;escribir en el registro
mov ax,MODE_REG ;Escribir valor antiguo para el registro de
out dx,ax ;modo en el registro
mov ah,FUNCSEL_REG ;Escribir valor antiguo para el registro de
out dx,ax ;seleccin de funcin en el registro

pop bx ;Cargar coordenadas de la pila
pop ax ;Cargar coordenadas de la pila
ret ;Retorno

setpix endp

; GETPIX: Carga el color de un punto de la pantalla dentro de uno de
; los nuevos modos gr ficos de la tarjeta VGA
; en la entrada recibe AX el valor para la lnea gr fica
; en la entrada recibe BX el valor para la columna gr fica
; en la salida CH corresponde al color del punto gr fico
; los registros ES, DX , CX y DI son modificados

getpix proc near

push ax ;Salvar coordenadas en
push bx ;la pila

call pixptr ;C lculo del puntero hacia el punto
mov ch,ah ;m scara Bit es desplazada hacia CH
shl ch,cl ;m scara Bit es desplazada a la pos. Bit

mov di,bx ;El Offset en RAM vdeo es puesto en SI
xor bl,bl ;El valor del color es formado en BL

mov dx,GRAPH_CONT ;Cargar direccin del puerto del cont. Graf.
mov ax,MAPSEL_REG + (3 shl 8) ;Acceso al Bit Plane #3

;-- ejecutar los 4 Bit Planes uno por uno ---------------------
gp1: out dx,ax ;Activar slo Bit Plane #AH
mov bh,es:[di] ;Cargar Byte desde Bit Plane
and bh,ch ;filtrar los Bits sin inters
neg bh ;Bit 7 ser 1, cuando el punto sea situado
rol bx,1 ;Desplazar Bit 7 de BH a Bit 1 de BL

dec ah ;Decrementar nmero del Bit Plane
jge gp1 ;an no -1 --> siguiente Bit Plane

;-- El registro Map Select no necesita ser borrado, --
;-- puesto que las BIOS VGA suponen aqu el valor 0 --

mov ch,bl ;El valor del color es cargado en CH
pop bx ;Cargar las coordenadas
pop ax ;de la pila
ret ;Retorno
getpix endp
; FILLSCR: Todos los puntos de pantalla reciben un tono de color
; Entrada: AX recibe el valor para el nmero de lneas gr ficas sobre pantalla
; CH recibe le valor, el cual define el color de los puntos
; Salida: Ninguna
; Registros: ES, AX, CX, DI, DX y BL son modificados

fillscr proc near

mov dx,GRAPH_CONT ;Cargar direccin del puerto del cont. Graf.
mov al,SETRES_REG ;Nmero de los registros Set/Reset
mov ah,ch ;AH y CH es desplazado hacia AL
out dx,ax ;Los valores son escritos en el registro

mov ax,ENABLE_REG + (0Fh shl 8) ;0Fh en el registro de activacin
out dx,ax ;Los valores son escritos en el registro

mov bx,LINE_LEN / 2 ;Longitud de una lnea gr fica / 2 hacia BX
mul bx ;multipl. con el nmero de lneas gr ficas
mov cx,ax ;como contador de repeticin hacia CX
xor di,di ;direccionar primer Byte en la VRAM
mov ax,VIO_SEG ;Cargar direccin de segmento de la RAM
mov es,ax ;de vdeo en ES
cld ;En instrucciones String contar para arriba
rep stosw ;Llenar la RAM de vdeo

;-- El contenido antiguo del registro de activacin
;-- del registro Set/Reset es nuevamente escrito

mov dx,GRAPH_CONT ;Cargar direccin del puerto del cont. Graf.
mov ax,ENABLE_REG ;Escribir el valor 00h en el registro
out dx,ax ;de activacin Set/Reset
ret ;Retorno
fillscr endp
; Fin

code ends ;Fin del segmento de cdigo
end demo ;Comenzar con la ejecucin del programa




;*--------------------------------------------------------------------*;
;* T S R R E L O J *;
;* *;
;* La hora actual es presentada en la parte *;
;* superior derecha de la pantalla *;
;* *;
;* La compilacin se realiz con TASM TSRRELOJ; *;
;* El LINK realizado bajo TSRRELOJ; una conversin de *;
;* TSRRELOJ.EXE en TSRRELOJ.COM realizada con EXE2BIN TSRRELOJ *;
;* *;
;* El programa es llamado con TSRRELOJ *;
;*--------------------------------------------------------------------*;

; Constantes

COLUMNAHORA = 36 ;nmero de lnea y columna en las que
FILAHORA = 0 ;aparece la hora en la pantalla
HORAINT = 6 ;despus de cuantos 1/18 S. se muestra la H.
COLORHORA = 07h ;la presentacin de la hora es invertida

; El programa

code segment para 'CODE' ;definicin del segmento CODE

org 100h

assume cs:code, ds:code, es:code, ss:code

start: jmp perminit ;llamado de la rutina de inicializacin

; Datos (permanecen el la memoria)

anterint equ this dword ;cambio vector de interrupcin 1Ch
intaltofs dw (?) ;dir. Offset de vector de interrupcin 1Ch
intaltseg dw (?) ;dir. segmento de vector de int. 1Ch

hora equ this byte ;la hora actual es cargada
horadece db (?) ;decena de hora como ASCII
horauni db (?) ;unidad de hora como ASCII
db ":"
minudec db (?) ;decena de minuto como ASCII
minuuni db (?) ;unidad de minuto como ASCII
db ":"
segdece db (?) ;decena de segundo como ASCII
seguni db (?) ;unidad de segundo como ASCII

tconta db 18 ;en cada llamado de timer sucede un decremento
intconta db HORAINT ;el contador para el reloj es mostrado
conta1 db 5 ;contador 1 es corregido
conta2 db 31 ;contador 2 es corregido


; La nueva interrupcin de teclado permanece en memoria

newint proc far

jmp short newtimer

db "JS" ;el programa es identificado

newtimer: push ax ;todos los registros que se modifican
push bx ;son llevados a la pila
push cx
push dx
push di
push si
push es
push ds

push cs ;CS es llevado a la pila
pop ds ;y traido como DS de la pila


dec intconta ;decrementar contador para la representacin
jne noint ;el contador an no est en cero

mov intconta,HORAINT ;el contador es puesto a su valor
;inicial

noint: dec tconta ; se cont ya hasta 18 ?
je nextseg ;SI, entonces ya pas un segundo
cmp intconta,255 ;no se debe mostrar ahora la hora ?
jne st1 ;NO --> mostrar
jmp volver ;SI --> retorno

nextseg: mov tconta,18 ;cargar contador nuevamente
dec conta1 ;fue el contador 1 decrementado ya 5 veces ?
jne settime ;NO, entonces se incrementa el tiempo ASCII
mov conta1,5 ;SI, poner contador nuevamente a 5
inc tconta ;incrementar contador
dec conta2 ;fue el contador 2 decrementado ya 31 veces ?
jne settime ;NO, entonces se incrementa el tiempo ASCII
mov conta2,31 ;Si, poner contador nuevamente a 31
inc tconta ;incrementar contador

settime: inc seguni ;incrementar unidad de segundo (ASCII)
cmp seguni,":" ;es ya la unidad de segundo 10 ?
st1: jne mostrar ;NO, entonces se muestra la hora
mov seguni,"0" ;poner unidad de segundo a cero
inc segdece ;incrementar decena de segundo (ASCII)
cmp segdece,"6" ;es ya la decena de segundo 6 (60 segundos)?
jne mostrar ;NO, entonces se muestra la hora
mov segdece,"0" ;poner decena de segundo a cero
inc minuuni ;incrementar la unidad de minuto (ASCII)
cmp minuuni,":" ;es ya la unidad de minuto 10?
jne mostrar ;NO, entonces se muestra la hora
mov minuuni,"0" ;poner unidad de minuto a cero
inc minudec ;incrementar decena de minuto (ASCII)
cmp minudec,"6" ;es ya la decena de minuto 6 (60 Minute)
jne mostrar ;NO, entonces se muestra la hora
mov minudec,"0" ;poner decena de minuto a cero
inc horauni ;incrementar unidad de hora (ASCII)
cmp horauni,":" ;es ya la unidad de hora 10?
jne test24 ;NO, entonces se prueba con 24 horas
mov horauni,"0" ;SI, entonces poner la unidad de hora a cero
inc horadece ;incrementar decena de hora (ASCII)
jmp short mostrar

test24: cmp horauni,"4" ;es ya la unidad de hora 4?
jne mostrar ;NO, entonces se muestra la hora
cmp horadece,"2" ;SI, entonces es la decena de hora = 2?
jne mostrar ;NO, entonces se muestra la hora
mov horadece,"0" ;ha comenzado un nuevo da
mov horauni,"0"

mostrar: mov ah,15 ;leer p gina de pantalla en curso
int 10h ;llamar a interrupcin de video BIOS
mov ah,3 ;leer posicin actual de cursor
int 10h ;llamar a interrupcin de video BIOS
push dx ;llevar a la pila

mov si,offset hora ;dir. Offset del String de hora
mov cx,1 ;escribir cada car cter una vez
mov dx,FILAHORA shl 8 + COLUMNAHORA ;pos. de cursor para la hora
mov bl,COLORHORA ;color el reloj
mov di,8 ;8 caracteres son enviados
pritime: mov ah,2 ;poner posicin de cursor
int 10h ;llamar a interrupcin de video BIOS
mov dh,FILAHORA shl 8 ;repetir lnea
inc dl ;incrementar columna para prximo car cter
mov ah,9 ;enviar un car cter
lodsb ;traer un car cter del String
int 10h ;llamar a interrupcin de video BIOS
dec di ;todos los caracteres trabajados?
jne pritime ;NO, entonces el prximo car cter es enviado

pop dx ;traer posicin antigua de cursor
mov ah,2 ;y ponerla nuevamente
int 10h ;llamar a interrupcin de video BIOS

volver: pop ds ;traer a todos los registros salvados
pop es ;de la pila
pop si
pop di
pop dx
pop cx
pop bx
pop ax
jmp cs:[anterint] ;saltar a la antigua interrupcin de timer

newint endp

instend equ this byte ;en tanto que TSRRELOJ est instalado, la
;memoria puede ser liberada nuevamente a
;partir de aqu

; Los datos pueden ser sustituidos por DOS

installm db 13,10," TSRRELOJ",13,10
db " est instalado y puede ser desactivado",13,10
db " por medio de una segunda ejecucin de TSRRELOJ",13,10,"$"

desinsta db "TSRRELOJ est desactivado",13,10,"$"

; EL programa puede ser sustituido por DOS

; Rutina de comienzo e inicializacin

perminit proc near

mov ax,351Ch ;traer contenido del vector de int. 1C
int 21h ;llamar funcin DOS
cmp word ptr es:[bx+2],"SJ" ;probar si PERMUHR
jne install ;an no est instalado --> instalarlo
; desactivar TSRRELOJ

mov dx,es:intaltofs ;dir. Offset de la interrupcin 1Ch
mov ax,es:intaltseg ;dir. de segmento de la interrupcin 1Ch
mov ds,ax ;hacia DS
mov ax,251Ch ;retornar contenido del vector de interrupcin
int 21h ;1Ch hacia la rutina antigua

mov bx,es ;guardar la dir. de segmento del programa
mov es,es:[2Ch] ;traer dir de seg. del entorno del PSP
mov ah,49h ;liberar nuevamente la memoria del
int 21h ;entorno antiguo

mov es,bx ;liberar nuevamente la memoria del
mov ah,49h ;antiguo TSRRELOJ por medio de la
int 21h ;funcin DOS 49h

push cs ;almacenar CS en la pila
pop ds ;traerlo como DS

mov dx,offset desinsta ;mensaje: Programa desactivado
mov ah,9 ;enviar nr. de funcin para String
int 21h ;llamar funcin DOS

mov ax,4C00h ;cdigo para programa ejecutado correctamente
int 21h ;terminar programa con cdigo fin

; Instalar TSRRELOJ

install: mov intaltseg,es ;guardar dir. de segmento y Offset del
mov intaltofs,bx ;vector de interrupcin 1Ch

mov ah,02Ch ;nr. de funcin para leer hora
int 021h ;llamar interrupcin DOS 21h
mov al,cl ;transferir minuto hacia AL
mov di,offset minudec ;resultado ASCII hacia minudec
call binascii ;convertir a 2 cifras ASCII
mov al,ch ;transferir hora hacia AL
mov di,offset horadece ;resultado ASCII hacia horadece
call binascii ;convertir a 2 cifras ASCII
mov al,dh ;transferir segundo hacia AL
mov di,offset segdece ;resultado ASCII hacia segdece
call binascii ;convertir a 2 cifras ASCII

mov dx,offset newint ;dir. Offset de nueva rutina de interrupcin
mov ax,251Ch ;cambiar contenido del vector de interrupcin
int 21h ;1C hacia la propia rutina

mov dx,offset installm ;mensaje: programa instalado
mov ah,9 ;enviar nr. de funcin para String
int 21h ;llamar funcin DOS

; La nueva rutina de interrupcin PSP y sus
; datos correspondientes deben permanecer residentes.

mov dx,offset instend ;calcular nmero de los parr fos
mov cl,4 ;(cada uno de 16 Bytes) de los cuales
shr dx,cl ;el programa debe disponer
inc dx
mov ax,3100h ;terminar programa con cdigo fin 0 (ok)
int 21h ;pero permanecer residente

perminit endp

; BINASCII : Transforma valor binario en 2 cifras ASCII
; Entrada : AL = el valor binario, que debe ser transformado
; DI = la dir. Offset para las 2 cifras ASCII
; Salida : ninguna
; Registros : AX, CL y FLAGS son modificados

binascii proc near

xor ah,ah ;Byte HI para divisin = 0
mov cl,10 ;trabajamos en el sistema 10
div cl ;dividir valor entre 10
or ax,03030H ;transformar resultado en ASCII
mov [di],ax ;y almacenarlo
ret ;retorno

binascii endp

; Fin

code ends ;fin del segmento CODE
end start

También podría gustarte