;  PROGRAM:  INUSE
;  AUTHOR:  RICHARD CONN
;  VERSION:  1.0
;  DATE:  12 JAN 82
;
; Translated with XLT86 for CP/M-86 use, April 2, 1982; by Kelly Smith
;
;  DERIVATION:  From BANNER Version 1.0 by Richard Conn ... which was from:
;  DERIVATION:  From Public Domain BANNER Program, Author Unknown
;  PREVIOUS VERSIONS:  None
VERS    EQU     10                      ;VERSION NUMBER
;********************************
;                               *
;   I N U S E  P R I N T        *
;                               *
;********************************
;
;  INUSE is a program which prints large (5x7) block letters
; on the CON: Device the word 'INUSE'.  When first started up, INUSE
; asks for a password, to which the user gives a desired password.
; INUSE is intended to be terminated by the user typing an Escape Character
; and then giving the original password.
;
;  INUSE is executed in one of two forms:
;       INUSE -- Normal operation
;       INUSE /? -- Prints HELP Info
;
;********************************
;  User-Customized Parameters   *
;********************************
ESC     EQU     1BH                     ; ESCAPE CHARACTER TO INPUT PASSWORD
;********************************
;  Constants                    *
;********************************
BDOS    EQU     0005H
FCB     EQU     005CH
BUFF    EQU     0080H
CTRLC   EQU     03H
CR      EQU     0DH
LF      EQU     0AH
TAB     EQU     09H
INCHAR  EQU     1                       ;INPUT FROM CON:
PRLINE  EQU     9                       ;Print Line Routine
READLN  EQU     10                      ;Input Line Editor
OUTC    EQU     2                       ;OUTPUT TO CON:
M       EQU     BYTE PTR 0[BX]          ; XLT86'S WAY OF MAKING 8080 'M'

       ORG     100H
       CALL    PMSG                    ; PRINT PROMPT
       DB      CR,LF,'INUSE Version ',VERS/10+'0','.',(VERS MOD 10)+'0',CR,LF
       DB      0
       MOV     AL,Byte Ptr .FCB+1      ; GET FIRST CHAR OF FCB
       CMP     AL,'/'                  ; QUERY?
       JZ      L_1
       JMP     IN1
L_1:
       CALL    PMSG
       DB      CR,LF,' INUSE is employed to print a banner on a user''s'
       DB      CR,LF,'terminal that said terminal is in use and by whom.  A'
       DB      CR,LF,'comment is asked for when INUSE is executed by the'
       DB      CR,LF,'command line -- '
       DB      CR,LF,'         INUSE'
       DB      CR,LF,'and this comment is printed with the INUSE Banner.'
       DB      CR,LF,'After being asked for the comment, he is then asked for'
       DB      CR,LF,'a password which should be typed to restore control.'
       DB      CR,LF,'Both the comment and the password are typed in the'
       DB      CR,LF,'usual fashion followed by a <CR>.'
       DB      CR,LF,' After INUSE prints the Banner and the Comment, it'
       DB      CR,LF,'waits for a user to hit the <ESCAPE> key, at which'
       DB      CR,LF,'time it asks for the password.  If the correct password'
       DB      CR,LF,'is entered, control is restored to CP/M; otherwise,'
       DB      CR,LF,'the Banner and Comment are reprinted and INUSE waits'
       DB      CR,LF,'for the <ESCAPE> key again.'
       DB      CR,LF,' The INUSE command takes two forms --'
       DB      CR,LF,'         INUSE -- Runs INUSE'
       DB      CR,LF,'         INUSE / -- Prints this HELP Message'
       DB      CR,LF,0
       JMP     EXIT
IN1:
       CALL    PMSG
       DB      '   Comment? ',0
       MOV     DX,(Offset COMMENT)     ; GET RESPONSE
       MOV     CL,READLN               ; INPUT LINE VIA BDOS
       INT     224
       CALL    PMSG
       DB      CR,LF,'   Password? ',0
       MOV     DX,(Offset INLINE)      ; GET RESPONSE
       MOV     CL,READLN               ; INPUT LINE VIA BDOS
       INT     224
