head     1.1;
access   ;
symbols  ;
locks    ; strict;
comment  @# @;


1.1
date     89.03.08.11.02.04;  author quist;  state Exp;
branches ;
next     ;


desc
@Trap 0, assembly support module for SPY
@



1.1
log
@Initial revision
@
text
@        nosyms
        com     T0_SUPPORT,-22
Gbase   equ     T0_SUPPORT
        mname   T0_SUPPORT

        src     MODULE T0_SUPPORT;
        src     EXPORT
        src     TYPE
        src     lineproc = procedure(lnum : integer);
        src     VAR
        src     trap0hook : lineproc;
        src     lastline  : integer;
        src     a6reg     : integer;
        src
        src     PROCEDURE START_MONITOR;
        src     PROCEDURE END_MONITOR;
        src     END;


        def     T0_SUPPORT__BASE
        def     T0_SUPPORT_START_MONITOR
        def     T0_SUPPORT_END_MONITOR
        def     T0_SUPPORT_T0_SUPPORT

jmpop   equ     $4EF9
trap0hook_sl equ Gbase-4
trap0hook_pa equ Gbase-8
lastline     equ Gbase-12
a6reg        equ Gbase-16
savet0       equ Gbase-22

T0_SUPPORT__BASE equ *  code base
*TRAP0 VECTOR PROC
TRAP0_M equ     *
        move    #$2700,sr       block interupts
        move.l  2(sp),lastline(a5)      ^line number
        
        movem.l a0-a6/d0-d7,-(sp)
        move.l  a6,a6reg(a5)    record a6
        movea.l lastline(a5),a0
        move.w  (a0),-(sp)      stack the line number
        clr.w   -(sp)      NOTE static link never used     
        movea.l trap0hook_pa(a5),a0
        jsr     (a0)            call the proc var
        movem.l (sp)+,a0-a6/d0-d7
        cmpi.w  #jmpop,savet0(a5)
        beq.s   L23
        addq.l  #2,2(sp)        skip the line number
        rte     
L23     move.l  savet0+2(a5),-(sp) pass control to old TRAP0
        rts

*- - - - - - - - - - - - - - - - - - - - - - - - - -  START_MONITOR
T0_SUPPORT_START_MONITOR equ *
* don't switch TRAP0 if its already switched
        tst.w   savet0(a5)
        bne.s   L201
* save then switch the TRAP0 vector
        movea.l #$FFFFFF94,a0
        movea.l a0,a1
        lea     savet0(a5),a2
        move.w  (a0)+,(a2)+
        move.l  (a0),(a2)
        move.w  #jmpop,(a1)+
        move.l  #trap0_m,(a1)
L201    equ     *
        rts  
           
*- - - - - - - - - - - - - - - - - - - - - - - - - -  END_MONITOR
T0_SUPPORT_END_MONITOR equ *
* restore the original TRAP0 vector
* don't restore TRAP0 if its not saved
        tst.w   savet0(a5)
        beq     L201
        movea.l #$FFFFFF94,a0
        lea     savet0(a5),a2
        move.w  (a2)+,(a0)+
        move.l  (a2),(a0)
        clr.w   savet0(a5)
        rts

* MODULE BODY
T0_SUPPORT_T0_SUPPORT equ *
        rts

        END
@
