Sorting source tree a bit
[tpg/acess2.git] / KernelLand / Kernel / arch / m68k / lib.c
1 /*
2  * Acess2 M68K port
3  * - By John Hodge (thePowersGang)
4  *
5  * arch/m68k/lib.c
6  * - Library functions
7  */
8 #include <acess.h>
9 #include "../helpers.h"
10 #include <drv_pci_int.h>
11
12 Uint64  __divmod64(Uint64 Num, Uint64 Den, Uint64 *Rem);
13 Uint64  __udivdi3(Uint64 Num, Uint64 Den);
14 Uint64  __umoddi3(Uint64 Num, Uint64 Den);
15
16 // === CODE ===
17 void *memcpy(void *__dest, const void *__src, size_t __len)
18 {
19         register Uint8  *dest = __dest;
20         register const Uint8 *src = __src;
21
22         while(__len --)
23                 *dest++ = *src++;
24
25         return __dest;
26 }
27
28 void *memset(void *__dest, int __val, size_t __count)
29 {
30         register Uint8  *dest = __dest;
31         
32         while(__count --)
33                 *dest = __val;
34         
35         return __dest;
36 }
37
38 int memcmp(const void *__p1, const void *__p2, size_t __maxlen)
39 {
40         const char      *m1 = __p1, *m2 = __p2;
41         while( __maxlen-- )
42         {
43                 if(*m1 != *m2)  return *m1 - *m2;
44         }
45         return 0;
46 }
47
48 DEF_DIVMOD(64)
49
50 Uint64 DivMod64U(Uint64 Num, Uint64 Den, Uint64 *Rem)
51 {
52         Uint64  ret;
53         if(Den == 0)    return 0;       // TODO: #div0
54         if(Num < Den) {
55                 if(Rem) *Rem = Num;
56                 return 0;
57         }
58         if(Num == 0) {
59                 if(Rem) *Rem = 0;
60                 return 0;
61         }
62         if(Den == 1) {
63                 if(Rem) *Rem = 0;
64                 return Num;
65         }
66         if(Den == 2) {
67                 if(Rem) *Rem = Num & 1;
68                 return Num >> 1;
69         }
70         if(Den == 16) {
71                 if(Rem) *Rem = Num & 0xF;
72                 return Num >> 4;
73         }
74         if(Den == 32) {
75                 if(Rem) *Rem = Num & 0x1F;
76                 return Num >> 5;
77         }
78         if(Den == 0x1000) {
79                 if(Rem) *Rem = Num & 0xFFF;
80                 return Num >> 12;
81         }
82         
83         if( !(Den >> 32) && !(Num >> 32) ) {
84                 if(Rem) *Rem = (Uint32)Num % (Uint32)Den;       // Clear high bits
85                 return (Uint32)Num / (Uint32)Den;
86         }
87
88         ret = __divmod64(Num, Den, Rem);
89         return ret;
90 }
91
92 // Unsigned Divide 64-bit Integer
93 Uint64 __udivdi3(Uint64 Num, Uint64 Den)
94 {
95         return DivMod64U(Num, Den, NULL);
96 }
97
98 // Unsigned Modulus 64-bit Integer
99 Uint64 __umoddi3(Uint64 Num, Uint64 Den)
100 {
101         Uint64  ret = 0;
102         DivMod64U(Num, Den, &ret);
103         return ret;
104 }
105
106 // ---- PCI (stubbed)
107 Uint32 PCI_CfgReadDWord(Uint32 Addr)
108 {
109         return 0xFFFFFFFF;
110 }
111 void PCI_CfgWriteDWord(Uint32 Addr, Uint32 Data)
112 {
113 }
114

UCC git Repository :: git.ucc.asn.au