Compucolor.org – Virtual Media

Listing of file='LISTER.MAC;1E' on disk='vmedia/printer_pkg_src-sideA-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	LISTER - LIST A BASIC FILE ON THE PRINTER
;
;		 VERSION 4.0
;
;	COPYRIGHT 1980 BY TREVOR TAYLOR
;
	TITLE	LISTER
;
;	REQD ROUTINES:
;
	EXTRN	CPYRGT
	EXTRN	DPB2D
	EXTRN	JMPVEC,CO,OSTR,SAVE
	EXTRN	FILVEC,EMESS,RESET,OPEN
	EXTRN	RWSEQI,INSEQO,GTBYT,ADHLA
	EXTRN	GENHDR
	EXTRN	PRTCHR,CRLF,FFEED,HEADER
	EXTRN	RDFN
	EXTRN	SETFIL
;
;	EXTERNAL VARIABLES
;
	EXTRN	BASTOK
	EXTRN	CHRCNT,LINCNT,PAGCNT,HDRMSG

;	EQUATES

BRATE	EQU	81E2H	;CURRENT BAUD RATE
KBDFL	EQU	81DFH	;HOLDS NUMBER OF JUMP VECTOR
READY	EQU	81FFH	;KEYBOARD READY FLAG
KBCHA	EQU	81FEH	;KEYBOARD CHARACTER

;	SPECIAL CONTROL CHARACTERS

CR	EQU	13	;CARRIAGE RETURN
LF	EQU	10	;LINE FEED
FF	EQU	12	;FORM FEED
HT	EQU	9	;HORIZONTAL TAB
ESC	EQU	27

FDRV	EQU	29

;..............................................................
;
;	USER-DEFINED PARAMETERS
;
	PUBLIC	RATE,LINLEN,PAGLEN,FFFLAG,SKPLEN,SNGLE
	PUBLIC	HDRFLG,DELTIM,FCSSP,CPRFLG

RATE:	DB	88H	;BAUD RATE (88H=1200)
LINLEN:	DB	80	;LINE LENGTH
PAGLEN:	DB	60	;PAGE LENGTH (NO. OF LINES
			;   ACTUALLY PRINTED)
FFFLAG:	DB	0FFH	;FORM FEED FLAG:
			;    0        = PRINTER CANNOT DO FF'S
			;    NOT ZERO = PRINTER CAN FORM FEED
SKPLEN:	DB	0	;NUMBER OF LINES TO SKIP
			;   FOR PAGE PERFORATIONS:
			;    0  = PRINTER DOES IT
			;    N  = NUMBER OF LINE-FEEDS
;
;    NOTE:	PAGLEN + SKPLEN = ACTUAL PHYSICAL PAGE LENGTH
;
SNGLE:	DB	0	;SINGLE PAGE FLAG
HDRFLG:	DB	0FFH	;HEADER FLAG
DFAULT:	DB	'BAS'	;DEFAULT FILE TYPE
DELTIM:	DB	1	;MECHANICAL DELAY FACTOR -
			;   TIME DELAY FOR MECHANICAL MOTION
			;   CR = 4*DELTIM
			;   LF = DELTIM
			;   FF = 20*DELTIM
;
;*** NOTE: DO NOT MAKE THIS ZERO - ZERO RESULTS IN VERY LONG
;	   DELAYS. MAXIMUM VALUE SHOULD BE 12.
;
FCSSP:	DS	2	;FCS STACK POINTER
;
;..............................................................
;
;	START OF PROGRAM
;	NOTE THAT THE FIRST "INSTRUCTION" IS REALLY A FLAG
;

LISTER:
CPRFLG:	XRA	A		;COPYRIGHT FLAG:
				;   0        = NO CHECK
				;   NOT ZERO = CHECK IT
	DI
	LXI	H,0		;SAVE FCS STACK POINTER
	DAD	SP
	SHLD	FCSSP
	LXI	SP,STACK	;SETUP RUNOFF STACK

	CALL	JMPVEC
	CALL	FILVEC

	LDA	RATE		;GET BAUD RATE CODE
	OUT	5		;LOAD 5501
	STA	BRATE		;STORE SO FCS WILL KNOW

	MVI	A,12		;SET KEYBOARD TO DUMP
	STA	KBDFL		;TO INPCRT
	EI

	XRA	A
	STA	CHRCNT
	STA	LINCNT
	STA	PAGCNT

	LXI	H,IDMSG		;PRINT STARTUP MESSAGE
	CALL	OSTR

	LXI	H,IBUF
	CALL	CPYRGT

	CALL	SETUP		;INITIALIZE FILE

	LDA	HDRFLG		;SKIP HEADER GENERATION IF
	ORA	A		;   NOT REQD
	JZ	LOOP
	LDA	FPB+FDRV	;GET DRIVE NUMBER
	LXI	B,IBUF
	LXI	D,FPB		;   AND POINTER TO FPB
	LXI	H,HDRMSG
	CALL	GENHDR		;GENERATE THE HEADER
	CALL	HEADER		;   AND PRINT IT

LOOP:
	LXI	H,FPB		;READ THE LINK FIELD
	CALL	GTBYT
	JC	CHKEOF
	MOV	E,A
	LXI	H,FPB
	CALL	GTBYT
	JC	CHKEOF
	ORA	E
	JZ	EXIT		;   FINISHED IF ZERO
	LXI	H,FPB		;READ THE LINE NUMBER
	CALL	GTBYT
	JC	CHKEOF
	MOV	E,A
	LXI	H,FPB
	CALL	GTBYT
	JC	CHKEOF
	MOV	D,A
	MVI	A,0FFH
	LXI	H,LINNUM
	PUSH	H
	CALL	DPB2D		;CONVERT LINE NO. TO ASCII
	POP	H

	MVI	C,5
