Compucolor.org – Virtual Media

Listing of file='XREF.SRC;01' on disk='vmedia/source_1-sector.ccvf'


;	ASSEMBLY CROSS REFERENCE GENERATOR
;
;
;	JAMES L HELMS
;
;
;	ORIGINAL:	10 JAN 82	V1.0
;	MODIFIED:	30 MAR 82	V3.82
;	MODIFIED:	02 MAY 82	V5.82
;
;
;
;	PUBLIC DOMAIN MATERIAL - NON-COPYRIGHTABLE
;
;	FOR USE AND DISTRIBUTION AT WILL
;
;
;
;	SYSTEM EQUATES
;
;
DFUN	EQU	80F2H	;DEFAULT UNIT (ASCII)
INPCRT	EQU	81C5H	;JUMP VECTOR NO. 31
KBDFL	EQU	81DFH	;KYBD FLAG
READY	EQU	81FFH	;KYBD STATUS
KBCHA	EQU	81FEH	;KYBD CHAR
UVEC	EQU	81BFH	;"ESC USER" VECTOR (SAME AS "ESCCRT")
COLOR	EQU	81CFH	;CCI COLOR CODE    (SAME AS "VFILL"+1)
XPOS	EQU	81CBH	;X POSITION        (SAME AS "VCRAD")
YPOS	EQU	81CCH	;Y POSITION        (SAME AS "VCRAD"+1)


;	FILE PARAMETER BLOCK LAYOUT


FOPT	EQU	0	;OPEN CODE (0 OLD, 1 NEW)
FATR	EQU	1	;ATTRIBUTE
FNAM	EQU	2	;NAME
FTYP	EQU	8	;EXTENSION
FVER	EQU	11	;VERSION
FSBK	EQU	12	;START BLOCK
FSIZ	EQU	14	;SIZE
FLBC	EQU	16	;LBC
FLAD	EQU	17	;LOAD ADDR
FSAD	EQU	19	;START/SAVE ADDR
FSPR	EQU	21	;SPARE
FDBK	EQU	22	;DIRECTORY BLOCK
FDEN	EQU	23	;DIRECTORY ENTRY
FAUX	EQU	24
FHAN	EQU	26	;HANDLER ADDR
FFCN	EQU	28	;FUNCTION CONTROL NUMBER
FDRV	EQU	29	;DRIVE
FBLK	EQU	30	;DISK BLOCK NUMBER
FBUF	EQU	32	;BUFFER ADDRESS
FXBC	EQU	34	;BUFFER SIZE
FPTR	EQU	36



;
;	EITHER OF THESE ORIGINS WILL PROVIDE SUFFICIENT BUFFER
;	SPACE FOR 997 JMP/CALL CROSS REFERENCE ADDRESSES TO BE
;	GENERATED.  THIS IS JUST BARELY ENOUGH TO COVER THE
;	V8.79 INTERPRETER IN ONE PASS.
;
;
;	USE THE 4000H ORIGIN FOR FCS, INTERPRETER, OR .PRG
;	PROGRAMS LOADING AT 9600H OR HIGHER - NOTE - SYSTEM
;	MUST SUPPORT RAM AT 4000H THROUGH 5FFFH!!
;
;	USE THE 8200H ORIGIN FOR FCS, INTERPRETER, OR .PRG
;	PROGRAMS LOADING AT 9B00H OR HIGHER.
;
;	USE THE D700H ORIGIN FOR FCS, INTERPRETER, OR .PRG
;	PROGRAMS LOADING AT 8200H W/ TOP OF PROGRAM BELOW D700H
;
;
;	PROGRAM TO BE CROSS REFERENCED MUST BY RESIDING IN
;	MEMORY PRIOR TO EXECUTING THIS PROGRAM.  THIS MAY BE
;	ACCOMPLISHED BY ENTERING FCS AND EXECUTING COMMAND
;	"LOA FILENAME.PRG".
;
;
;	THIS PROGRAM CAN NOT DISTINGUISH BETWEEN OP CODES AND
;	DB (DATA BYTE) OR DW (DATA WORD) ENTRIES.  THEREFORE,
;	SOME LISTINGS GENERATED MAY BE AMBIGUOUS AND WILL HAVE
;	TO BE WEEDED OUT.
;
;
;	"TBUF", THE BUFFER USED TO SAVE AND SORT THE CROSS
;	REFERENCE ADDRESSES, IS CONSTRUCTED AS FOLLOWS:
;
;	BYTE 1		THE JMP/CALL INSTRUCTION (OP CODE)
;			VALUE LESS 192.
;	BYTE 2-3	THE PC (PROGRAM COUNT) WHERE THE
;			INSTRUCTION WAS FOUND, LO BYTE FIRST.
;	BYTE 4-5	THE ADDRESS WHERE THE JMP/CALL INSTRUC-
;			TION IS REFERENCING, LO BYTE FIRST.
;
;	THIS REPEATS FOR N NUMBER OF JMP/CALLS FOUND, OR TOP
;	OF MEMORY, WHICHEVER OCCURS FIRST.  A ZERO (0) IS
;	INSERTED AT BYTE 1 OF THE NEXT AVAILABLE ENTRY TO
;	BE USED AS A TOP OF LISTING TERMINATOR.
;
;
;	IF A CROSS REFERENCE OF THIS PROGRAM IS TO BE
;	GENERATED, THEN USE START/END ADDRESSES AS FOLLOWS
;	IN ORDER TO ELIMINATE MESSAGE/VARIABLE DATA:
;	(THIS ASSUMES NO MODIFICATIONS MADE)
;
;
;	ORG 4000	4000 TO 44D3
;	ORG 8200	8200 TO 86D3
;	ORG D700	D700 TO DBD3
;
;
;
;	THANKS AND CREDIT GOES GO CAPT. DeFRANCE CLARKE III
;	FOR THE IDEA AND INSPIRATION, AND TO THE "FORUM" WHICH
;	PUBLISHED HIS "BASIC" VERSION (NOV/DEC 1981, VOL 1 NO
;	5, PG 19).
;
;
;	THIS PROGRAM SUPPORTS THE "ESCAPE-USER" RENTRY KEY.
;
;
;


	ORG	04000H
