Category : Miscellaneous Language Source Code
Archive   : VDIGIT.ZIP
Filename : TSR.ASM
;* *
;* 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
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/