home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 156_01 / profile.asm < prev    next >
Assembly Source File  |  1985-08-21  |  3KB  |  165 lines

  1. ; NAME...
  2. ;    PROFILE
  3. ;
  4. ; PURPOSE...
  5. ;    Count calls to each function, report number of calls
  6. ;    at exit() time, enable walkback trace on errors.
  7. ;
  8. ;    Exported symbols...
  9. ;
  10.     GLOBAL    CCREGIS        ;entering a function
  11.     GLOBAL    CCLEAVI        ;leaving a function
  12.     GLOBAL    CCCALLS        ;report calls to functions
  13. ;
  14. ;    Imported symbols...
  15. ;
  16.     GLOBAL    QPUTS
  17.     GLOBAL    QPUTCHAR
  18.     GLOBAL    CURRENT        ;points to stack frame for
  19. ;                    current function
  20.     GLOBAL    CCCAR        ;like CAR() in LISP
  21.     GLOBAL    CCCDR        ;like CDR() in LISP
  22. ;
  23. ;    Entering new function...add a link to the previous one
  24. ;
  25. ;        register()
  26. ;            {de = *sp++;
  27. CCREGIS: POP    DE
  28. ;            *--sp = current;
  29.     LD    HL,(CURRENT)
  30.     PUSH    HL
  31. ;            current=sp;
  32.     LD    HL,0
  33.     ADD    HL,SP
  34.     LD    (CURRENT),HL
  35. ;            hl=*(current+1);
  36.     CALL    CCCDR
  37. ;            ++(hl-3);  /* 3 byte integer */
  38.     DEC    HL
  39.     DEC    HL
  40.     DEC    HL
  41.     CALL    CINCREM
  42.     CALL    C,CINCREM
  43.     CALL    C,CINCREM
  44. CCREG2:
  45. ;            *--sp = de;
  46. ;            return;
  47.     EX    DE,HL
  48.     JP    (HL)
  49. ;
  50. CINCREM: LD    A,(HL)
  51.     ADD    A,1
  52.     DAA
  53.     LD    (HL),A
  54.     INC    HL
  55.     RET
  56. ;
  57. ;    leaving a function...remove a link
  58. ;
  59. ;            current=*current
  60. CCLEAVI: EX    DE,HL             ;save function value if any
  61.     LD    HL,(CURRENT)
  62.     LD    A,(HL)
  63.     INC    HL
  64.     LD    H,(HL)
  65.     LD    L,A
  66.     LD    (CURRENT),HL
  67.     EX    DE,HL             ;restore function value
  68.     RET
  69. ;
  70. ;    report the function calls, called before exit()
  71. ;            calls(p) int *p;
  72. CCCALLS: PUSH    HL
  73. ;            {    puts("calls\tfunction\n");
  74.     LD    HL,CMSG
  75.     PUSH    HL
  76.     CALL    QPUTS
  77.     POP    HL
  78. ;                while(p)
  79.     POP    HL
  80. CCCAL2: LD    A,L
  81.     OR    H
  82.     RET    Z
  83. ;                    {puts(p+5);
  84.     LD    (POINT),HL
  85.     INC    HL
  86.     INC    HL
  87.     INC    HL
  88.     INC    HL
  89.     INC    HL
  90.     PUSH    HL
  91.     CALL    QPUTS
  92.     POP    HL
  93.     LD    HL,9
  94. ;                    putchar('\t');
  95.     PUSH    HL
  96.     CALL    QPUTCHAR
  97.     POP    HL
  98. ;                    ptn(p+4);
  99.     LD    HL,(POINT)
  100.     INC    HL
  101.     INC    HL
  102.     INC    HL
  103.     INC    HL
  104.     CALL    CCPTN
  105. ;                    putchar('\n');
  106.     LD    HL,13
  107.     PUSH    HL
  108.     CALL    QPUTCHAR
  109.     POP    HL
  110. ;                    p=*p;
  111.     LD    HL,(POINT)
  112.     CALL    CCCAR
  113. ;                    }
  114.     JP    CCCAL2
  115. ;            }
  116. ;            ptn(x) char *x;
  117. ;            {    c=' '-'0';
  118. CCPTN:    LD    C,' '-'0'
  119. ;                ptb(x);ptb(x);ptb(x);
  120.     CALL    CCPUTB
  121.     CALL    CCPUTB
  122. ;                        fall into...
  123. ;            }
  124. ;            ptb(y) char *y;
  125. ;            {    ptnib((*x)>>4);
  126. CCPUTB:    LD    A,(HL)
  127.     RRA
  128.     RRA
  129.     RRA
  130.     RRA
  131.     CALL    CCPTNIB
  132. ;                ptnib(*x--);
  133. ;            }
  134.     LD    A,(HL)
  135.     CALL    CCPTNIB
  136.     DEC    HL
  137.     RET
  138. ;            ptnib(z) char (z);
  139. ;            {    x=x&15;
  140. CCPTNIB: AND    0FH
  141. ;                if(x)    c=0;
  142. ;                else    x=c;
  143.     JP    NZ,CCP33
  144.     LD    A,C
  145.     DB    0C2H    ;jp nz, (skips 2 bytes)
  146. CCP33:    LD    C,0
  147. ;                putchar(x+'0');
  148.     ADD    A,'0'
  149.     PUSH    DE    ;save...
  150.     PUSH    BC
  151.     PUSH    HL
  152.     LD    L,A
  153.     LD    H,0
  154.     PUSH    HL
  155.     CALL    QPUTCHAR
  156.     POP    HL
  157.     POP    HL    ;recover...
  158.     POP    BC
  159.     POP    DE
  160. ;            }
  161.     RET
  162. ;
  163. CMSG:    DB    'function  calls',13,0
  164. POINT:    DW    0
  165.