	.TITLE	DIG
	.IDENT	/01/
;
;	THIS PROGRAM SIMULATES A DIGITAL CLOCK ON A CRT.
;	IT HAS 2 MODES OF OPERATION BY CONTINOUSLY UPDATING:
;	1) HOURS, MINUTES, SECONDS, DAY OF MONTH, MONTH, DAY AND YEAR
;	2) HOURS AND MINUTES IN LARGE DIGITS
;
;	THIS PROGRAM UPDATES ONLY THE CHARACTERS THAT HAVE CHANGED SINCE
;	THE LAST SECOND.  IT USES THE DIRECT CURSOR ADDRESSING OF A VT52
;	OR VT52 SIMULATED CRT.
;
;	AUTHOR N. D. PERRON, DIGITAL EL SEGUNDO, CA.
;
;	TO ASSEMBLE:
;	MAC DIG=DIG
;
;	TO BUILD:
;	TKB
;	TKB>DIG=DIG
;	TKB>/
;	TKB>STACK=100
;	TKB>TASK=...DIG
;	TKB>//
;
	.MCALL	GTIM$S,MRKT$S,WTSE$S,QIOW$,DIR$
	.MCALL	QIOW$S,EXIT$S,ASTX$S,GMCR$
;
MAXLIN=24.			;# OF LINES ON VIDEO TERMINAL
MAXCOL=80.			;# OF COLUMNS
;
START:	DIR$	#GETMCR		;GET MCR BUFFER
	DIR$	#HOMDPB,DIRERR	;HOME CURSOR, ERASE, HOME
	MOV	#2,TYPEN	;INDICATE HH:MM:SS TYPE
	DIR$	#ATADPB,DIRERR	;ATTATCH TO UNSOLICITED INPUT
;
RESTRT:	CMPB	TYPEN,TYPEO	;SAME TYPE AS LAST TIME?
	BEQ	30$		;BR IF YES
;
	BITB	#100,TYPEN	;ILLEGAL CHAR ENTERED?
	BEQ	10$		;BR IF NO
	BICB	#100,TYPEN	;CLEAR FOR NEXT TIME
	MOV	#MSG1,R0	;COPY MESSAGE 1 TO BOTTOM OF SCREEN
	MOV	#WRKBUF+<MAXCOL*22.>,R1
5$:	MOVB	(R0)+,(R1)+	;COPY A BYTE
	BNE	5$		;LOOP TIL DONE
	BR	30$		;JOIN COMMON CODE
;
10$:	MOVB	TYPEN,TYPEO	;SET UP FOR NEXT TIME
	MOV	#WRKBUF,R0	;BLANK OUT WORKING BUFFER
	MOV	#VTBUF,R1	;INIT VT BUFFER
	MOV	#MAXLIN*MAXCOL/2,R2 ;NUMBER OF WORDS TO BLANK
15$:	MOV	#"  ,(R0)+	;BLANK 2 CHARACTERS
	CLR	(R1)+		;BLANK VT BUFFER
	DEC	R2		;NOW 1 LESS WORD
	BNE	15$		;BR IF MORE
;
	MOV	#HMSTAB,R0	;DEFAULT TO HH:MM:SS COLON TABLE
	CMPB	#2,TYPEN	;RIGHT?
	BEQ	20$		;BR IF HH:MM:SS
	MOV	#HMTAB,R0	;HH:MM ONLY
20$:	MOVB	#'X,@0(R0)	;FORM PART OF COLON
	TST	(R0)+		;GET TO NEXT ENTRY
	BNE	20$		;BR IF NOT DONE
;
	MOV	#-1,R0		;INIT HH, MM, SS TO SAY MUST DISPLAY
	MOV	R0,HR
	MOV	R0,TMIN
	MOV	R0,UMIN
	MOV	R0,TSEC
	MOV	R0,USEC
	MOV	R0,DAY
	MOV	R0,MON
	MOV	R0,YR
;
30$:	GTIM$S	#TIMBUF		;GET TIME
	CMPB	#1,TYPEN	;HH:MM TYPE?
	BNE	40$		;BR IF NOT
	CALL	HHMM		;FORMAT HH:MM
	BR	100$		;JOIN COMMON CODE
40$:	CMPB	#2,TYPEN	;HH:MM:SS ?
	BNE	50$		;BR IF NOT
	CALL	HHMMSS		;FORMAT HH:MM:SS
	BR	100$		;JOIN COMMON CODE
50$:	CMPB	#200,TYPEN	;EXIT?
	BNE	60$		;BR IF NOT
	DIR$	#ENDDPB,DIRERR	;OUTPUT ENDING MESSAGE
	EXIT$S			;TA-TA
;
60$:	BPT
;
100$:	TST	NEDDIS		;NEED TO DISPLAY?
	BEQ	110$		;BR IF NO
	CLR	NEDDIS		;INIT FOR NEXT TIME
	CALL	DISPLY		;DISPLAY WHAT WE GOT
110$:	MRKT$S	#1,#2,#1,,DIRERR;WAIT 1 SECOND
	WTSE$S	#1		;WAIT FOR TIMER TO EXPIRE
	BR	RESTRT		;DO IT ALL AGAIN
	.PAGE
