	ORG	000H
	TITLE	'SID INSTRUCTION BACKTRACE UTILITY 12/26/77'
;
;	BACKTRACE INSTRUCTIONS IN SID
;
;	COPYRIGHT (C) 1977
;	DIGITAL RESEARCH
;	BOX 579, PACIFIC GROVE, CA.
;	93950
;
;	ENTRY VECTOR
TRAC:	JMP	SETUP
;
SYBASE:
;	SYMBOL TABLE SET-UP FOR SID
	DB	'YALPSID',7,LOW DISE,HIGH DISE	;DISPLAY
	DB	'TCELLOC',7,LOW COLE,HIGH COLE	;COLLECT
	DB	'LAITINI',7,LOW INIE,HIGH INIE	;INITIAL
SYLEN	EQU	$-SYBASE	;LENGTH OF SYMBOL TABLE
;
INIE:	JMP	INITIAL
COLE:	JMP	COLLECT
DISE:	JMP	DISPLAY
;
	DB	'COPYRIGHT (C) 1977, DIGITAL RESEARCH   '
;
BDOSE	EQU	0005H	;PRIMARY BDOS ENTRY POINT
DDTBASE	EQU	7*8+1	;ADDRESS OF DDT ENTRY VECTOR
CR	EQU	0DH
LF	EQU	0AH
;
PRLABEL:
	;PRINT SYMBOLIC LABEL GIVEN BY HL
	LXI	B,27
	JMP	GODDT
;
PCHAR:	;PRINT CHARACTER FROM REGISTER A
	LXI	B,9
	JMP	GODDT
;
PADDR:	;PRINT ADDRESS FROM D,E
	PUSH	D	;SAVE A COPY
	MOV	A,D	;HIGH ADDRESS
	CALL	PBYTE	;PRINT BYTE VALUE
	POP	D	;RECALL ADDRESS
	MOV	A,E	;LOW VALUE
;	(DROP THROUGH TO PRINT BYTE)
PBYTE:	;PRINT BYTE VALUE FROM A
	LXI	B,12
GODDT:	LHLD	DDTBASE	;GET ENTRY TO DDT FROM RST 7 LOCATION
	DAD	B
	PCHL
;
PRINT:	;PRINT MESSAGE IN D,E 'TIL FIRST ZERO
	LDAX	D
	ORA	A
	RZ
;	MORE TO PRINT
	INX	D
	PUSH	D
	CALL	PCHAR
	POP	D
	JMP	PRINT
;
CRLF:	;PRINT CARRIAGE RETURN LINE FEED
	PUSH	B
	PUSH	D
	MVI	A,CR
	CALL	PCHAR
	MVI	A,LF
	CALL	PCHAR
	POP	D
	POP	B
	RET
;
SETUP:
	;ARRIVE HERE FROM RELOCATOR TO SETUP BRANCHES
	LHLD	BDOSE+1	;PREVIOUS BDOS ENTRY ADDRESS
	SHLD	TRAC+1	;CHANGE FIRST JMP ADDRESS
	LXI	H,TRAC	;ADDRESS OF FIRST JMP
	SHLD	BDOSE+1	;CHANGE BDOS ENTRY ADDRESS
;
INITIAL:
;	PRINT ENTRY POINT ADDRESSES
	LXI	D,INIMSG
	CALL	PRINT
	LXI	D,INIE
	CALL	PADDR
	LXI	D,COLMSG
	CALL	PRINT
	LXI	D,COLE
	CALL	PADDR
	LXI	D,DISMSG
	CALL	PRINT
	LXI	D,DISE
	CALL	PADDR
;
;	DETERMINE IF THE DISASSEMBLER IS PRESENT
	LDA	DDTBASE+1	;HIGH ORDER ADDRESS OF DDT TO REG-A
	CPI	ENDMOD SHR 8
	JNZ	INIT1
;	DISASSEMBLER HAS BEEN OVERLAYED
	LXI	D,OVERMSG
	MVI	A,1		;MARK AS ADDRESSES ONLY
	JMP	INIT2
INIT1:	;MARK AS FULL TRACE
	XRA	A
	LXI	D,UNDMSG
;
INIT2:	STA	DISFLG	;SET TO 1 IF ADDRESSES ONLY
	CALL	PRINT
	LXI	H,COUNT
	MVI	M,0		;ZERO THE INSTRUCTION COUNT
	LXI	H,ABUFF		;ADDRESS BUFFER
	SHLD	NEXT		;NEXT TO FILL AT BEGINNING OF BUFFER
	LXI	D,SYLEN		;LENGTH OF SYMBOL TABLE
	RET			;BACK TO DDT
