.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