;▄▄                   ▄
;▀▀▀ STEALTH GROUP WW █ Mail:   BOX 15, 125080 MOSCOW   ████████ █████████ █▀▀█
;▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀   ┌─┐┬ ┬┌─┤┬ ┬ ╥ ┬┐┌ █▄▄█
; ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█   ▌ █ ▄▀█ █ ▄▀▀ █▄▄    ├┬┘│ │└─┐├─┤   │└┤ ▄  █
;  █ █ █ █▀  █▀  █    █  █▀  █ █   █ █ █ █ █ █   █      ┴└─└─┘└─┘┴ ┴   ┴ ┴ ▀▀▀▀
;  █ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀    ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄   ████  WINTER ' 96  ████
;  ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   ███████████████████████
;
;   █████████████ ЗВУЧАЩАЯ КЛАВИАТУРА ██████████████ 

n CAITY.COM
a
;
;
; Эта программа называется CAITY. Для компиляции используйте
; "DEBUG <CAITY.IV9" - натопчите это в коммандной строке. Таким образом,
; будет создан файл CAITY.COM в текущей директории.
; Перехватывет клавиатуру и таймер. Каждое нажатие на клавишу издает звук.
;
; Программа написана по идее моей двухлетней дочки.
;
; Written by Graeme W. McRae. My CompuServe PPN is 73307,2453.
;
; Замечание редактора: поскольку программка была снабжена жирными
; комментариями, то я не буду лишать их читателей, и перевожу это с English

mov  ax,3509   ; Сохранить адрес вектора прерывания клавиатуры
int  21
mov  [153],bx
mov  [155],es
mov  ax,2509   ; Установить свой вектор прерывания клавиатуры
mov  dx,132
int  21
;
mov  ax,3508   ; Сохранить старый вектор
int  21
mov  [177],bx
mov  [179],es
mov  ax,2508   ; Установить новый вектор
mov  dx,157
int  21
;
mov  dx,18     ; Зарезервировать 18h параграфов и остаться резидентом
mov  ax,3100
int  21
;
;
;                Обработчик прерывания клавиатуры
;
push ax
in   al,60     ; Получить скэн-код клавиши из порта 60h
test al,80     ; Игнорируем, если это код отпущенной клавиши
jnz  151
mov  al,B6     ; Подготовить к выводу счетчик для канала 2
out  43,al
in   al,60     ; Еще раз получим ту же клавишу
add  al,4      ; + 4, * 40h
mov  ah,40
mul  ah
out  42,al     ; Сначала младший, потом старший биты
mov  al,ah
out  42,al
cs:  mov  byte ptr [17B],B ;  11 тиков спикера
pop  ax
jmp  0:0       ; вернуться в оригинальный обработчик int 09
;
;
;                обработчик таймера
;
push ax
cs:  cmp  byte ptr [17B],1 ; Счетчик количества оставшихся тиков
jb   175       ; 0 = звука в данный момент нет
je   16A       ; Последний тик - выключим спикер.
in   al,61     ; Иначе оставляем спикер включенным
or   al,3
out  61,al
jmp  170
in   al,61     ; Здесь выключается спикер
and  al,FC
out  61,al
cs:  dec  byte ptr [17B]
pop  ax
jmp  0:0       ; Переход на оригинальное прерывание таймера
; e 17B 00  - обнуляем счетчик тиков
; r cx 7C  - длина CAITY.COM
; W записывает CAITY.COM в текущий директорий

e 17B 00
r cx
7C
w
q