;
;	FORMAT HH:MM IN BIG CHARACTERS
;
HHMM:				;FORMAT HOURS
	MOV	TIMBUF+6,R0	;PICK UP HOUR
	CMP	HR,R0		;DID HR CHANGE?
	BEQ	10$		;BR IF NO
	MOV	R0,HR		;SET UP FOR NEXT TIME
	INC	NEDDIS		;SAY NEED TI DISPLAY
	MOV	#10.,R1		;PICK UP DIVISOR OF 10.
	CALL	$DIV		;DIVIDE HOUR BY 10.
	MOV	R1,-(SP)	;SAVE UNITS
				;R0=TENS POSITION OF HOUR
	CLR	R1		;START AT COL 1
	TST	R0		;LEADING ZERO?
	BNE	5$		;BR IF NO
	MOV	#' ,R0		;SUPPRESS LEADING ZERO
5$:	CALL	FMTBIG		;FORMAT A BIG CHARACTER
	MOV	(SP)+,R0	;PICK UP UNITS POSITION
	MOV	#18.,R1		;START AT COL 19.
	CALL	FMTBIG		;FORMAT ANOTHER BIG CHARACTER
				;FORMAT MINUTES
10$:	MOV	TIMBUF+8.,R0	;PICK UP MINUTES
	MOV	#10.,R1
	CALL	$DIV		;DIVIDE MINUTES BY 10.
	MOV	R1,-(SP)	;SAVE UNITS
				;R0=TENS POSITION OF MINUTES
	CMP	TMIN,R0		;DID TENS POS OF MINS CHANGE?
	BEQ	15$		;BR IF NOT
	MOV	R0,TMIN		;SET UP FOR NEXT TIME
	INC	NEDDIS		;SAY NEED TO DISPLAY
	MOV	#44.,R1		;START AT COL 45.
	CALL	FMTBIG		;FORMAT 1ST DIGIT OF MINUTES
15$:	MOV	(SP)+,R0	;PICK UP UNITS
	CMP	UMIN,R0		;DID TENS POS OF MINS CHANGE?
	BEQ	20$		;BR IF NOT
	MOV	R0,UMIN		;UPDATE FOR NEXT TIME
	INC	NEDDIS		;SAY NEED TO DISPLAY
	MOV	#62.,R1		;START AT COL 63.
	CALL	FMTBIG		;FORMAT 2ND DIGIT
20$:	RETURN
	.PAGE
;
;	FORMAT HH:MM:SS IN MEDIUM CHARACTERS
;	AND DAY IN SMALL CHARS
;
HHMMSS:				;FORMAT HOURS
	MOV	TIMBUF+6,R0	;PICK UP HOUR
	CMP	HR,R0		;DID HR CHANGE?
	BEQ	10$		;BR IF NO
	MOV	R0,HR		;SET UP FOR NEXT TIME
	INC	NEDDIS		;SAY NEED TI DISPLAY
	MOV	#10.,R1		;PICK UP DIVISOR OF 10.
	CALL	$DIV		;DIVIDE HOUR BY 10.
	MOV	R1,-(SP)	;SAVE UNITS
				;R0=TENS POSITION OF HOUR
	CLR	R1		;START AT COL 1
	TST	R0		;LEADING ZERO?
	BNE	5$		;BR IF NO
	MOV	#' ,R0		;SUPPRESS LEADING ZERO
5$:	CALL	FMTMED		;FORMAT A MEDIUM CHARACTER
	MOV	(SP)+,R0	;PICK UP UNITS POSITION
	MOV	#12.,R1		;START AT COL 13.
	CALL	FMTMED		;FORMAT ANOTHER MEDIUM CHARACTER
				;FORMAT MINUTES
10$:	MOV	TIMBUF+8.,R0	;PICK UP MINUTES
	MOV	#10.,R1
	CALL	$DIV		;DIVIDE MINUTES BY 10.
	MOV	R1,-(SP)	;SAVE UNITS
				;R0=TENS POSITION OF MINUTES
	CMP	TMIN,R0		;DID TENS POS OF MINS CHANGE?
	BEQ	15$		;BR IF NOT
	MOV	R0,TMIN		;SET UP FOR NEXT TIME
	INC	NEDDIS		;SAY NEED TO DISPLAY
	MOV	#28.,R1		;START AT COL 29.
	CALL	FMTMED		;FORMAT 1ST DIGIT OF MINUTES
15$:	MOV	(SP)+,R0	;PICK UP UNITS
	CMP	UMIN,R0		;DID TENS POS OF MINS CHANGE?
	BEQ	20$		;BR IF NOT
	MOV	R0,UMIN		;UPDATE FOR NEXT TIME
	INC	NEDDIS		;SAY NEED TO DISPLAY
	MOV	#40.,R1		;START AT COL 41.
	CALL	FMTMED		;FORMAT 2ND DIGIT
20$:				;FORMAT SECONDS
	MOV	TIMBUF+10.,R0	;PICK UP SECONDS
	MOV	#10.,R1
	CALL	$DIV		;DIVIDE SECONDS BY 10.
	MOV	R1,-(SP)	;SAVE UNITS
				;R0=TENS POSITION OF SECONDS
	CMP	TSEC,R0		;DID TENS POS OF SECS CHANGE?
	BEQ	25$		;BR IF NOT
	MOV	R0,TSEC		;SET UP FOR NEXT TIME
	INC	NEDDIS		;SAY NEED TO DISPLAY
	MOV	#56.,R1		;START AT COL 57.
	CALL	FMTMED		;FORMAT 1ST DIGIT OF SECONDS
