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