home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG042.ARK
/
XT.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
25KB
|
648 lines
; 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