;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;       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

;2nd argument not a 4-byte binary in XCALL

BINERR: TYPESP  ?2nd argument not a 4-byte binary

;general error reporting

ERROR:  TYPECR  in TRMADR.SBR
       EXIT

       END