;	ORG	08200H
;	ORG	0D700H



	JMP	SETUP		;ESC-T ENTRY - VALID
				;FOR 8200H ORIGIN ONLY


;	V6.78 CALL TABLE


V678	EQU	$


ADHLA:	JMP	3518H		;HL<-HL+A
CMPHD:	JMP	344DH		;HL<=DE?
CRLF:	JMP	338BH		;CR/LF
ERAS:	JMP	2B8DH		;ERASE CRT
ESCD:	JMP	32C9H		;ESC'D'
LO:	JMP	3392H		;CHARACTER TO CRT
MOVHD:	JMP	3444H		;STRING HL<-DE LEN B
MULHD:	JMP	3562H		;HL=DE*HL
NIBL:	JMP	33B3H		;ASCII HEX->HEX
OSTR:	JMP	33F4H		;STRING TO CRT
SUBHD:	JMP	3459H		;HL=HL-DE
WATL:	JMP	3429H		;20 MS WAIT

CLSEQO:	JMP	3136H		;CLOSE OUTPUT FILE
EMESS:	JMP	262DH		;FCS ERROR MSG
INSEQO:	JMP	30E7H		;INIT NEW FILE
OPEN:	JMP	2DABH		;OPEN FILE
PFSPC:	JMP	3077H		;PARSE FILE SPEC
PTBYT:	JMP	324AH		;FILE<-BYTE
RESET:	JMP	26A5H		;RESET DRIVES
RWSEQI:	JMP	30C6H		;REWIND INPUT FILE

BEGIN:	DW	3768H

LTAB	EQU	$-V678


;	START


START:	LXI	SP,STACK	;SET STACK
	MVI	B,LTAB		;TABLE LENGTH
	LXI	D,V879		;V8.79 TABLE
	LXI	H,V678		;V6.78 TABLE
	LDA	092AH		;TEST ROM
	CPI	1FH		;V8.79?
	CZ	M879		;YES-OVERLAY
	JZ	SETUP		; & SKIP
	LXI	D,V980		;V9.80 TABLE
	CPI	37H		;V9.80?
	CZ	M980		;YES-OVERLAY


;	SETUP


SETUP:	LXI	SP,STACK	;RESET STACK
	LXI	H,SETUP		;SET
	SHLD	UVEC+1		;"ESC USER"
	MVI	A,0C3H
	STA	UVEC		;JUMP INSTR
	MVI	A,31		;SET
	STA	KBDFL		; NO-ECHO
	MVI	A,0C9H		;  KEYBOARD
	STA	INPCRT
	LXI	H,DSS		;CLEAR
	MVI	A,DSE-DSS	; ALL
	CALL	CLRM		;  DATA


;	INTRODUCTION


	LXI	H,MSG01		;INTRO MSG
	CALL	OSTR
INTRO:	CALL	INPUT		;USER RESPONSE
	CPI	10
	JZ	STOP		;ABORT
	CPI	13
	JNZ	INTRO		;WAIT
	CALL	ERAS		;ERASE CRT


;	PRESET


	LHLD	32940		;TOP OF RAM
	LXI	D,-6		;LESS 6
	DAD	D
	SHLD	SIZE		;RAM AVAIL TO USE
	LXI	H,TBUF		;BUFFER
	SHLD	TADR
	MVI	M,0		;SET TERMINATOR


;	GET START ADDRESS


GSA:	LXI	H,MSG02		;START ADDR MSG
	LXI	D,KBUF		;KYBD BUFFER
	LXI	B,4		;LENGTH
	CALL	ESTC		;GET ADDRESS
	JZ	HALT		;NO ENTRY
	MOV	A,B		;4 DIGITS?
	CPI	4
	JNZ	GSA		;NO
	CALL	DECH		;TO HEX
	JNC	GSA		;NO ENTRY-DO AGAIN
	SHLD	SAD		;SAVE START ADDRESS


;	GET ENDING ADDRESS


GEA:	LXI	H,MSG03		;END ADDR MSG
	LXI	D,KBUF
	LXI	B,4
	CALL	ESTC
	JZ	HALT		;NO ENTRY
	MOV	A,B
	CPI	4
	JNZ	GEA		;<>4 DIGITS
	CALL	DECH		;TO HEX
	JNC	GEA		;NO ENTRY
	SHLD	EAD		;SAVE END ADDR


;	VALIDATE


	XCHG
	LHLD	SAD
	CALL	CMPHD		;START<END?
	JNC	GSA		;NO-ILLEGAL!


;	GET BOUNDARY LOW


