;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; TRMADR - AlphaBASIC subroutine to return Term Ctl Blk address
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;Commissioned by: Cary Fitch, NTSC
;
;Written by: David Pallmann, UltraSoft
;
;Edit History:
;1.0 23-Dec-86 created. /DFP
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Calling format:
;
; XCALL TRMADR, term$, address
;
; Where:
;
; term$ - is a string variable or constant containing the
; name of the terminal/modem/printer in question
;
; address - is a 4-byte binary variable that receives the
; address of the TCB in question. A zero is returned
; if a non-existent TCB name is supplied in term$.
;
; Example:
;
; MAP1 TRMLOC, B, 4
; ...
; XCALL TRMADR, "TRM1", TRMLOC
; IF TRMLOC=0 THEN GOTO TERM'ERROR
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VMAJOR=1
VMINOR=0
VSUB=0
OBJNAM .SBR
SEARCH SYS
SEARCH SYSSYM
COPY XCALL
PHDR -1,,PH$REE!PH$REU
;check argument count
CHKCNT: CMPW COUNT(A3),#2 ; 2 arguments in XCALL?
JNE CNTERR ; no - error
;check that first argument is of type string
CHKSTR: CMPW TYPE1(A3),#STRING ; 1st argument a string?
JNE STRERR ; no - error
;check that second argument is of type binary and is 4 bytes long
CHKBIN: CMPW TYPE2(A3),#BINARY ; 2nd argument a binary?
JNE BINERR ; no - error
CMP SIZE2(A3),#4 ; 2nd argument 4 bytes long
JNE BINERR ; no - error
;convert ASCII terminal name to RAD50 equivalent
CONVRT: MOV A4,A1 ; set up A1 for PACK call
MOV ADDR1(A3),A2 ; set up A2 for PACK call
PACK ; convert ASCII term name
PACK ; to RAD50
;scan the terminal definition chain for the specified terminal
SCAN: MOV TRMDFC,D7 ; point to base of table
10$: MOV D7,A5 ; copy index to addr reg
CTRLC NOTFND ; ^C check
CMM 4(A5),@A4 ; name match?
BEQ FOUND ; yes - branch
MOV @A5,D7 ; no - point to next link
BNE 10$ ; branch unless end-of-chain
;terminal not found - return zero
NOTFND: MOV ADDR2(A3),A0 ; point to 2nd argument address
CLR @A0 ; return zero
RTN ; return to program
;terminal found - return address
FOUND: ADD #10,A5 ; bypass link anb name
MOV ADDR2(A3),A0 ; point to 2nd argument
MOV A5,@A0 ; set address
RTN ; return
;incorrect number of arguments in XCALL
CNTERR: TYPESP ?Incorrect number of arguments
BR ERROR
;1st argument not a string in XCALL
STRERR: TYPESP ?1st argument not a string
BR ERROR