25$:	MOV	(SP)+,R0	;PICK UP UNITS
	CMP	USEC,R0		;DID TENS POS OF SECS CHANGE?
	BEQ	30$		;BR IF NOT
	MOV	R0,USEC		;UPDATE FOR NEXT TIME
	INC	NEDDIS		;SAY NEED TO DISPLAY
	MOV	#68.,R1		;START AT COL 69.
	CALL	FMTMED		;FORMAT 2ND DIGIT
30$:				;FORMAT DATE
	MOV	TIMBUF+4,R0	;DATE
	CMP	DAY,R0		;CHANGE?
	BEQ	40$		;BR IF NO
	MOV	R0,DAY		;SET UP FOR NEXT TIME
	INC	NEDDIS		;NEED TO DISPLAY
	MOV	#10.,R1
	CALL	$DIV		;DIVIDE BY 10.
	MOV	R1,-(SP)	;SAVE UNITS
	TST	R0		;LEADING ZERO?
	BNE	35$		;BR IF NOT
	MOV	#40,R0		;SUPPRESS
35$:	CLR	R1		;COL #
	CALL	FMTSMA		;FORMAT A SMALL CHAR
	MOV	(SP)+,R0	;PICK UP UNITS DIG
	MOV	#8.,R1		;COL #
	CALL	FMTSMA		;FORMAT
	MOV	#'-,R0		;DASH
	MOV	#18.,R1		;COL #
	CALL	FMTSMA		;FORMAT
40$:				;FORMAT MONTH
	MOV	TIMBUF+2,R0	;PICK UP MONTH
	CMP	MON,R0		;CHANGE?
	BEQ	45$		;BR IF NOT
	MOV	R0,MON		;SAVE
	INC 	NEDDIS		;NEED TO DISPLAY
	DEC	R0		;START AT ZERO
	ASL	R0		;*4
	ASL	R0
	MOVB	MONTAB+2(R0),-(SP) ;SAVE 3RD CHAR
	MOVB	MONTAB+1(R0),-(SP) ;SAVE 2ND
	MOVB	MONTAB(R0),R0	;PICK UP 1ST CHAR
	MOV	#28.,R1		;COL #
	CALL	FMTSMA		;FORMAT
	MOVB	(SP)+,R0	;PICK UP 2ND CHAR
	MOV	#36.,R1		;COL #
	CALL	FMTSMA		;FORMAT
	MOVB	(SP)+,R0	;PICK UP 3RD CHAR
	MOV	#44.,R1		;COL #
	CALL	FMTSMA		;FORMAT
	MOV	#'-,R0		;DASH
	MOV	#54.,R1		;COL #
	CALL	FMTSMA		;FORMAT
45$:				;FORMAT YR
	MOV	TIMBUF,R0	;PICK UP YR
	CMP	YR,R0		;CHANGE?
	BEQ	50$		;BR IF NO
	MOV	R0,YR		;UPDATE
	INC 	NEDDIS		;NEED TO DISPLAY
	MOV	#10.,R1
	CALL	$DIV		;DIVIDE BY 10.
	MOV	R1,-(SP)	;SAVE UNITS
	MOV	#64.,R1		;COL #
	CALL	FMTSMA		;FORMAT
	MOV	(SP)+,R0	;PICK UP UNITS
	MOV	#72.,R1		;COL #
	CALL	FMTSMA		;FORMAT
50$:	RETURN
	.PAGE
;
;	FORMAT A BIG CHARACTER
;
;	CALLING SEQUENCE:
;
;	MOV	#BINVAL,R0	;BINARY VALUE TO FORMAT
;	MOV	#COLNUM-1,R1	;STARTING COLUMN NUMBER (LESS 1)
;	CALL	FMTBIG		;CALL ROUTINE
;
;	NOTES:
;
;	BINARY VALUE MUST BE IN RANGE OF 0-11 OR 40 FOR SPACE (OCTAL BINARY VALUES)
;	COLNUM-1 MUST BE EVEN AND IN RANGE OF 0 THRU MAXCOL-1
;
;	REGISTERS R0,R1,R2,R3 ARE DESTROYED
;
FMTBIG:	ASL	R0		;DOUBLE FOR TABLE LOOKUP
	CMP	#40*2,R0	;SPACE?
	BNE	5$		;BR IF NOT
	MOV	#12*2,R0	;PICK UP TEXT FOR SPACE
5$:	MOV	BIGTAB(R0),R0	;PICK UP ADDR OF TEXT
	MOV	#7,R2		;# OF LINES PER CHARACTER DIVIDED BY 3
10$:	MOV	#8.,R3		;# OF COLUMNS PER CHARACTER DIVIDED BY 2
20$:	MOV	(R0),WRKBUF(R1)	;1ST OF 3 LINES
	MOV	(R0),WRKBUF+MAXCOL(R1) ;2ND
	MOV	(R0)+,WRKBUF+MAXCOL+MAXCOL(R1) ;3RD
	ADD	#2,R1		;POINT TO NEXT PAIR OF CHARS IN WRKBUF
	DEC	R3		;DONE ALL COL'S FOR THIS LINE?
	BNE	20$		;BR IF NO
	ADD	#<MAXCOL*3>-16.,R1	;POINT TO NEXT LINE
	DEC	R2		;DONE ALL LINES?
	BNE	10$		;BR IF NO
	RETURN			;FINI
	.PAGE