GBL:	LXI	H,MSG04		;BOUNDARY LO MSG
	LXI	D,KBUF
	LXI	B,4
	CALL	ESTC
	JZ	HALT		;NO ENTRY
	MOV	A,B
	CPI	4
	JNZ	GBL		;<>4 DIGITS
	CALL	DECH		;TO HEX
	JNC	GBL		;NO ENTRY
	SHLD	BCL		;SAVE BOUNDARY LOW


;	GET BOUNDARY HIGH


GBH:	LXI	H,MSG05		;BOUNDARY HIGH MSG
	LXI	D,KBUF
	LXI	B,4
	CALL	ESTC
	JZ	HALT		;NO ENTRY
	MOV	A,B
	CPI	4
	JNZ	GBH		;<>4 DIGITS
	CALL	DECH		;TO HEX
	JNC	GBH		;NO ENTRY
	SHLD	BCH		;SAVE BOUNDARY HIGH


;	VALIDATE


	XCHG
	LHLD	BCL
	CALL	CMPHD		;LOW<HIGH?
	JNC	GBL		;NO-ILLEGAL!


;	CHECK IF FILE


	LXI	H,MSG12		;GENERATE FILE?
	CALL	OSTR
CIF:	CALL	INPUT		;GET RESPONSE
	MVI	B,0		;SET 0
	CPI	'N'		;A "N"?
	JZ	CIF1		;DON'T WANT TO
	INR	B		;SET 1
	CPI	'Y'		;A "Y"?
	JNZ	CIF		;NO-BAD ENTRY
CIF1:	CALL	LO		;ECHO
	CALL	CRLF		;CR/LF
	MOV	A,B		;CHOICE
	ORA	A		; TEST
	STA	SF		;  SAVED
	JZ	PROG		;IF NO FILE


;	PARSE FILE SPECS


FILE:	LXI	B,TYPS		;.SRC TYPE
	LXI	D,FPB1		;FPB
	LXI	H,NAME		;NAME
	CALL	PFSPC		;PARSE
	JC	ERROR		;IF ERROR


;	OPEN FILE


	LXI	H,FPB1		;OUTPUT FPB
	MVI	M,1		;OPEN CODE
	CALL	OPEN		;OPEN FILE
	JC	ERROR		;IF ERROR


;	INITIALIZE OUTPUT FILE


	LXI	H,0		;CLR
	SHLD	FPB1+FLAD	; LOAD ADDR
	SHLD	FPB1+FSAD	; SAVE ADDR
	LXI	H,OBUF		;BUFFER
	SHLD	FPB1+FBUF
	LXI	H,768		;SIZE
	SHLD	FPB1+FXBC
	LXI	H,FPB1		;FPB
	CALL	INSEQO		;INITIALIZE
	JNC	PROG


;	FILE ERROR


ERROR:	CALL	EMESS		;ERROR MSG
	CALL	CRLF
	XRA	A		;TURN OFF
	STA	SF		; FILE CONTROL


;	PROGRAM LOOP


PROG:	LXI	H,MSG06		;SEARCHING
	CALL	OSTR
	LHLD	SAD		;START
	XCHG
	LHLD	EAD		;END
	CALL	SUBHD		;SIZE
	PUSH	H
	POP	B
	INX	B		;COUNT+1
				;NOTE:  BC REGISTERS MUST
				;NOT BE DESTROYED FROM
				;HERE TO "PRG6" ENTRY.
	LHLD	SAD		;START ADDR OR "PC"
				; (PROGRAM COUNT)
PRG1:	MOV	A,M		;INSTR
	CALL	VIC		;VALIDATE
	JNZ	PRG3		;<>JMP/CALL


;	CHECK LOW BOUNDARY


	PUSH	H		;SAVE
	PUSH	H		; COUPLE
	PUSH	H		;  TIMES
	INX	H		;PC+1
	MOV	E,M		;ADDR LO
	INX	H		;PC+2
	MOV	D,M		;ADDR HI
	LHLD	BCL		;LOW BOUNDARY
	XCHG
	CALL	CMPHD
	XCHG
	JC	PRG2		;ADDR<LOW BOUNDARY


;	CHECK HIGH BOUNDARY


	LHLD	BCH		;HIGH BOUNDARY
	CALL	CMPHD
	JC	PRG2		;ADDR>HIGH BOUNDARY


;	SAVE INSTRUCTION


	POP	D		;PC
	LHLD	TADR		;TBUF ADDR
	LDAX	D
	SUI	192		;-OFFSET
	MOV	M,A		;INSTR


;	SAVE PROG COUNT (ADDRESS) (PC)


	INX	H		;TBUF+1
	MOV	M,E		;PC LO
	INX	H		;TBUF+2
	MOV	M,D		;PC HI


;	SAVE JMP/CALL ADDRESS


	INX	D		;PC+1
	INX	H		;TBUF+3
	LDAX	D
	MOV	M,A		;JMP/CALL LO
	INX	D		;PC+2
	INX	H		;TBUF+4
	LDAX	D
	MOV	M,A		;JMP/CALL HI
	INX	H		;TBUF+5
	SHLD	TADR		;SAVE NEXT ENTRY
	PUSH	H
	POP	D
	MVI	M,0		;TERMINATORS
	INX	H
	MVI	M,0
	INX	H
	MVI	M,0
	LHLD	SIZE
	CALL	CMPHD		;OUT OF MEM?
	JC	PRG6		;YES!


