;***************************************************************************;
;                                                                           ;
;                                  NEWTRM                                   ;
;                   Allow user to change terminal driver                    ;
;                                                                           ;
;***************************************************************************;
;Copyright (C) 1988 UltraSoft Corporation.  All Rights Reserved.
;
;Written by: David Pallmann
;
;2.0(100)  17-Apr-88  created. /DFP
;2.0(101)  21-Apr-88  correct bug with terminals lacking a statu line. /DFP

       VMAJOR=2
       VMINOR=0
       VEDIT=101.

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM

       MEM=A5

       .OFINI
       .OFDEF  DRIVER,4                ; driver name (2 RAD50 words)
       .OFDEF  BUFFER,10.              ; ASCII buffer
       .OFDEF  TRMFLG,TC.SIZ           ; terminal characteristics
       .OFSIZ  MEMSIZ

DEFINE  DEPACK  ADDR
       SAVE    A1,A2
       LEA     A1,ADDR
       SUB     #8.,SP
       MOV     SP,A2
       UNPACK
       UNPACK
       CLRB    @A2
       TTYL    @SP
       ADD     #8.,SP
       REST    A1,A2
       ENDM

DEFINE  CRT     CODE
       MOVW    #-1_8.+^D<CODE>,D1
       TCRT
       ENDM

DEFINE  MOVWL   SRC,DST
       CLR     D7
       MOVW    SRC,D7
       MOV     D7,DST
       ENDM

DEFINE  BIT     SRC,DST
       MOV     DST,D7
       AND     SRC,D7
       ENDM

START:  PHDR    -2,,PH$REE!PH$REU
       GETIMP  MEMSIZ,MEM
       JOBIDX  A4
       MOV     JOBTRM(A4),A3

;******************************************
;*  Set image mode and turn off echoplex  *
;******************************************

TERM:   ANDW    #^C<T$DAT>,T.STS(A3)
       ORW     #T$IMI!T$ECS,T.STS(A3)

;*******************************************
;*  Check for driver name on command line  *
;*******************************************

CMDLIN: BYP
       LIN
       JEQ     CURR
       LEA     A1,DRIVER(MEM)
       PACK
       PACK
       JMP     SEARCH

;**********************************
;*  Show current terminal driver  *
;**********************************

CURR:   TYPESP  Current terminal driver is
       MOV     T.TDV(A3),A1
       SUB     #4,A1
       LEA     A2,BUFFER(MEM)
       UNPACK
       UNPACK
10$:    CMMB    -(A2),#40
       BEQ     10$
       CLRB    1(A2)
       TTYL    BUFFER(MEM)
       TYPE    <.  >

CHANGE: TYPESP  Do you wish to change it?
       KBD     EXIT
       UCS
       CMPB    D1,#33
       JEQ     ABORT
       CMPB    D1,#'N
       BEQ     10$
       CMPB    D1,#'Y
       BEQ     20$
       TTYI
       BYTE    7,0
       CRLF
       JMP     CURR
10$:    TYPECR  No
       JMP     EXIT
20$:    TYPECR  Yes

QUERY:  TYPESP  Do you want to see a list of available drivers?
       KBD     EXIT
       UCS
       CMPB    D1,#33
       JEQ     ABORT
       CMPB    D1,#'N
       BEQ     10$
       CMPB    D1,#'Y
       BEQ     20$
       TTYI
       BYTE    7,0
       CRLF
       BR      QUERY
10$:    TYPECR  No
       CRLF
       JMP     SELECT
20$:    TYPECR  Yes
       CRLF

;****************************
;*  List available drivers  *
;****************************

LIST:   TYPECR  The following terminal drivers are available:
       MOV     TRMTDC,A0
L1:     CRLF
       TAB
       MOV     #6,D0
L2:     DEPACK  4(A0)
       TST     @A0
       BEQ     L3
       MOV     @A0,A0
       TAB
       SOB     D0,L2
       BR      L1
L3:     CMP     D0,#6
       BEQ     L4
       CRLF
L4:     CRLF

;*********************************************
;*  Prompt user to select a terminal driver  *
;*********************************************

SELECT: TYPESP  Enter driver name:
       LEA     A2,BUFFER(MEM)
       CLR     D2
SELCHR: KBD     EXIT
       CMPB    D1,#40
       BLO     SELCTL
       CMPB    D1,#'~
       BHI     SELCTL
SELTXT: CMPB    D2,#6
       BHIS    SELCHR
       TTY
       MOVB    D1,(A2)+
       INCB    D2
       BR      SELCHR
SELCTL: CMPB    D1,#33
       JEQ     ABORT
       CMPB    D1,#'M-'@
       BEQ     SELRTN
       CMPB    D1,#177
       BEQ     SELDEL
       BR      SELCHR
SELDEL: TSTB    D2
       BEQ     SELCHR
       TTYI
       BYTE    10,40,10,0
       EVEN
       DEC     A2
       DECB    D2
       BR      SELCHR
SELRTN: CRLF
       CLRB    @A2
       LEA     A1,DRIVER(MEM)
       LEA     A2,BUFFER(MEM)
       PACK
       PACK
       CRLF

;*******************************************************
;*  Search terminal driver chain for specified driver  *
;*******************************************************

SEARCH: MOV     TRMTDC,A0
10$:    CMM     4(A0),DRIVER(MEM)
       BEQ     SWITCH
       TST     @A0
       BEQ     20$
       MOV     @A0,A0
       BR      10$
20$:    TYPECR  No such terminal driver.
       CRLF
       JMP     QUERY

;*******************************
;*  Affix new terminal driver  *
;*******************************

SWITCH: ADD     #10,A0
       MOV     A0,T.TDV(A3)

;********************************
;*  Initialize terminal driver  *
;********************************

INIT:   SAVE    A0-A6,D0-D7
       MOV     A3,A5
       CALL    TD.INI(A0)              ; call terminal driver init routine
       REST    A0-A6,D0-D7
       TRMCHR  TRMFLG(MEM)

;********************************************************
;*  Clear screen, top status line, and unlock keyboard  *
;********************************************************

CLEAR:  CRT     0                       ; clear screen
       CRT     8                       ; unlock keyboard
       BIT     #TD$STS,TRMFLG(MEM)     ; status lines?
       BEQ     30$                     ;  no                           [101]
       MOVWL   TRMFLG+TC.TSL(MEM),D0   ; get size of top status line
       BEQ     30$                     ;  zero
       CRT     63                      ; select top status line
       TYPESP                          ; start at far left position

       MOVB    #40,D1                  ; load space
       DECB    D0                      ; decrement count by one
       BEQ     20$                     ;  went to zero
10$:    TTY                             ; output space
       SOB     D0,10$                  ; loop
       MOVB    #25.,D1
       TTY

20$:    CRT     129                     ; end status line
30$:

;****************************************************
;*  Confirm terminal driver change by echoing name  *
;****************************************************

CONFRM: CRT     11
       TYPESP  Terminal driver changed to
       CRT     12
       DEPACK  DRIVER(MEM)
       CRLF

EXIT:   EXIT

ABORT:  TYPECR  Aborted.
       EXIT

       END