;---INT 1A----------------------------------------------------------------- 
; TIME_OF_DAY 
;  Эта программа  выполняет установку/считывание часов 
;Вход: 
;  (AH)=0 - прочитать текущее значение часов 
;           Возвращает: CX - старшая часть счетчика 
;                       DX - младшая часть счетчика 
;                       AL=0 - если таймер не прошел 24 часа с момента 
;                              последнего считывания 
;                       AL<>0 - если на следующий день 
;  (AH)=1 - установить текущее состояние часов 
;           CX - старшая часть счетчика 
;           DX - младшая часть счетчика 
; Замечание: счет выполняется 1193180/65536 раз в секунду 
;       (или около 18.2 в сек) 
;---------------------------------------------------------------------------- 
        ASSUME  CS:CODE,DS:DATA 
TIME_OF_DAY     PROC   FAR 
        STI                          ;Разрешить прерывания 
        PUSH    DS                   ;Сохранить сегмент 
        PUSH    AX                   ;Сохранить параметр 
        MOV     AX,DATA 
        MOV     DS,AX                ;Установить адресацию значений 
        POP     AX                   ;Восстановить входной параметр 
        OR      AH,AH                ;AH=0 
        JZ      T2                   ;Чтение времени 
        DEC     AH                   ;AH=1 
        JZ      T3                   ;Установка времени 
T1:                                  ;Возврат из программы 
        STI                          ;Разрешить прерывания 
        POP     DS                   ;Восстановить сегмент 
        IRET                         ;Возврат 
T2:                                  ;Чтение времени 
        CLI                          ;Запретить прерывания во время считывания 
                                     ; таймера 
        MOV     AL,TIMER_OFL 
        MOV     TIMER_OFL,0          ;Переплнение, сбросить флаг 
        MOV     CX,TIMER_HIGH 
        MOV     DX,TIMER_LOW 
        JMP     T1                   ;Возврат 
T3:                                  ;Установка времени 
        CLI                          ;Запретить прерывания во время записи 
                                     ; таймера 
        MOV     TIMER_LOW,DX 
        MOV     TIMER_HIGH,CX        ;Установить время 
        MOV     TIMER_OFL,0          ;Сброс переполнения 
        JMP     T1                   ;Возврат 
TIME_OF_DAY     ENDP 
 
;---------------------------------------------------------------------------- 
;  Эта подпрограмма обрабатывает неиспользуемые аппаратные прерывания (A - D). 
;  Переменная INTR_FLAG будет содержать уровень аппаратного прерывания или 
; FF если прерывание не аппаратное. 
;---------------------------------------------------------------------------- 
HARD_RETURN    PROC    NEAR 
        PUSH    DS 
        PUSH    DX 
        PUSH    AX 
        MOV     AX,DATA 
        MOV     DS,AX                ; сегмент данных 
        MOV     AL,0BH               ; команда - чтение IN-SERVICE REG 
        OUT     20H,AL               ; определение уровня прерывания 
        NOP 
        IN      AL,20H               ; ввод уровня прерывания 
        MOV     AH,AL 
        OR      AL,AH                ; проверка на ноль 
                                     ; 0 - нет аппаратного прерывания 
        JNZ     HW_INT               ; если аппаратное прерывание было 
        MOV     AH,0FFH              ; признак нет прерывания 
        JMP     SHORT SET_INTR_FLAG  ; 
HW_INT: IN      AL,21H               ; ввод значения маски 
        OR      AL,AH                ; сброс бита маски 
        OUT     21H,AL 
        MOV     AL,20H               ; команда - конец прерывания 
        OUT     20H,AL 
SET_INTR_FLAG: 
        MOV     INTR_FLAG,AH         ; запись признака - номера прерывания 
        POP     AX 
        POP     DX 
        POP     DS 
DUMMY_RETURN: 
        IRET 
HARD_RETURN  ENDP 
 
 
        ORG     0FEF3H 
 