;
;	FORMAT A MEDIUM CHARACTER
;
;	CALLING SEQUENCE:
;
;	MOV	#BINVAL,R0	;BINARY VALUE TO FORMAT
;	MOV	#COLNUM-1,R1	;STARTING COLUMN NUMBER (LESS 1)
;	CALL	FMTMED		;CALL ROUTINE
;
;	NOTES:
;
;	BINARY VALUE MUST BE IN RANGE OF 0-11 OR 40 FOR SPACE (OCTAL BINARY VALUES)
;	COLNUM-1 MUST BE EVEN AND IN RANGE OF 0 THRU MAXCOL-1
;
;	REGISTERS R0,R1,R2,R3 ARE DESTROYED
;
FMTMED:	ASL	R0		;DOUBLE FOR TABLE LOOKUP
	CMP	#40*2,R0	;SPACE?
	BNE	5$		;BR IF NOT
	MOV	#12*2,R0	;PICK UP TEXT FOR SPACE
5$:	MOV	MEDTAB(R0),R0	;PICK UP ADDR OF TEXT
	MOV	#7,R2		;# OF LINES PER CHARACTER DIVIDED BY 2
10$:	MOV	#6,R3		;# OF COLUMNS PER CHARACTER DIVIDED BY 2
20$:	MOV	(R0),WRKBUF(R1)	;1ST OF 3 LINES
	MOV	(R0)+,WRKBUF+MAXCOL(R1) ;2ND
	ADD	#2,R1		;POINT TO NEXT PAIR OF CHARS IN WRKBUF
	DEC	R3		;DONE ALL COL'S FOR THIS LINE?
	BNE	20$		;BR IF NO
	ADD	#<MAXCOL*2>-12.,R1	;POINT TO NEXT LINE
	DEC	R2		;DONE ALL LINES?
	BNE	10$		;BR IF NO
	RETURN			;FINI
	.PAGE
;
;	FORMAT A SMALL CHARACTER
;
;	CALLING SEQUENCE:
;
;	MOV	#BINVAL,R0	;BINARY VALUE TO FORMAT
;	MOV	#COLNUM-1,R1	;STARTING COLUMN NUMBER (LESS 1)
;	CALL	FMTSMA		;CALL ROUTINE
;
;	NOTES:
;
;	BINARY VALUE MUST BE IN RANGE OF 0-11 OR 40 FOR SPACE (OCTAL BINARY VALUES)
;	ASCII A-Z OR DASH
;	COLNUM-1 MUST BE EVEN AND IN RANGE OF 0 THRU MAXCOL-1
;
;	REGISTERS R0,R1,R2,R3 ARE DESTROYED
;
FMTSMA:	CMP	#'-,R0		;DASH?
	BNE	2$		;BR IF NO
	MOV	#13,R0		;PICK UP TABLE ENTRY
	BR	5$
2$:	CMP	#' ,R0		;SPACE?
	BNE	3$		;BR IF NOT
	MOV	#12,R0		;CONVERT TO NEEDED VALUE
	BR	5$
3$:	CMP	#'A,R0		;ALPHA?
	BGT	5$		;BR IF NOT
	SUB	#'A-14,R0	;SCALE TO OUR TABLE
5$:	ASL	R0		;DOUBLE FOR TABLE LOOKUP
	MOV	SMATAB(R0),R0	;PICK UP ADDR OF TEXT
	MOV	#7,R2		;# OF LINES PER CHARACTER DIVIDED BY 2
10$:	MOV	#3,R3		;# OF COLUMNS PER CHARACTER DIVIDED BY 2
20$:	MOV	(R0)+,WRKBUF+<MAXCOL*15.>(R1)	;1ST
	ADD	#2,R1		;POINT TO NEXT PAIR OF CHARS IN WRKBUF
	DEC	R3		;DONE ALL COL'S FOR THIS LINE?
	BNE	20$		;BR IF NO
	ADD	#MAXCOL-6,R1	;POINT TO NEXT LINE
	DEC	R2		;DONE ALL LINES?
	BNE	10$		;BR IF NO
	RETURN			;FINI
	.PAGE
;
;	DISPLAY ALL CHARACTERS THAT CHANGED SINCE LAST TIME
;
;	CALLING SEQUENCE:
;
;	CALL	DISPLY
;
;	REGISTERS R0,R1,R2,R3,R4,R5 ARE DESTROYED
;
DISPLY:
	BR	8$		;NOP IF NOT CRT
	MOV	#WRKBUF,R0	;OUTPUT WILL BE PRINTED ON LUN 5
5$:	QIOW$S	#IO.WLB,#5,#2,,,,<R0,#MAXCOL,#40>
	BCS	.
	ADD	#MAXCOL,R0
	CMP	#<MAXCOL*MAXLIN>+WRKBUF,R0
	BNE	5$
	RETURN
;
8$:	CLR	R1		;LINE POSITION
	CLR	R2		;BYTE POSITION
	CLR	R3		;# OF CHARS TO OUTPUT
10$:	CLR	R0		;COL POSITION
20$:	CMPB	WRKBUF(R2),VTBUF(R2) ;ANY CHANGE?
	BEQ	40$		;BR IF NO
	MOVB	WRKBUF(R2),VTBUF(R2) ;UPDATE WORK BUFFER
	TST	R3		;ANY CHARS YET?
	BNE	30$		;BR IF YES
	MOV	R2,R4		;SET UP START OF BUFFER ADDR
	ADD	#VTBUF,R4	;ADD IN BASE OF BUFFER
	MOV	R0,STCOL	;SET UP STARTING COL #