INUSE:
       CALL    SPACER                  ; SPACE DOWN ON SCREEN
       CALL    BANNER                  ; PRINT INUSE MESSAGE
       CALL    PRCMT                   ; PRINT COMMENT ON NEXT LINE
       CALL    SPACER                  ; SPACE DOWN ON SCREEN
INUSE1:
       MOV     CL,INCHAR               ; BDOS CHAR INPUT
       INT     224
       AND     AL,7FH                  ; MASK MSB
       CMP     AL,61H                  ; SMALL A?
       JB      INUSE2
       CMP     AL,61H+26+1             ; > SMALL Z?
       JNB     INUSE2
       SUB     AL,20H                  ; CAPITALIZE
INUSE2:
       CMP     AL,ESC                  ; ESCAPE CHAR?
       JNZ     INUSE1
       CALL    PMSG
       DB      CR,LF,'   Password? ',0
       MOV     DX,(Offset RDLINE)      ; GET RESPONSE
       MOV     CL,READLN
       INT     224
       MOV     BX,(Offset INLINE)+1    ; COMPARE PASSWORDS
       MOV     DX,(Offset RDLINE)+1
       MOV     SI,DX                   ; GET CHAR COUNT
       MOV     AL,[SI]
       CMP     AL,M                    ; COMPARE CHAR COUNT
       JNZ     INUSE                   ; REPRINT BANNER IF NO MATCH
       MOV     CH,AL                   ; CHAR COUNT IN B
       OR      AL,AL                   ; NO CHARS?
       JZ      EXIT                    ; EXIT IF SO
INUSE3:
       INC     BX                      ; PT TO NEXT CHAR
       INC     DX
       MOV     SI,DX                   ; GET NEXT CHAR
       MOV     AL,[SI]
       CMP     AL,M                    ; COMPARE
       JNZ     INUSE                   ; NEW BANNER IF NO MATCH
       DEC     CH                      ; COUNT DOWN
       JNZ     INUSE3
;
;  Exit INUSE
;
EXIT:
       MOV     CL,0    ; BACK TO WHENCE WE CAME...
       INT     224
;
;  PRINT BANNER CONTAINED IN BLINE BUFFER
;
BANNER:
       MOV     DH,80H                  ;PT TO MSB+1
CBAN:
       MOV     BX,(Offset BLINE)       ;SET PTR TO FIRST CHAR
       MOV     Word Ptr NEXTCH,BX
       CALL    CRLF                    ;NEW LINE
       MOV     AL,DH                   ;GET BIT PTR
       ROR     AL,1                    ;ROTATE
       AND     AL,7FH                  ;MASK OUT MSB
       MOV     DH,AL                   ;SET BIT PTR
       JZ      CB2                     ;NEW LINE AND THEN EXIT
CB1:
       CALL    CONIN                   ;GET NEXT CHAR
       MOV     CL,AL                   ;CHAR IN C
       OR      AL,AL                   ;DONE?
       JZ      CBAN                    ;DO NEXT LINE IF SO
       CALL    CONV                    ;GET ADDRESS OF DATA IN HL
       JB      CB1                     ;SKIP IF ERROR
       CALL    PRINT                   ;PRINT 5 CHARS FOLLOWED BY TWO SPACES
       JMPS    CB1                     ;CONTINUE
CB2:
       CALL    CRLF                    ;1 CRLF
       RET
;
;  COMPUTE POINTER TO TABLE ENTRY OF CHAR IN REG A
;    ON INPUT, A=CHAR; ON OUTPUT, HL=PTR TO TABLE ENTRY (1ST BYTE)
;
CONV:
       PUSH    CX                      ;SAVE BC
       PUSH    DX                      ;SAVE DE
       SUB     AL,' '                  ;CONVERT <SP> TO 0
       JNB     L_2
       RET                             ;INVALID CHAR
