home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 549b.lha / M2P_v1.0_sources / source.lzh / DBug.mpp < prev    next >
Encoding:
Modula Implementation  |  1991-08-10  |  9.6 KB  |  303 lines

  1. IMPLEMENTATION MODULE DBug;
  2.  
  3. @IF AMIGA THEN
  4.  
  5.    @INCLUDE "MACROS"
  6.    
  7.    IMPORT SYSTEM;
  8.    IMPORT Tasks;
  9.    
  10.    @IF    M2S THEN
  11.       IMPORT RunTime;
  12.    @ELSIF TDI THEN
  13.       IMPORT AMIGAX;
  14.       IMPORT Libraries;
  15.    @END
  16.    
  17.    (*----------------------------------------------------------------------*)
  18.    
  19.    @IF    M2S THEN CONST HaltNumber = 0;
  20.    @ELSIF TDI THEN CONST HaltNumber = 9;
  21.    @ELSE           CONST HaltNumber = 0;
  22.    @END
  23.    
  24.    TYPE Message = ARRAY [0..40] OF CHAR;
  25.    
  26.    VAR errorNo      : INTEGER;       (* Error number *)
  27.        errorText    : POINTER TO Message;
  28.        
  29.        task         : Tasks.TaskPtr;
  30.        oldTrapCode  : PROC;
  31.    
  32.    @IF TDI THEN
  33.    VAR IntuitionBase: SYSTEM.ADDRESS;
  34.    @END
  35.        
  36.    (*----------------------------------------------------------------------*)
  37.    (* To avoid importing Intuition, we simply define AutoRequest here      *)
  38.    (*----------------------------------------------------------------------*)
  39.    
  40.    @NoLongAddressing
  41.    
  42.    @IF M2S THEN
  43.    
  44.       PROCEDURE AutoRequest(window,bodyText,posText,negText:SYSTEM.ADDRESS;
  45.                             posFlags,negFlags:LONGBITSET;
  46.                             width,height:INTEGER): BOOLEAN;
  47.       INLINE(RunTime.IntuitionBase, -348, 8, 9, 10, 11, 0, 1, 2, 3);
  48.    
  49.    @ELSIF TDI THEN
  50.    
  51.       @NoEntryExitCode
  52.       
  53.       PROCEDURE AutoRequest(window,bodyText,posText,negText:SYSTEM.ADDRESS;
  54.                             posFlags,negFlags:LONGBITSET;
  55.                             width,height:LONGINT): BOOLEAN;
  56.       BEGIN
  57.          SYSTEM.CODE(048E7H,070FEH);            (* movem.l d1-d3/a0-a6,-(sp)    *)
  58.          SYSTEM.SETREG(14,IntuitionBase);
  59.          SYSTEM.CODE(04CEFH,00F0FH,0002CH);     (* movem.l 44(sp),d0-d3/a0-a3   *)
  60.          SYSTEM.CODE(0C740H);                   (*  exg     d0,d3               *)
  61.          SYSTEM.CODE(0C541H);                   (*  exg     d1,d2               *)
  62.          SYSTEM.CODE(0C748H);                   (*  exg     a0,a3               *)
  63.          SYSTEM.CODE(0C549H);                   (*  exg     a1,a2               *)
  64.          SYSTEM.CODE(04EAEH,0FEA4H);            (* jsr     -348(a6)             *)
  65.          SYSTEM.CODE(01F40H,0004CH);            (* move.b   d0,76(sp)           *)
  66.          SYSTEM.CODE(04CDFH,07F0EH);            (* movem.l (sp)+,d1-d3/a0-a6    *)
  67.          SYSTEM.CODE(04E75H);                   (* rts                            *)
  68.       END AutoRequest;
  69.    
  70.       @EntryExitCode
  71.    
  72.    @END
  73.    
  74.    (*----------------------------------------------------------------------*)
  75.    (* Put up a requester asking what to do about the problem.              *)
  76.    (*----------------------------------------------------------------------*)
  77.    
  78.    @NoLongAddressing
  79.    
  80.    PROCEDURE AskCont(): BOOLEAN;
  81.    
  82.    TYPE IntuiText = RECORD
  83.            FrontPen : SYSTEM.BYTE;
  84.            BackPen  : SYSTEM.BYTE;
  85.            DrawMode : SYSTEM.BYTE;
  86.            LeftEdge : INTEGER;
  87.            TopEdge  : INTEGER;
  88.            ITextFont: SYSTEM.ADDRESS;
  89.            IText    : SYSTEM.ADDRESS;
  90.            NextText : SYSTEM.ADDRESS;
  91.          END;
  92.    
  93.    VAR it1,it2,ptext,ntext: IntuiText;
  94.        mess1,cont,abort   : Message;
  95.    
  96.    BEGIN
  97.      mess1:='Modula-2 Runtime Error';
  98.      cont :=' Cont ';
  99.      abort:=' Abort ';
  100.      WITH it1 DO
  101.        FrontPen  := SYSTEM.BYTE(0);
  102.        DrawMode  := SYSTEM.BYTE(0);
  103.        LeftEdge  := 18;
  104.        TopEdge   := 8;
  105.        ITextFont := SYSTEM.ADDRESS(0);
  106.        IText     := SYSTEM.ADR(mess1);
  107.        NextText  := SYSTEM.ADR(it2);
  108.      END;
  109.    
  110.      WITH it2 DO
  111.        FrontPen  := SYSTEM.BYTE(0);
  112.        DrawMode  := SYSTEM.BYTE(0);
  113.        LeftEdge  := 18;
  114.        TopEdge   := 18;
  115.        ITextFont := SYSTEM.ADDRESS(0); 
  116.        IText     := errorText;
  117.        NextText  := SYSTEM.ADDRESS(0);
  118.      END;
  119.    
  120.      WITH ntext DO
  121.        FrontPen  := SYSTEM.BYTE(0);
  122.        DrawMode  := SYSTEM.BYTE(0);
  123.        LeftEdge  := 6;
  124.        TopEdge   := 3;
  125.        ITextFont := SYSTEM.ADDRESS(0);
  126.        IText     := SYSTEM.ADR(abort);
  127.        NextText  := SYSTEM.ADDRESS(0);
  128.      END;
  129.    
  130.      WITH ptext DO
  131.        FrontPen  := SYSTEM.BYTE(0);
  132.        DrawMode  := SYSTEM.BYTE(0);
  133.        LeftEdge  := 6;
  134.        TopEdge   := 3;
  135.        ITextFont := SYSTEM.ADDRESS(0);
  136.        IText     := SYSTEM.ADR(cont);
  137.        NextText  := SYSTEM.ADDRESS(0);
  138.      END;
  139.    
  140.      RETURN AutoRequest(SYSTEM.ADDRESS(0),SYSTEM.ADR(it1),SYSTEM.ADR(ptext),
  141.                         SYSTEM.ADR(ntext),LONGBITSET(0),LONGBITSET(0),
  142.                         320,72);
  143.    END AskCont;
  144.    
  145.    (*----------------------------------------------------------------------*)
  146.    (* Set the error message based on the compiler and the errorNo.         *)
  147.    (* If it is a halt, then halt without asking, otherwise ask if user     *)
  148.    (* wants to continue.                                                   *)
  149.    (*----------------------------------------------------------------------*)
  150.    
  151.    PROCEDURE ProcessError;
  152.    
  153.    VAR mess: Message;
  154.    
  155.    BEGIN
  156.       @IF M2S THEN
  157.  
  158.          CASE errorNo OF
  159.             | -11: errorText:=SYSTEM.ADR('Line 1111 emulation');
  160.             | -10: errorText:=SYSTEM.ADR('Line 1010 emulation');
  161.             | -9 : errorText:=SYSTEM.ADR('Trace exception');
  162.             | -8 : errorText:=SYSTEM.ADR('Privilege violation');
  163.             | -7 : errorText:=SYSTEM.ADR('Arithmetic overflow (TRAPV)');
  164.             | -6 : errorText:=SYSTEM.ADR('Index/range error (CHK)');
  165.             | -5 : errorText:=SYSTEM.ADR('Divide by zero');
  166.             | -4 : errorText:=SYSTEM.ADR('Illegal instruction');
  167.             | -3 : errorText:=SYSTEM.ADR('Address error');
  168.             | -2 : errorText:=SYSTEM.ADR('Bus error');
  169.             |  0 : errorText:=SYSTEM.ADR("Program HALT");
  170.             |  1 : errorText:=SYSTEM.ADR('CASE index out of range');
  171.             |  2 : errorText:=SYSTEM.ADR('No RETURN from function');
  172.             |  3 : errorText:=SYSTEM.ADR('IEEE arithmetic overflow');
  173.             |  4 : errorText:=SYSTEM.ADR('Unimplemented RunTime routine');
  174.          ELSE
  175.             errorText:=SYSTEM.ADR('Unknown error');
  176.          END;
  177.  
  178.       @ELSIF TDI THEN
  179.       
  180.          errorNo:=AMIGAX.ErrorContext.Error;
  181.          CASE errorNo OF
  182.             |  3 : mess:='Arithmetic overflow trap';
  183.             |  4 : mess:='Out of range trap';
  184.             |  5 : mess:='Division by zero trap';
  185.             |  7 : mess:='Address error trap';
  186.             |  9 : mess:='Program HALT';
  187.             | 10 : mess:='No RETURN from a function';
  188.             | 11 : mess:='Illegal case index range';
  189.             | 12 : mess:='Stack Overflow';
  190.             | 13 : mess:='Out of range';
  191.             | 14 : mess:='Arithmetic overflow';
  192.             | 15 : mess:='Not enough workspace for new process';
  193.             | 16 : mess:='Process terminated';
  194.             | 17 : mess:='Unimplemented routine';
  195.             | 18 : mess:='Normal return';
  196.          ELSE
  197.             mess:='Unknown error';
  198.          END;
  199.          errorText:=SYSTEM.ADR(mess);
  200.  
  201.       @ELSE
  202.          errorNo:=HaltNumber;
  203.          mess[0]:=0C;
  204.          errorText:=SYSTEM.ADR(mess);
  205.       @END
  206.       
  207.       IF (errorNo=HaltNumber) OR NOT AskCont() THEN
  208.          TermProc;
  209.          @IF    M2S THEN
  210.             RunTime.privateInfo2:=NIL;
  211.             task^.tcTrapCode:=PROC(oldTrapCode);
  212.          @ELSIF TDI THEN
  213.             AMIGAX.ErrorProcessor:=PROC(oldTrapCode);
  214.             Libraries.CloseLibrary(IntuitionBase);
  215.          @END
  216.          HALT;
  217.       END;
  218.       @IF TDI THEN
  219.          SYSTEM.SETREG(9,SYSTEM.ADR(AMIGAX.ErrorContext.PC));
  220.          SYSTEM.CODE(02059H); 
  221.          SYSTEM.CODE(05489H);           (* restore partial context *)
  222.          SYSTEM.CODE(04CD9H,0E000H);    (* of error and attempt to *)
  223.          SYSTEM.CODE(02859H);           (* resume again            *)
  224.          SYSTEM.CODE(04ED0H);   
  225.       @END
  226.    END ProcessError;
  227.    
  228.    (*-------------------------------------------------------------------*)
  229.    
  230.    PROCEDURE Nothing;
  231.    BEGIN END Nothing;
  232.  
  233.    (*-------------------------------------------------------------------*)
  234.    (* Trap handlers to set up M2Sprint error catcher                    *)
  235.    (*-------------------------------------------------------------------*)
  236.       
  237.    @IF M2S THEN
  238.       
  239.       @LongAddressing
  240.       
  241.       PROCEDURE HaltHandler;
  242.       BEGIN
  243.         errorNo:=SYSTEM.REGISTER(0);
  244.         ProcessError;
  245.       END HaltHandler;
  246.       
  247.       
  248.       PROCEDURE PostTrap2;
  249.       BEGIN
  250.         SYSTEM.CODE(02F40H,00004H);           (* move.l pc,4(a7) *)
  251.         ProcessError;
  252.       END PostTrap2;
  253.       
  254.       @NoEntryExitCode
  255.       
  256.       PROCEDURE PostTrap1;  (* Just used to put a long word on the stack *)
  257.       BEGIN
  258.         PostTrap2;
  259.         SYSTEM.CODE(04E75H);
  260.       END PostTrap1;
  261.       
  262.       @NoEntryExitCode
  263.       
  264.       PROCEDURE TrapHandler;
  265.       BEGIN
  266.         SYSTEM.CODE(201FH);           (* move.l (a7)+,d0   trap number *)
  267.         errorNo:=INTEGER(SYSTEM.REGISTER(0));
  268.         errorNo:=-errorNo;
  269.         SYSTEM.CODE(0202FH,00002H);   (* move.l 2(a7),d0   pc *)
  270.         SYSTEM.SETREG(11,PostTrap1);
  271.         SYSTEM.CODE(02F4BH,00002H);   (* move.l a3,2(a7) *)
  272.         SYSTEM.CODE(047163B);         (* RTE *)
  273.       END TrapHandler;
  274.       
  275.       @EntryExitCode
  276.  
  277.    @END
  278.  
  279.    (*********************************************************************)
  280.  
  281.    @NoLongAddressing
  282.    
  283.    BEGIN
  284.      TermProc:=Nothing;
  285.      @IF TDI THEN
  286.         IntuitionBase:=Libraries.OpenLibrary("intuition.library",0);
  287.      @END
  288.      @IF    M2S THEN
  289.         RunTime.privateInfo2:=SYSTEM.ADR(HaltHandler);
  290.         task:=RunTime.CurrentProcess;
  291.         oldTrapCode:=PROC(task^.tcTrapCode);
  292.         task^.tcTrapCode:=TrapHandler;
  293.      @ELSIF TDI THEN
  294.         oldTrapCode:=PROC(AMIGAX.ErrorProcessor);
  295.         AMIGAX.ErrorProcessor:=ProcessError;
  296.      @END
  297.  
  298. @ELSE 
  299.   BEGIN 
  300. @END
  301.  
  302. END DBug.
  303.