;*; Updated on 15-May-89 at 9:33 AM by James A. Jarboe I V; edit time: 0:38:55
;***************************************************************************
;                                                                          *
;                           P A S W R D . M 6 8                            *
;                                                                          *
;***************************************************************************
;
; Super Simple Password input.
; This subroutine accepts user input but only displays *'s as output.
; The only exit is a CR which returns the user to BASIC.
;
; Calling format is:
;  XCALL PASWRD, VARIABLE
;
;  Where:
;       VARIABLE = Unformatted or string variable.
;
;  The VARIABLE contents are returned to BASIC. The contents can
;  be any ASCII character except, CR or DEL which are trapped in this
;  subroutine.
;


       VMAJOR  =       1
       VEDIT   =       100.            ; Written 15-May-89


       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM

       OBJNAM  PASWRD.SBR


       PAGE
;***************************************************************************
;                                                                          *
;                               M A C R O S                                *
;                                                                          *
;***************************************************************************
;

DEFINE  PRTTAB  ROW, COL
       MOVW    #<ROW_8.+COL>,D1
       TCRT
ENDM


;***************************************************************************
;                                                                          *
;                            C O N S T A N T S                             *
;                                                                          *
;***************************************************************************
;

       $DEL    =       127.            ; DELete character.
       $CR     =       13.             ; CR character.
       $NULL   =       0               ; NULL character.
       $BELL   =       7.              ; BELL character.


;***************************************************************************
;                                                                          *
;                        X C A L L    O F F S E T S                        *
;                                                                          *
;***************************************************************************
;
OFINI
OFDEF   XP.TOP, 2                       ; Number of arguments.
OFDEF   TYPE1, 2                        ; Type of arg 1
OFDEF   ADDR1, 4                        ; Address of arg1
OFDEF   SIZE1, 4                        ; Size arg1
OFSIZ   XP.SIZ


       PAGE
;***************************************************************************
;                                                                          *
;                     S U B R O U T I N E     S T A R T                    *
;                                                                          *
;***************************************************************************
;
;
PASWRD: PHDR    -1,0,PH$REE!PH$REU

       CMPW    XP.TOP(A3), #1          ; Got at least one argument?
       JLO     QTYVAR                  ;  No..tell em.
       CMPW    TYPE1(A3), #2           ; Is it at least a string?
       JHI     STRVAR                  ;  No..tell em.

       TRMRST  D6                      ; Get terminal status.
       MOV     D6, D5                  ; Save terminal status.
       ORW     #T$DAT!T$ECS, D6        ; Set data, noecho.
       TRMWST  D6                      ; Set terminal status.

       MOV     ADDR1(A3), A2           ; Set new KBD address.
       PUSH    A2                      ; Save it.
       MOV     SIZE1(A3), D0           ; Get size of argument.
10$:    MOVB    #0, (A2)+               ; Clear out argument.
       SOB     D0, 10$                 ; Until finished.
       POP     A2                      ; Restore address.
       PUSH    A2                      ; Then save it again.
       CLR     D4                      ; Clear counter.

LOOP:
       KBD     OUTOF                   ; Get KBD input.
       UCS                             ; Make it upper case.
       CMPB    D1, #$DEL               ; Was this a backspace (RUB)?
       JEQ     BACKSP                  ;  Yes..do backspace stuff.
       CMPB    D1, #$CR                ; Was this a CR?
       BEQ     20$                     ;  Yes..we through.
       CMP     D4, SIZE1(A3)           ; Have we exceed length?
       BLO     10$                     ;  No..process it.
       MOVB    #$BELL, D1              ;  Yes..set up bell.
       TTY                             ; Ring it.
       BR      LOOP                    ; Try again.
10$:    MOVB    D1, (A2)+               ; Save character.
       TYPE    *                       ; Output a star.
       INC     D4                      ; Bump character count.
       BR      LOOP                    ; Try again.
20$:
       POP     A2                      ; Restore pointer.

OUTOF:
       TRMRST  D6                      ; Get terminal status.
       MOV     D5, D6                  ; Restore status.
       TRMWST  D6                      ; Set terminal status.
       RTN                             ; Return to basic.


QTYVAR:
       TYPE    <?No variables passed >
       BR      ERROUT

STRVAR:
       TYPE    <?Invalid variable type >

ERROUT:
       TYPECR  <in PASWRD.SBR>
       RTN

BACKSP:
       CMPB    D4, #0                  ; Any characters yet?
       BEQ     10$                     ;  No..don't bother.
       DEC     D4                      ;  Yes..decrease count.
       MOVB    #$NULL, -(A2)           ; Clear last character.
       PRTTAB  -1,5                    ; Do a backspace.
       TYPE    < >                     ; Clear screen space.
       PRTTAB  -1,5                    ; Do a backspace.

10$:    JMP     LOOP                    ; Try again.
       END