home *** CD-ROM | disk | FTP | other *** search
- page ,132
- .model tiny
- .code
- first:
- ;
- ; WATCHCAT copyright 1989, Joseph R. Ahlgren
- ; see WATCHCAT.DOC
- ;
- ; WATCHCAT performs 5 critical functions for any RBBS system:
- ; 1. Reboots system if no carrier in specified period of time
- ; This catches RBBS or system failures
- ; 2. Reboots system if carrier lost during critical period
- ; This allows Doors to be used safely
- ; 3. Reboots system if 20 rings without answering phone
- ; This allows system to be restarted by phone
- ; 4. Reboots system if "Hit any key to return to system" message appears
- ; This restarts system on a common RBBS failure
- ; 5. Drops carrier if L&R shift keys pressed simultaneously
- ; This allows users to be logged off without a nasty message.
- ;WATCHCAT loads the TSR and disables all functions
- ; WATCHCAT OFF disables all functions
- ; WATCHCAT ON enables 1,3,4,and 5
- ; WATCHCAT TIMER enables 2,4,and 5
- ;ComPort = 03f8h ;{COM1}
- ;ComPort = 02f8h ;{COM2}
- ;ComPort = 03e8h ;{COM3}
- ;ComPort = 02e8h ;{COM4}
- ;ScreenSegment = 0b800h ;{Color}
- ;ScreenSegment = 0b000h ;{Mono}
- ModemStatus = 0006h
- ModemControl = 0004h
- CarrierDetect = 0080h
- RingIndicator = 0040h
- tpm = 1092 ; {ticks per minute}
- RingTicks = 110; {6 seconds}
- org 100h
- start:
- jmp init
- RingTrigger dw 0
- RingTimer db 0
- Flag db 'F' and 0fh ; OFF ON TIME = F O I
- TimerInt dd ?
- Minutes dw 8*60 ;{minutes of no carrier to trigger reset}
- Seconds dw tpm
- MinReset dw 8*60
- ColdBoot dd 0ffff0000h
- ExitTimer db 0
- DropTrigger db 3 ;Drop DTR on L&R shift
- ExitMessage db 'Hit any key to return to system'
- ExitMessageEnd db 0
- ComPort dw 02f8h ;{COM2}
- ScreenSegment dw 0b000h ;{Mono}
- Ident db "jOeY"
- Ident2 db "50c4"
- timer:
- assume ds:nothing,es:nothing,ss:nothing
- cmp cs:[Flag],'F' and 0fh
- jne SystemOn
- jmp cs:[TimerInt]
- SystemOn:
- push ax
- push dx
- push ds
- ; 4. Reboots system if "Hit any key to return to system" message appears
- ; This restarts system on a common RBBS failure
- dec cs:[ExitTimer]
- jnz NoExitLoop
- push cx
- push si
- push di
- mov ax,cs:[ScreenSegment]
- mov ds,ax
- mov cx,25
- xor si,si
- SSLoop1:
- push cx
- push si
- mov cx,ExitMessageEnd-ExitMessage
- mov di,offset ExitMessage
- SSLoop2:
- lodsw
- cmp al,cs:[di]
- jne SSLoop2x
- inc di
- loop SSLoop2
- jmp short NoCarrier
- SSLoop2x:
- pop si
- pop cx
- add si,160
- loop SSLoop1
- pop di
- pop si
- pop cx
- NoExitLoop:
- ; 5. Drops carrier if L&R shift keys pressed simultaneously
- ; This allows users to be logged off without a nasty message.
- xor ax,ax
- mov ds,ax
- assume ds:Lowmem
- mov al,[ShiftStatus]
- and al,0fh
- cmp al,cs:[DropTrigger]
- jne NoShift
- mov dx,cs:[ComPort]
- add dx,ModemControl
- in al,dx
- ; or al,1
- and al,0feh
- out dx,al ;drop DTR
- NoShift:
- ; 3. Reboots system if 20 rings without answering phone
- ; This allows system to be restarted by phone
- mov dx,[ComPort]
- add dx,ModemStatus
- in al,dx
- test al,RingIndicator
- jz NotRinging
- or cs:[RingTrigger],1
- NotRinging:
- dec cs:[RingTimer]
- jnz NoRingTime
- mov cs:[RingTimer],RingTicks
- mov ax,cs:[RingTrigger]
- cmp ax,0ffffh
- je NoCarrier
- shl ax,1
- mov cs:[RingTrigger],ax
- ; 2. Reboots system if carrier lost during critical period
- ; This allows Doors to be used safely
- NoRingTime:
- cmp cs:[Flag],'I' and 0fh
- jb NoMonitor
- je TimeCheck
- in al,dx
- and al,CarrierDetect
- jz NoCarrier
- NoMonitor:
- pop ds
- pop dx
- pop ax
- jmp cs:[TimerInt]
- NoCarrier:
- jmp cs:[ColdBoot]
- ; 1. Reboots system if no carrier in specified period of time
- ; This catches RBBS or system failures
- TimeCheck:
- test al,CarrierDetect
- jnz ResetTime
- dec cs:[Seconds]
- jnz NoMonitor
- mov cs:[Seconds],tpm
- dec cs:[Minutes]
- jz NoCarrier
- jmp short NoMonitor
- ResetTime:
- mov ax,cs:[MinReset]
- mov cs:[Minutes],ax
- jmp short NoMonitor
- ;
- ;
- ;
- ;
- assume ds:@code,es:@code,ss:@code
- init:
- mov dx,offset SignOnMessage
- mov ax,0900h
- int 21h ;print load message
- mov ax,[word ptr Ident2]
- xor [word ptr Ident],ax
- mov ax,[word ptr Ident2+2]
- xor [word ptr Ident+2],ax
- xor dx,dx
- mov es,dx
- mov si,offset Ident
- mov cx,cs
- mov ax,[si]
- findloop:
- cmp ax,es:[si]
- jz found
- NotQuite:
- inc dx
- mov es,dx
- loop findloop
- LoadWatchCat:
- xor bx,bx
- mov es,bx
- mov bl,ds:[82h]
- cmp bl,'0'
- jle NoCom
- cmp bl,'4'
- jle ComSpec
- NoCom:
- mov bl,'1'
- ComSpec:
- mov [ComPortNumber],bl
- add bx,bx
- mov ax,es:[bx+400h-31h-31h]
- mov [ComPort],ax
- cmp byte ptr ds:[83h],'C'
- jnz NotColor
- mov [ScreenSegment],0b800h
- mov [ScreenSegNum],'8'
- NotColor:
- mov ax,3508h
- int 21h ;get timer interrupt
- mov [word ptr TimerInt],bx
- mov [word ptr TimerInt+2],es
- mov dx,offset Timer
- mov ax,2508h
- int 21h ;set timer interrupt
- mov dx,offset message1
- mov ax,0900h
- int 21h ;print load message
- mov dx,(init-first+15)/16
- mov ax,3101h
- int 21h ;TSR
- Found:
- mov bx,[si+2]
- cmp bx,es:[si+2]
- jnz NotQuite
- mov ax,es
- mov bx,10h
- mov di,offset message2x
- mov cx,4
- loc:
- mul bx
- cmp dl,9
- jbe locx
- add dl,7
- locx:
- add dl,'0'
- mov [di],dl
- inc di
- loop loc
- mov ax,es:[MinReset]
- mov es:[Minutes],ax
- mov al,ds:[83h]
- and al,0fh
- mov es:[Flag],al
- mov dx,offset message2tim
- cmp al,'I' and 0fh
- jz done
- mov dx,offset message2off
- jb done
- mov dx,offset message2on
- done:
- push dx
- mov dx,offset message2
- mov ax,0900h
- int 21h
- pop dx
- mov ax,0900h
- int 21h
- mov ax,4c00h
- int 21h
- message1 db 0ah,0dh,'Watchcat Loaded, set to COM'
- ComPortNumber db '1 and Screen B'
- ScreenSegNum db '000',0ah,0dh,'$'
- message2 db 0ah,0dh,'Watchcat found at '
- message2x db '0000 and set to $'
- message2on db 'ON',0ah,0dh,'$'
- message2off db 'OFF',0ah,0dh,'$'
- message2tim db 'TIMER',0ah,0dh,'$'
- SignOnMessage db 0dh,0ah,'WATCHCAT, copyright 1989 Joseph R. Ahlgren'
- db ' RBBS 703-241-7980',0dh,0ah
- db ' WATCHCAT may be freely distributed provided this message is not modified',0dh,0ah
- db ' Load with WATCHCAT ps, where p is the port number (1,2,3,4)',0dh,0ah
- db ' and s is the screen type (Color or Mono), e.g., WATCHCAT 2C',0dh,0ah
- db ' specifies COM2 and Color Screen',0ah,0dh
- db ' Subsequent calls are WATCHCAT ON, WATCHCAT OFF, and WATCHCAT TIMER',0dh,0ah
- db ' OFF disables all functions',0dh,0ah
- db ' ON reboots if carrier lost',0dh,0ah
- db ' TIMER reboots if 20 rings without answering phone, if no carrier',0dh,0ah
- db ' in 8 hours, or if "Hit any key to return to system" appears on screen',0dh,0ah
- db ' Also, pressing both Left and Right Shift keys simultaneously will',0dh,0ah
- db ' drop the line, logging off the current user.',0dh,0ah
- db '$'
- ends
- Lowmem segment at 0000h
- org 417h
- ShiftStatus db ?
- Lowmem ends
- end start
-