2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
5 Desc: DeviceTuple() function.
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, Cardres
)
20 UWORD type
, tuplesize
, speed
, units
, size
, mantissa
, exponent
;
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;
30 tuplesize
= tuple_data
[1];
32 if ((type
!= CISTPL_DEVICE
&& type
!= CISTPL_DEVICE_A
) || tuplesize
== 0)
37 storage
->dtd_DTtype
= tuple_data
[offset
] >> 4;
38 if (storage
->dtd_DTtype
> 7 && storage
->dtd_DTtype
!= 13)
41 if (tuplesize
>= offset
) {
42 speed
= tuple_data
[offset
] & 15;
46 storage
->dtd_DTspeed
= 250;
49 storage
->dtd_DTspeed
= 200;
52 storage
->dtd_DTspeed
= 150;
55 storage
->dtd_DTspeed
= 100;
57 case 7: /* SPEED_EXT */
59 mantissa
= (tuple_data
[offset
] >> 3) & 15;
60 exponent
= tuple_data
[offset
] & 7;
62 storage
->dtd_DTspeed
= 10;
63 else if (mantissa
== 2)
64 storage
->dtd_DTspeed
= 12;
65 else if (mantissa
== 3)
66 storage
->dtd_DTspeed
= 13;
67 else if (mantissa
== 4)
68 storage
->dtd_DTspeed
= 15;
70 storage
->dtd_DTspeed
= 20 + (mantissa
- 5) * 5;
72 storage
->dtd_DTspeed
/= 2;
73 if (!storage
->dtd_DTspeed
)
74 storage
->dtd_DTspeed
= 1;
76 while (exponent
-- > 1)
77 storage
->dtd_DTspeed
*= 10;
79 /* skip possible extended data */
80 while (tuplesize
>= offset
&& (tuple_data
[offset
] & 0x80))
91 if (tuplesize
>= offset
) {
92 size
= tuple_data
[offset
] & 7;
93 units
= tuple_data
[offset
] >> 3;
94 storage
->dtd_DTsize
= (512 << (size
* 2)) * (units
+ 1);
95 } else if (storage
->dtd_DTtype
== 13) { /* IO device? */
96 storage
->dtd_DTsize
= 1;
99 storage
->dtd_DTflags
= 0;