OSCR
Open Source Cartridge Reader
Loading...
Searching...
No Matches
gba.h
1
2#pragma once
3#ifndef CRDB_GBA_H_
4# define CRDB_GBA_H_
5
6# include "config.h"
7
8# if HAS_GBX
9# include "common/CRDB.h"
10# include "cores/GameBoyAdvance.h"
11
12namespace OSCR::Databases
13{
14 using OSCR::Cores::GameBoyAdvance::crdbGBARecord;
15
17 : public OSCR::CRDB::GenericCartRecord<crdbGBARecord>
18 {
19 public:
20 void debug()
21 {
22# if defined(ENABLE_CRDB_DEBUG)
23 OSCR::Serial::printLineSync(FS(OSCR::Strings::Headings::CRDBDebugROM));
24
25 OSCR::Serial::printSync(FS(OSCR::Strings::Labels::NAME));
26 OSCR::Serial::printLineSync(_data.name);
27
28 OSCR::Serial::printSync(FS(OSCR::Strings::Labels::CRCSum));
29 OSCR::Serial::printLineSync(_data.crc32);
30
31 OSCR::Serial::printSync(FS(OSCR::Strings::Labels::ID));
32 OSCR::Serial::printLineSync(_data.serial);
33
34 OSCR::Serial::printSync(FS(OSCR::Strings::Labels::SIZE));
35 OSCR::Serial::printLineSync(_data.size);
36
37 OSCR::Serial::printSync(FS(OSCR::Strings::Labels::SAVE));
38 OSCR::Serial::printLineSync(_data.saveType);
39
40 OSCR::Serial::printLineSync(FS(OSCR::Strings::Headings::CRDBDebugEnd));
41# endif /* ENABLE_CRDB_DEBUG */
42 }
43 };
44
45 class GBA : public OSCR::CRDB::CRDB<GBARecord, CRDB_RECORD_SIZE_GBA>
46 {
47 using CRDB::CRDB;
48 public:
49 void nextRecord()
50 {
51 clearError();
52 readNum32(currentRecord->data()->crc32);
53 readBytes(&currentRecord->data()->serial, 4);
54 readNum16(&currentRecord->data()->size);
55 readNum16(&currentRecord->data()->saveType);
56 readBytes(&currentRecord->data()->name, 100);
57
58# if defined(ENABLE_CRDB_DEBUG)
59 OSCR::Serial::printLineSync(currentRecord->data()->name);
60# endif /* ENABLE_CRDB_DEBUG */
61 }
62
63 bool searchRecord(char const * serialSearch, uint16_t startingRecord = 0)
64 {
65 constexpr uint8_t const offset = 4;
66 clearError();
67
68# if defined(ENABLE_CRDB_DEBUG)
69 OSCR::Serial::printLineSync(F("<CRDB> Searching..."));
70 OSCR::Serial::printSync(F("<CRDB> Serial Search: "));
71 OSCR::Serial::printLineSync(serialSearch);
72# endif /* ENABLE_CRDB_DEBUG */
73
74 for (uint_fast32_t i = startingRecord; gotoRecordIndex(i) && file.seekCur(offset); ++i)
75 {
76 char serial[5];
77 int_fast8_t const readLen = readBytes(serial, 4);
78
79 if (readLen != 4) break;
80
81 if (
82 (serial[0] == serialSearch[0]) &&
83 (serial[1] == serialSearch[1]) &&
84 (serial[2] == serialSearch[2]) &&
85 (serial[3] == serialSearch[3])
86 )
87 {
88# if defined(ENABLE_CRDB_DEBUG)
89 OSCR::Serial::printSync(F("<CRDB> "));
90 OSCR::Serial::printLineSync(FS(OSCR::Strings::Common::OK));
91# endif /* ENABLE_CRDB_DEBUG */
92
93 if (!loadRecordIndex(i))
94 {
95# if defined(ENABLE_CRDB_DEBUG)
96 OSCR::Serial::printLineSync(F("<CRDB> Failed to load record!"));
97# endif /* ENABLE_CRDB_DEBUG */
98 error(OSCR::CRDB::ERRORS::E_READ_ERROR);
99 return false;
100 }
101
102# if defined(ENABLE_CRDB_DEBUG)
103 OSCR::Serial::printLineSync(F("<CRDB> Loaded record."));
104# endif /* ENABLE_CRDB_DEBUG */
105
106 return true;
107 }
108 }
109
110# if defined(ENABLE_CRDB_DEBUG)
111 OSCR::Serial::printLineSync(F("<CRDB> NOT FOUND"));
112# endif /* ENABLE_CRDB_DEBUG */
113
114 gotoRecordIndex(0);
115 return false;
116 }
117
118 bool searchRecordNext(char const * serialSearch)
119 {
120 return searchRecord(serialSearch, recordNum);
121 }
122 };
123}
124
125# endif /* HAS_GBX */
126
127#endif /* CRDB_GBA_H_ */
#define F(str)
Definition CRDB.h:313
Definition CRDB.h:63
Definition gba.h:46
Definition gba.h:18