L_2:
       CMP     AL,7BH-' '              ;IN RANGE?
       JNB     CNVER                   ;INVALID CHAR
       MOV     DL,AL                   ;VALUE IN E
       MOV     DH,0                    ;VALUE IN DE
       MOV     BH,DH                   ;VALUE IN HL
       MOV     BL,DL
       SHL     BX,1                    ;VALUE * 2
       SHL     BX,1                    ;VALUE * 4
       ADD     BX,DX                   ;HL = VALUE * 5
       MOV     DX,(Offset CHARS)       ;POINT TO BEGINNING OF TABLE
       ADD     BX,DX                   ;HL PTS TO ELEMENT IN TABLE
       POP     DX                      ;RESTORE DE
       POP     CX                      ;RESTORE BC
       OR      AL,AL                   ;CLEAR CARRY
       RET
CNVER:
       STC                             ;SET CARRY FOR INVALID CHAR
       POP     DX                      ;RESTORE DE
       POP     CX                      ;RESTORE BC
       RET
;
;  PRINT CHAR IN C ACCORDING TO THE ENTRY PTED TO BY HL
;    BIT MASK IS IN D
;
PRINT:
       PUSH    CX                      ;SAVE BC (C=CHAR)
       MOV     CH,5                    ;5 BYTES/CHAR
PRINT1:
       MOV     AL,M                    ;GET BIT SET
       AND     AL,DH                   ;MASK FOR BIT IN QUESTION
       JZ      PRINT3                  ;IF ZERO, PRINT <SP>
       CALL    CONOUT                  ;PRINT CHAR IN C
PRINT2:
       LAHF                            ;PT TO NEXT BYTE
       INC     BX
       SAHF
       DEC     CH                      ;COUNT DOWN
       JNZ     PRINT1
       MOV     CL,' '                  ;PRINT THREE SPACES
       CALL    CONOUT
       CALL    CONOUT
       CALL    CONOUT
       POP     CX                      ;RESTORE BC
       RET
PRINT3:
       MOV     DL,CL                   ;SAVE CHAR
       MOV     CL,' '                  ;PRINT <SP>
       CALL    CONOUT
       MOV     CL,DL                   ;GET CHAR
       JMPS    PRINT2
;
;  PRINT COMMENT ON SCREEN IF ANY
;
PRCMT:
       CALL    CRLF                    ; NEW LINE
       MOV     BX,(Offset COMMENT)+1   ; PT TO CHAR COUNT
       MOV     AL,M                    ; GET CHAR COUNT
       INC     BX                      ; PT TO FIRST CHAR
       OR      AL,AL                   ; ANY?
       JNZ     L_3
       RET
L_3:
       PUSH    BX                      ; SAVE PTR TO FIRST CHAR
       ADD     AL,BL                   ; POINT TO AFTER LAST CHAR
       MOV     BL,AL
       MOV     AL,BH
       ADC     AL,0
       MOV     BH,AL
       MOV     M,'$'                   ; STORE ENDING '$'
       POP     DX                      ; PT TO LINE
       MOV     CL,PRLINE               ; BDOS PRINT
       INT     224
       CALL    CRLF                    ; NEW LINE
       RET
;
;  SUPPORT ROUTINES
;
SPACER:
       MOV     CH,8                    ; GO DOWN SCREEN
SPACE0:
       CALL    CRLF                    ; NEW LINE
       DEC     CH                      ; COUNT DOWN
       JNZ     SPACE0
       RET
PMSG:
       MOV     BP,SP                   ;GET PTR TO STRING
       XCHG    BX,[BP]
       MOV     CH,0                    ;SET TAB COUNTER
PMSG1:
       MOV     AL,M                    ;GET NEXT BYTE
       INC     BX                      ;PT TO NEXT
       OR      AL,AL                   ;DONE?
       JZ      PMSG2
       CMP     AL,TAB                  ;TABULATE?
       JZ      PMSG@TAB
       MOV     CL,AL                   ;CHAR IN C
       CALL    CONOUT                  ;PRINT CHAR
       INC     CH                      ;INCR CHAR COUNT
       JMPS    PMSG1