30$:	INC	R3		;NOW 1 ADDITIONAL CHAR TO OUTPUT
	BR	60$		;JOIN COMMON CODE
40$:	TST	R3		;ANY CHARS TO OUTPUT?
	BEQ	60$		;BR IF NO
	CALL	OUTLIN		;OUTPUT A LINE
60$:	INC	R2		;NEXT BYTE
	INC	R0		;NEXT COL
	CMP	#MAXCOL,R0	;DONE ALL COLS?
	BGT	20$		;BR IF NOT
	TST	R3		;ANY CHARS TO OUTPUT?
	BEQ	70$		;BR IF NO
	CALL	OUTLIN		;OUTPUT 1 LINE
70$:	INC	R1		;NEXT LINE
	CMP	#MAXLIN-1,R1	;DONE ALL LINES?
	BNE	10$		;BR IF NO
	MOV	#2,HOMDPB+Q.IOPL+2 ;SET UP TO HOME CURSOR
	DIR$	#HOMDPB,DIRERR	;HOME IT
	MOV	#6,HOMDPB+Q.IOPL+2 ;RESET CHAR COUNT
	RETURN			;FINI
	.PAGE
;
;	OUTPUT 1 LINE TO CRT
;
;	CALLING SEQUENCE
;
;	MOV	#NUMCHR,R3	;# OF CHARACTERS TO DISPLAY
;	MOV	#LINNUM,R1	;LINE NUMBER
;	CALL	OUTLIN		;CALL ROUTINE
;
;	REGISTERS R3,R4,R5 ARE DESTROYED
;
OUTLIN:	MOV	R3,NUMCHR	;SAVE # OF CHARS
	MOV	#OUTBUF+2,R5	;WHERE TO STUFF DATA
	MOVB	R1,(R5)+	;SET UP LINE #
	MOVB	STCOL,(R5)+	;SET UP COL #
	ADD	#20040,OUTBUF+2	;PART OF CURSOR ADDRESS
10$:	MOVB	(R4)+,(R5)+	;COPY A CHAR
	DEC	R3		;DONE?
	BNE	10$		;BR IF NOT
	ADD	#4,NUMCHR	;ADD IN CURSOR CONTROL
	DIR$	#OUTDPB,DIRERR	;QIO TO TERMINAL
				;NOTE R3=0
	RETURN			;FINI
	.PAGE
;
;	UNSOLICITED INPUT PROCESSING
;
ATAAST:	CMPB	#170,(SP)	;X (LOWER CASE)=EXIT
	BEQ	5$		;BR IF YES
	CMPB	#3,(SP)		;CONTROL C=EXIT
	BEQ	5$		;BR IF YES
	CMPB	#'X,(SP)	;X=EXIT
	BNE	10$		;BR IF NOT
5$:	MOVB	#200,TYPEN	;INDICATE EXIT
	BR	100$		;JOIN COMMON CODE
10$:	CMPB	#15,(SP)	;RETURN KEY?
	BNE	30$		;BR IF NOT
	CMPB	#1,TYPEN	;CHANGE MODE
	BEQ	20$
	MOVB	#1,TYPEN
	BR	100$
20$:	MOVB	#2,TYPEN
	BR	100$
30$:	BISB	#100,TYPEN	;INDICATE ILLEGAL CHAR ENTERED
100$:	TST	(SP)+		;POP CHARACTER
	ASTX$S	DIRERR		;EXIT AST
;
;	DIRECTIVE ERROR
;
DIRERR:	MOV	$DSW,R0		;PICK UP REASON
	MOV	(SP)+,R1	;PICK UP RET ADDR
	BPT			;CRASH TASK
	.PAGE
;
;	MACRO'S AND IMPURE AREA
;
OUTDPB:	QIOW$	IO.WAL,5,2,,,,<OUTBUF,0>
NUMCHR=OUTDPB+Q.IOPL+2		;NUMBER OF CHARACTERS
HOMDPB:	QIOW$	IO.WAL,5,2,,,,<HOMBUF,6>
ATADPB:	QIOW$	IO.ATA,5,2,,,,<ATAAST> ;ATTATCH TO UNSOLICITED INPUT
HOMBUF:	.BYTE	33,'H,33,'J,33,'H	;HOME CURSOR, ERASE, HOME
ENDDPB:	QIOW$	IO.WAL,5,2,,,,<MSG2,MSG2L>
OUTBUF:	.BYTE	33,'Y,0,0	;ESC, 'Y, LIN#, COL#
	.BLKB	MAXCOL		;BUFFER FOR 1 LINE
	.EVEN
GETMCR:	GMCR$			;GET MCR BUFFER (TO FREE UP DSR)
.=GETMCR+2			;OVERLAP MCRBUF+WRKBUF
WRKBUF:	.BLKB	MAXLIN*MAXCOL	;WORKING BUFFER
VTBUF:	.BLKB	MAXLIN*MAXCOL	;ACTUAL VT BUFFER TO DISPLAY
TIMBUF:	.BLKW	8.		;BUFFER TO SAVE TIME INFO
TYPEN:	.BYTE	0		;NEW TYPE, 1=HH:MM, 2=HH:MM:SS, 200=EXIT
				;100=ILLEGAL CHAR ENTERED
