detect if the compiler supports -fno-builtin and -fno-builtin-vsnprintf. (NicJA)
[AROS.git] / arch / m68k-amiga / card / devicetuple.c
blobcea1161f34d14eb4fe11d1ce6709ec5d1193f43c
1 /*
2 Copyright © 1995-2014, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: DeviceTuple() function.
6 Lang: english
7 */
9 #include <proto/exec.h>
11 #include "card_intern.h"
13 AROS_LH2(ULONG, DeviceTuple,
14 AROS_LHA(UBYTE*, tuple_data, A0),
15 AROS_LHA(struct DeviceTData*, storage, A1),
16 struct CardResource*, CardResource, 13, Card)
18 AROS_LIBFUNC_INIT
20 UWORD type, tuplesize, units, size, mantissa, exponent;
21 UBYTE offset;
23 CARDDEBUG(bug("DeviceTuple(%p,%p)\n", tuple_data, storage));
25 storage->dtd_DTspeed = 0;
26 storage->dtd_DTsize = 0;
27 storage->dtd_DTflags = 0;
29 type = tuple_data[0];
30 tuplesize = tuple_data[1];
32 if ((type != CISTPL_DEVICE && type != CISTPL_DEVICE_A) || tuplesize == 0)
33 return FALSE;
35 offset = 2;
37 storage->dtd_DTtype = tuple_data[offset] >> 4;
38 if (storage->dtd_DTtype > 7 && storage->dtd_DTtype != 13)
39 return FALSE;
41 if (tuplesize >= offset) {
42 switch (tuple_data[offset] & 7)
44 case 1:
45 storage->dtd_DTspeed = 250;
46 break;
47 case 2:
48 storage->dtd_DTspeed = 200;
49 break;
50 case 3:
51 storage->dtd_DTspeed = 150;
52 break;
53 case 4:
54 storage->dtd_DTspeed = 100;
55 break;
56 case 7: /* SPEED_EXT */
57 offset++;
58 mantissa = (tuple_data[offset] >> 3) & 15;
59 exponent = tuple_data[offset] & 7;
60 if (mantissa == 1)
61 storage->dtd_DTspeed = 10;
62 else if (mantissa == 2)
63 storage->dtd_DTspeed = 12;
64 else if (mantissa == 3)
65 storage->dtd_DTspeed = 13;
66 else if (mantissa == 4)
67 storage->dtd_DTspeed = 15;
68 else
69 storage->dtd_DTspeed = 20 + (mantissa - 5) * 5;
70 if (exponent == 0) {
71 storage->dtd_DTspeed /= 2;
72 if (!storage->dtd_DTspeed)
73 storage->dtd_DTspeed = 1;
74 } else {
75 while (exponent-- > 1)
76 storage->dtd_DTspeed *= 10;
78 /* skip possible extended data */
79 while (tuplesize >= offset && (tuple_data[offset] & 0x80))
80 offset++;
81 break;
82 case 0:
83 break;
84 default:
85 return FALSE;
87 offset++;
90 if (tuplesize >= offset) {
91 size = tuple_data[offset] & 7;
92 units = tuple_data[offset] >> 3;
93 storage->dtd_DTsize = (512 << (size * 2)) * (units + 1);
94 } else if (storage->dtd_DTtype == 13) { /* IO device? */
95 storage->dtd_DTsize = 1;
98 storage->dtd_DTflags = 0;
100 return TRUE;
102 AROS_LIBFUNC_EXIT