PMSG@TAB:
       MOV     CL,' '                  ;PRINT <SP>
       CALL    CONOUT                  ;PRINT
       INC     CH                      ;INCR POSITION COUNT
       MOV     AL,CH                   ;GET IT
       AND     AL,7                    ;DONE?
       JNZ     PMSG@TAB
       JMPS    PMSG1                   ;PROCESS NEXT CHAR
PMSG2:
       MOV     BP,SP                   ;RESTORE HL, PTR
       XCHG    BX,[BP]
       RET
CRLF:
       MOV     CL,CR
       CALL    CONOUT
       MOV     CL,LF
       CALL    CONOUT
       MOV     CL,0                    ; 2 <NULL>S
       CALL    CONOUT                  ; FALL THRU FOR 2ND
CONOUT:
       PUSH    BX
       PUSH    CX
       PUSH    DX
       MOV     DL,CL
       MOV     CL,OUTC                 ;OUTPUT TO CON:
       INT     224
       POP     DX
       POP     CX
       POP     BX
       RET
CONIN:
       PUSH    BX
       PUSH    DX
       PUSH    CX
       MOV     BX,Word Ptr NEXTCH      ;GET NEXT CHAR PTR
       MOV     AL,M                    ;GET CHAR
       INC     BX                      ;PT TO NEXT
       MOV     Word Ptr NEXTCH,BX
       AND     AL,7FH                  ;MASK MSB IF ANY
       POP     CX
       POP     DX
       POP     BX
       RET
L_4     EQU     $
       DSEG
       ORG     Offset L_4
