                             ; CP/M FILE LISTING FACILITY, INCUDING
                             ; AUTOMATIC PRINTING OF TIME AND DATE
                             ; USING COMPU/TIME T-102 CLOCK BOARD
                             ;
                             ; ver. 1.1.A  12/02/79 - HARRY KAEMMERER
                             ; TEL. NY TIME 201-221-2297
                             ;
                             ; BASED ON VER. 1.1 4/17/79 BY DENNIS THOVSON
                             ;
                             ; Based on ver. 2.0 of IMSAI's IMDOS 
                             ; File List Facility
                             ;
                             ; FCB FOR FILE MUST BE SET UP BEFORE ENTRY
                             ; i.e. "TLIST FILENAME.TYP" Command
                             ; DO NOT ENTER AMBIGUOUS (? or *) FILENAME
                             ; OR TYPE
                             ;
                             ; Default Title is FILENAME.TYP +
                             ; any additional information (up to 48
                             ; characters) appended to the entry command.
                             ;
                             ; Optional Title and Subtitle may be
                             ; entered after Entry Command is executed.
                             ;
PGSIZ	EQU   65             ;NO. OF LINES PER PAGE
PPPAGE	EQU   60             ;NO. OF LINES TO PRINT PER PAGE
PNOCOL	EQU   64             ;COLUMN "PAGE" AND NUMBER
RESET	EQU   0CH            ;FF CLEARS SCREEN ON MY CONSOLE
                             ;SYSTEM CALL FUNCTION NUMBERS
CLK     EQU   0C0H           ;MY CLOCK BOARD ADDRESS PORT
CONIN	EQU   1              ;CONSOLE INPUT CHAR
CONOUT	EQU   2              ;CONSOLE OUTPUT CHAR (E)
CONRDY	EQU   11             ;CONSOLE CHARACTER READY TEST
BUFFRD	EQU   10             ;BUFFERED READ COMMAND
PRINT	EQU   9              ;PRINT STRING (DE) TO $
LIST	EQU   5              ;OUT CHAR (E) TO LST: DEVICE
OPEN	EQU   15             ;OPEN FILE CONTROL BLOCK
READ	EQU   20             ;READ NEXT SEQUENTIAL RECORD
BDOS	EQU   05H            ;SYSTEM CALL ENTRY POINT
FCB	EQU   5CH            ;DEFAULT FILE CONTROL BLOCK
NR	EQU   FCB+32         ;NEXT RECORD TO READ
TBUFF	EQU   80H            ;WHERE CCP PUTS COMMAND LINE
DEFBUF	EQU   80H            ;WHERE SECTORS ARE READ
TBASE	EQU   100H           ;TRANSIENT PROGRAM BASE
                             ;EQUATES FOR ASCII CONTROL CHARACTERS
TAB	EQU   9              ;CONTROL I (HT) TAB.
LF	EQU   0AH            ;LINE FEED
FF	EQU   0CH            ;FORM FEED
ALTFF	EQU   0BH            ;CONTROL K (VT) ALSO CAUSES FF
CR	EQU   0DH            ;CARRIAGE RETURN
CTRLZ	EQU   1AH            ;CONTROL Z. EOF.
                             ;
                             ;
	ORG   TBASE          ;ENTRY POINT 
                             ;
TLIST:	JMP   LISTGO         ;NORMAL ENTRY
	LXI   SP,DSTACK      ;DDT DEBUGGING ENTRY
	CALL  LISTGO         ;USE "I" COM'D TO SET FILE NAME
	RST   7              ;RETURN TO DDT
                             ;
                             ;MAIN PROGRAM BEGINS HERE
LISTGO:	LXI   H,0            ;
	DAD   SP             ;
	SHLD  CALRSP         ;
	LXI   SP,STACK       ;
                             ;
                             ;SIGN-ON MESSAGES
                             ;
	LXI   D,CMSG1        ;MESSAGE 1 TO CONSLOLE
	CALL  PCOMSG         ;
                             ;PRINT DEFAULT TITLE ON CONSOLE
	LXI   H,TBUFF        ;GET DEFAULT TITLE
	MOV   B,M            ;HOW MANY CHARACTERS