OUTLIN:	MOV	A,M
	INX	H
	CALL	PRTCHR
	DCR	C
	JNZ	OUTLIN
	MVI	A,' '		;FOLLOW LINE NO. BY A SPACE
	CALL	PRTCHR
;
;	PRINT THE LINE
;
LOOP10:	LXI	H,FPB
	CALL	GTBYT
	JC	CHKEOF
	ORA	A		;END OF LINE MARKED BY A NULL
	JNZ	LOOP15
	CALL	CRLF
	JMP	LOOP

LOOP15:	CPI	32		;CHECK FOR SPACE
	JNZ	LOOP20
	LDA	SPCFLG		;SEE IF LAST TOKEN ALREADY
	ORA	A		;   DID A SPACE,
	PUSH	PSW		;   AND SKIP IF TRUE
	XRA	A
	STA	SPCFLG		;CLEAR SPACE FLAG
	POP	PSW
	JNZ	LOOP10		;SKIP PRINTING SPACE
	MVI	A,' '
	JMP	NEXT10

LOOP20:	PUSH	PSW
	XRA	A
	STA	SPCFLG		;CLEAR SPACE FLAG
	POP	PSW
	JC	NEXT10		;PRINT CONTROL CHRS

NEXT:	CPI	0C6H		;CHECK FOR A TOKEN
	JNC	NEXT10
	CPI	80H
	JC	NEXT10
	CALL	TOKEN		;   AND PRINT IT
	JMP	ABTEST

NEXT10:	CALL	PRTCHR		;OTHERWISE, JUST PRINT CHR

ABTEST:	LDA	READY		;SEE IF BREAK
	CPI	50H
	JZ	ABTEST		;HANG UNTIL ANOTHER IS STRUCK
	CPI	80H
	JNZ	LOOP10
	XRA	A
	STA	READY
	LDA	KBCHA		;READ NEXT CHARACTER
	CPI	LF		;EXIT IF LF
	JZ	EXIT
	CPI	ESC		;EXIT IF ESC
	JZ	EXIT
	JMP	LOOP10

CHKEOF:	JZ	EXIT		;CHECK IF END-OF-FILE

ERROR:	LXI	H,ERRMSG	;PRINT ERROR MESSAGE
	CALL	OSTR

EXIT:
	XRA	A		;OUTPUT A FORM FEED TO FINISH
	STA	SNGLE
	CALL	FFEED
	MVI	A,13
	STA	KBDFL
	LHLD	FCSSP		;RESTORE FCS STACK
	SPHL
	MVI	B,0		;SET NO ERROR
	RET			;   AND EXIT TO FCS

;..............................................................
;
;	PRINT A BASIC KEYWORD
;

TOKEN:	PUSH	PSW		;SAVE TOKEN
	CALL	LOOKUP		;GET KEYWORD
	PUSH	D
	MVI	B,0
TOK10:	LDAX	D		;CALCULATE ITS LENGTH
	INX	D
	INR	B
	ORA	A
	JP	TOK10
	LDA	CHRCNT		;FIND NO. SPACES LEFT ON LINE
	MOV	C,A
	LDA	LINLEN
	SUB	C
	SUB	B		;SEE IF KEYWORD FITS ON LINE
	JP	TOK20
	CALL	CRLF		;OUTPUT CR LF IF WON'T FIT
TOK20:	POP	D
TOK30:	LDAX	D		;PRINT THE KEYWORD
	INX	D
	PUSH	D
	PUSH	PSW
	ANI	7FH
	CALL	PRTCHR
	POP	PSW
	POP	D
	ORA	A		;LAST CHR HAS MSB SET
	JP	TOK30

	POP	PSW		;GET THE TOKEN BACK
	SUI	80H
	LXI	H,SPCTAB	;CHECK IF FOLLOWED BY A SPACE
	CALL	ADHLA
	MOV	A,M
	STA	SPCFLG		;SET SPACE FLAG
	ORA	A
	RZ
	MVI	A,' '		;PRINT SPACE IF REQD
	CALL	PRTCHR
	RET

;	SPACE TABLE - FOR SPACES AFTER KEYWORDS

SPCTAB:	DB	0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1
	DB	1,1,1,1,1,1,1,1,0,1,0,0,1,1,1,0,0,0,0,0,1
	DB	1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	DB	0,0,0,0,0,0,0

SPCFLG:	DB	0

;
;	FIND KEYWORD IN BASIC TOKEN TABLE
;
LOOKUP:	SUI	7FH		;CONVERT TOKEN TO OFFSET
	MOV	C,A
	LXI	D,BASTOK
LOOK10:	LDAX	D		;INDEX THRU TABLE
	INX	D
	ORA	A
	JP	LOOK10
	DCR	C
	JNZ	LOOK10
	RET
;
;	SETUP FILE FOR INPUT
;
SETUP:	LXI	B,DFAULT
	LXI	D,FPB
	LXI	H,IBUF
	CALL	RDFN
	JC	SETUP

	XRA	A
	LXI	B,1024
	LXI	D,IBUF
	LXI	H,FPB
	CALL	SETFIL
	JC	SETUP
	RET

;..............................................................
;
;	MESSAGES

IDMSG:	DB	29,15,13,10
	DB	17,'BASIC FILE LISTER ',23,'V4.0',13,10,239
ERRMSG:	DB	17,'*** HARDWARE ERROR ***',13,10,239

LINNUM:	DB	'00000'	;ASCII FOR CURRENT LINE NUMBER

;
;	DATA AREA
;
	DB	0FFH
IBUF:	DS	80H	;INPUT BUFFER
	DB	0FFH
	DS	380H

	DS	100	;STACK AREA
STACK:	DS	2

FPB:	DS	38	;INPUT FPB

	END	LISTER