RESPUESTA A LA PREGUNTA 29903 DE C/VISUAL C ;========================================+ ;RELOJ.COM Ricardo Ortega || ;Instala un reloj residente || ;========================================+ LOW_BIOS_SEG EQU 0040H CRT_MODE EQU 0449H TIMER_LOW EQU 046CH TIMER_HIGH EQU 046EH TIMER_OFL EQU 0470H COLOR EQU 120 TIMECOL EQU 0096h Code Segment Para Public 'Code' Assume CS:Code,DS:Code Org 100h Start: jmp Install CColor DB 78 VColor DB 120 Full_Clock DB 0 Time_Str DB 'H', COLOR, 'o', COLOR, 'r', COLOR, 'a', COLOR DB ':', COLOR, ' ', COLOR, ' ', COLOR Ram_Vid_Seg DW 0b000h Alarm_Flag DW 0 Old_Bios_Int DW 0, 0 Old_HHS DW 0 Alarm_Count DW 0 Cur_Timer_High DW 0 DB 0 Cur_Crt_Mode DW 0 Clock_Flag DW 18 NewInt1c: sti pushf dec cs:Clock_Flag jz do_int cmp cs:Alarm_Flag, 1 jz do_int jmp do_old_int1c do_int: mov cs:Clock_Flag, 18 push ax push es push ds push cx push dx push si push di xor ax, ax mov es, ax mov ax, es:[CRT_MODE] mov cs:[Cur_Crt_Mode], ax mov ax, es:[TIMER_HIGH] mov cs:[Cur_Timer_High], ax cmp ax, cs:[Old_HHS] je Check_Video_Mode push cs pop ds call Hour_Alarm Check_Video_Mode: mov ax, cs:[Cur_Crt_Mode] cmp al, 04h ; Modo grafico ? jb Print_Time cmp al, 06h ; Modo grafico ? ja Print_Time jmp End_NewInt1c Print_Time: mov ax, cs:[Ram_Vid_Seg] mov es, ax push cs pop ds mov di, TIMECOL-12 mov si, offset Time_Str mov cx, 0007h cld rep movsw mov cx, cs:[Ram_Vid_Seg] mov ds, cx mov ax, cs:[Cur_Timer_High] cmp Byte Ptr cs:Full_Clock, 0 je Morning cmp ax, 12 jbe Morning sub ax, 12 Morning: cmp ax, 10 jb Print_Unit_Hour sub ax, 10 mov cl, '1' cmp ax, 10 jb Ten mov cl, '2' sub ax, 10 Ten: mov ch, cs:VColor mov ds:[TIMECOL], cx Print_Unit_Hour: add ax, '0' mov ah, cs:VColor mov word ptr ds:[TIMECOL+2], ax mov ah, cs:VColor mov al, ':' Print_Minutes: mov word ptr ds:[TIMECOL+4], ax xor ax, ax mov ds, ax mov ax, ds:[TIMER_LOW] xor dx, dx mov cx, 0450h div cx mov dh, cs:VColor mov dl, '0' Print_Secs: cmp al, 10 jb Print_Unit_Secs inc dl sub al, 10 jmp Short Print_Secs Print_Unit_Secs: mov cx, cs:[Ram_Vid_Seg] mov ds, cx mov ds:[TIMECOL+6], dx add al, '0' mov ah, cs:VColor mov ds:[TIMECOL+8], ax End_NewInt1c: pop di pop si pop dx pop cx pop ds pop es pop ax do_old_int1c: popf jmp cs:dword ptr [Old_Bios_Int] ; ========== Hour_Alarm: ; ========== cmp cs:Alarm_Count, 28 jne Alarm2 mov cs:Alarm_Flag, 0 in al, 61h ; Apaga el sonido and al, 0FCh out 61h, al mov ax, cs:[Cur_Timer_High] mov cs:[Old_HHS], ax mov cs:Alarm_Count, 0000h ret Alarm2: cmp cs:Alarm_Count, 0000h jne Alarm3 mov cs:Alarm_Flag, 1 mov al, 0B6h out 43h, al mov ax, 020Ch out 42h, al mov al, ah out 42h, al in al, 61h and al, 0FCh ; Apaga el sonido out 61h, al Alarm3: mov cs:Alarm_Flag, 1 in al, 61h mov ah, al and al, 0FCh ; Apaga el sonido xor ah, 03h and ah, 03h or al, ah out 61h, al inc cs:Alarm_Count ret Install_Msg db 'RELOJ 1.0 -- 1989. Ricardo Ortega O.$' ; db 10, 13, '$' ; ========================================= Install: ; ========================================= mov ah, 9 mov dx, offset Install_Msg int 21h xor ax, ax mov es, ax mov ax, es:[CRT_MODE] cmp al, 7 je Continue mov cs:word ptr [Ram_Vid_Seg], 0B800h mov al, CColor mov VColor, al Continue: mov al, VColor mov Time_Str+1, al mov Time_Str+3, al mov Time_Str+5, al mov Time_Str+7, al mov Time_Str+9, al mov Time_Str+11, al xor ax, ax mov es, ax mov ax, es:[TIMER_HIGH] mov cs:[Old_HHS], ax mov ax, 351Ch int 21h mov cs:[Old_Bios_Int], bx mov cs:[Old_Bios_Int+2], es mov dx, offset NewInt1c mov ax, 251Ch int 21h mov dx, offset Install_Msg int 27h Code ends End Start ; --------------------------------------------------------------------- Ricardo Ortega ricardo@ortega.as http://www.lawebdelprogramador.com