TYPEO:	.BYTE	0		;OLD TYPE (SAME AS ABOVE)
STCOL:	.WORD	0		;STARTING COLUMN #
HR:	.WORD	0		;LAST HOUR
TMIN:	.WORD	0		;LAST MINUTE (TENS POS)
UMIN:	.WORD	0		;LAST MIN (UNITS POS)
TSEC:	.WORD	0		;LAST SECOND (TENS POS)
USEC:	.WORD	0		;LAST SEC (UNITS POS)
DAY:	.WORD	0		;LAST DAY
MON:	.WORD	0		;LAST MONTH
YR:	.WORD	0		;LAST YEAR
NEDDIS:	.WORD	0		;0=DON'T NEED TO DISPLAY, OTHERWISE DISPLAY
HMTAB:	.WORD	WRKBUF+<MAXCOL*7>+37. ;FORM COLON BETWEEN HRS + MINS
	.WORD	WRKBUF+<MAXCOL*7>+38.
	.WORD	WRKBUF+<MAXCOL*8.>+37.
	.WORD	WRKBUF+<MAXCOL*8.>+38.
	.WORD	WRKBUF+<MAXCOL*15.>+37.
	.WORD	WRKBUF+<MAXCOL*15.>+38.
	.WORD	WRKBUF+<MAXCOL*16.>+37.
	.WORD	WRKBUF+<MAXCOL*16.>+38.
	.WORD	0
;
HMSTAB:	.WORD	WRKBUF+<MAXCOL*4>+24.	;FORM COLLON FOR HH:MM:SS
	.WORD	WRKBUF+<MAXCOL*4>+25.
	.WORD	WRKBUF+<MAXCOL*5>+24.
	.WORD	WRKBUF+<MAXCOL*5>+25.
	.WORD	WRKBUF+<MAXCOL*9.>+24.
	.WORD	WRKBUF+<MAXCOL*9.>+25.
	.WORD	WRKBUF+<MAXCOL*10.>+24.
	.WORD	WRKBUF+<MAXCOL*10.>+25.
	.WORD	WRKBUF+<MAXCOL*4>+52.
	.WORD	WRKBUF+<MAXCOL*4>+53.
	.WORD	WRKBUF+<MAXCOL*5>+52.
	.WORD	WRKBUF+<MAXCOL*5>+53.
	.WORD	WRKBUF+<MAXCOL*9.>+52.
	.WORD	WRKBUF+<MAXCOL*9.>+53.
	.WORD	WRKBUF+<MAXCOL*10.>+52.
	.WORD	WRKBUF+<MAXCOL*10.>+53.
	.WORD	0
	.PAGE
	.NLIST	BEX
;
;	MONTH TABLE
;
MONTAB:	.ASCII	/JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC /
;
;	BIG CHARACTER DATA
;
BIGTAB:	.WORD	BIG0,BIG1,BIG2,BIG3,BIG4,BIG5
	.WORD	BIG6,BIG7,BIG8,BIG9,BIGSP
;
BIG0:	.ASCII	/   XXXXXXXXX    /
	.ASCII	/XXX         XXX /
	.ASCII	/XXX         XXX /
	.ASCII	/XXX         XXX /
	.ASCII	/XXX         XXX /
	.ASCII	/XXX         XXX /
	.ASCII	/   XXXXXXXXX    /
;
BIG1:	.ASCII	/      XXX       /
	.ASCII	/   XXXXXX       /
	.ASCII	/      XXX       /
	.ASCII	/      XXX       /
	.ASCII	/      XXX       /
	.ASCII	/      XXX       /
	.ASCII	/   XXXXXXXXX    /
;
BIG2:	.ASCII	/   XXXXXXXXX    /
	.ASCII	/XXX         XXX /
	.ASCII	/            XXX /
	.ASCII	/         XXX    /
	.ASCII	/      XXX       /
	.ASCII	/   XXX          /
	.ASCII	/XXXXXXXXXXXXXXX /
;
BIG3:	.ASCII	/   XXXXXXXXX    /
	.ASCII	/XXX         XXX /
	.ASCII	/            XXX /
	.ASCII	/         XXX    /
	.ASCII	/            XXX /
	.ASCII	/XXX         XXX /
	.ASCII	/   XXXXXXXXX    /
;
BIG4:	.ASCII	/XXX      XXX    /
	.ASCII	/XXX      XXX    /
	.ASCII	/XXX      XXX    /
	.ASCII	/XXXXXXXXXXXXXXX /
	.ASCII	/         XXX    /
	.ASCII	/         XXX    /
	.ASCII	/         XXX    /
;
BIG5:	.ASCII	/XXXXXXXXXXXXXXX /
	.ASCII	/XXX             /
	.ASCII	/XXXXXXXXX       /
	.ASCII	/         XXX    /
	.ASCII	/            XXX /
	.ASCII	/XXX         XXX /
	.ASCII	/   XXXXXXXXX    /
;
BIG6:	.ASCII	/   XXXXXXXXX    /
	.ASCII	/XXX             /
	.ASCII	/XXX             /
	.ASCII	/XXXXXXXXXXXX    /
	.ASCII	/XXX         XXX /
	.ASCII	/XXX         XXX /
	.ASCII	/   XXXXXXXXX    /
;
BIG7:	.ASCII	/XXXXXXXXXXXX    /
	.ASCII	/            XXX /
	.ASCII	/            XXX /
	.ASCII	/         XXX    /
	.ASCII	/      XXX       /
	.ASCII	/   XXX          /
	.ASCII	/XXX             /
