home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols200
/
vol224
/
profile.asm
< prev
next >
Wrap
Assembly Source File
|
1994-07-13
|
3KB
|
165 lines
; NAME...
; PROFILE
;
; PURPOSE...
; Count calls to each function, report number of calls
; at exit() time, enable walkback trace on errors.
;
; Exported symbols...
;
GLOBAL CCREGIS ;entering a function
GLOBAL CCLEAVI ;leaving a function
GLOBAL CCCALLS ;report calls to functions
;
; Imported symbols...
;
GLOBAL QPUTS
GLOBAL QPUTCHAR
GLOBAL CURRENT ;points to stack frame for
; current function
GLOBAL CCCAR ;like CAR() in LISP
GLOBAL CCCDR ;like CDR() in LISP
;
; Entering new function...add a link to the previous one
;
; register()
; {de = *sp++;
CCREGIS: POP DE
; *--sp = current;
LD HL,(CURRENT)
PUSH HL
; current=sp;
LD HL,0
ADD HL,SP
LD (CURRENT),HL
; hl=*(current+1);
CALL CCCDR
; ++(hl-3); /* 3 byte integer */
DEC HL
DEC HL
DEC HL
CALL CINCREM
CALL C,CINCREM
CALL C,CINCREM
CCREG2:
; *--sp = de;
; return;
EX DE,HL
JP (HL)
;
CINCREM: LD A,(HL)
ADD A,1
DAA
LD (HL),A
INC HL
RET
;
; leaving a function...remove a link
;
; current=*current
CCLEAVI: EX DE,HL ;save function value if any
LD HL,(CURRENT)
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
LD (CURRENT),HL
EX DE,HL ;restore function value
RET
;
; report the function calls, called before exit()
; calls(p) int *p;
CCCALLS: PUSH HL
; { puts("calls\tfunction\n");
LD HL,CMSG
PUSH HL
CALL QPUTS
POP HL
; while(p)
POP HL
CCCAL2: LD A,L
OR H
RET Z
; {puts(p+5);
LD (POINT),HL
INC HL
INC HL
INC HL
INC HL
INC HL
PUSH HL
CALL QPUTS
POP HL
LD HL,9
; putchar('\t');
PUSH HL
CALL QPUTCHAR
POP HL
; ptn(p+4);
LD HL,(POINT)
INC HL
INC HL
INC HL
INC HL
CALL CCPTN
; putchar('\n');
LD HL,13
PUSH HL
CALL QPUTCHAR
POP HL
; p=*p;
LD HL,(POINT)
CALL CCCAR
; }
JP CCCAL2
; }
; ptn(x) char *x;
; { c=' '-'0';
CCPTN: LD C,' '-'0'
; ptb(x);ptb(x);ptb(x);
CALL CCPUTB
CALL CCPUTB
; fall into...
; }
; ptb(y) char *y;
; { ptnib((*x)>>4);
CCPUTB: LD A,(HL)
RRA
RRA
RRA
RRA
CALL CCPTNIB
; ptnib(*x--);
; }
LD A,(HL)
CALL CCPTNIB
DEC HL
RET
; ptnib(z) char (z);
; { x=x&15;
CCPTNIB: AND 0FH
; if(x) c=0;
; else x=c;
JP NZ,CCP33
LD A,C
DB 0C2H ;jp nz, (skips 2 bytes)
CCP33: LD C,0
; putchar(x+'0');
ADD A,'0'
PUSH DE ;save...
PUSH BC
PUSH HL
LD L,A
LD H,0
PUSH HL
CALL QPUTCHAR
POP HL
POP HL ;recover...
POP BC
POP DE
; }
RET
;
CMSG: DB 'function calls',13,0
POINT: DW 0