OSCR
Open Source Cartridge Reader
Loading...
Searching...
No Matches
snes.h
1
2#pragma once
3#ifndef CRDB_SNES_H_
4# define CRDB_SNES_H_
5
6# include "config.h"
7
8# if HAS_SNES
9# include "common/CRDB.h"
10# include "cores/SNES.h"
11
12namespace OSCR::Databases
13{
14 using OSCR::Cores::SNES::crdbSNESRecord;
15
17 : public OSCR::CRDB::GenericCartRecord<crdbSNESRecord>
18 {
19 public:
20 uint32_t getCRC32()
21 {
22 return _data.crc32;
23 }
24
25 void debug()
26 {
27# if defined(ENABLE_CRDB_DEBUG)
28 OSCR::Serial::printLine(F(" ===== ROM DEBUG INFO ===== "));
29
30 OSCR::Serial::print(FS(OSCR::Strings::Labels::NAME));
31 OSCR::Serial::printLine(_data.name);
32
33 OSCR::Serial::print(FS(OSCR::Strings::Labels::CRCSum));
34 OSCR::Serial::printLine(_data.crc32);
35
36 OSCR::Serial::print(FS(OSCR::Strings::Labels::ID));
37 OSCR::Serial::printLine(_data.id32);
38
39 OSCR::Serial::print(FS(OSCR::Strings::Labels::CHECKSUM));
40 OSCR::Serial::printLine(_data.chksum);
41
42 OSCR::Serial::print(FS(OSCR::Strings::Labels::SIZE));
43 OSCR::Serial::printLine(_data.size);
44
45 OSCR::Serial::print(FS(OSCR::Strings::Labels::BANKS));
46 OSCR::Serial::printLine(_data.banks);
47
48 OSCR::Serial::printLine(F(" ========================== "));
49# endif /* ENABLE_CRDB_DEBUG */
50 }
51 };
52
53 class SNES : public OSCR::CRDB::CRDB<SNESRecord, CRDB_RECORD_SIZE_SNES>
54 {
55 using CRDB::CRDB;
56 public:
57 void nextRecord()
58 {
59 clearError();
60 readNum32(currentRecord->data()->crc32);
61 readNum16(&currentRecord->data()->chksum);
62 readNum32(currentRecord->data()->id32);
63 readNum32(&currentRecord->data()->size);
64 readNum16(&currentRecord->data()->banks);
65 readBytes(&currentRecord->data()->name, 100);
66 }
67
68 bool searchRecord(uint16_t chksumSearch, uint16_t startingRecord = 0)
69 {
70 constexpr uint8_t const offset = 4;
71 clearError();
72
73# if defined(ENABLE_CRDB_DEBUG)
74 OSCR::Serial::printLine(F("<CRDB> Searching..."));
75 OSCR::Serial::print(F("<CRDB> Checksum Search: "));
76 OSCR::Serial::printHex(chksumSearch);
77 OSCR::Serial::printLine();
78# endif /* ENABLE_CRDB_DEBUG */
79
80 for (uint_fast32_t i = startingRecord; gotoRecordIndex(i) && file.seekCur(offset); ++i)
81 {
82 uint16_t chksum;
83 int_fast8_t const readLen = readNum16(&chksum);
84
85 if (readLen != 2) break;
86
87 if (chksum == chksumSearch)
88 {
89 loadRecordIndex(i);
90
91# if defined(ENABLE_CRDB_DEBUG)
92 OSCR::Serial::print(F("<CRDB> "));
93 OSCR::Serial::printLine(FS(OSCR::Strings::Common::OK));
94# endif /* ENABLE_CRDB_DEBUG */
95
96 return true;
97 }
98 }
99
100# if defined(ENABLE_CRDB_DEBUG)
101 OSCR::Serial::printLine(F("<CRDB> NOT FOUND"));
102# endif /* ENABLE_CRDB_DEBUG */
103
104 gotoRecordIndex(0);
105 return false;
106 }
107
108 bool searchRecordNext(uint16_t chksumSearch)
109 {
110 return searchRecord(chksumSearch, recordNum);
111 }
112 };
113}
114
115# endif /* HAS_SNES*/
116
117#endif /* CRDB_SNES_H_ */
#define F(str)
Definition CRDB.h:313
Definition CRDB.h:63
Definition snes.h:54
Definition snes.h:18