;	PASS INSTR BYTES


PRG2:	POP	H		;PC
PRG3:	LXI	SP,STACK	;CLR STACK
	MOV	A,M		;INSTR CODE
	PUSH	H		;PC
	LXI	H,BYTE		;OP CODE LEN TABLE
	CALL	ADHLA		; + INSTR VALUE POINTS
	MOV	A,M		; TO INSTR LENGTH
	POP	H		;PC BACK
	DCR	A
	JM	PRG5		;ILLEGAL
	JZ	PRG5		;1 BYTE
	DCR	A
	JZ	PRG4		;2 BYTE ELSE
				;3 BYTE


;	3 BYTE INSTR


	INX	H		;PC+1
	DCX	B
	MOV	A,B
	ORA	C
	JZ	PRG6		;DONE


;	2 BYTE INSTR


PRG4:	INX	H		;PC+1
	DCX	B
	MOV	A,B
	ORA	C
	JZ	PRG6		;DONE


;	1 BYTE INSTR


PRG5:	INX	H		;PC+3
	DCX	B
	MOV	A,B
	ORA	C
	JNZ	PRG1		;MORE!


;	DONE WITH SEARCH - NOW SEE IF ANY FOUND


PRG6:	LXI	SP,STACK	;RESET STACK
	LDA	TBUF		;BUFFER
	ORA	A		;TEST
	JZ	NONE		;NOTHING!


;	SORT RESULTS BY CALLED ADDRESS


	LXI	H,MSG07		;SORTING
	CALL	OSTR
	MVI	A,4
	STA	PASS
SORT:	LXI	H,TBUF-5	;BUFFER-5
	SHLD	TADR		;SAVED


;	SET NEXT BUFFER ENTRY
;	AND CHECK IF DONE


SRT1:	LHLD	TADR		;THIS BUFFER ADDR
	LXI	D,5		;ENTRY LENGTH
	DAD	D
	SHLD	TADR		;NEXT TBUF ENTRY
	MOV	A,M		;1ST CHAR
	ORA	A		;TEST
	JZ	SRT3		;IF END


;	MATCH THEM


	INX	H		;TBUF+1
	INX	H		;TBUF+2
	INX	H		;TBUF+3
	MOV	E,M		;#1 LO
	INX	H		;TBUF+4
	MOV	D,M		;#1 HI
	INX	H		;TBUF+5  (NEXT ENTRY)
	MOV	A,M		;1ST CHAR NEXT ENTRY
	ORA	A		;AT TOP OF LIST?
	JZ	SRT3		;IF YES THEN DONE
	INX	H		;TBUF+6
	INX	H		;TBUF+7
	INX	H		;TBUF+8
	MOV	A,M		;#2 LO
	INX	H		;TBUF+9
	MOV	H,M		;#2 HI
	MOV	L,A
	CALL	CMPHD		;#2=>#1?
	JNC	SRT1		;YES


;	SWAP THEM


	LHLD	TADR
	PUSH	H
	POP	D		;THIS TBUF ENTRY
	LXI	B,5
	DAD	B		;NEXT TBUF ENTRY
SRT2:	LDAX	D		;GET #1
	MOV	B,A		; & SAVE
	MOV	A,M		;GET #2
	STAX	D		; & SAVE IT
	MOV	M,B		;NOW SAVE #1
	INX	D		;1ST ENTRY +1
	INX	H		;2ND ENTRY +1
	DCR	C		;COUNT-1
	JNZ	SRT2		;DO SOME MORE
	MVI	A,4		;SET THE
	STA	PASS		; PASS COUNT
	JMP	SRT1		;  AND REPEAT


;	CHECK PASS COUNT
;	MUST HAVE 4 GOOD PASSES
;	TO SATISFY SORT ROUTINE


SRT3:	LXI	H,PASS		;PASS COUNT
	DCR	M		;-1
	JNZ	SORT		;IF <>0


;	PRINT THE LISTING


	LXI	H,MSG08		;LISTING
	CALL	OSTR
	LXI	H,0		;CLR
	SHLD	LADR		;LAST ADDR
	LXI	H,TBUF		;SET
	SHLD	TADR		;BUFFER
	MOV	A,M
	STA	CODE		;1ST INSTR


;	GET CALLED ADDRESS
;	COMPARE TO LAST ONE


PRINT:	CALL	GREEN		;SET GREEN
	LHLD	TADR		;BUFFER
	INX	H		;TBUF+1
	INX	H		;TBUF+2
	INX	H		;TBUF+3
	MOV	E,M		;CALLED LO
	INX	H		;TBUF+4
	MOV	D,M		;CALLED HI
	LHLD	LADR		;LAST ADDR
	CALL	CMPHD		;SAME?
	XCHG
	SHLD	LADR		;NEW LAST ADDR
	CNZ	PNUM		;<>SAME-PRINT


;	CHECK X POS


	CALL	CYAN		;SET CYAN
PNT1:	CALL	STAB		;SEND TAB
	LDA	XPOS		;CK X POSITION
	CPI	16		;<16?
	JC	PNT1		;IF YES


;	PRINT INSTRUCTION


	LXI	H,TABLE		;INSTR TABLE
	LXI	D,5		;ENTRY LENGTH
	LDA	CODE		;INSTR CODE
