arch/m68k-amiga: No longer allocate nor clear .bss
[AROS.git] / arch / m68k-amiga / card / devicetuple.c
blobaffba98863d9dccfbd632cf70f1cf963496b448e
1 /*
2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
3 $Id: devicetuple.c $
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, Cardres)
18 AROS_LIBFUNC_INIT
20 UWORD type, tuplesize, speed, 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 speed = tuple_data[offset] & 15;
43 switch (speed)
45 case 1:
46 storage->dtd_DTspeed = 250;
47 break;
48 case 2:
49 storage->dtd_DTspeed = 200;
50 break;
51 case 3:
52 storage->dtd_DTspeed = 150;
53 break;
54 case 4:
55 storage->dtd_DTspeed = 100;
56 break;
57 case 7: /* SPEED_EXT */
58 offset++;
59 mantissa = (tuple_data[offset] >> 3) & 15;
60 exponent = tuple_data[offset] & 7;
61 if (mantissa == 1)
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;
69 else
70 storage->dtd_DTspeed = 20 + (mantissa - 5) * 5;
71 if (exponent == 0) {
72 storage->dtd_DTspeed /= 2;
73 if (!storage->dtd_DTspeed)
74 storage->dtd_DTspeed = 1;
75 } else {
76 while (exponent-- > 1)
77 storage->dtd_DTspeed *= 10;
79 /* skip possible extended data */
80 while (tuplesize >= offset && (tuple_data[offset] & 0x80))
81 offset++;
82 break;
83 case 0:
84 break;
85 default:
86 return FALSE;
88 offset++;
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;
101 return TRUE;
103 AROS_LIBFUNC_EXIT