; 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