PNT2:	DAD	D		;FIND THE
	DCR	A		;RIGHT ONE
	JNZ	PNT2
	CALL	SSTR		;PRINT IT


;	PRINT PC


	LXI	H,MSG11		;"FROM" MSG
	CALL	SSTR		; PRINTED
	LHLD	TADR		;BUFFER
	INX	H		;TBUF+1
	MOV	E,M		;PC LO
	INX	H		;TBUF+2
	MOV	D,M		;PC HI
	XCHG
	CALL	PNUM		;PRINT PC
	CALL	PCRS		;CR/LF


;	NEXT ENTRY


	LHLD	TADR		;BUFFER
	LXI	B,5		;ENTRY LEN
	DAD	B
	SHLD	TADR		;NEXT ENTRY
	MOV	A,M		;1ST CHAR
	STA	CODE		;SAVED
	ORA	A		;TEST
	JZ	QUIT		;IF END
	CALL	PAUSE		;"ATTN BREAK"?
	JZ	HALT		;YES-AND ABORT
	MVI	A,10		;DO A
	CALL	WATL		; 200 MS WAIT
	JMP	PRINT		;CONTINUE


;	NOTHING FOUND


NONE:	LXI	H,MSG09		;NOTHING MSG
	CALL	OSTR
	JMP	QUIT


;	QUIT


STOP:	CALL	ERAS		;ERASE CRT
QUIT:	CALL	PCRS2		;2 CR/LF'S
	LXI	H,33209		;CLOCK
	MVI	M,0
	MVI	A,3
TIME:	CMP	M
	JNZ	TIME		;WAIT 3 SECS
HALT:	CALL	PCRS		;1 CR/LF
	LDA	SF		;FILE
	ORA	A		; GENERATED?
	LXI	H,FPB1
	CNZ	CLSEQO		;CLOSE IF YES
	LXI	SP,8042H	;RESET STACK
				;ISC 3650 MAY
				;USE 8044H HERE
	LXI	D,KBDFL		;RESET
	LHLD	BEGIN		; KEYBOARD
	XCHG
	PUSH	D
	JMP	ESCD		;TO FCS




;=======SUBROUTINES


;	PAUSE
;
;	THIS IS AN IMPROVED VARIATION OF LDA READY/CPI 50H
;	AN WILL WORK DURING FCS AND PRINTER OPERATIONS
;	WHEN THE PREVIOUS ONE WON'T.
;
;	STATUS:		< Z>	ATTN BREAK
;			<NZ>	NONE


PAUSE:	MVI	A,0FH
	OUT	7
	IN	1
	ANI	10H
	RNZ


;	CONTINUE OPTION
;	STATUS:	< Z>		'N' REPLY (ABORT)
;		<NZ>		'Y' REPLY (CONTINUE)


CONTIN:	LXI	H,MSG10		;CONTINUE MSG
	CALL	OSTR
CONT1:	CALL	INPUT
	CPI	'N'
	JZ	CONT2		;ABORT
	CPI	'Y'
	JNZ	CONT1		;ERROR
	ORA	A		;SET <NZ>
CONT2:	CALL	LO		;ECHO
	CALL	CRLF
	CALL	CRLF
	RET


;	ENTER STRING DATA W/ CRLF
;	INPUT:	B		DON'T CARE
;		C		MAX COUNT ALLOWED
;		DE		BUFFER
;		HL		MESSAGE
;	OUTPUT:	B		LENGTH ENTERED
;		HL		PAST LAST CHAR STORED
;	STATUS:	< Z>		NO ENTRY
;		<NZ>		STRING ENTERED
;	COMMANDS:		EL,BS,SF,CR


ESTC:	CALL	EST
	CALL	CRLF
	RET


;	ENTER STRING DATA
;	USES COUNT DOWN METHOD


EST:	PUSH	B		;COUNT SAVED
	PUSH	D		;BUFFER SAVED
	CALL	OSTR		;PRINT MSG
	POP	H		;BUFFER UP
	POP	B		;COUNT UP
EST0:	MOV	A,C		;COPY COUNT
	INR	A		;+1
	CALL	CLRM		;CLR BUFFER
	MOV	B,C		;COPY COUNT


;	ERASE LINE ENTRY


EST1:	CALL	EST8		;ANY COUNT?
	JZ	EST3		;NO-SKIP
	CALL	EST10		;BACKUP
	JMP	EST1		;AGAIN


;	ENTER CHARACTER/VALIDATE


EST2:	CALL	EST9		;BACKSPACE
EST3:	CALL	INPUT		;GET CHAR
	CPI	11
	JZ	EST1		;ERASE LINE
	CPI	13
	JZ	EST6		;DONE
	CPI	25
	JZ	EST4		;MOVE RIGHT
	CPI	26
	JZ	EST2		;BACKSPACE
	CALL	CCHB		;LET/NUM?
	JNC	EST3		;NO!


;	CHECK COUNT/SAVE CHAR


	MOV	D,A		;SAVE CHAR
	MOV	A,B		;REMAINING
	ORA	A		; COUNT?
	JZ	EST3		;NO-IGNORE
	MOV	M,D		;SAVE CHAR AND
				;FALL THROUGH


;	MOVE RIGHT


EST4:	CALL	CCHA		;CHAR?
	JNC	EST3		;NO!


;	ECHO/ADJUST COUNT


	CALL	LO		;ECHO
	INX	H		;BUFFER+1
	DCR	B		;COUNT-1
	JMP	EST3		;NEXT CHAR


