Commit | Line | Data |
---|---|---|
2d8189f2 | 1 | /* |
42a118aa RE |
2 | * Copyright (c) 1980 Regents of the University of California. |
3 | * All rights reserved. The Berkeley software License Agreement | |
4 | * specifies the terms and conditions for redistribution. | |
5 | * | |
af857331 | 6 | * @(#)traper_.c 5.3 %G% |
a2b867fb | 7 | * |
2d8189f2 DW |
8 | * Full of Magic! DON'T CHANGE ANYTHING !! |
9 | * | |
10 | * To use from f77: | |
11 | * integer oldmsk, traper | |
12 | * oldmsk = traper (mask) | |
af857331 | 13 | * where for vax: |
2d8189f2 DW |
14 | * mask = 1 to trap integer overflow |
15 | * mask = 2 to trap floating underflow | |
16 | * mask = 3 to trap both | |
17 | * These 2 bits will be set into the PSW. | |
18 | * The old state will be returned. | |
af857331 KM |
19 | * |
20 | * where for CCI: | |
21 | * mask = 0 to trap neither | |
22 | * mask = 1 to trap integer overflow | |
23 | * mask = 2 to trap floating underflow | |
24 | * mask = 3 to trap both | |
25 | * These 2 bits will be set into the PSL. | |
26 | * The old state will be returned. | |
2d8189f2 DW |
27 | */ |
28 | ||
af857331 | 29 | #ifdef vax |
2d8189f2 DW |
30 | long traper_(msk) |
31 | long *msk; | |
32 | { | |
33 | int old = 0; | |
2d8189f2 DW |
34 | #define IOV_MASK 0140 |
35 | int **s = &msk; | |
36 | int psw; | |
37 | ||
38 | s -= 5; | |
39 | psw = (int)*s; | |
40 | old = (psw & IOV_MASK) >> 5; | |
41 | psw = (psw & ~IOV_MASK) | ((*msk << 5) & IOV_MASK); | |
42 | *s = (int *)psw; | |
2d8189f2 DW |
43 | return((long)old); |
44 | } | |
af857331 KM |
45 | #endif vax |
46 | ||
47 | /* | |
48 | * Assumptions for CCI: | |
49 | * - the two bits are contiguous in PSL; | |
50 | * - integer overflow trap enable bit < floating underflow trap enable bit; | |
51 | */ | |
52 | #ifdef tahoe | |
53 | # include <machine/psl.h> | |
54 | ||
55 | unsigned long old_msk; | |
56 | unsigned short new_msk; | |
57 | unsigned long tst_msk; | |
58 | ||
59 | long traper_(msk) | |
60 | long *msk; | |
61 | { | |
62 | #define IOV_MASK (PSL_IV | PSL_FU) | |
63 | #define IOV_DISP 5 | |
64 | ||
65 | asm(" movpsl _old_msk"); | |
66 | ||
67 | old_msk = (old_msk & IOV_MASK) >> IOV_DISP; | |
68 | ||
69 | new_msk = (*msk << IOV_DISP) & IOV_MASK; | |
70 | asm(" bispsw _new_msk"); | |
71 | ||
72 | new_msk = ~(*msk << IOV_DISP) & IOV_MASK; | |
73 | asm(" bicpsw _new_msk"); | |
74 | ||
75 | return(old_msk); | |
76 | } | |
77 | #endif tahoe |