- Removed unnecessary casts.
[AROS.git] / arch / m68k-amiga / expansion / readexpansionrom.c
blob0f29dd6a4f4f586b33a1a5d64eac2873c1e13711
1 /*
2 Copyright © 1995-2007, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc:
6 Lang: english
7 */
9 #define DEBUG 1
10 #include <aros/debug.h>
11 #include <proto/expansion.h>
12 #include <exec/memory.h>
13 #include <proto/exec.h>
15 #include <expansion_intern.h>
17 static void readexprom(APTR board, struct ExpansionRom *rom, struct ExpansionBase *ExpansionBase)
19 WORD cnt;
21 for (cnt = 0; cnt < sizeof(struct ExpansionRom); cnt++)
22 ((UBYTE*)rom)[cnt] = ~ReadExpansionByte(board, cnt);
23 /* AOS expansion.library appears to have off-by-one bug.. */
24 ReadExpansionByte(board, cnt);
25 rom->er_Type = ~rom->er_Type;
28 /*****************************************************************************
30 NAME */
31 #include <clib/expansion_protos.h>
33 AROS_LH2(BOOL, ReadExpansionRom,
35 /* SYNOPSIS */
36 AROS_LHA(APTR , board, A0),
37 AROS_LHA(struct ConfigDev *, configDev, A1),
39 /* LOCATION */
40 struct ExpansionBase *, ExpansionBase, 17, Expansion)
42 /* FUNCTION
44 INPUTS
46 RESULT
48 NOTES
50 EXAMPLE
52 BUGS
54 SEE ALSO
56 INTERNALS
58 HISTORY
59 27-11-96 digulla automatically created from
60 expansion_lib.fd and clib/expansion_protos.h
62 *****************************************************************************/
64 AROS_LIBFUNC_INIT
66 struct ExpansionRom *rom = &configDev->cd_Rom;
67 struct ExpansionRom tmprom;
68 ULONG size;
69 UBYTE cnt;
71 readexprom(board, rom, ExpansionBase);
73 if (rom->er_Reserved03 != 0)
74 return FALSE;
76 if (rom->er_Manufacturer == 0 || rom->er_Manufacturer == 0xffff)
77 return FALSE;
79 if ((rom->er_Type & ERT_TYPEMASK) != ERT_ZORROII && (rom->er_Type & ERT_TYPEMASK) != ERT_ZORROIII)
80 return FALSE;
82 /* AOS expansion.library wants to be really really sure... */
83 for (cnt = 0; cnt < 11; cnt++) {
84 readexprom(board, &tmprom, ExpansionBase);
85 if (memcmp(&tmprom, rom, sizeof(struct ExpansionRom)))
86 return FALSE;
89 if ((rom->er_Type & ERT_TYPEMASK) == ERT_ZORROIII && (rom->er_Flags & ERFF_EXTENDED)) {
90 size = (16 * 1024 * 1024) << (rom->er_Type & ERT_MEMMASK);
91 } else {
92 UBYTE mem = rom->er_Type & ERT_MEMMASK;
93 if (mem == 0)
94 size = 8 * 1024 * 1024; // 8M
95 else
96 size = (32 * 1024) << mem; // 64k,128k,256k,512k,1m,2m,4m
98 if ((rom->er_Type & ERT_TYPEMASK) == ERT_ZORROIII) {
99 UBYTE subsize = rom->er_Flags & ERT_Z3_SSMASK;
100 ULONG ss = size;
101 if (subsize >= 2 && subsize <= 7) { // 64k,128k,256k,512k,1m,2m
102 ss = (64 * 1024) << (subsize - 2);
103 } else if (subsize >= 8) { // 4m,6m,8m,10m,12m,14m
104 ss = (4 + (subsize - 8) * 2) * 1024 * 1024;
106 if (size > ss)
107 size = ss;
110 configDev->cd_BoardSize = size;
111 configDev->cd_BoardAddr = board;
113 D(bug("Found board %p: mfg=%d prod=%d size=%08x serial=%08x diag=%p\n",
114 board, rom->er_Manufacturer, rom->er_Product, size, rom->er_SerialNumber, rom->er_InitDiagVec));
116 return TRUE;
118 AROS_LIBFUNC_EXIT
119 } /* ReadExpansionRom */