revert between 56095 -> 55830 in arch
[AROS.git] / arch / m68k-mac / exec / setsr.S
blob270470106313be0bbc497118beb11e428ec7a92b
1 /*
2     Copyright © 1995-2007, The AROS Development Team. All rights reserved.
3     $Id$
4 */
6 /*****************************************************************************
7  
8     NAME
9  
10         AROS_LH1(ULONG, SetSR,
12     SYNOPSIS
13         AROS_LHA(ULONG, new , D0),
14         AROS_LHA(ULONG, mask, D1),
16     LOCATION
17         struct ExecBase *, SysBase, 24, Exec)
19     FUNCTION
21     INPUTS
23     RESULT
25     NOTES
26         This function is CPU dependant.
28     EXAMPLE
30     BUGS
32     SEE ALSO
34     INTERNALS
36     HISTORY
38 ******************************************************************************/
40         #include "aros/m68k/asm.h"
42         .text
43         .balign 4
44         .globl  AROS_SLIB_ENTRY(SetSR,Exec,24)
46 AROS_SLIB_ENTRY(SetSR,Exec,24):
48         /*
49          * Switch to Supervisor Mode by calling a trap function
50          */
51 #ifndef DoRegisterCalls
52         move.l  8(%sp),%d1
53         move.l  4(%sp),%d0
54 #endif
55         move.l  %d7,-(%sp)
56         move.l  #4,%d7     // #4 => call _sys_trap1_SetSR
57         trap    #1
58         move.l  (%sp)+,%d7 // d0 holds old value of SR.
59         rts
61         .globl _sys_trap1_SetSR
62 _sys_trap1_SetSR:
63         /*
64          * Stack layout in this function
65          * D2  0(%sp)
66          * SR  4(%sp)  from trap call
67          * PC  6(%sp)
68          */
69         move.l  %d2,-(%sp)
70         and.w   %d1,%d0     // isolate the flags to be changed
71         not.w   %d1         // invert the mask
72         move.w  4(%sp),%d2  // target for sr is register d2
73         and.w   %d1,%d2     // isolate the flags to remain untouched
74         or.w    %d0,%d2     // generate new sr
75         move.w  4(%sp),%d0  // old value of sr goes into d0
76         move.w  %d2,4(%sp)  // save the modified target
77         not.w   %d1         // revert the change
78         move.l  (%sp)+,%d2
79         rte