TLTOUT:	DCR   B              ;	
	JM    TLTEND         ;
	INX   H              ;
	MOV   A,M            ;
	CALL  CONO           ;PRINT TITLE ON CONSOLE
	JNZ   TLTOUT         ;DO IT ALL
TLTEND: LXI   D,CMSG2        ;CONSOLE MESSAGE 2
	CALL  PCOMSG         ;
	MVI   C,CONIN        ;GET CHAR. FROM CONSOLE
	CALL  BDOS           ;
	CPI   CR             ;IS IT A CR ?
	JNZ   LTE1           ;
	CALL  TITL1          ;DEFAULT TITLE
	JMP   NSTEND         ;
LTE1:	CPI   'Y'            ;IS IT A YES ?
	JNZ   TLTEND         ;ASK AGAIN IF NOT
	LXI   D,CMSG4        ;CONSOLE MESSAGE 4
	CALL  PCOMSG         ;
                             ;GET NEW TITLE
	LXI   D,RDBUFF       ;
	MVI   A,60           ;LENGTH OF TITLE
	STAX  D              ;
	MVI   C,BUFFRD       ;
	CALL  BDOS           ;GET NEW TITLE
	LXI   H,RDBUFF+1     ;SEE IF ANY CHARS.
	MOV   A,M            ;
	CPI   0              ;
	JNZ   NBE1           ;
	CALL  TITL1          ;DEFAULT TITLE
	JMP   NTEND          ;
NBE1:	LXI   D,TTLBUF       ;MOVE NEW TITLE TO
	MOV   C,A            ;BUFFER
	MVI   B,60           ;
	CALL  TITLUP         ;DO IT
NTEND:                       ;
NSTBEG:	LXI   D,CMSG6        ;CONSOLE MESSAGE 6
	CALL  PCOMSG         ;
	LXI   H,STLBUF       ;SUBTITLE OUTPUT BUFFER POINTER
	SHLD  SBTPNT         ;
	XRA   A              ;
	STA   SUBTF          ;SET SUBTITLE FLAG TO 0
GSBTL:	LXI   D,RDBUFF       ;BUFFERED READ THRU CP/M
	MVI   A,80           ;
	STAX  D              ;
	MVI   C,BUFFRD       ;
	CALL  BDOS           ;
	LXI   H,RDBUFF       ;
	LDA   RDBUFF+1       ;NO. OF CHARS. THIS LINE
	CPI   0	             ;SEE IF ANY CHARS.
	JZ    NSTEND         ;NO, IGNORE SUBTITLE
	INR   A              ;
	MVI   D,0            ;
	MOV   E,A            ;
	DAD   D	             ;ADDRESS OF LAST CHAR.
	MOV   A,M            ;
	CPI   1AH            ;IS IT A CONTROL Z ?
	JZ    GSB1           ;YES, MORE TO DO
	INX   H	             ;ADD 0 TO END
	MVI   M,0            ;END OF SUBTITLE
	CALL  SASBTL         ;PUT LINE IN BUFFER
	MVI   A,0FFH         ;
	STA   SUBTF          ;SET FLAG
	JMP   NSTEND         ;ALL DONE
GSB1:	MVI   M,0DH          ;CR, OVERWRITE CONTROL Z
	INX   H              ;
	MVI   M,0AH          ;LF
	CALL  SASBTL         ;PUT LINE IN BUFFER
	MVI   A,LF           ;
	CALL  CONO           ;SEND A LF TO CONSOLE
	JMP   GSBTL          ;GET NEXT LINE
SASBTL:	LHLD  SBTPNT         ;WHERE SUBTITLE GOES
	XCHG                 ;
	LXI   H,RDBUFF+1     ;NO. OF CHARS IN LINE
	MOV   B,M            ;
	INR   B	             ;ADD 1 FOR LF OR 0
