1 #include "c517.h"
2
3 #include "mdu517.h"
4
5 static uint16_t v;
6 static uint32_t d;
7
8 uint8_t
mdu_32udiv16(uint32_t op1,uint16_t op2,uint32_t * res,uint16_t * rem)9 mdu_32udiv16(uint32_t op1, uint16_t op2, uint32_t *res, uint16_t *rem)
10 __reentrant
11 {
12 MD0= op1 & 0xff;
13 MD1= (op1 >> 8) & 0xff;
14 MD2= (op1 >> 16) & 0xff;
15 MD3= (op1 >> 24) & 0xff;
16
17 MD4= op2 & 0xff;
18 MD5= (op2 >> 8) & 0xff;
19
20 __asm__ ("nop");
21
22 d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
23 if (res)
24 *res= d;
25 v= MD5*256 + MD4;
26 if (rem)
27 *rem= v;
28
29 return ARCON & 0xc0;
30 }
31
32 uint8_t
mdu_16udiv16(uint16_t op1,uint16_t op2,uint16_t * res,uint16_t * rem)33 mdu_16udiv16(uint16_t op1, uint16_t op2, uint16_t *res, uint16_t *rem)
34 __reentrant
35 {
36 MD0= op1 & 0xff;
37 MD1= (op1 >> 8) & 0xff;
38 MD4= op2 & 0xff;
39 MD5= (op2 >> 8) & 0xff;
40
41 __asm__ ("nop");
42
43 v= MD1*256 + MD0;
44 if (res)
45 *res= v;
46 v= MD5*256 + MD4;
47 if (rem)
48 *rem= v;
49
50 return ARCON & 0xc0;
51 }
52
53 uint8_t
mdu_16umul16(uint16_t op1,uint16_t op2,uint32_t * res)54 mdu_16umul16(uint16_t op1, uint16_t op2, uint32_t *res)
55 __reentrant
56 {
57 MD0= op1 & 0xff;
58 MD4= op2 & 0xff;
59 MD1= (op1 >> 8) & 0xff;
60 MD5= (op2 >> 8) & 0xff;
61
62 __asm__ ("nop");
63
64 d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
65 if (res)
66 *res= d;
67
68 return ARCON & 0x80;
69 }
70
71 uint8_t
mdu_norm(uint32_t op,uint32_t * res,uint8_t * nuof_shifts)72 mdu_norm(uint32_t op, uint32_t *res, uint8_t *nuof_shifts)
73 __reentrant
74 {
75 uint8_t a;
76
77 MD0= op & 0xff;
78 MD1= (op >> 8) & 0xff;
79 MD2= (op >> 16) & 0xff;
80 MD3= (op >> 24) & 0xff;
81 ARCON= 0;
82
83 __asm__ ("nop");
84
85 d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
86 if (res)
87 *res= d;
88 a= ARCON;
89 if (nuof_shifts)
90 *nuof_shifts= a & 0x1f;
91 return a & 0xc0;
92 }
93
94 uint8_t
mdu_lshift(uint32_t op,uint8_t shifts,uint8_t right,uint32_t * res)95 mdu_lshift(uint32_t op, uint8_t shifts, uint8_t right, uint32_t *res)
96 __reentrant
97 {
98 MD0= op & 0xff;
99 MD1= (op >> 8) & 0xff;
100 MD2= (op >> 16) & 0xff;
101 MD3= (op >> 24) & 0xff;
102 ARCON= (right?0x20:0) + (shifts&0x1f);
103
104 __asm__ ("nop");
105
106 d= (uint32_t)MD0 + (uint32_t)MD1*256l + (uint32_t)MD2*256l*256l + (uint32_t)MD3*256l*256l*256l;
107 if (res)
108 *res= d;
109 return ARCON & 0x80;
110 }
111
112 uint8_t
mdu_lshift_left(uint32_t op,uint8_t shifts,uint32_t * res)113 mdu_lshift_left(uint32_t op, uint8_t shifts, uint32_t *res)
114 __reentrant
115 {
116 return mdu_lshift(op, shifts, 0, res);
117 }
118
119 uint8_t
mdu_lshift_right(uint32_t op,uint8_t shifts,uint32_t * res)120 mdu_lshift_right(uint32_t op, uint8_t shifts, uint32_t *res)
121 __reentrant
122 {
123 return mdu_lshift(op, shifts, 1, res);
124 }
125