home *** CD-ROM | disk | FTP | other *** search
- ; ATTACH TO REMOTE DRIVERS VIA REMDRV
- ;
- MODULE "ATTREM"
- ;
- ; Improved version now includes the following features:
- ; - Attach to port A..P, corresponding to REMDRV-COMM-CHANNELS 0..15
- ; - optional second argument allows specification of
- ; channel baud rates ... OR ...
- ; clearing a channel.
- ;
- ; Syntax: ATTREM <1> [2]
- ; Example:
- ; 0A}attrem a b
- ; <1> = mandatory argument -- port letter A..P
- ; [2] = optional argument -- baud rate (A=50 baud...P=19200)
- ; OR, this argument may be "X" to DETACH the channel
- ; For baud rate codes, see Z80 Programmer's Guide,
- ; T-Function 37 (Page 5-40), where 0=A,1=B..15=P
- ;
- ; NOTE:
- ; The "X" (DETACH) command should only be used if a channel is
- ; hopelessly locked up. IT SHOULD NOT BE USED TO "chase someone
- ; off the system"!!! It's sole purpose is to free a locked channel
- ; (a channel can be locked simply by crashing the process running
- ; ATTREM; subsequent calls to ATTREM will show that channel busy.)
- ; NOTE:
- ; The above also applies to the 8-bit version of ATTREM.
- ;
- ; PATCH POINTS:
- ; AT 0102H IN THE Z80 VERSION (CS+2 IN THE 8086 VERSION), FOUR BYTES
- ; MAY BE PATCHED:
- ; Z80 0102 8086 CS+2 default baud rate code (A..H)
- ; 0103 CS+3 intercept character used to send ATTN
- ; to remote
- ; 0104 CS+4 remote attention character
- ; 0105 CS+5 exit character (must be typed 5 times)
- ;
- LOC Code#
- ;
- START: JMPS SKIP
- ;
- DBAUD: BYTE 'O' ; DEFAULT BAUD RATE
- INTER: BYTE 0X1E ; ^\
- BREAK: BYTE 0
- EXITC: BYTE '`'
- ;
- SKIP: MOV AX,DS
- MOV SS,AX
- MOV SP,&STACK ; set up local stack
- MOV AL,(0X5D) ; PORT A..P
- CMP AL,='A' ; CHECK!
- JC FALP
- CMP AL,='Q'
- JNC FALP
- MOV PORT1,AL
- MOV PORT2,AL
- MOV PORT3,AL
- MOV PORT4,AL
- DEC AL
- AND AL,=0X0F
- MOV PORT,AL
- MOV AL,0X6D
- CMP AL,='X'
- JNZ __NQ
- JMP QUIT
- ;
- __NQ: CMP AL,=' '
- JNZ __BRT
- CS MOV AL,DBAUD
- __BRT: CMP AL,='A'
- JB ILB
- CMP AL,='P'
- JA ILB
- DEC AL
- AND AL,=0X0F
- MOV BAUDR,AL
- MOV DX,&QUIT ; set abort address
- MOV BX,CS
- MOV CL,=8
- INT 0XDF
- MOV CL,=33
- MOV DH,=0XFE ; attach to com channel 1
- MOV CH,PORT
- INT 0XDF
- INC AL ; busy?
- JZ BUZI
- INC AL
- JNZ LOCL1
- MOV DX,&EROR
- JMPS XX
- ;
- ILB: MOV DX,&MILB
- JMPS XX
- ;
- FALP: MOV DX,&FALPM
- JMPS XX
- ;
- BUZI: MOV DX,&BARF ; else quit with error message
- XX: MOV CL,=9
- INT 0XE0
- MOV CL,=0
- INT 0XE0
- ;
- LOCL1: MOV CL,=9
- MOV DX,&HOOKED ; display success message
- INT 0XE0
- MOV CL,=33
- MOV DH,=0XFC ; set com channel 1 baud rate
- MOV CH,PORT
- MOV DL,BAUDR
- INT 0XDF
- MOV AL,=0X0D
- JMPS ECHO
- ;
- ; I/O loop
- ;
- LOCL: MOV CL,=6 ; get keyboard char if there is one
- MOV DL,=0XFF
- INT 0XE0
- OR AL,AL ; got a character?
- JNZ ECHO ; yes, echo it to remote
- ;
- NOIN: MOV CL,=33
- MOV DH,=0XFA ; com channel 1 I/O
- MOV CH,PORT
- INT 0XDF
- OR AL,AL ; check if any input chars
- JZ LOCL ; no, get next keyboard char
- OO: MOV CL,AL ; else display the input buffer
- XOR CH,CH
- MOV BX,=0X81 ; starting at 81h, for A chars
- OLP: MOV AL,[BX]
- PUSH CX
- PUSH BX
- CALL ECHO1 ; display the character
- POP BX
- POP CX
- INC BX
- LOOP OLP
- JMPS LOCL
- ;
- ; echo a character to remote, read input buffer
- ;
- ECHO: CS CMP EXITC,AL ; see if exit char
- JZ __XC ; yes, skip
- MOV COUNT,=5 ; set count to start
- JMPS __X
- ;
- __XC: CALL CHKXIT ; check exit
- __X: CS CMP INTER,AL
- JNZ __NB
- CS MOV AL,BREAK
- __NB: MOV CL,=33
- MOV DL,AL ; load character
- MOV DH,=0XFA ; com channel 1 I/O request
- MOV CH,PORT
- OR CH,=0X80 ; set output flag
- INT 0XDF
- OR AL,AL ; got any input?
- JNZ OO ; yes, join above loop
- JMPS LOCL ; else go for next keyboard char
- ;
- ; echo a character to the console
- ;
- ECHO1: MOV DL,AL
- MOV CL,=6
- INT 0XE0
- RET
- ;
- CHKXIT: DEC COUNT
- JZ QUIT
- RET
- ;
- ; abort address - only way to exit
- ;
- QUIT: MOV DH,=0XFD ; request detach from com1
- MOV CH,PORT
- MOV CL,=33
- INT 0XDF
- MOV CL,=9
- MOV DX,&UNHOOK ; display message
- INT 0XE0
- MOV CL,=0
- INT 0XE0
- ;
- LOC Data#
- ;
- PORT: BYTE 0
- BAUDR: BYTE 0
- COUNT: BYTE 5
- ;
- BARF: BYTE "\R\N\N\7ERROR: COM CHANNEL "
- PORT1: BYTE "1 IS BUSY\R\N\N$"
- EROR: BYTE "\R\N\N\7ERROR: COM CHANNEL "
- PORT2: BYTE "1 DOES NOT EXIST\R\N\N$"
- HOOKED: BYTE "\R\NCONNECTED TO COM CHANNEL "
- PORT3: BYTE "1\R\N$"
- UNHOOK: BYTE "\R\NDISCONNECTED FROM COM CHANNEL "
- PORT4: BYTE "1\R\N\N$"
- FALPM: BYTE "\R\N\N\7ERROR: ONLY PORTS A..P ALLOWED!\R\N\N$"
- MILB: BYTE "\R\N\N\7ERROR: BAUD RATE CODES A..P ONLY\R\N\N$"
- RES 40
- STACK == .
- END
- OV CH,PORT
- OR CH,=0X80 ; set output flag
- INT 0XDF
- OR AL,A