;
;  CHARACTER TABLE
;    THE CHARACTERS REPRESENTED IN THIS TABLE ARE IN A 5X7 FORMAT
;    THE FIRST BYTE IN EACH ENTRY REPRESENTS THE FIRST CHAR TO PRINT, ETC
;    THE BITS 6 TO 0 REPRESENT LINES (SUCCESSIVE) TO PRINT FOR THE CHAR
;
CHARS   RS      0
       DB      00H,00H,00H,00H,00H     ;<SP>
       DB      00H,00H,7DH,00H,00H     ;EXCLAMATION MARK
       DB      00H,70H,00H,70H,00H     ;"
       DB      14H,7FH,14H,7FH,14H     ;#
       DB      12H,2AH,7FH,2AH,24H     ;$
       DB      62H,64H,08H,13H,23H     ;%
       DB      36H,49H,35H,02H,05H     ;&
       DB      00H,00H,70H,00H,00H     ;'
       DB      1CH,22H,41H,00H,00H     ;(
       DB      00H,00H,41H,22H,1CH     ;)
       DB      22H,14H,7FH,14H,22H     ;*
       DB      08H,08H,3EH,08H,08H     ;+
       DB      00H,01H,06H,00H,00H     ;,
       DB      08H,08H,08H,08H,08H     ;-
       DB      00H,03H,03H,00H,00H     ;.
       DB      02H,04H,08H,10H,20H     ;/
       DB      3EH,45H,49H,51H,3EH     ;0
       DB      11H,31H,7FH,01H,01H     ;1
       DB      21H,43H,45H,49H,31H     ;2
       DB      22H,41H,49H,49H,36H     ;3
       DB      0CH,14H,24H,7FH,04H     ;4
       DB      7AH,49H,49H,49H,46H     ;5
       DB      3EH,49H,49H,49H,26H     ;6
       DB      43H,44H,48H,50H,60H     ;7
       DB      36H,49H,49H,49H,36H     ;8
       DB      30H,49H,49H,49H,3EH     ;9
       DB      00H,00H,36H,00H,00H     ;:
       DB      00H,01H,16H,00H,00H     ;;
       DB      08H,14H,22H,41H,00H     ;<
       DB      14H,14H,14H,14H,14H     ;=
       DB      00H,41H,22H,14H,08H     ;>
       DB      20H,40H,4DH,50H,20H     ;?
       DB      7EH,41H,5DH,4DH,39H     ;@
       DB      3FH,48H,48H,48H,3FH     ;A
       DB      7FH,49H,49H,49H,36H     ;B
       DB      7FH,41H,41H,41H,41H     ;C
       DB      7FH,41H,41H,41H,3EH     ;D
       DB      7FH,49H,49H,49H,41H     ;E
       DB      7FH,48H,48H,48H,40H     ;F
       DB      7FH,41H,41H,49H,4FH     ;G
       DB      7FH,08H,08H,08H,7FH     ;H
       DB      41H,7FH,41H,80H,80H     ;I
       DB      03H,01H,01H,01H,7FH     ;J
       DB      7FH,08H,14H,22H,41H     ;K
       DB      7FH,01H,01H,01H,01H     ;L
       DB      7FH,20H,10H,20H,7FH     ;M
       DB      7FH,30H,08H,06H,7FH     ;N
       DB      7FH,41H,41H,41H,7FH     ;O
       DB      7FH,48H,48H,48H,78H     ;P
       DB      7FH,41H,45H,43H,7FH     ;Q
       DB      7FH,48H,4CH,4AH,79H     ;R
       DB      32H,49H,49H,49H,26H     ;S
       DB      40H,40H,7FH,40H,40H     ;T
       DB      7FH,01H,01H,01H,7FH     ;U
       DB      70H,0CH,03H,0CH,70H     ;V
       DB      7FH,02H,04H,02H,7FH     ;W
       DB      63H,14H,08H,14H,63H     ;X
       DB      60H,10H,0FH,10H,60H     ;Y
       DB      43H,45H,49H,51H,61H     ;Z
       DB      7FH,41H,41H,41H,00H     ;[
       DB      20H,10H,08H,04H,02H     ;\
       DB      00H,41H,41H,41H,7FH     ;]
       DB      04H,08H,10H,08H,04H     ;^
       DB      01H,01H,01H,01H,01H     ;_
       DB      00H,40H,20H,10H,00H     ;@
       DB      3FH,48H,48H,48H,3FH     ;A
       DB      7FH,49H,49H,49H,36H     ;B
       DB      7FH,41H,41H,41H,41H     ;C
       DB      7FH,41H,41H,41H,3EH     ;D
       DB      7FH,49H,49H,49H,41H     ;E
       DB      7FH,48H,48H,48H,40H     ;F
       DB      7FH,41H,41H,49H,4FH     ;G
       DB      7FH,08H,08H,08H,7FH     ;H
       DB      41H,7FH,41H,80H,80H     ;I
       DB      03H,01H,01H,01H,7FH     ;J
       DB      7FH,08H,14H,22H,41H     ;K
       DB      7FH,01H,01H,01H,01H     ;L
       DB      7FH,20H,10H,20H,7FH     ;M
       DB      7FH,30H,08H,06H,7FH     ;N
       DB      7FH,41H,41H,41H,7FH     ;O
       DB      7FH,48H,48H,48H,78H     ;P
       DB      7FH,41H,45H,43H,7FH     ;Q
       DB      7FH,48H,4CH,4AH,79H     ;R
       DB      32H,49H,49H,49H,26H     ;S
       DB      40H,40H,7FH,40H,40H     ;T
       DB      7FH,01H,01H,01H,7FH     ;U
       DB      70H,0CH,03H,0CH,70H     ;V
       DB      7FH,02H,04H,02H,7FH     ;W
       DB      63H,14H,08H,14H,63H     ;X
       DB      60H,10H,0FH,10H,60H     ;Y
       DB      43H,45H,49H,51H,61H     ;Z
;
;  BUFFERS
;
       RS      40                      ;20-ELT STACK
STACK   RS      0
       RS      2                       ;TOP OF BANNER STACK; CP/M STACK
NEXTCH  RS      0
       RS      2
LLEN    EQU     80                      ;NUMBER OF CHARS IN LINE, MAX
INLINE  RS      0
       DB      LLEN                    ;CHAR COUNT FOR INLINE
       RS      LLEN+1
RDLINE  RS      0
       DB      LLEN                    ;CHAR COUNT FOR RDLINE
       RS      LLEN+1
COMMENT RS      0
       DB      LLEN
       RS      LLEN+1
BLINE   RS      0
       DB      '* INUSE *',0           ; MESSAGE
       END