]> rtime.felk.cvut.cz Git - sysless.git/blob - arch/mcs51/generic/libs/misc/vect_a2c.c
b32f49bcfb7bb23aa73c73689418ced215c68f71
[sysless.git] / arch / mcs51 / generic / libs / misc / vect_a2c.c
1 #include "vect.h"
2
3 #ifdef SDCC
4 #ifndef SDCC_MODEL_LARGE
5 __data unsigned char vec_param1;
6 #endif /* SDCC_MODEL_LARGE */
7 #endif /* SDCC */
8
9 #ifdef SDCC
10 #ifndef SDCC_MODEL_LARGE
11 void __code *vec_set(prot_int fnc,unsigned char vec) VECT_FNC_REENTRANT
12 {
13   vec_param1=vec;
14   __asm
15         .globl vec_set
16         mov  r4,_vec_param1
17         lcall vec_set
18         mov  dpl,r4
19         mov  dph,r5
20   __endasm;
21 }
22 #else
23 /* For large model
24  * vec   Allocated to stack - offset -3  (the push _bp taken into account)
25  * fnc Allocated to registers 
26  */
27 void __code *vec_set(prot_int fnc,unsigned char vec) VECT_FNC_REENTRANT
28 {
29   __asm
30         .globl vec_set
31         mov  a,sp
32         add  a,#-3
33         mov  r0,a
34         mov  a,@r0
35         mov  r4,a
36         lcall vec_set
37         mov  dpl,r4
38         mov  dph,r5
39   __endasm;
40 }
41 #endif /* SDCC_MODEL_LARGE */
42 #else
43 void __code *vec_set(void __code *fnc,unsigned char vec) VECT_FNC_REENTRANT
44 {
45 #pragma asm
46         extrn code(VEC_SET)
47         mov  dpl,r7     ; fnc address into DPTR
48         mov  dph,r6
49         mov  a,r5       ; vec into r4
50         mov  r4,a
51         lcall VEC_SET   ; 
52         mov  a,r4
53         mov  r7,a
54         mov  a,r5       ; return previous vector setting
55         mov  r6,a
56 #pragma endasm
57 }
58 #endif /* SDCC */
59
60 #ifdef SDCC
61 void vec_jmp(unsigned char vec) 
62 {
63   __asm
64         .globl vec_get
65         mov   dph,#0
66         clr  a
67         jmp  @a+dptr
68   __endasm;
69 }
70 #else /*SDCC*/
71 void vec_jmp(unsigned char vec) 
72 {
73 #pragma asm
74         mov   dpl,r7
75         mov   dph,#0
76         clr  a
77         jmp  @a+dptr
78 #pragma endasm
79 }
80 #endif