SAS1:	INX   H	             ;MOVE LINE TO BUFFER
	MOV   A,M            ;
	STAX  D              ;
	INX   D              ;
	DCR   B              ;
	JNZ   SAS1           ;
	XCHG                 ;
	SHLD  SBTPNT         ;SAVE SUBTITLE BUFF. PTR.
	RET                  ;
                             ;
NSTEND:	LXI   D,CMSG7        ;CONSOLE MESSAGE 7
	CALL  PCOMSG         ;
	MVI   C,CONIN        ;
	CALL  BDOS           ;
	CPI   CR             ;
	JNZ   NSTEND         ;
	JMP   TITL9          ;
                             ;SET UP DEFAULT TITLE.  TITLE CONSISTS OF FILE
                             ;NAME AND ANYTHING USER TYPES AFTER IT.
TITL1:	LXI   H,TTLBUF       ;WHERE TO PUT TEXT
	XCHG                 ;
	LXI   H,TBUFF        ;WHERE CCP LEFT TEXT
	MOV   C,M            ;NUMBER OF CHARS IN TBUFF
	INX   H	             ;DISCARD LEADING ' '
	DCR   C              ;
	MVI   B,60           ;MAX # CHARS TO USE
	CALL  TITLUP         ;
	RET                  ;
                             ;COPY TEXT
TITLUP:	DCR   C              ;
	JM    TITL2          ;STOP IF INPUT USED UP
	INX   H              ;
	MOV   A,M            ;
	STAX  D              ;
	INX   D	             ;MOVE 1 CHARACTER
	DCR   B              ;
	JNZ   TITLUP         ;STOP AT MAX # CHARS
                             ;TERMINATE WITH 0
TITL2:	XRA   A              ;
	STAX  D              ;
	RET                  ;
                             ;MAKE SURE NO ?'S IN FILE NAME: IF AFN IS GIVEN
                             ;DIRECTORY ENTRIES GET CHANGED TO ?'S ON AUTOMATIC
                             ;CLOSES ON GOING TO NEXT EXTENT, AND SUCCESSIVE
                             ;EXTENTS ARE NOT NECESSARILY OF THE SAME FILE.
                             ;CCP TRANSLATES *'S TO MULTIPLE ?'S.
TITL9:	LXI   H,FCB          ;WHERE NAME IS
	MVI   C,11           ;NUMBER OF CHARS
	LXI   D,EMQUES       ;MESSAGE TO USE IF ? FOUND
QLUP:	INX   H	             ;POINT NEXT CHARACTER
	MOV   A,M            ;GET CHARACTER
	CPI   '?'            ;
	JZ    TERM           ;JMP IF ?
	DCR   C	             ;COUNT CHARACTERS TO TEST
	JNZ   QLUP           ;LOOP BACK UNLESS DONE
                             ;OPEN FILE
	MVI   C,OPEN         ;
	LXI   D,FCB          ;
	CALL  BDOS           ;CALL SYSTEM
	CPI   255            ;
	LXI   D,EMFNF        ;MESSAGE IF ERROR
	JZ    TERM           ;IF NOT FOUND, ERROR EXIT
	XRA   A              ;
	STA   NR             ;SAY START AT RECORD 0
	STA   ICOUNT         ;SAY EMPTY INPUT BUFFER
                             ;INITIALIZE OUTPUT
	XRA   A              ;
	STA   COL            ;
	STA   LINE           ;INIT CURSOR POSITION
	STA   PAGE+1         ;
	INR   A              ;
	STA   PAGE           ;.. PAGE STARTS AT DW 1
                             ;POSTION PAPER TO FIRST LINE BEFORE CALLING
                             ;LIST. THE NEXT PROGRAM SEGMENT WILL SPACE
                             ;DOWN TO THE 4th LINE AND PRINT TITLE
                             ;(SUBTITLE) INFORMATION.
	MVI   B,3            ;SEND 3 LINE FEEDS