;
BIG8:	.ASCII	/   XXXXXXXXX    /
	.ASCII	/XXX         XXX /
	.ASCII	/XXX         XXX /
	.ASCII	/   XXXXXXXXX    /
	.ASCII	/XXX         XXX /
	.ASCII	/XXX         XXX /
	.ASCII	/   XXXXXXXXX    /
;
BIG9:	.ASCII	/   XXXXXXXXX    /
	.ASCII	/XXX         XXX /
	.ASCII	/XXX         XXX /
	.ASCII	/   XXXXXXXXXXXX /
	.ASCII	/            XXX /
	.ASCII	/            XXX /
	.ASCII	/   XXXXXXXXX    /
;
BIGSP:	.REPT	7
	.ASCII	/                /	;SPACE
	.ENDR
;
;	MEDIUM CHARACTER DATA
;
MEDTAB:	.WORD	MED0,MED1,MED2,MED3,MED4,MED5
	.WORD	MED6,MED7,MED8,MED9,MEDSP
;
MED0:	.ASCII	/   XXXXXX   /
	.ASCII	/ XX      XX /
	.ASCII	/ XX      XX /
	.ASCII	/ XX      XX /
	.ASCII	/ XX      XX /
	.ASCII	/ XX      XX /
	.ASCII	/   XXXXXX   /
;
MED1:	.ASCII	/     XX     /
	.ASCII	/   XXXX     /
	.ASCII	/     XX     /
	.ASCII	/     XX     /
	.ASCII	/     XX     /
	.ASCII	/     XX     /
	.ASCII	/   XXXXXX   /
;
MED2:	.ASCII	/   XXXXXX   /
	.ASCII	/ XX      XX /
	.ASCII	/         XX /
	.ASCII	/       XX   /
	.ASCII	/     XX     /
	.ASCII	/   XX       /
	.ASCII	/ XXXXXXXXXX /
;
MED3:	.ASCII	/   XXXXXX   /
	.ASCII	/ XX      XX /
	.ASCII	/         XX /
	.ASCII	/       XX   /
	.ASCII	/         XX /
	.ASCII	/ XX      XX /
	.ASCII	/   XXXXXX   /
;
MED4:	.ASCII	/ XX    XX   /
	.ASCII	/ XX    XX   /
	.ASCII	/ XX    XX   /
	.ASCII	/ XXXXXXXXXX /
	.ASCII	/       XX   /
	.ASCII	/       XX   /
	.ASCII	/       XX   /
;
MED5:	.ASCII	/ XXXXXXXXXX /
	.ASCII	/ XX         /
	.ASCII	/ XXXXXX     /
	.ASCII	/       XX   /
	.ASCII	/         XX /
	.ASCII	/ XX      XX /
	.ASCII	/   XXXXXX   /
;
MED6:	.ASCII	/   XXXXXX   /
	.ASCII	/ XX         /
	.ASCII	/ XX         /
	.ASCII	/ XXXXXXXX   /
	.ASCII	/ XX      XX /
	.ASCII	/ XX      XX /
	.ASCII	/   XXXXXX   /
;
MED7:	.ASCII	/ XXXXXXXX   /
	.ASCII	/         XX /
	.ASCII	/         XX /
	.ASCII	/       XX   /
	.ASCII	/     XX     /
	.ASCII	/   XX       /
	.ASCII	/ XX         /
;
MED8:	.ASCII	/   XXXXXX   /
	.ASCII	/ XX      XX /
	.ASCII	/ XX      XX /
	.ASCII	/   XXXXXX   /
	.ASCII	/ XX      XX /
	.ASCII	/ XX      XX /
	.ASCII	/   XXXXXX   /
;
MED9:	.ASCII	/   XXXXXX   /
	.ASCII	/ XX      XX /
	.ASCII	/ XX      XX /
	.ASCII	/   XXXXXXXX /
	.ASCII	/         XX /
	.ASCII	/         XX /
	.ASCII	/   XXXXXX   /
;
MEDSP:	.REPT	7
	.ASCII	/            /	;SPACE
	.ENDR
;
;	SMALL CHARACTER DATA
;
SMATAB:	.WORD	SMA0,SMA1,SMA2,SMA3,SMA4,SMA5
	.WORD	SMA6,SMA7,SMA8,SMA9,SMASP,SMADAS
	.WORD	SMAA,SMAB,SMAC,SMAD,SMAE,SMAF,SMAG,SMAH,SMAI,SMAJ,SMAK,SMAL,SMAM
	.WORD	SMAN,SMAO,SMAP,SMAQ,SMAR,SMAS,SMAT,SMAU,SMAV,SMAW,SMAX,SMAY,SMAZ
;
SMA0:	.ASCII	/ XXX  /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/ XXX  /
;
SMA1:	.ASCII	/  X   /
	.ASCII	/ XX   /
	.ASCII	/  X   /
	.ASCII	/  X   /
	.ASCII	/  X   /
	.ASCII	/  X   /
	.ASCII	/ XXX  /
;
SMA2:	.ASCII	/ XXX  /
	.ASCII	/X   X /
	.ASCII	/    X /
	.ASCII	/   X  /
	.ASCII	/  X   /
	.ASCII	/ X    /
	.ASCII	/XXXXX /
;
SMA3:	.ASCII	/ XXX  /
	.ASCII	/X   X /
	.ASCII	/    X /
	.ASCII	/   X  /
	.ASCII	/    X /
	.ASCII	/X   X /
	.ASCII	/ XXX  /
