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