;
COLLECT:
;	ENTER WITH INSTRUCTION ADDRESS IN D,E
	LXI	H,COUNT
	MOV	A,M		;INSTRUCTION COUNT
	ORA	A
	JM	FULLC		;STOP AT 128 COUNTS
	INR	M		;NOT AT 128 YET
FULLC:	LHLD	NEXT		;NEXT POSITION TO FILL
	MOV	M,E
	INR	L		;WRAP-AROUND ON PAGE
	MOV	M,D
	INR	L
	SHLD	NEXT
	XRA	A
	RET			;RETURN TO DDT WITH ZERO FLAG
;
DISPLAY:
;	ENTER WITH C=1 IF ONLY ADDRESS TRACE IS REQUESTED
	LXI	H,DISFLG
	MOV	A,M
	ORA	C	;DISFLG = 1 IF DISASSEMBLER NOT PRESENT
	MOV	C,A
	PUSH	B
	LXI	D,TRMSG	;TRACE MESSAGE
	CALL	PRINT
	POP	B
	LXI	H,COUNT
	MOV	B,M		;QUEUE SIZE IN B
	XRA	A		;CLEAR COLUMN COUNT
	STA	COLUMN
	MOV	A,C
	ORA	A	;ADDRESS MODE?
	JNZ	DISP0
;	SAVE OLD PC FROM DISASSEMBLER
	LHLD	PC
	SHLD	TPC
DISP0:	LHLD	NEXT
;
DISP1:	;DISPLAY COLLECTED ADDRESSES OR INSTRUCTIONS
	MOV	A,B	;QUEUE SIZE
	ORA	A
	JZ	ENDISP
	DCR	B	;COUNT SIZE DOWN
	PUSH	B	;SAVE COUNT AND MODE
	DCR	L	;ADDRESS LAST HIGH ORDER ADDRESS
	MOV	D,M
	DCR	L	;ADDRESS LAST LOW ORDER ADDRESS
	MOV	E,M
	PUSH	H		;SAVE NEXT TO GET
	XCHG
;	CHECK MODE OF DISPLAY
	MOV	A,C
	ORA	A
	JZ	FDISP		;FULL DISPLAY?
;
;	PARTIAL ADDRESS DISPLAY
	XCHG		;READY FOR ADDRESS PRINTING
	LXI	H,COLUMN
	MOV	A,M
	INR	M
	ANI	111B	;COUNTS 0-7
	CZ	CRLF		;START NEW LINE
	CALL	PADDR
	MVI	A,' '
	CALL	PCHAR
	JMP	EDISP
;
FDISP:	SHLD	PC		;READY FOR DECODE
	CALL	PRLABEL		;OPTIONAL LABEL
	MVI	A,2
	STA	PAGM		;TO DISPLAY ONE LINE
	CALL	DISENT		;DISPLAYED
EDISP:	POP	H		;RECOVER NEXT TO DECODE
	POP	B		;RECOVER COUNT
	JMP	DISP1
;
ENDISP:	;END OF DISPLAY
	MOV	A,C
	ORA	A
	RZ		;RETURN WITHOUT RESTORING PC
	LHLD	TPC
	SHLD	PC	;DISASSEMBLER'S PC RESTORED
	RET
;
;	MESSAGES
INIMSG:	DB	CR,LF,'INITIAL = ',0
COLMSG:	DB	CR,LF,'COLLECT = ',0
DISMSG:	DB	CR,LF,'DISPLAY = ',0
OVERMSG:
	DB	CR,LF,'"-A" IN EFFECT, ADDRESS BACKTRACE',0
UNDMSG:	DB	CR,LF,'READY FOR SYMBOLIC BACKTRACE',0
TRMSG:	DB	CR,LF,'BACKTRACE:',0
;
;	DATA AREAS
COUNT:	DB	0
NEXT:	DW	ABUFF
TPC:	DS	2
DISFLG:	DS	1	;1 IF ADDRESSES ONLY
COLUMN:	DS	1	;COLUMN COUNT IF ADDRESSES ONLY
NPAGE	EQU	($ + 100H) AND 0FF00H	;NEXT PAGE ADDRESS
	DS	NPAGE-$	;SPACE FROM CURRENT LOCATION
;	ADDRESS BUFFER IS ON A PAGE BOUNDARY
ABUFF:	DS	255
	DB	0
ENDMOD	EQU	$
;
DISEM	EQU	ENDMOD		;DISASSEMBLER ENTRY POINTS
PC	EQU	DISEM+0CH
PAGM	EQU	DISEM+10H
DISENT	EQU	DISEM+06H
	END