TOPPAG:	PUSH  B              ;
	MVI   A,LF           ;
	CALL  LOCH           ;
	POP   B              ;
	DCR   B              ;
	XRA   A              ;
	CMP   B              ;
	JNZ   TOPPAG         ;
                             ;PRINT TITLE AND SUBTITLE FOR FIRST PAGE
	CALL  PTITL          ;
                             ;IGNORE ANY CR'S, LF'S, FORM FEEDS, ECT.
                             ;AT BEGINNING OF FILE.
	CALL  IGNORE         ;IGNORE FF'S ETC.
	JMP   CLOOP1         ;ENTER CHARACTER LOOP
                             ;MAIN PROGRAM CONTROL LOOP STARTS HERE
CLOOP:	CALL  INCH           ;GET CHARACTER
CLOOP1:	PUSH  B              ;
	PUSH  H              ;
	CALL  LSTCH          ;PROCESS  & LIST 1 CHAR
                             ;CHECK CONSOLE STATUS
	MVI   C,CONRDY       ;
	CALL  BDOS           ;
	RAR                  ;TEST LSB
	CC    CHKCON         ;SEE WHAT CONSOLE WANTS
	POP   H              ;
	POP   B              ;
	JMP   CLOOP          ;
                             ;CONSOLE CONTROL ROUTINE
CHKCON:	MVI   C,CONIN        ;
	CALL  BDOS           ;GET CHARACTER
	CPI   15H            ;IS IT A CONTROL U ?
	JZ    EOF            ;
	CPI   13H            ;IS IT A CONTROL S ?
	RNZ                  ;RETURN IF NOT
CON1:	MVI   C,CONRDY       ;
	CALL  BDOS           ;
	RAR                  ;
	JNC   CON1           ;WAIT FOR CONSOLE
	MVI   C,CONIN        ;
	CALL  BDOS           ;WHAT IS IT ?
	CPI   13H            ;
	RZ                   ;START LIST AGAIN
	CPI   15H            ;WANT TO ABORT ?
	JZ    EOF            ;ABORT
	JMP   CON1           ;WAIT FOR ANOTHER CHAR
                             ;END OF FILE.  FORM FEED AND EXIT.
                             ;OUTPUT FF WITHOUT TITLE
EOF:	CALL  LFFSUB         ;
                             ;EXIT ROUTINE
EXIT:	LHLD  CALRSP         ;ENTRY STACK POINTER
	SPHL                 ;RESET SP FOR CCP
	MVI   A,0            ;SAY NO ERROR
	RET                  ;
                             ;ERROR STUFF
NSERR:	LXI   D,MERR         ;MISCELLANEOUS ERRORS
                             ;COME HERE WITH DE POINTING TO TEXT
TERM:	MVI   C,PRINT        ;
	CALL  BDOS           ;
	JMP   EXIT           ;
                             ;READ NEW RECORD FROM OPEN FILE
NEWREC:	MVI   C,READ         ;
	LXI   D,FCB          ;
	CALL  BDOS           ;READ RECORD
	CPI   1              ;
	JZ    EOF            ;IF END OF FILE
	ORA   A              ;
	JNZ   NSERR          ;GOOD RETURN FROM BDOS ?
	LXI   H,ICOUNT       ;
	MVI   M,128          ;INIT BUFFER COUNTER
	LXI   H,DEFBUF       ;
	SHLD  IPOINT         ;INIT BUFFFER POINTER
	POP   H              ;
                             ;ENTRY POINT
