;------------------------------------------------------------------------- 
;  коррекции: 
;    12.02.89  - BEEP оформлена стандартной подпрограммой 
;------------------------------------------------------------------------- 
 
 
;----------------- П/П звукового сигнала 
;       (BL) - длительность в квантах (квант - ? мс ) 
;       (BH) - управление тоном 
 
BEEP    PROC    NEAR 
        PUSH    AX 
        PUSH    CX 
        MOV     AL,10110110B         ;Выбрать TIM 2,LSB,MSB,BINARY 
        OUT     TIMER+3,AL           ;Записать регистр режимов таймера 
        MOV     AL,33H             ;Управление тоном звука 
        OUT     TIMER+2,AL           ;Записать счетчик таймера 2 
        MOV     AL,BH             ;управление тоном звука 
        OUT     TIMER+2,AL           ;Записать счетчик таймера 2 
        IN      AL,PORT_B            ;Получить текущее состояние порта 
        PUSH    AX                   ;Сохранение значения порта 
        OR      AL,03                ;Включить звук 
        OUT     PORT_B,AL 
        MOV     CX,100H              ;Установить счетчик ожидания 500/64 мс 
G7:     LOOP    G7                   ;Задержка перед включением 
        DEC     BL                   ;Задержка счетчика закончена? 
        JNZ     G7                   ;НЕТ - продолжение подачи сигнала 
        POP     AX                   ;Восстановить значение порта 
        OUT     PORT_B,AL 
        POP     CX 
        POP     AX 
        RET                          ;Возврат к программе 
BEEP    ENDP 
 
;------------------------------------------------------------------------ 
; Эта подпрограмма выводит звуковой сигнал ошибки начального тестирования 
;      (DX) - количество писков 
;------------------------------------------------------------------------ 
BEEP_ERROR    PROC   NEAR 
        PUSH     CX 
        PUSH     BX 
B_ERR_0: 
        MOV      BX,0203H 
        CALL     BEEP 
        MOV      CX,0FFFFH 
B_ERR_1: 
        NOP 
        LOOP     B_ERR_1 
        DEC      DX 
        JNZ      B_ERR_0 
        POP      BX 
        POP      CX 
        RET 
BEEP_ERROR    ENDP 
 
 
;------------------------------------------------------------------------ 
;       Эта подпрограмма печатает сообщения на экране. 
; Входные условия: 
;       SI=смещение (адрес) буфера сообщения 
;       CX=счетчик байтов сообщения 
;       Максимальный размер передаваемого сообщения - 36 символов 
;-------------------------------------------------------------------------- 
P_MSG   PROC    NEAR 
        MOV     AL,CS:[SI]           ;Заслать символ в AL 
        INC     SI                   ;Указатель следующего символа 
        MOV     BH,0                 ;Установить страницу =0 
        MOV     AH,14                ;Записать символ 
        INT     10H                  ;Вызов VIDEO_IO 
        LOOP    P_MSG                ;Продолжать до конца сообщения 
        RET 
P_MSG   ENDP 
 
;--------------------------------------------------------------------- 
; Эта процедура производит подсчет контрольной суммы области памяти 
;     DS:BX - начало области памяти 
;     CX    - размер 
; Если контрольная сумма совпала, то устанавливается флаг Z 
;--------------------------------------------------------------------- 
ROS_CHECKSUM   PROC  NEAR 
        XOR     AL,AL 
ROS0:   ADD     AL,DS:[BX] 
        INC     BX 
        LOOP    ROS0 
        OR      AL,AL 
        RET 
ROS_CHECKSUM   ENDP 
 
;------------------------------------------------------------------- 
; Эта процедура производит начальную инициализацию программы в ПЗУ 
;      DS 
;------------------------------------------------------------------- 
ROM_INIT       PROC  NEAR 
        SUB      AH,AH 
        MOV      AL,[BX+2]    ; В рег. (AX) - длина ПЗУ в 512б блоках 
        MOV      CL,9 
        SHL      AX,CL        ; Умножить (AX) на 512 
        PUSH     AX           ; Сохранить (AX) 
        MOV      CL,4 
        SHR      AX,CL        ; Разделить (AX) на 16 
        ADD      DX,AX 
        POP      CX           ; (CX) - размер ПЗУ 
        CALL     ROS_CHECKSUM 
        JZ       ROM_I_0 
        PUSH     DX 
        MOV      DX,2 
        CALL     BEEP_ERROR 
        POP      DX 
        JMP      ROM_I_RET 
ROM_I_0: 
        PUSH     DX 
        PUSH     CS 
        LEA      AX,CS:ROM_I_1 
        PUSH     AX 
        PUSH     DS 
        MOV      AX,3 
        PUSH     AX 
        DB       0CBH        ;(RETF) 
ROM_I_1: 
        POP      DX 
        SUB      DX,20H 
ROM_I_RET: 
        RET 
ROM_INIT      ENDP 
 
 
 
;        ORG     0FF54H 
 