;
SMA4:	.ASCII	/X  X  /
	.ASCII	/X  X  /
	.ASCII	/X  X  /
	.ASCII	/XXXXX /
	.ASCII	/   X  /
	.ASCII	/   X  /
	.ASCII	/   X  /
;
SMA5:	.ASCII	/XXXXX /
	.ASCII	/X     /
	.ASCII	/XXX   /
	.ASCII	/   X  /
	.ASCII	/    X /
	.ASCII	/X   X /
	.ASCII	/ XXX  /
;
SMA6:	.ASCII	/ XXX  /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/XXXX  /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/ XXX  /
;
SMA7:	.ASCII	/XXXX  /
	.ASCII	/    X /
	.ASCII	/    X /
	.ASCII	/   X  /
	.ASCII	/  X   /
	.ASCII	/ X    /
	.ASCII	/X     /
;
SMA8:	.ASCII	/ XXX  /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/ XXX  /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/ XXX  /
;
SMA9:	.ASCII	/ XXX  /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/ XXXX /
	.ASCII	/    X /
	.ASCII	/    X /
	.ASCII	/ XXX  /
;
SMASP:	.REPT	7
	.ASCII	/      /	;SPACE
	.ENDR
;
SMADAS:	.ASCII	/      /	;DASH
	.ASCII	/      /
	.ASCII	/      /
	.ASCII	/XXXXX /
	.ASCII	/      /
	.ASCII	/      /
	.ASCII	/      /
;
SMAA:	.ASCII	/ XXX  /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/XXXXX /
	.ASCII	/X   X /
	.ASCII	/X   X /
;
SMAB:	.ASCII	/XXXX  /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/XXXX  /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/XXXX  /
;
SMAC:	.ASCII	/ XXXX /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/ XXXX /
;
SMAD:	.ASCII	/XXXX  /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/XXXX  /
;
SMAE:	.ASCII	/XXXXX /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/XXXX  /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/XXXXX /
;
SMAF:	.ASCII	/XXXXX /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/XXXX  /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/X     /
;
SMAG:	.ASCII	/ XXXX /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/X XXX /
	.ASCII	/X   X /
	.ASCII	/ XXX  /
;
SMAH:	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/XXXXX /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
;
SMAI:	.ASCII	/ XXX  /
	.ASCII	/  X   /
	.ASCII	/  X   /
	.ASCII	/  X   /
	.ASCII	/  X   /
	.ASCII	/  X   /
	.ASCII	/ XXX  /
;
SMAJ:	.ASCII	/    X /
	.ASCII	/    X /
	.ASCII	/    X /
	.ASCII	/    X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/ XXX  /
;
SMAK:	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X  X  /
	.ASCII	/XXX   /
	.ASCII	/X  X  /
	.ASCII	/X   X /
	.ASCII	/X   X /
;
SMAL:	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/XXXXX /
;
SMAM:	.ASCII	/X   X /
	.ASCII	/XX XX /
	.ASCII	/X X X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
;
SMAN:	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/XX  X /
	.ASCII	/X X X /
	.ASCII	/X  XX /
	.ASCII	/X   X /
	.ASCII	/X   X /
;
SMAO:	.ASCII	/ XXX  /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/ XXX  /
;
SMAP:	.ASCII	/XXXX  /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/XXXX  /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/X     /
;
SMAQ:	.ASCII	/ XXX  /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X X X /
	.ASCII	/X  X  /
	.ASCII	/ XX X /
;
SMAR:	.ASCII	/XXXX  /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/XXXX  /
	.ASCII	/X X   /
	.ASCII	/X  X  /
	.ASCII	/X   X /
;
SMAS:	.ASCII	/ XXXX /
	.ASCII	/X     /
	.ASCII	/X     /
	.ASCII	/ XXX  /
	.ASCII	/    X /
	.ASCII	/    X /
	.ASCII	/XXXX  /
;
SMAT:	.ASCII	/XXXXX /
	.ASCII	/  X   /
	.ASCII	/  X   /
	.ASCII	/  X   /
	.ASCII	/  X   /
	.ASCII	/  X   /
	.ASCII	/  X   /
;
SMAU:	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/XXXXX /
;
SMAV:	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/ X X  /
	.ASCII	/  X   /
;
SMAW:	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/X X X /
	.ASCII	/XX XX /
	.ASCII	/X   X /
;
SMAX:	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/ X X  /
	.ASCII	/  X   /
	.ASCII	/ X X  /
	.ASCII	/X   X /
	.ASCII	/X   X /
;
SMAY:	.ASCII	/X   X /
	.ASCII	/X   X /
	.ASCII	/ X X  /
	.ASCII	/  X   /
	.ASCII	/  X   /
	.ASCII	/  X   /
	.ASCII	/  X   /
;
SMAZ:	.ASCII	/XXXXX /
	.ASCII	/    X /
	.ASCII	/   X  /
	.ASCII	/  X   /
	.ASCII	/ X    /
	.ASCII	/X     /
	.ASCII	/XXXXX /
;
MSG1:	.ASCIZ	?ENTER X OR CTRL/C TO EXIT, RETURN KEY TO CHANGE MODE?
MSG2:	.BYTE	33,'H,33,'J,33,'H	;HOME, ERASE, HOME
MSG2L=.-MSG2
	.EVEN
	.END	START