INCH:	PUSH  H              ;
	LXI   H,ICOUNT       ;
	DCR   M	             ;COUNT CHARS USED FROM RECORD
	JM    NEWREC         ;NEED ANOTHER RECORD
	LHLD  IPOINT         ;GET BUFFER POINTER
	MOV   A,M            ;FETCH CHARACTER
	CPI   CTRLZ          ;
	JZ    EOF            ;GO DIRECT TO EOF ROUTINE
	INX   H              ;
	SHLD  IPOINT         ;POINT NEXT
	POP   H              ;
	RET                  ;
                             ;LIST CHAR IN A WITH PROCESSING OF SPECIAL CHARS
                             ;KEEPS TRACK OF COLUMN, LINE, PAGE.
                             ;EXPANDS TABS WITH STOPS EVERY 8 COLUMNS
                             ;SIMULATES FORM FEEDS WITH LINE FEEDS.
LSTCH:	LXI   H,COL          ;INCREMENT COLUMN COUNTER
	INR   M              ;
                             ;KILL PARITY BIT IN CHARS. FROM  FILE.
                             ;(NOTE: ELSE CERTAIN CHARS CAN PRODUCE
                             ;INFINITE LOOP OF ^'S.)
	ANI   7FH            ;
                             ;SPACE OR GREATER ASCII CODE JUST GETS PRINTED
	CPI   ' '            ;
	JP    LOCH           ;GO PRINT IT
	DCR   M	             ;ELSE RESTORE COLUMN COUNTER
                             ;PROCESS SPECIALS
	PUSH  PSW            ;
	CPI   CR             ;
	JNZ   LSC2           ;
	XRA   A              ;
	STA   COL            ;
POPLOC:	POP   PSW            ;GET CHAR BACK
	JMP   LOCH           ;GO LIST IT
LSC2:	CPI   LF             ;
	JNZ   LSC3           ;
	LDA   LINE           ;
	CPI   PPPAGE-1       ;
	JP    LISFF          ;PAGE FULL, MAKE LIKE FF
	POP   PSW            ;CLEAR STACK AND PROCEED
                             ;PROCESS AND PRINT LINE FEED
LISLF:	PUSH  PSW            ;
	MVI   A,LF           ;
	CALL  LOCH           ;OUTPUT LINE FEED
	LDA   LINE           ;
	INR   A	             ;LINE+1
	CPI   PGSIZ          ;
	JM    LSC2A          ;IF BOTTOM OF PAGE, MAKE IT..
	XRA   A	             ;..TOP OF NEXT PAGE.
	LHLD  PAGE           ;
	INX   H              ;
	SHLD  PAGE           ;
LSC2A:	STA   LINE           ;
	POP   PSW            ;
	RET                  ;
                             ;
LSC3:	CPI   ALTFF          ;
	JZ    LISFF          ;ALTERNATE FORM FEED
	CPI   FF             ;
	JNZ   LSC4           ;
                             ;PRINT CR, LF'S TILL LINE=0
LISFF:	CALL  LFFSUB         ;SIMULATE FORM FEED
                             ;NEED A TITLE AT TOP OF NEXT PAGE, BUT FIRST SEE
                             ;IF ANY MORE NON-CR, LF, FF CHARACTERS IN FILE.
                             ;THUS IT AVOIDS BLANK SPACE AT TOP OF PAGE.
	CALL  IGNORE         ;PASS CR, FF, ETC
                             ;IF HERE, NOT AT EOF AND NEXT CHAR IS IN A REG.
	CALL  PTITL          ;PRINT TITLE
	POP   H              ;
	JMP   LSTCH          ;CLEAR STACK, GO LIST CHAR
LSC4:	CPI   TAB            ;
	JNZ   LSC5           ;
                             ;PRINT SPACES TILL LO 3 BITS OF COL = 0
LSC4A:	MVI   A,' '          ;
	CALL  LSTCH          ;
	LDA   COL            ;
	ANI   7              ;
	JNZ   LSC4A          ;
LPOPX:	POP   PSW            ;
	RET                  ;
                             ;ADD MISCELLANEOUS CHARACTERS HERE.
                             ;PRINT ^ AND LETTER
LSC5:	MVI   A,'^'          ;
	CALL  LSTCH          ;
	POP   PSW            ;
	ORI   40H            ;
	JMP   LSTCH          ;
                             ;PROCESS AND OUTPUT (SIMULATED) FORM FEED
LFFSUB:	MVI   A,CR           ;
	CALL  LSTCH          ;
LSFF2:	LDA   LINE           ;
	ORA   A              ;
	CNZ   LISLF          ;
	JNZ   LSFF2          ;
	RET                  ;
                             ;SUBROUTINE TO IGNORE CR'S, LF'S, FORM FEEDS.
                             ;CALLED AT TOP OF EACH PAGE. RETURNS NEXT NON-
                             ;IGNORED CHAR. IN A. QUIT 'LIST' IF EOF FOUND.
IGNORE: CALL  INCH           ;GET SOURCE FILE CHAR. IN A
	CPI   CR             ;
	JZ    IGNORE         ;
	CPI   LF             ;
	JZ    IGNORE         ;
	CPI   FF             ;
	JZ    IGNORE         ;
	CPI   ALTFF          ;
	JZ    IGNORE         ;
	RET                  ;CHARACTER IS IN A
                             ;LIST OUTPUT CHAR IN A, WITHOUT PROCESSING
LOCH:	MOV   E,A            ;
	MVI   C,LIST         ;
        JMP   BDOS           ;
                             ;SUBROUTINE TO PRINT PAGE TITLE
PTITL:  CALL  CLOCK          ;*** READ CLOCK AND PRINT IT ON TOP OF PAGE  ***
      	PUSH  PSW            ;
	PUSH  H              ;
                             ;TITLE TEXT
	LDA   TFLAG          ;
	ORA   A              ;
	JZ    NOTITL         ;
	LXI   H,TTLBUF       ;
	CALL  LSTRNG         ;
                             ;PAGE NUMBER
NOTITL:	LDA   PNFLAG         ;
	ORA   A              ;
	JZ    NOPGNO         ;
                             ;SPACE TO COLUMN
PAGN1:	MVI   A,' '          ;
	CALL  LSTCH          ;MINIMUM ONE SPACE
	LDA   COL            ;
	SBI   PNOCOL         ;
	JM    PAGN1          ;
                             ;"PAGE" TEXT
	LXI   H,PGETXT       ;
	CALL  LSTRNG         ;
                             ;NUMBER
	LHLD  PAGE           ;
	CALL  DECPR          ;
                             ;PRINT SUBTITLE IF ANY
	LDA   STFLAG         ;
	ORA   A              ;
	JZ    NOPGNO         ;
	LDA   SUBTF          ;
	ORA   A              ;
	JZ    NOPGNO         ;
	MVI   A,CR           ;
	CALL  LSTCH          ;
	MVI   A,LF           ;
	CALL  LSTCH          ;
	LXI   H,STLBUF       ;
	CALL  LSTRNG         ;
                             ;TEST IF EITHER OF ABOVE WAS PRINTED
NOPGNO:	LHLD  TFLAG          ;
	LDA   PNFLAG         ;
	ORA   L              ;
	JZ    PTTLEX         ;NO, NEED NO CRLF'S
                             ;CR AND 2 LF'S
	MVI   A,CR           ;
	CALL  LSTCH          ;
	MVI   A,LF           ;
	CALL  LSTCH          ;
	MVI   A,LF           ;
	CALL  LSTCH          ;
PTTLEX:	POP   H              ;
	POP   PSW            ;
	RET                  ;
                             ;SUBR TO LIST STRING (HL) TO NULL
LSTRNG:	MOV   A,M            ;
	ORA   A              ;
	RZ                   ;
	INX   H              ;
	PUSH  H              ;
	CALL  LSTCH          ;
	POP   H              ;
	JMP   LSTRNG         ;
                             ;DECIMAL PRINT HL, UNSIGNED
DECPR:	PUSH  B              ;
	PUSH  D              ;
	PUSH  H              ;
	LXI   B,-10          ;MINUS RADIX
	LXI   D,-1           ;BECOMES NUMBER/RADIX
DECPR1:	DAD   B              ;
	INX   D              ;
	JC    DECPR1         ;SUBTRACT TILL NEGATIVE
	LXI   B,10           ;
	DAD   B              ;AD RADIX BACK ONCE
	XCHG                 ;HAVE N/10 IN HL, REM. IN DE
	MOV   A,H            ;
	ORA   L              ;
	CNZ   DECPR          ;GET REMAINING DIGITS, IF ANY
	MOV   A,E            ;
	ADI   '0'            ;
	CALL  LOCH           ;PRINT THIS DIGIT
	POP   H              ;
	POP   D              ;
	POP   B              ;
	RET                  ;
                             ;OUTPUT MESSAGE TO CONSOLE
PCOMSG:	MVI   C,PRINT        ;MSG POINTER IN DE
	CALL  BDOS           ;
	RET                  ;
                             ;OUTPUT CHAR IN A REG.
CONO:	PUSH  PSW            ;
	PUSH  B              ;
	PUSH  D              ;
	PUSH  H              ;
	MOV   E,A            ;
	MVI   C,CONOUT       ;
CALLEN: CALL  BDOS           ;
	POP   H              ;
	POP   D              ;
	POP   B              ;
	POP   PSW            ;
	RET                  ;
                             ;
CLOCK:  PUSH  PSW            ;*** SAVE ALL REGISTERS ***
        PUSH  B              ;
        PUSH  D              ;
        PUSH  H              ;
                             ;
        LXI   H,TIME+4       ;SET MEM. POINTER TO START OF TIME SLOT
        MVI   A,0            ;HR. TENS ADDRESS
        CALL  GETDIG         ;GET IT
        MVI   A,1            ;HR. UNITS
        CALL  GETDIG         ;GET IT
        INX   H              ;SKIP ":"
        MVI   A,2            ;MIN. TENS
        CALL  GETDIG         ;GET IT
        MVI   A,3            ;MIN. UNITS
        CALL  GETDIG         ;GET IT
        INX   H              ;SKIP ":"
        MVI   A,4            ;SEC. TENS
        CALL  GETDIG         ;GET IT
        MVI   A,5            ;SEC. UNITS
        CALL  GETDIG         ;GET IT
        LXI   H,TIME+19      ;SET DATE ADDRESS
        MVI   A,8            ;MONTH TENS
        OUT   CLK            ;SEND TO CLOCK PORT
        CALL  DELAY          ;WAIST SOME TIME
        IN    CLK            ;READ PORT
        ANI   0FH            ;CLEAR SOME BITS
        ADI   48             ;MAKE IT ASCII
        CPI   63             ;TEST FOR "15"
        CZ    SET1           ;IF SO THEN SET TO BLANK
        MOV   M,A            ;PUT IN MEM.
        MVI   A,9            ;MONTH UNITS
        CALL  GETDIG         ;GET IT
        INX   H              ;SKIP "/"
        MVI   A,10           ;DAY TENS
        CALL  GETDIG         ;GET IT
        MVI   A,11           ;DAY UNITS
        CALL  GETDIG         ;GET IT
        LXI   H,TIME         ;RESET INDEX REGISTER TO START OF TIME MESS.
YY1     MOV   A,M            ;SEND IT TO THE PRINTER
        CPI   '$'            ;CHECK FOR END OF MESS.
        JZ    ZZ1            ;IF SO JUMP TO RETURN SECTION     
        PUSH  H              ;
        CALL  LOCH           ;
        POP   H              ;
        INX   H              ;
        JMP   YY1            ;DO IT AGAIN
                             ;
ZZ1     POP   H              ;RESTORE ALL REGISTERS AND RETURN
        POP   D              ;
        POP   B              ;
        POP   PSW            ;
        RET                  ;
                             ;
SET1:   MVI   A,20H          ;
        RET                  ;
                             ;
GETDIG: OUT   CLK            ;SEND CHAR. IN REG. A TO PORT
        CALL  DELAY          ;
        IN    CLK            ;READ PORT
        ANI   0FH            ;
        ADI   48             ;MAKE IT ASCII
        INX   H              ;POINT TO NEXT SLOT IN MEM.
        MOV   M,A            ;PUT IT THERE
        RET                  ;RETURN
                             ;
DELAY:  LXI   D,02FFH        ;WAIST SOME TIME
WAIT1:  DCR   E              ;CPU TOO FAST FOR CLOCK
        JNZ   WAIT1          ;
        DCR   D              ;
        JNZ   WAIT1          ;
        RET                  ;
                             ;
CMSG1:	DB    RESET
	DB    '* * * XT VER. 1.1.A * * *'
	DB    CR,LF,LF
	DB    'LISTING CONTROL CONSOLE COMMANDS:'
	DB    CR,LF,LF
	DB    'Control U aborts listing'
	DB    CR,LF
	DB    'Control S stops-restarts listing'
	DB    CR,LF,LF
	DB    'The default Title Line is:'
	DB    CR,LF,LF,24H
CMSG2:	DB    CR,LF,LF
	DB    'Do you want to enter a new TITLE or '
	DB    'SUBTITLE',CR,LF
	DB    'YES - enter Y',CR,LF
	DB    'NO  - enter CR  ??$'
CMSG4:	DB    CR,LF,LF
	DB    'Enter New Title (enter a CR to '
	DB    'retain Default Title)',CR,LF
	DB    'Title can be one line only - '
	DB    '60 characters maximum - '
	DB    'End with a CR',CR,LF,'$'
CMSG6:	DB    CR,LF,LF
	DB    'Enter Subtitle (a CR skips subtitle)'
	DB    CR,LF
	DB    'SUBTITLE can be multiple lines. '
	DB    'If you want to enter additional lines '
	DB    CR,LF
	DB    'end preceeding lines with a control Z.  '
	DB    'End Subtitle input with a CR.'
	DB    CR,LF,24H
CMSG7:	DB    CR,LF,LF
	DB    '* * * POSITION PAPER TO TOP LINE * * *'
	DB    CR,LF,LF
	DB    'Enter CR when ready',CR,LF,'$'
MERR:	DB    CR,LF,'SOME KIND OF ERROR'
	DB    CR,LF,24H
EMFNF:	DB    LF,'FILE NOT FOUND',CR,LF,'$'
TIME:   DB    'TIME HH:MM:SS DATE MM/DD/1979',CR,LF,'$'
EMQUES:	DB    LF,'NO *.S OR ?.S PLEASE!'
	DB    CR,LF,24H
PGETXT: DB    'PAGE '
        DB    0
TFLAG:	DB    0FFH           ;MAKE 0 TO SUPPRESS TITLE
PNFLAG:	DB    0FFH           ;MAKE 0 TO SUPPRESS PAGE NOS.
STFLAG:	DB    0FFH           ;MAKE 0 TO SUPPRESS SUBTITLE
        DS    1
SUBTF:	DS    1	             ;SUBTITLE PRESENT FLAG
SBTPNT:	DS    2	             ;SUBTITLE BUFFER POINTER
IPOINT:	DS    2	             ;INPUT BUFFER POINTER
ICOUNT:	DS    1	             ;INPUT BUFFER DOWN-COUNTER
COL:	DS    1
LINE:	DS    1
PAGE:	DS    2
CALRSP:	DS    2	             ;CALLER'S STACK POINTER
RDBUFF:	DS    84             ;SPACE FOR CP/M BUFFERED READ
TTLBUF:	DS    80             ;SPACE FOR TITLE
STLBUF:	DS    100H           ;SPACE FOR SUBTITLE
        DS    80
TIMESP: DS    29
STACK:	DS    4
DSTACK:	DS    2