;	SET CHAR COUNT
;	STATUS:	< Z>		NO ENTRY
;		<NZ>		ENTRY


EST6:	CALL	EST8		;CHAR COUNT
	MOV	B,A		;=ENTERED
	MVI	M,0		;TERMINATOR
	RET


;	CHECK CHAR COUNT
;	STATUS:	< Z>		NO ENTRY
;		<NZ>		ENTRY


EST8:	MOV	A,C
	SUB	B
	RET


;	BACKSPACE - ADJUST COUNT/BUFFER


EST9:	CALL	EST8		;ANY COUNT?
	RZ			;NO-IGNORE
EST10:	INR	B		;COUNT+1
	DCX	H		;BUFFER-1
	PUSH	B
	PUSH	H
	LXI	H,DLC		;DELETE
	CALL	OSTR		;LAST CHAR
	POP	H
	POP	B
	RET


;	NO-ECHO KEYBOARD
;	OUTPUT:	A		KYBD CHAR


INPUT:	CALL	CLEAR		;CLEAR KYBD
INPT1:	LDA	READY		;KYBD FLAG
	ORA	A		;TEST
	JZ	INPT1		;LOOP
	XRA	A
	STA	READY
	LDA	KBCHA		;KYBD CHAR
	RET


;	CLEAR KYBD


CLEAR:	XRA	A
	STA	READY
	STA	KBCHA
	RET


;	CHARACTER CHECK
;	INPUT:	HL		BUFFER
;	STATUS:	< C>		VALID
;		<NC>		INVALID


CCHA:	MOV	A,M		;GET IT
CCHB:	CPI	'z'+1		;>'z'?
	RNC			;YES
	CPI	' '		;<' '?
	CMC
	RET


;	MOVE 0 TO M UNTIL A = 0
;	STATUS:	HL	RETAINED
;		A	ZERO
;		<Z>	FORCED


CLRM:	PUSH	H
CLR1:	MVI	M,0		;M<-0
	INX	H		;ADDR+1
	DCR	A		;COUNT-1
	JNZ	CLR1		;AGAIN
	POP	H
	RET


;	VALIDATE INSTRUCTION CODE
;	STATUS:	< Z>		JMP/CALL INSTR
;		<NZ>		<>JMP/CALL


VIC:	CPI	194
	RC			;NO GOOD
	SUI	194
	RZ			;JNZ
	DCR	A
	RZ			;JMP
	DCR	A
	RZ			;CNZ
	SUI	6
	RZ			;JZ
	SUI	2
	RZ			;CZ
	DCR	A
	RZ			;CALL
	SUI	5
	RZ			;JNC
	SUI	2
	RZ			;CNC
	SUI	6
	RZ			;JC
	SUI	2
	RZ			;CC
	SUI	6
	RZ			;JPO
	SUI	2
	RZ			;CPO
	SUI	6
	RZ			;JPE
	SUI	2
	RZ			;CPE
	SUI	6
	RZ			;JP
	SUI	2
	RZ			;CP
	SUI	6
	RZ			;JM
	SUI	2
	RET			;CM


;	SET GREEN


GREEN:	MVI	A,2
	JMP	SCOL


;	SET CYAN


CYAN:	MVI	A,6
SCOL:	STA	COLOR
	RET


;	CONVERT BUFFER INPUTS TO HEX
;	INPUT:	HL		BUFFER
;		B		LENGTH
;		C		DON'T CARE
;	OUTPUT:	A		LOW BYTE
;		BC		LOST
;		DE		LOST
;		HL		NUMBER
;	STATUS:	<NC>		NO ENTRY
;		< C>< Z>	VALUE =ZERO
;		< C><NZ>	VALUE >ZERO


DECH:	LXI	H,KBUF		;KYBD BUFFER
DEC0:	CALL	HEX		;HEX DIGIT?
	RNC			;NO
	LXI	D,0		;INITIAL VALUE
	PUSH	D		;VALUE SAVED
	DCX	H		;BUFFER-1
DEC1:	INX	H		;BUFFER+1
	CALL	HEX		;HEX DIGIT?
				;IF YES, WILL BE HEX
				;VALUE RANGE 0 - 15
	JNC	DEC2		;NO-QUIT
	MOV	C,A		;SHIFT DIGIT
	XTHL			;SWAP BUFFER/NUMBER
	PUSH	B		;SAVE DIGIT
	LXI	D,16
	CALL	MULHD		;NUMBER*16
	POP	B		;DIGIT BACK
	MOV	A,C
	CALL	ADHLA		;NEW VALUE
	XTHL			;SWAP NUMBER/BUFFER
	DCR	B		;LENGTH-1
	JNZ	DEC1		;NEXT CHAR
DEC2:	POP	H		;NUMBER UP
	MOV	A,H
	ORA	L		;TEST 0
	MOV	A,L		;SET LOW BYTE
	STC			;SET CARRY
	RET


;	VALIDATE HEX DIGIT
;	A:	0-15 IF VALID
;	< C>	VALID
;	<NC>	INVALID


HEX:	MOV	A,M
	CALL	NIBL
	CMC
	RET


;	PRINT NUMBER (HEX)
;	INPUT:	HL		VALUE


PNUM:	MOV	A,H
	CALL	HIGH
	MOV	A,H
	CALL	LOW
	MOV	A,L
	CALL	HIGH
	MOV	A,L
	JMP	LOW


