
;------------------------------------------------
; Модуль перехватчика прерывания INT 10
; к модулю FontTxt  V 1.0
;------------------------------------------------
; Язык программирования :
; Macro Assembler V 5.1
;------------------------------------------------
; Дата последних изменений
; 30.09.1992
;------------------------------------------------
; (c) 1992, Мигач Ярослав
;------------------------------------------------

EXTRN   RELOAD : FAR   ; Подрограмма перезагрузки шрифта

DATA    SEGMENT PUBLIC

        ASSUME DS : DATA

EXTRN   INT10 : DWORD  ; Сохраненное значение базового
                       ; вектора прерывания INT 10

DATA    ENDS

CODE    SEGMENT PUBLIC

        ASSUME  CS : CODE

SAVEDS    DW      ?    ; Значение сегмента DS устанавливаемое
                       ; подпрограммой инициализации

COUNT     DB      ?    ; Значение счетчика санкционированного
                       ; доступа

        PUBLIC  ANALIZ
        PUBLIC  InitDs

;---------------------------------------------------------
; Процедура перехвата вектора INT 10
;---------------------------------------------------------
; При нулевом значении COUNT и ( AH = 0 )
; AND ( NOT ( AL IN [ 0, 1, 2, 3 ] ) ) вызывает
; процедуру вывода сообщения и снятия задачи
; При ненулевом значении COUNT и ( AH = 0 )
; AND ( NOT ( AL IN [ 0, 1, 2, 3 ] ) ) уменьшает
; значение COUNT и вызывает базовый обработчик
; При AH = 0EEh воспринимает AL как новое значение
; счетчика COUNT
; При других значениях регистров, просто вызывает
; базовый обработчик
;---------------------------------------------------------

ANALIZ  PROC    FAR

        ; Устанавливаем необходимое значение DS

        PUSH    DS
        PUSH    AX
        MOV     AX, SAVEDS
        MOV     DS, AX
        POP     AX

        PUSHF

        ; Анализируем установку счетчика
        ; санкционированного достыпа

GOCHECK :

        ; Для всех значений AH <> 0
        ; вызываем
        ; базовый обработчик

        CMP     AH, 0
        JNZ     LBL1
        CMP     AL, 2
        JZ      GOFN
        CMP     AL, 3
        JNZ     LBL1

GOFN :

        ; Иначе вызываем обработчик и
        ; перезагрузку шрифта

        CALL    INT10
        CALL    RELOAD

        POP     DS
        IRET

        ; Устанавливаем стек и вызываем
        ; базовый обработчик

LBL1 :  POPF
        PUSHF

        CALL    INT10

        POP     DS
        IRET

ANALIZ  ENDP

        ; Начальная инициализация сегмета DS
        ; и счетчика санкционированного доступа

INITDS  PROC    NEAR

        PUSH    AX
        MOV     AX, DS
        MOV     SAVEDS, AX

        MOV     AL, 0
        MOV     COUNT, AL

        POP     AX
        RET

INITDS  ENDP

CODE    ENDS

        END
