home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Education Master 1994 (4th Edition)
/
EDUCATIONS_MASTER_4TH_EDITION.bin
/
files
/
progmisc
/
digitol1
/
tsr.asm
< prev
next >
Wrap
Assembly Source File
|
1989-06-24
|
4KB
|
166 lines
;**************************************************************
;* *
;* Digitized Voice Programmer's Toolkit *
;* ------------------------------------ *
;* *
;* Example memory-resident program *
;* *
;* Copyright (c) 1989, Farpoint Software *
;* *
;* *
;* This program monitors the state of the left shift key *
;* bit at absolute address 417h (bit 1). Upon detecting a *
;* zero to one transition of this bit, a voice announcement *
;* is initiated in the background. *
;* *
;**************************************************************
.286
.MODEL LARGE
DOSSEG
shift_mask equ 02h
extrn PVOICE_INIT:far
extrn PVOICE_START:far
extrn PVOICE_STATUS:far
;------------------------------------------------
;declare the VDATA segment here as well as in TSRVM.ASM
; so that the pointers to the beginning and end of the
; voice data can be properly accessed
VDATA segment public 'VDATA'
extrn _EVMSG:byte
extrn _EVMSGLEN:byte
VDATA ends
;------------------------------------------------
.STACK 256
;------------------------------------------------
.DATA
count dd 0
index dd 0
pspseg dw 0
prev db 0
;------------------------------------------------
.CODE
assume ds:DGROUP
old_1C dd 0 ;this is in the code segment so
; that we can jump to the original
; user timer tick routine without
; inconvenient messing with the stack
; - - - - - - - - - - - - - - - - - - - - - - - -
;this is the user timer tick interrupt routine
shift_check proc far
push ds ;save all registers
push es
pusha
mov ax,DGROUP
mov ds,ax
mov ax,40h
mov es,ax
mov al,es:[17h] ;address at which shift state is kept
and al,shift_mask
cmp al,prev ;has the bit changed?
je shift_check_exit
mov prev,al
cmp al,shift_mask ;is it now a 1?
jne shift_check_exit
;left shift has been pressed
;are we still playing message from last press?
push ds
push offset count
push ds
push offset index
call PVOICE_STATUS
or ax,ax
jnz shift_check_exit
;trigger voice message playback
push VDATA ;block address
push offset _EVMSG
mov ax,offset _EVMSGLEN
sub ax,offset _EVMSG
push 0 ;block length
push ax
push 0 ;file read flag (MUST be zero!)
push 0 ;handle
push 0 ;data length
push ax
push 0 ;start position
push 0
call PVOICE_START ;do it
shift_check_exit:
popa ;restore all registers
pop es
pop ds
jmp old_1C ;chain to previous holder of this vector
shift_check endp
; - - - - - - - - - - - - - - - - - - - - - - - -
;Begin execution here
start: mov ax,DGROUP ;set segment registers
mov ds,ax
mov ax,es
mov pspseg,ax ;save PSP segment for later
;install voice playback routines
call PVOICE_INIT
;get the original user timer tick vector
mov ax,351Ch
int 21h
mov word ptr old_1C,bx
mov word ptr old_1C+2,es
;set the vector to point to our routine
push ds
lea dx,shift_check
mov ax,cs
mov ds,ax
mov ax,251Ch
int 21h
pop ds
;terminate and stay resident
mov dx,ss ;DOSSEG forces stack to last segment
sub dx,pspseg ;compute amout of memory this occupies
mov ax,3100h ;terminate and stay resident
int 21h
end start