1 /*---------------------------------------------------------------------------*
2   Project:  Dolphin Memory Card API
3   File:     card.h
4 
5   Copyright 2000-2004 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: card.h,v $
14   Revision 1.2  2006/02/04 11:56:44  hashida
15   (none)
16 
17   Revision 1.1.1.1  2005/12/29 06:53:27  hiratsu
18   Initial import.
19 
20   Revision 1.1.1.1  2005/05/12 02:41:06  yasuh-to
21   transitioned from the Dolphin source tree
22 
23 
24     39    3/08/04 19:50 Shiki
25     Added CARDGetCurrentMode().
26 
27     38    1/06/04 11:27 Shiki
28     Added CARDGetFastMode() and CARDSetFastMode().
29 
30     37    2/12/03 16:26 Shiki
31     Defined CARD_ATTR_GLOBAL and CARD_ATTR_COMPANY.
32 
33     36    8/12/02 15:30 Shiki
34     Added __padding field to CARDFileInfo{} and CARDStat{}.
35 
36     35     8/05/02 15:49:00 Shiki
37     Added const keywords to relevant function prototypes.
38 
39     34    11/26/01 11:52 Shiki
40     Added CARD_XFER_SETATTRIBUTES and CARD_XFER_WRITE.
41 
42     33    10/18/01 14:16 Shiki
43     Added CARDGetAttributes(),CARDGetSerialNo(),CARDSetAttributes[Async]().
44 
45     32    7/19/01 22:09 Shiki
46     Added CARDCheckEx[Async].
47 
48     31    6/19/01 11:55a Dante
49     Added CARDSetIconAddress & CARDSetCommentAddress
50 
51     30    6/18/01 10:16p Dante
52     Added CARDSetIconAnim() & CARDSetBannerFormat()
53 
54     29    5/18/01 4:03p Shiki
55     Added CARDProbeEx().
56 
57     28    5/18/01 1:49p Shiki
58     Added CARD_XFER_*.
59 
60     27    5/18/01 1:16p Shiki
61     Added CARDGetXferredBytes().
62 
63     26    5/10/01 11:07a Shiki
64     Modified CARD_ENCODE_* to sync with OS_FONT_ENCODE_*.
65 
66     25    01/04/23 15:28 Shiki
67     Fixed CARDGetIcon*() macros.
68 
69     24    01/04/23 14:45 Shiki
70     Removed CARDStat.gameVersion.
71 
72     23    01/04/19 9:10 Shiki
73     Added CARD_COMMENT_SIZE.
74 
75     22    01/02/27 16:46 Shiki
76     Added CARDCancel().
77 
78     21    01/02/22 15:54 Shiki
79     Added CARDGetIconAnim().
80 
81     20    01/02/22 11:48 Shiki
82     Changed the type of fileName from u8[] to char[].
83 
84     19    01/02/22 9:37 Shiki
85     Added support for multiple sector sizes.
86 
87     18    01/01/23 9:30 Shiki
88     Fixed typo.
89 
90     17    12/14/00 7:17p Shiki
91     Added CARDGetMemSize().
92 
93     16    12/11/00 11:05p Shiki
94     Added icon stuff.
95 
96     15    10/25/00 11:50p Shiki
97     Added CARDCheckAsync().
98 
99     14    9/07/00 6:53p Shiki
100     Added CARD_FILENAME_MAX.
101 
102     13    9/05/00 2:46p Shiki
103     Fixed to be C++ ready.
104 
105     12    9/01/00 5:28p Shiki
106     Added CARDRename() and CARDRenameAsync().
107 
108     11    8/25/00 6:46p Shiki
109     Revised CARD_ENCODE_*.
110 
111     10    8/25/00 3:54p Shiki
112     Added CARD_RESULT_ENCODING.
113 
114     9     8/24/00 6:32p Shiki
115     Added CARDGetEncoding().
116 
117     8     8/24/00 4:16p Shiki
118     Added CARDProbe().
119 
120     7     8/10/00 4:39p Shiki
121     Modified CARDStat.length from u8 to u32.
122 
123     6     8/10/00 4:27p Shiki
124     Added CARD_BLOCK_SIZE.
125 
126     5     8/09/00 6:19p Shiki
127     Cleanup.
128 
129     4     8/09/00 5:10p Shiki
130     Added CARD_RESULT_NAMETOOLONG.
131 
132     3     8/08/00 7:51p Shiki
133     Added CARD_RESULT_LIMIT.
134 
135     2     7/19/00 7:44p Shiki
136     Added CARD_RESULT_NOPERM.
137 
138     1     7/14/00 3:58p Shiki
139     Initial check-in.
140   $NoKeywords: $
141  *---------------------------------------------------------------------------*/
142 
143 #ifndef __CARD_H__
144 #define __CARD_H__
145 
146 #include <revolution/types.h>
147 #include <revolution/os/OSFont.h>
148 
149 #ifdef __cplusplus
150 extern "C" {
151 #endif
152 
153 #define CARD_WORKAREA_SIZE  (5 * 8 * 1024)
154 #define CARD_READ_SIZE      512
155 #define CARD_MAX_FILE       127
156 #define CARD_COMMENT_SIZE   64
157 
158 // internal API command xfer bytes
159 #define CARD_XFER_CREATE        (2 * 8 * 1024)  // CARDCreate[Async]
160 #define CARD_XFER_DELETE        (2 * 8 * 1024)  // CARD[Fast]Delete[Async]
161 #define CARD_XFER_MOUNT         (5 * 8 * 1024)  // CARDMount[Async]
162 #define CARD_XFER_FORMAT        (5 * 8 * 1024)  // CARDFormat[Async]
163 #define CARD_XFER_RENAME        (1 * 8 * 1024)  // CARDRename[Async]
164 #define CARD_XFER_SETSTATUS     (1 * 8 * 1024)  // CARDSetStatus[Async]
165 #define CARD_XFER_SETATTRIBUTES (1 * 8 * 1024)  // CARDSetAttributes[Async]
166 #define CARD_XFER_WRITE         (1 * 8 * 1024)  // CARDWrite[Async]
167 
168 #define CARD_ENCODE_ANSI    OS_FONT_ENCODE_ANSI
169 #define CARD_ENCODE_SJIS    OS_FONT_ENCODE_SJIS
170 
171 // longest file name string excluding terminating zero
172 #define CARD_FILENAME_MAX   32
173 
174 #define CARD_ICON_MAX       8
175 #define CARD_ICON_WIDTH     32
176 #define CARD_ICON_HEIGHT    32
177 #define CARD_BANNER_WIDTH   96
178 #define CARD_BANNER_HEIGHT  32
179 
180 #define CARD_MODE_NORMAL    0
181 #define CARD_MODE_FAST      1
182 
183 typedef struct CARDFileInfo
184 {
185     s32 chan;
186     s32 fileNo;
187 
188     s32 offset;
189     s32 length;
190     u16 iBlock;
191     u16 __padding;
192 } CARDFileInfo;
193 
194 typedef struct CARDStat
195 {
196     // read-only (Set by CARDGetStatus)
197     char fileName[CARD_FILENAME_MAX];
198     u32  length;
199     u32  time;           // seconds since 01/01/2000 midnight
200     u8   gameName[4];
201     u8   company[2];
202 
203     // read/write (Set by CARDGetStatus/CARDSetStatus)
204     u8   bannerFormat;
205     u8   __padding;
206     u32  iconAddr;      // offset to the banner, bannerTlut, icon, iconTlut data set.
207     u16  iconFormat;
208     u16  iconSpeed;
209     u32  commentAddr;   // offset to the pair of 32 byte character strings.
210 
211     // read-only (Set by CARDGetStatus)
212     u32  offsetBanner;
213     u32  offsetBannerTlut;
214     u32  offsetIcon[CARD_ICON_MAX];
215     u32  offsetIconTlut;
216     u32  offsetData;
217 } CARDStat;
218 
219 #define CARDGetBannerFormat(stat)          (((stat)->bannerFormat) & CARD_STAT_BANNER_MASK)
220 #define CARDGetIconAnim(stat)              (((stat)->bannerFormat) & CARD_STAT_ANIM_MASK)
221 #define CARDGetIconFormat(stat, n)         (((stat)->iconFormat >> (2 * (n))) & CARD_STAT_ICON_MASK)
222 #define CARDGetIconSpeed(stat, n)          (((stat)->iconSpeed  >> (2 * (n))) & CARD_STAT_SPEED_MASK)
223 #define CARDSetBannerFormat(stat, f)       ((stat)->bannerFormat = (u8) (((stat)->bannerFormat & ~CARD_STAT_BANNER_MASK)|(f)))
224 #define CARDSetIconAnim(stat, f)           ((stat)->bannerFormat = (u8) (((stat)->bannerFormat & ~CARD_STAT_ANIM_MASK  )|(f)))
225 #define CARDSetIconFormat(stat, n, f)      ((stat)->iconFormat = (u16) (((stat)->iconFormat & ~(CARD_STAT_ICON_MASK  << (2 * (n)))) | ((f) << (2 * (n)))))
226 #define CARDSetIconSpeed(stat, n, f)       ((stat)->iconSpeed  = (u16) (((stat)->iconSpeed  & ~(CARD_STAT_SPEED_MASK << (2 * (n)))) | ((f) << (2 * (n)))))
227 #define CARDSetIconAddress(stat, addr)     ((stat)->iconAddr =     (u32)(addr))
228 #define CARDSetCommentAddress(stat, addr)  ((stat)->commentAddr =  (u32)(addr))
229 
230 #define CARD_STAT_ICON_NONE     0
231 #define CARD_STAT_ICON_C8       1
232 #define CARD_STAT_ICON_RGB5A3   2
233 #define CARD_STAT_ICON_MASK     3
234 
235 #define CARD_STAT_BANNER_NONE   0
236 #define CARD_STAT_BANNER_C8     1
237 #define CARD_STAT_BANNER_RGB5A3 2
238 #define CARD_STAT_BANNER_MASK   3
239 
240 #define CARD_STAT_ANIM_LOOP     0x00
241 #define CARD_STAT_ANIM_BOUNCE   0x04
242 #define CARD_STAT_ANIM_MASK     0x04
243 
244 #define CARD_STAT_SPEED_END     0
245 #define CARD_STAT_SPEED_FAST    1
246 #define CARD_STAT_SPEED_MIDDLE  2
247 #define CARD_STAT_SPEED_SLOW    3
248 #define CARD_STAT_SPEED_MASK    3
249 
250 #define CARD_ATTR_RESERVED_0    0x01u
251 #define CARD_ATTR_RESERVED_1    0x02u
252 #define CARD_ATTR_PUBLIC        0x04u
253 #define CARD_ATTR_NO_COPY       0x08u
254 #define CARD_ATTR_NO_MOVE       0x10u
255 #define CARD_ATTR_GLOBAL        0x20u
256 #define CARD_ATTR_COMPANY       0x40u
257 #define CARD_ATTR_RESERVED_7    0x80u
258 
259 // For backward compatibility only...
260 #define CARD_ATTR_RESERVED_5    0x20u
261 #define CARD_ATTR_RESERVED_6    0x40u
262 
263 typedef void (*CARDCallback)( s32 chan, s32 result );
264 
265 void CARDInit              ( void );
266 BOOL CARDGetFastMode       ( void );
267 BOOL CARDSetFastMode       ( BOOL enable );
268 
269 s32  CARDCheck             ( s32 chan );
270 s32  CARDCheckAsync        ( s32 chan, CARDCallback callback );
271 s32  CARDCheckEx           ( s32 chan, s32* xferBytes );
272 s32  CARDCheckExAsync      ( s32 chan, s32* xferBytes, CARDCallback callback );
273 s32  CARDCreate            ( s32 chan, const char* fileName, u32 size, CARDFileInfo* fileInfo );
274 s32  CARDCreateAsync       ( s32 chan, const char* fileName, u32 size, CARDFileInfo* fileInfo, CARDCallback callback );
275 s32  CARDDelete            ( s32 chan, const char* fileName );
276 s32  CARDDeleteAsync       ( s32 chan, const char* fileName, CARDCallback callback );
277 s32  CARDFastDelete        ( s32 chan, s32 fileNo );
278 s32  CARDFastDeleteAsync   ( s32 chan, s32 fileNo, CARDCallback callback );
279 s32  CARDFastOpen          ( s32 chan, s32 fileNo, CARDFileInfo* fileInfo );
280 s32  CARDFormat            ( s32 chan );
281 s32  CARDFormatAsync       ( s32 chan, CARDCallback callback );
282 s32  CARDFreeBlocks        ( s32 chan, s32* byteNotUsed, s32* filesNotUsed );
283 s32  CARDGetAttributes     ( s32 chan, s32 fileNo, u8* attr );
284 s32  CARDGetEncoding       ( s32 chan, u16* encode );
285 s32  CARDGetMemSize        ( s32 chan, u16* size );
286 s32  CARDGetResultCode     ( s32 chan );
287 s32  CARDGetSectorSize     ( s32 chan, u32* size );
288 s32  CARDGetSerialNo       ( s32 chan, u64* serialNo );
289 s32  CARDGetStatus         ( s32 chan, s32 fileNo, CARDStat* stat );
290 s32  CARDGetXferredBytes   ( s32 chan );
291 s32  CARDMount             ( s32 chan, void* workArea, CARDCallback detachCallback );
292 s32  CARDMountAsync        ( s32 chan, void* workArea, CARDCallback detachCallback, CARDCallback attachCallback );
293 s32  CARDOpen              ( s32 chan, const char* fileName, CARDFileInfo* fileInfo );
294 BOOL CARDProbe             ( s32 chan );
295 s32  CARDProbeEx           ( s32 chan, s32* memSize, s32* sectorSize );
296 s32  CARDRename            ( s32 chan, const char* oldName, const char* newName );
297 s32  CARDRenameAsync       ( s32 chan, const char* oldName, const char* newName, CARDCallback callback );
298 s32  CARDSetAttributesAsync( s32 chan, s32 fileNo, u8 attr, CARDCallback callback);
299 s32  CARDSetAttributes     ( s32 chan, s32 fileNo, u8 attr );
300 s32  CARDSetStatus         ( s32 chan, s32 fileNo, CARDStat* stat );
301 s32  CARDSetStatusAsync    ( s32 chan, s32 fileNo, CARDStat* stat, CARDCallback callback );
302 s32  CARDUnmount           ( s32 chan );
303 s32  CARDGetCurrentMode    ( s32 chan, u32* mode );
304 
305 s32  CARDCancel            ( CARDFileInfo* fileInfo );
306 s32  CARDClose             ( CARDFileInfo* fileInfo );
307 s32  CARDRead              ( CARDFileInfo* fileInfo, void* addr, s32 length, s32 offset );
308 s32  CARDReadAsync         ( CARDFileInfo* fileInfo, void* addr, s32 length, s32 offset, CARDCallback callback );
309 s32  CARDWrite             ( CARDFileInfo* fileInfo, const void* addr, s32 length, s32 offset );
310 s32  CARDWriteAsync        ( CARDFileInfo* fileInfo, const void* addr, s32 length, s32 offset, CARDCallback callback );
311 
312 #define CARDGetFileNo(fileInfo)     ((fileInfo)->fileNo)
313 
314 #define CARD_RESULT_UNLOCKED        1
315 #define CARD_RESULT_READY           0
316 #define CARD_RESULT_BUSY            -1
317 #define CARD_RESULT_WRONGDEVICE     -2
318 #define CARD_RESULT_NOCARD          -3
319 #define CARD_RESULT_NOFILE          -4
320 #define CARD_RESULT_IOERROR         -5
321 #define CARD_RESULT_BROKEN          -6
322 #define CARD_RESULT_EXIST           -7
323 #define CARD_RESULT_NOENT           -8
324 #define CARD_RESULT_INSSPACE        -9
325 #define CARD_RESULT_NOPERM          -10
326 #define CARD_RESULT_LIMIT           -11
327 #define CARD_RESULT_NAMETOOLONG     -12
328 #define CARD_RESULT_ENCODING        -13
329 #define CARD_RESULT_CANCELED        -14
330 #define CARD_RESULT_FATAL_ERROR     -128
331 
332 #ifdef __cplusplus
333 }
334 #endif
335 
336 #endif  // __CARD_H__
337