home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / beehive / program / c-no-bug.arc / DEBUG.C next >
Encoding:
C/C++ Source or Header  |  1990-06-30  |  4.0 KB  |  182 lines

  1. /****************** debug.c ***************************
  2. * DEBUG.C
  3. *
  4. *    (c)    Copyright 1985 by Thomas D. Webb.
  5. *    All rights reserved.
  6. *    Permission is granted for unlimited personal, noncomercial
  7. *    use only.
  8. *-------------------------------------------------------
  9. *
  10. *    Modified and changed for CP/M by Edmond.Breen 1986.
  11. *    (for original source code for IBM PC and clones see COMPUTER
  12. *     LANGUAGE(1986).Vol 3,Number 2:31-38.)
  13. *    
  14. *    Modifications (E.Breen):
  15. *        Structures: TKB and TCHR_ATTR removed, not required
  16. *            for CP/M use.
  17. *        Most character arrays replaced with pointers, to 
  18. *            improve speed.
  19. *        display_trace() function modified, for speed.
  20. *        inkey() function modified to reflect CP/M
  21. *            environment. Returns int value of
  22. *            key from keyboard, instead of a structure
  23. *            address of type TKB.
  24. *        CRTBUF() function replaced with movemem() function, 
  25. *            CRTBUF() was not given in the original source.
  26. *        Most variable names shortened to: text,data pair and
  27. *            user_text,variable pair.
  28. *        #define ON and #define OFF moved into debug.h file.
  29. *------------------------------------------------------------------
  30. */
  31.  
  32. #include <stdio.h>
  33. #include "debug.h"
  34.  
  35. #define CONTROL_KEY       26  /* ^Z */
  36. #define VOID
  37. #define TRUE        1
  38. #define FALSE        0
  39. #define BLANK        ' '
  40. #define MAX_ROWS    24    /* rows/screen */
  41. #define MAX_COLS    80    /* columns/screen */
  42. #define SCR_SIZE    (MAX_COLS * MAX_ROWS)    /* screen size */
  43. #define SCREEN        61440    /* start address or top left hand corner
  44.                  of screen for a Microbee. Memory mapped
  45.                  VDU. */
  46. #define    BUFFER_SIZE    2000
  47.  
  48. int trace_sw = OFF;
  49. static int first_time = TRUE;
  50. char user_data[MAX_COLS/2];
  51. static char save_buf[BUFFER_SIZE];
  52. static char trace_table[MAX_ROWS][MAX_COLS];
  53.  
  54. inkey()
  55. {
  56.     int ch;
  57.     if( (ch = bdos(1,0)) == CONTROL_KEY)
  58.         (trace_sw == ON) ? (trace_sw = OFF): (trace_sw = ON);
  59.     return ch;
  60. }
  61.  
  62. wait()
  63. {
  64.     inkey();
  65. }
  66.  
  67. init_table()
  68. {
  69.     int i, j;
  70.     static char trace_msg[] = 
  71. {"Trace table ... Press any key to return ... Press ^Z to toggle off trace"};
  72.  
  73.     for(i=0;i<MAX_ROWS;i++)
  74.         for(j=0;j<MAX_COLS;j++)
  75.             trace_table[i][j]=BLANK;
  76.  
  77.     for(i=0; i < sizeof(trace_msg) ;i++)
  78.         trace_table[0][i] = trace_msg[i];
  79. }
  80.  
  81. display_trace(text,data)
  82. char *text, *data;
  83. {
  84.     int i;
  85.     if(first_time) {
  86.         init_table();
  87.         first_time = FALSE;
  88.     }
  89.  
  90.     movemem(trace_table[1],trace_table[2],
  91.                 sizeof(trace_table)-80);
  92.  
  93.     for(i=0; i< MAX_COLS; i++)
  94.         trace_table[MAX_ROWS-1][i] = BLANK;
  95.     for(i=0; i < MAX_COLS/2 && *text != '\0'; i++)
  96.         trace_table[MAX_ROWS-1][i] = *text++;
  97.     for(i= MAX_COLS/2; i < MAX_COLS    && *data !='\0'; i++)
  98.         trace_table[MAX_ROWS-1][i] = *data++;
  99.     
  100.     movemem(save_buf,SCREEN,SCR_SIZE); /* save screen display */
  101.     movemem(SCREEN,trace_table,SCR_SIZE); /*display trace_table */
  102.     wait();
  103.     movemem(SCREEN,save_buf,SCR_SIZE); /* refresh screen display */
  104. }    
  105.  
  106. movemem(to,from,n)
  107. unsigned char *to, *from;
  108. unsigned int n;
  109. {
  110.     while(n--)
  111.         *to++ = *from++;
  112.  
  113. t_c(text,varible)
  114. char *text;
  115. char varible;
  116. {
  117.     if(varible == BLANK)
  118.         strcpy(user_data,"BLANK char");
  119.     else    
  120.         if(varible == '\0')
  121.             strcpy(user_data,"NULL char");
  122.     else
  123.         sprintf(user_data,"%c",varible);
  124.  
  125.     display_trace(text,user_data);
  126. }
  127.  
  128. t_i(text,variable)
  129. char *text;
  130. int variable;
  131. {
  132.     sprintf(user_data,"%d",variable);
  133.     display_trace(text,user_data);
  134. }
  135.  
  136. t_l(text,variable)
  137. char *text;
  138. long int variable;
  139. {
  140.     sprintf(user_data,"%ld",variable);
  141.     display_trace(text,user_data);
  142. }
  143.  
  144. t_u(text,variable)
  145. char *text;
  146. unsigned variable;
  147. {
  148.     sprintf(user_data,"%u",variable);
  149.     display_trace(text,user_data);
  150. }
  151.  
  152. t_f(text,variable)
  153. char *text;
  154. float variable;
  155. {
  156.     sprintf(user_data, "%f",variable);
  157.     display_trace(text,user_data);
  158. }
  159.  
  160. t_d(text,varible)
  161. char *text;
  162. double varible;
  163. {
  164.     sprintf(user_data, "%f",varible);
  165.     display_trace(text,user_data);
  166. }
  167.  
  168. t_s(text,variable)
  169. char * text;
  170. char *variable;
  171. {
  172.     if(*variable == '\0') 
  173.         strcpy(user_data,"NULL string");
  174.     else
  175.         strcpy(user_data,variable);    
  176.     display_trace(text,user_data);
  177. }
  178.  
  179.  
  180.  
  181.