HIGH:	ANI	0F0H		;KILL LOW BITS
	RRC			;/2
	RRC			;/4
	RRC			;/8
	RRC			;/16


LOW:	ANI	00FH		;KILL HI BITS
	ADI	'0'		;+ASCII
	CPI	'9'+1		;>9?
	JC	PHEX		;NO
	ADI	7		;YES-ADD FOR A-F


PHEX:	CALL	LO		;ECHO
	JMP	WRITE		;WRITE IT


;	SEND STRING HL TERM W/ 0
;	(NO CHECK FOR CHAR VALIDITY)
;	INPUT:	HL	MESSAGE
;	STATUS:	<Z>	FORCED


SSTR:	MOV	A,M		;GET CHAR
	INX	H		;MESSAGE+1
	ORA	A		;AT END?
	RZ			;YES
	CALL	LO		;ECHO
	CALL	WRITE		;WRITE IT
	JMP	SSTR		;NEXT CHAR


;	SEND CR/LF'S


PCRS2:	CALL	PCRS
PCRS:	CALL	CRLF		;TO CRT
	MVI	A,13		;CR
	CALL	WRITE
	MVI	A,10		;LF
	JMP	WRITE


;	SEND TAB


STAB:	MVI	A,9		;SET TAB
	CALL	LO		;ECHO


;	WRITE ONE CHARACTER TO FILE
;	STATUS:		ALL REGISTERS RETAINED
;	FLAGS:		DON'T CARE


WRITE:	PUSH	H
	LXI	H,SF		;SRC FILE POINTER
	DCR	M		;-1
	INR	M		;+1
				;DONE THAT WAY IN ORDER TO
				;PRESERVE ALL REGISTERS.
				;< Z> IF FILE NOT GENERATED
				;<NZ> IF FILE IS  GENERATED
	LXI	H,FPB1		;OUTPUT FPB
	CNZ	PTBYT		;PUT THE BYTE
	POP	H
	RET			;WHEN ASSEMBLED, THIS SHOULD
				;BE AT 86D3H (ORG 8200H) OR
				;DBD3H (ORG D700H) OR 44D3H
				;(ORG 4000H) IF THERE AREN'T
				;ANY MODS....


;=======MESSAGES


MSG01:	DB	6,3,27,11,15,12,14,3,14,1
	DB	'ASSEMBLY CROSS REFERENCE LISTING V5.82'
	DB	15,22,3,21,10,'HIT ',6,56,' RETURN '
	DB	6,6,' TO CONTINUE',3,64,0,239

MSG02:	DB	6,6,13,10,10
	DB	'STARTING ADDRESS      (HEX)  > ',239

MSG03:	DB	6,6,13,10,10
	DB	'ENDING   ADDRESS      (HEX)  > ',239

MSG04:	DB	6,2,13,10,10
	DB	'LOW  BOUNDARY ADDRESS (HEX)  > ',239

MSG05:	DB	6,2,13,10,10
	DB	'HIGH BOUNDARY ADDRESS (HEX)  > ',239

MSG06:	DB	6,3,13,10,10,'SEARCHING',13,10,239

MSG07:	DB	6,3,13,10,10,'SORTING',13,10,239

MSG08:	DB	6,4,13,10,10,'LISTING:',13,10,10,22,239

MSG09:	DB	6,1,13,10,10,'NOTHING FOUND',13,10,10,239

MSG10:	DB	6,6,13,10,10,'CONTINUE? ',239

MSG11:	DB	9,'FROM',9,0		;NOTE THE 0 TERMINATOR
					;VICE A 239.  THIS MSG
					;IS SENT BY "SSTR".

MSG12:	DB	6,6,13,10,10,'DESIRE A ',17,'SOURCE ',22
	DB	'FILE TO BE GENERATED?  <',18,'Y',22,'/'
	DB	17,'N',22,'>',9,18,'> ',22,239

DLC:	DB	26,32,26,239

NAME:	DB	'XREF',0		;FILE NAME
TYPS:	DB	'SRC',0			;FILE TYPE


;	BYTE LENGTH PER OP CODE


	;	0 1 2 3 4 5 6 7 8 9 A B C D E F    <-LOW/HI
	;
BYTE:	DB	1,3,1,1,1,1,2,1,0,1,1,1,1,1,2,1		;00
	DB	0,3,1,1,1,1,2,1,0,1,1,1,1,1,2,1		;10
	DB	0,3,3,1,1,1,2,1,0,1,3,1,1,1,2,1		;20
	DB	0,3,3,1,1,1,2,1,0,1,3,1,1,1,2,1		;30
	DB	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1		;40
	DB	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1		;50
	DB	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1		;60
	DB	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1		;70
	DB	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1		;80
	DB	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1		;90
	DB	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1		;A0
	DB	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1		;B0
	DB	1,1,3,3,3,1,2,1,1,1,3,0,3,3,2,1		;C0
	DB	1,1,3,2,3,1,2,1,1,0,3,2,3,0,2,1		;D0
	DB	1,1,3,1,3,1,2,1,1,1,3,1,3,0,2,1		;E0
	DB	1,1,3,1,3,1,2,1,1,1,3,1,3,0,2,1		;F0


