; 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 .' DB CR,LF,' After INUSE prints the Banner and the Comment, it' DB CR,LF,'waits for a user to hit the 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 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 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 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 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 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 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 ; 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