Category : Communication (modem) tools and utilities
Archive   : MDMLIGHT.ZIP
Filename : MDMLIGHT.ASM

 
Output of file : MDMLIGHT.ASM contained in archive : MDMLIGHT.ZIP
;®RM132¯
;
;The following program will display in the upper right hand side of display
;the active (SPACE, CONTROL ON, POSITIVE VOLTAGE) RS232 signals. The DTE
;generated signals are displayed in red, the DCE in green, also uart errors
;are shown in white. ***** NOTE if you have a mono display change DISPLAY_ADDR
;to b005 and the attributes in the "RSDATA" section to your preference. ****
;
; DISPLAY DEFINTIONS
;TMO TIME OUT ERROR
;FRM FRAMING ERROR
;PAR PARITY ERROR
;OVR OVERRUN ERROR
;CAR Recieve Line Signal Detected --CARRIER DETECTED
;RNG RING INDICATOR
;DSR DATASET READY
;CTS CLEAR TO SEND
;DTR DATA TERMINAL READY
;RTS REQUEST TO SEND
;
;This program installs itself in memory and the display can be toggled off and
;on by depressing the ALT AND LEFT HAND SHIFT KEYS simultaeneously.
;
;The display is turned on initialy (if you dont see anything put your modem
;into analog or local loopback). Since this routine is active only about 18
;times per second it will not catch all error conditions that may occur
;during a normal communications session.
;
;
;
; **********************************************************************
;If the display is active while accessing a floppy drive(works ok on hard disk)
;it sometimes causes data errors. If so toggle the display off while accessing
;the floppy. I suspect a routine such as this screws up the dos software timing?
;If anyone has any info about this I would appreciate hearing from you.
;
;
;I would like to hear your comments and suggesstions
;
; Tim Burmeister
; (COMPUSERVE 74736,2402)
;
;
;PS Be gentle this is my first attemp at a useful assembly language program
;
;
title BREAKOUT BOX
page 65,132
;
; EQUATES
;
DISPLAY_ADDR equ 0b805H ;second half of the top line
;
; MACROS
;
ERASE MACRO ;moves spaces to the display area
.xlist
cld
mov ax,DISPLAY_ADDR
mov es,ax
mov cx,28H
mov ax,0020H
mov di,0
rep stosw
.list
endm
;
SHOW_232 MACRO LINE
.xlist
cli
push cs
pop ds
sti
mov ax,DISPLAY_ADDR
mov es,ax ;set the destination segment up
mov cx,DATAEND - DATASTART ;set the count (BYTE VALUE)
shr cx,1 ;divide count by 2 to equal number of words to move
cld ;direction flag clear so stos will increment di
mov si,offset DATASTART ;point to begining of the data
mov di,LINE*160 ;point dest to video memory
rep movsw
.list
endm
;
MOVE MACRO
LOCAL BLANK,THATSIT
.xlist
jnc blank ;if bit not set
rep movsw
jmp THATSIT
blank: push si ;save source index
mov si,offset spaces ;new source index
rep movsw
pop si ;restore si and add 8
add si,8
thatsit: mov cx,4 ;restore cx:
.list
endm
;
GET_STATUS MACRO PORT
.xlist
cli
push ds
pop es ;set es to point within dataseg(needed for the move macro)
sti
mov dx,03fdH ;the first com port to look at
in al,dx
inc dx
mov ah,al
in al,dx
mov si,offset rsdata ;point to the begining of ascii data
mov di,offset datastart ;point to where we want to build message
mov cx,4 ;all messages are 4 words
shl ax,1
move ;timeout
shl ax,1 ;ignore shift register
shl ax,1 ;ignore buffer register
shl ax,1 ;ignore break
shl ax,1
move ;framing error
shl ax,1
move ;parity error
shl ax,1
move ;overrun error
shl ax,1 ;ignore data ready
shl ax,1
move ;carrier detect
shl ax,1
move ;ring detected
shl ax,1
move ;dataset ready
shl ax,1
move ;clear to send
mov dx,03fcH ;now get rts and dtr
in al,dx ;get the bits
shr al,1 ;dtr to carry flag
move
shr al,1 ;rts to carry flag
move
.list
endm
;
NEED segment at 0
zero proc far
zero endp
NEED ends
;
cseg segment
org 100H
assume cs:cseg
assume ds:cseg
BEGIN proc near
jmp INIT
;
; DATA AREA
;
DATASTART equ $
DATA dw 40 dup(0020H)
DATAEND equ $
;
RSDATA equ $
TMO DB ' ',7,'T',7,'M',7,'O',7
FRM DB ' ',7,'F',7,'R',7,'M',7
PAR DB ' ',7,'P',7,'A',7,'R',7
OVR DB ' ',7,'O',7,'V',7,'R',7
CAR DB ' ',2,' ',2,'C',2,'D',2
RNG DB ' ',2,' ',2,'R',2,'I',2
DSR DB ' ',2,'D',2,'S',2,'R',2
CTS DB ' ',2,'C',2,'T',2,'S',2
DTR DB ' ',4,'D',4,'T',4,'R',4
RTS DB ' ',4,'R',4,'T',4,'S',4
RSDATAEND EQU $
;
SPACES DW 4 DUP(0020H)
;
DISPLAY_FLAG DB 1
KEYS_RELEASED DB 1 ;will be 1 if keys (ALT AND LEFT SHIFT) are released
;
;this is the entry point from the interupt
ITRENT equ $
push ax ;save the registers
push bx
push cx
push dx
push ds
push es
push si
push di
push bp
mov ax,cs
mov ds,ax ;set up my dataseg
sti ;enable interupts
;
;THE MAIN PROGRAM
;
xor ax,ax ;set es so we can get the keyboard flags
mov es,ax
mov ax,es:[417H] ;KB_FLAG
and al,10 ;get rid of the other bits
sub al,10 ;if zero flag set the l shift and alt keys are pressed
jnz NOTPR
cmp KEYS_RELEASED,1 ;if transition just took place then toggle display
jnz CONT
xor DISPLAY_FLAG,1 ;toggle display_flag
and KEYS_RELEASED,0 ;reset so the display will not toggle until next release and press
JMP CONT
NOTPR: or KEYS_RELEASED,1
CONT: cmp DISPLAY_FLAG,1
jz doit
cmp KEYS_RELEASED,0 ;if no display and keys were just released then erase
jnz bye
erase
bye: jmp exit
;
doit: GET_STATUS
INSTCHCK equ $
mov ax,DISPLAY_ADDR
mov es,ax ;set es up to point to video memory
SHOW_232 0 ;display on line 0
;
exit: cli
pop bp ;restore the registers
pop di
pop si
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
sti
jmpout: jmp zero ;will be filled
;in with the address of the timer int routine
INIT: ;initial entry point to set up vectors, this code
push ds ;will be discarded upon installing itself in memory
sub ax,ax ;zero ax
mov ds,ax ;address interrupt vectors
mov si,ds:[70H] ;get the present interrupt values
mov cx,ds:[72H] ;usually points to an iret
mov ds,cx ;entry to present interupt handler
; Next lines determine if this program is
; already installed
mov bx,cs:INSTCHCK
cmp word ptr [si+INSTCHCK-ITRENT],bx
jne instal
pop ds
call beep ;complain LOUDLY if this program alredy in memory
int 20H ;exit
instal: pop ds
mov word ptr jmpout+1,si ;move timer int addr to jmpout
mov word ptr jmpout+3,cx
mov dx,offset ITRENT ;give dos the intr entry to this code
mov ax,251CH ;request dos to set up a vector
int 21H ;do it
mov dx,offset INIT ;move the ending addr of the resident
;portion of the code
int 27H ;terminate and stay resident
BEGIN endp
;
beep proc near ;beep the speaker
mov bx,1000
in al,61h
push ax
more: and al,0fch
out 61h,al
mov cx,50
ab: LOOP ab
or al,2
out 61h,al
mov cx,50
bc: loop bc
dec bx
jnz more
pop ax
out 61h,al
ret
beep endp

cseg ends
end BEGIN


  3 Responses to “Category : Communication (modem) tools and utilities
Archive   : MDMLIGHT.ZIP
Filename : MDMLIGHT.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. 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/