;	JMP/CALL PRINT TABLE
;
;	ADD 192 TO ENTRY NUMBER TO GET APPROPRIATE
;	JMP/CALL EQUIVALENT.  NOTE THE TERMINATING
;	ZERO (0) AFTER EACH ENTRY.....THESE ARE
;	PRINTED BY "SSTR" ROUTINE.  TABLE COULD BE
;	REDUCED AND ELIMINATE THE SPACE ENTRIES IF
;	DESIRED, BUT THIS WILL REQUIRE MORE EXTENSIVE
;	CHECK OF THE NUMBER IN THE ACCUMULATOR AT
;	"PNT2" LOCATION.
;
;	ALL ENTRIES MUST BE THE SAME LENGTH!!


TABLE:	DB	'    ',0	;00/192
	DB	'    ',0
	DB	'JNZ ',0	;02/194
	DB	'JMP ',0	;03/195
	DB	'CNZ ',0	;04/196
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'JZ  ',0	;10/202
	DB	'    ',0
	DB	'CZ  ',0	;12/204
	DB	'CALL',0	;13/205
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'JNC ',0	;18/210
	DB	'    ',0
	DB	'CNC ',0	;20/212
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'JC  ',0	;26/218
	DB	'    ',0
	DB	'CC  ',0	;28/220
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'JPO ',0	;34/226
	DB	'    ',0
	DB	'CPO ',0	;36/228
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'JPE ',0	;42/234
	DB	'    ',0
	DB	'CPE ',0	;44/236
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'JP  ',0	;50/242
	DB	'    ',0
	DB	'CP  ',0	;52/244
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'    ',0
	DB	'JM  ',0	;58/250
	DB	'    ',0
	DB	'CM  ',0	;60/252
	DB	0,0,0,0,0	;TERMINATORS



;	FCS ROM CALL TABLES
;
;
;	V8.79 CALL TABLE


V879	EQU	$


	JMP	194EH		;ADHLA
	JMP	1883H		;CMPHD
	JMP	17C1H		;CRLF
	JMP	1030H		;ERAS
	JMP	16FFH		;ESCD
	JMP	17C8H		;LO
M879:	JMP	187AH		;MOVHD
	JMP	1998H		;MULHD
	JMP	17E9H		;NIBL
	JMP	182AH		;OSTR
	JMP	188FH		;SUBHD
	JMP	185FH		;WATL

	JMP	156CH		;CLSEQO
	JMP	0AD6H		;EMESS
	JMP	151DH		;INSEQO
	JMP	11E1H		;OPEN
	JMP	14ADH		;PFSPC
	JMP	1680H		;PTBYT
	JMP	0B48H		;RESET
	JMP	14FCH		;RWSEQI

	DW	01B6H


;	V9.80 CALL TABLE


V980	EQU	$


	JMP	194EH		;ADHLA
	JMP	1883H		;CMPHD
	JMP	17C1H		;CR/LF
	JMP	0250H		;ERAS
	JMP	16FFH		;ESCD
	JMP	17C8H		;LO
M980:	JMP	187AH		;MOVHD
	JMP	1998H		;MULHD
	JMP	17E9H		;NIBL
	JMP	182AH		;OSTR
	JMP	188FH		;SUBHD
	JMP	185FH		;WATL

	JMP	156CH		;CLSEQO
	JMP	0AD6H		;EMESS
	JMP	151DH		;INSEQO
	JMP	11E1H		;OPEN
	JMP	14ADH		;PFSPC
	JMP	1680H		;PTBYT
	JMP	0B48H		;RESET
	JMP	14FCH		;RWSEQI

	DW	01B6H


EPRG	EQU	$-1


;=======VARIABLE DATA AREA
;
;
;	THE FOLLOWING VARIABLES ARE CLEARED FROM "DSS" TO
;	"DSE" BY "SETUP" ROUTINE.  FPB1 IS CLEARED AND SET
;	DOWN IN ROM.  TBUF IS SET BY THE PROGRAM.
;
;	THESE VARIABLES USE THE SAME MEMORY AREA AS THE
;	V8.79//V9.80 CALL TABLES.  THIS IS OK AS THE TABLES
;	ARE OVERLAYED ONLY ONCE AND THEN NEVER USED AGAIN.



	ORG	V879		;RESET ORIGIN


DSS	EQU	$		;DATA START

KBUF:	DS	16		;KYBD BUFFER

BCH:	DS	2		;BOUNDARY LO
BCL:	DS	2		;BOUNDARY HI
CODE:	DS	1		;INSTR CODE (-192)
EAD:	DS	2		;END ADDR
LADR:	DS	2		;LAST ADDR CK
PASS:	DS	1		;SORT PASS COUNT
SAD:	DS	2		;START ADDR
SF:	DS	1		;FILE CONTROL
SIZE:	DS	2		;TOP OF BUFFER
TADR:	DS	2		;BUFFER ADDR

DSE	EQU	$-1		;DATA END


FPB1:	DS	38		;FPB

	DS	128		;STACK SPACE
STACK	EQU	$


	ORG	(($/128)+1)*128


OBUF:	DS	768		;OUTPUT BUFFER


	ORG	8200H		;RESET ORIGIN - USE WITH
				;PROGRAM ORIGIN OF 4000H
				;ONLY


TBUF	EQU	$		;XREF BUFFER


EOP	EQU	EPRG		;PROG END - NO NEED TO
				;SAVE ANYTHING PAST THIS
				;POINT WHEN SAVING AS A
				;.PRG PROGRAM


	END	START