home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum16.lzh / SOFTWARE / ASSEMBLER / EXCEPT_HANDLER / dmplib.c next >
Text File  |  1991-01-09  |  3KB  |  190 lines

  1. /* 1990-Nov-05 : changed _mkdata_module permissions to 557 (from 555) DFK */
  2. #include <module.h>
  3. #include <errno.h>
  4. #include <stdio.h>
  5.  
  6. #define MODSIZE        sizeof (struct dump)
  7. #define REGWORDS    8
  8. #define STKWORDS    32
  9.  
  10. struct dump
  11. {
  12.     int valid;
  13.     int errno;
  14.     int pc;
  15.     int offset;
  16.     int d [REGWORDS];
  17.     int a [REGWORDS];
  18.     int stk [STKWORDS];
  19. };
  20.  
  21. static struct dump *dtaptr;
  22. static mod_exec *modptr;
  23. void outpc (),
  24.      outreg (),
  25.      outstk (),
  26.      bname ();    /* this is tricky: I want a reference from pc */
  27.  
  28. dmp_link (name)
  29. char *name;
  30. {
  31.     char modname [20];
  32.     mod_exec *modlink ();
  33.     void *_mkdata_module ();
  34.  
  35.     if (!dtaptr)
  36.     {
  37.     if (name == NULL)
  38.         name = (void*)bname;
  39.     strncpy (modname, name, 15);
  40.     strcat (modname, ".dmp");
  41.     modptr = modlink (modname,(MT_DATA << 8)+ML_ANY);
  42.     if (modptr == (void*)-1)
  43.     {
  44.         register struct dump *d;
  45.  
  46.         _mkdata_module (modname, MODSIZE, 0xc000, 0x557);
  47.         modptr = modlink (modname,(MT_DATA << 8)+ML_ANY);
  48.         d = (void*)((char*)modptr + modptr->_mexec);
  49.         d->valid = 0;
  50.     }
  51.     if (modptr != (void*)-1)
  52.         dtaptr = (void*)((char*)modptr + modptr->_mexec);
  53.     }
  54. }
  55.  
  56. dmp_unlink ()
  57. {
  58.     munlink (modptr);
  59. }
  60.  
  61. dmp_stderr ()
  62. {
  63.     if (dtaptr)
  64.     {
  65.     register struct dump *d = dtaptr;
  66.  
  67.     if (d->valid)
  68.     {
  69.         outpc (d->errno, d->pc, d->offset);
  70.         outreg (d->d);
  71.         outstk (d->stk, d->valid);
  72.     }
  73.     }
  74. }
  75.  
  76. dmp_pc (errno, pc, offpc)
  77. int errno,
  78.     pc,
  79.     offpc;
  80. {
  81.     register struct dump *d = dtaptr;
  82.  
  83.     outpc (errno, pc, offpc);
  84.     if (d)
  85.     {
  86.     d->errno = errno;
  87.     d->pc = pc;
  88.     d->offset = offpc;
  89.     }
  90. }
  91.  
  92. dmp_reg (reg)
  93. register int *reg;
  94. {
  95.     register int i;
  96.     register struct dump *d = dtaptr;
  97.  
  98.     outreg (reg);
  99.     if (d)
  100.     {
  101.     for (i = 0; i < REGWORDS; i++, reg++)
  102.         d->d[i] = *reg;
  103.     for (i = 0; i < REGWORDS; i++, reg++)
  104.         d->a[i] = *reg;
  105.     }
  106. }
  107.  
  108. dmp_stk (stk)
  109. register int *stk;
  110. {
  111.     register int i;
  112.     register struct dump *d = dtaptr;
  113.  
  114.     outstk (stk, STKWORDS);
  115.     if (d)
  116.     {
  117.     d->valid = STKWORDS;
  118.     for (i = 0; i < STKWORDS; i++, stk++)
  119.         d->stk[i] = *stk;
  120.     }
  121. }
  122.  
  123. static void outpc (errno, pc, offpc)
  124. int errno,
  125.     pc,
  126.     offpc;
  127. {
  128.     register char *out;
  129.  
  130.     switch (errno)
  131.     {
  132.     case E_BUSERR:
  133.     out = "Bus Error at        : %08X\n";
  134.     break;
  135.  
  136.     case E_ADRERR:
  137.     out = "Address Error  at   : %08X\n";
  138.     break;
  139.  
  140.     case E_ILLINS:
  141.     out = "Illegal Instr. at   : %08X\n";
  142.     break;
  143.  
  144.     case E_ZERDIV:
  145.     out = "Divide by Zero at   : %08X\n";
  146.     break;
  147.  
  148.     case E_1010:
  149.     out = "1010 Exception at   : %08X\n";
  150.     break;
  151.  
  152.     case E_1111:
  153.     out = "1111 Exception at   : %08X\n";
  154.     break;
  155.     }
  156.     fprintf (stderr, out, pc);
  157.     fprintf (stderr, "offset from main () : %08X\n", offpc);
  158. }
  159.  
  160. static void outreg (reg)
  161. register int *reg;
  162. {
  163.     register int i;
  164.  
  165.     fprintf (stderr, "d0-7:");
  166.     for (i = 0; i < REGWORDS; i++, reg++)
  167.     fprintf (stderr, " %08X", *reg);
  168.     fprintf (stderr, "\na0-7:");
  169.     for (i = 0; i < REGWORDS; i++, reg++)
  170.     fprintf (stderr, " %08X", *reg);
  171.     fprintf (stderr, "\n");
  172. }
  173.  
  174. static void outstk (stk, n)
  175. register int *stk;
  176. register int n;
  177. {
  178.     register int i;
  179.  
  180.     fprintf (stderr, ".sp :");
  181.     for (i = 0; i < n; i++, stk++)
  182.     {
  183.     fprintf (stderr, " %08X", *stk);
  184.     if (i % 8 == 7)
  185.         fprintf (stderr, "\n     ");
  186.     }
  187.     fprintf (stderr, "\n");
  188.     fflush (stderr);
  189. }
  190.