; (C)opyright Erdogan Tan - 30 April 2000 (4)
;
; INT1CS.ASM (Standalone version of INT1C.ASM.)
;
; Handles INT 1Ch for showing current date and time.
; This is INT 1Ch handling type version of CDT.ASM or DATETIME.ASM.
;
; Program uses INT 15h Function 85h, SysReq key handler
; for checking stop/exit request. (Alt+SysRq keystrokes.)
;
; After performing SysReq procedure, program restores
; original INT 1Ch and INT 15h vectors.
;
; ROM-BIOS functions are derived from American Megatrend Inc.'s
; AMIBIOS Programming Guide (1993).
PAGE 60,132
;ÄÄÄÄÄÄÄÄÄÄ CODE_SEG_1 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
CODE_SEG_1 segment para public
assume CS:CODE_SEG_1, DS:CODE_SEG_1, SS:CODE_SEG_1, ES:CODE_SEG_1
org 100h
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
;±
;± ENTRY POINT
;±
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
;±
;± PROCEDURE proc_start
;±
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
proc_start proc near
start: ; N-Ref=0
jmp load
Magic_Word: dw 0
var_INT15h_off: dw 0
var_INT15h_seg: dw 0
var_INT1Ch_off: dw 0
var_INT1Ch_seg: dw 0
proc_start endp
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
;±
;± PROCEDURE proc_handler
;±
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
proc_handler proc near
INT1Ch_handler:
pushf
call dword ptr CS:var_INT1Ch_off
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
push cs
pop ds
mov ah, 03h
mov bx, 07h
int 10h ; Return Cursor Position
mov word ptr [CursorPos], dx
mov ah, 04h
int 1Ah
mov al, ch
call proc_hex
mov word ptr [Century], ax
mov al, cl
call proc_hex
mov word ptr [Year], ax
mov al, dh
call proc_hex
mov word ptr [Month], ax
mov al, dl
call proc_hex
mov word ptr [Day], ax
mov ah, 02h
int 1Ah
mov al, ch
call proc_hex
mov word ptr [Hour], ax
mov al, cl
call proc_hex
mov word ptr [Minute], ax
mov al, dh
call proc_hex
mov word ptr [Second], ax
mov dx, 30h
mov ah, 02h
mov bx, 07h
int 10h ; Set Cursor Position
mov si, offset Msg_Date
call proc_printmsg
return_from_INT1Ch:
mov dx, word ptr [CursorPos]
mov ah, 02h
mov bx, 07h
int 10h ; Set Cursor Position
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
IRET
SYSREQ_handler:
push ax
pushf
call dword ptr CS:var_INT15h_off
pop ax
push ax
push si
push di
push ds
push es
push cs
pop ds
cmp ah, 85h
jnz short return_from_INT15h
xor ax, ax
mov es, ax
mov di, 70h
mov si, offset var_INT1Ch_off
movsw
movsw
mov di, 54h
mov si, offset var_INT15h_off
movsw
movsw
Return_from_INT15h:
pop es
pop ds
pop di
pop si
pop ax
IRET
proc_handler endp
proc_printmsg proc near
loc_print:
lodsb ; Load byte at DS:SI to AL
and AL,AL
je short end_of_print ; If AL = 00h then return
mov AH,0Eh
mov BX,07h
int 10h ; BIOS Service func ( ah ) = 0Eh
; Write char as TTY
;AL-char BH-page BL-color
jmp short loc_print
end_of_print:
retn
proc_printmsg endp
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';
; From binary (byte) to hexadecimal (character) converter ;
; ;
; input -> AL = byte (binary number) to be converted ;
; output -> AH = First character of hexadecimal number ;
; output -> AL = Second character of hexadecimal number ;
; ;
; (c) Erdogan TAN 1998 - 1999 ;
;............................................................;
; 1998
proc_hex proc near
db 0D4h,10h ; Undocumented inst. AAM
; AH = AL / 10h
; AL = AL MOD 10h
or AX,'00' ; Make it ZERO (ASCII) based
xchg AH,AL
; 1999
cmp AL,'9'
jna pass_cc_al
add AL,7
pass_cc_al:
cmp AH,'9'
jna pass_cc_ah
add AH,7
pass_cc_ah:
; 1998
retn
proc_hex endp
Msg_Copyrights:
db 0Dh, 0Ah
db "INT 1Ah FUNCTION 04h DATE AND 02h TIME OUTPUTS"
db 0Dh, 0Ah
db "via INT 1Ch Periodic Timer Interrupt"
db 0Dh, 0Ah
db "and INT 15h FUNCTION 85h SysReq Key Handler"
db 0Dh, 0Ah
db 0Dh, 0Ah
db "(c) Erdogan Tan [ 2000 ]"
db 0Dh, 0Ah
db 0Dh, 0Ah
db "Press Alt+SysRq keys when you want to exit."
db 0Dh, 0Ah
db 0Dh, 0Ah, 0
Msg_Date: db "Date: "
Day: db '0'
db '0'
db '/'
Month: db '0'
db '0'
db '/'
Century: db '0'
db '0'
Year: db '0'
db '0'
db 20h
db 20h
db 'Time: '
Hour: db '0'
db '0'
db ':'
Minute: db '0'
db '0'
db ':'
Second: db '0'
db '0'
db 0Dh, 0Ah
db 0Dh, 0Ah
db 0
CursorTyp: dw 0
CursorPos: dw 0
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
;±
;± PROCEDURE proc_load
;±
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
proc_load proc near
load:
xor BX,BX
mov ES,BX
mov SI,70h
mov AX, offset INT1Ch_handler
mov DX, Word ptr ES:[SI]
cmp AX,DX
jnz short pass_INT1Ch_magicword_ctrl
mov BX, AX
sub BX, 10
cmp word ptr [BX], 417
jz short loc_return
pass_INT1Ch_magicword_ctrl:
mov word ptr ES:[SI],AX
mov Word Ptr [var_INT1Ch_off],DX
mov DX, Word ptr ES:[SI]+2
mov Word Ptr [var_INT1Ch_seg],DX
mov DX,DS
mov word ptr ES:[SI]+2,DX
mov word ptr [Magic_Word], 417
mov SI, 54h
mov AX, word ptr ES:[SI]
mov word ptr [var_INT15h_off],AX
mov AX, word ptr ES:[SI]+2
mov word ptr [var_INT15h_seg],AX
mov AX, offset SYSREQ_handler
mov word ptr ES:[SI],AX
mov word ptr ES:[SI]+2,DX
mov si, offset Msg_Copyrights
call proc_printmsg
loc_return:
int 20h
proc_load endp
CODE_SEG_1 ends
end start