mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 17:04:19 +00:00
230 lines
4.6 KiB
NASM
230 lines
4.6 KiB
NASM
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
|
||
|