00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <QValidator>
00026
00027 #include "geniedialog.hh"
00028 #include "system.hh"
00029 #include "../tools/decoder.hh"
00030 #include "../tools/encoder.hh"
00031 #include "../model/nesgamegeniecode.hh"
00032 #include "../model/nesrawcode.hh"
00033 #include "../model/snesgamegeniecode.hh"
00034 #include "../model/snesrawcode.hh"
00035 #include "../model/genesisgamegeniecode.hh"
00036 #include "../model/genesisrawcode.hh"
00037 #include "../model/gbgggamegeniecode.hh"
00038 #include "../model/gbggrawcode.hh"
00039 #include "../exceptions/invalidgamegeniecode.hh"
00040
00041 using namespace emuWorks;
00042
00043 GenieDialog::GenieDialog() : QDialog(), encoding(false), decoding(false) {
00044 setAttribute(Qt::WA_QuitOnClose);
00045 ui.setupUi(this);
00046
00047
00048 QRegExp regex;
00049
00050 regex = QRegExp("[A-Fa-f0-9]+");
00051 hexValidator = new QRegExpValidator(regex, this);
00052
00053 regex = QRegExp("[APZLGITYEOXUKSVNapzlgityeoxuksvn]+");
00054 nesValidator = new QRegExpValidator(regex, this);
00055
00056 regex = QRegExp("[A-Fa-f0-9-]+");
00057 snesValidator = new QRegExpValidator(regex, this);
00058
00059 regex = QRegExp("[A-HJ-NPR-TV-Z0-9a-hj-np-tv-z-]+");
00060 genesisValidator = new QRegExpValidator(regex, this);
00061
00062 regex = QRegExp("[A-Fa-f0-9-]+");
00063 gbggValidator = new QRegExpValidator(regex, this);
00064
00065 ui.valueEdit->setValidator(hexValidator);
00066 ui.addressEdit->setValidator(hexValidator);
00067 ui.compareEdit->setValidator(hexValidator);
00068
00069 ui.compareEdit->setMaxLength(2);
00070
00071
00072 on_nesRadio_toggled(true);
00073 }
00074
00075 GenieDialog::~GenieDialog() {
00076 delete hexValidator;
00077 delete nesValidator;
00078 delete snesValidator;
00079 delete genesisValidator;
00080 delete gbggValidator;
00081 }
00082
00083 void GenieDialog::reset() {
00084 encoding = true;
00085 decoding = true;
00086
00087 ui.gamegenieEdit->clear();
00088 ui.valueEdit->clear();
00089 ui.addressEdit->clear();
00090 ui.compareEdit->clear();
00091
00092 encoding = false;
00093 encoding = false;
00094 }
00095
00096 void GenieDialog::on_nesRadio_toggled(bool checked) {
00097 if (checked) {
00098 reset();
00099 system = NES;
00100 ui.compareEdit->setEnabled(true);
00101
00102 ui.valueEdit->setMaxLength(2);
00103 ui.addressEdit->setMaxLength(4);
00104 ui.gamegenieEdit->setMaxLength(8);
00105 ui.gamegenieEdit->setValidator(nesValidator);
00106 }
00107 }
00108
00109 void GenieDialog::on_snesRadio_toggled(bool checked) {
00110 if (checked) {
00111 reset();
00112 system = SNES;
00113 ui.compareEdit->setEnabled(false);
00114
00115 ui.valueEdit->setMaxLength(2);
00116 ui.addressEdit->setMaxLength(6);
00117 ui.gamegenieEdit->setMaxLength(9);
00118 ui.gamegenieEdit->setValidator(snesValidator);
00119 }
00120 }
00121
00122 void GenieDialog::on_genesisRadio_toggled(bool checked) {
00123 if (checked) {
00124 reset();
00125 system = GENESIS;
00126 ui.compareEdit->setEnabled(false);
00127
00128 ui.valueEdit->setMaxLength(4);
00129 ui.addressEdit->setMaxLength(6);
00130 ui.gamegenieEdit->setMaxLength(9);
00131 ui.gamegenieEdit->setValidator(genesisValidator);
00132 }
00133 }
00134
00135 void GenieDialog::on_gbggRadio_toggled(bool checked) {
00136 if (checked) {
00137 reset();
00138 system = GBGG;
00139 ui.compareEdit->setEnabled(true);
00140
00141 ui.valueEdit->setMaxLength(2);
00142 ui.addressEdit->setMaxLength(4);
00143 ui.gamegenieEdit->setMaxLength(11);
00144 ui.gamegenieEdit->setValidator(gbggValidator);
00145 }
00146 }
00147
00148 void GenieDialog::encode() {
00149 if (decoding) {
00150 return;
00151 }
00152
00153 encoding = true;
00154
00155 bool ok;
00156
00157 int value = ui.valueEdit->text().toInt(&ok, 16);
00158 int address = ui.addressEdit->text().toInt(&ok, 16);
00159 int compare = ui.compareEdit->text().toInt(&ok, 16);
00160
00161 if (system == NES) {
00162 NESRawCode *rawcode;
00163
00164 if (!ui.compareEdit->text().isEmpty()) {
00165 rawcode = new NESRawCode(address, value, compare);
00166 } else {
00167 rawcode = new NESRawCode(address, value);
00168 }
00169
00170 NESGameGenieCode ggcode = Encoder::encode(*rawcode);
00171 ui.gamegenieEdit->setText(ggcode.getCode());
00172
00173 delete rawcode;
00174 } else if (system == SNES) {
00175 SNESRawCode rawcode(address, value);
00176 SNESGameGenieCode ggcode = Encoder::encode(rawcode);
00177 ui.gamegenieEdit->setText(ggcode.getCode());
00178 } else if (system == GENESIS) {
00179 GenesisRawCode rawcode(address, value);
00180 GenesisGameGenieCode ggcode = Encoder::encode(rawcode);
00181 ui.gamegenieEdit->setText(ggcode.getCode());
00182 } else if (system == GBGG) {
00183 GBGGRawCode *rawcode;
00184
00185 if (!ui.compareEdit->text().isEmpty()) {
00186 rawcode = new GBGGRawCode(address, value, compare);
00187 } else {
00188 rawcode = new GBGGRawCode(address, value);
00189 }
00190
00191 GBGGGameGenieCode ggcode = Encoder::encode(*rawcode);
00192 ui.gamegenieEdit->setText(ggcode.getCode());
00193
00194 delete rawcode;
00195 }
00196
00197 encoding = false;
00198 }
00199
00200 void GenieDialog::on_valueEdit_textEdited(const QString &) {
00201 encode();
00202 }
00203
00204
00205 void GenieDialog::on_addressEdit_textEdited(const QString &) {
00206 encode();
00207 }
00208
00209
00210 void GenieDialog::on_compareEdit_textEdited(const QString &) {
00211 encode();
00212 }
00213
00214 void GenieDialog::decode() {
00215 if (encoding) {
00216 return;
00217 }
00218
00219 decoding = true;
00220
00221 QString text = ui.gamegenieEdit->text().toUpper();
00222
00223 try {
00224 QString str;
00225
00226 if (system == NES) {
00227 NESGameGenieCode ggcode = NESGameGenieCode::create(text);
00228 NESRawCode rawcode = Decoder::decodeNES(ggcode);
00229
00230 str.sprintf("%02X", rawcode.getValue());
00231 ui.valueEdit->setText(str);
00232
00233 str.sprintf("%04X", rawcode.getAddress());
00234 ui.addressEdit->setText(str);
00235
00236 if (rawcode.hasCompare()) {
00237 str.sprintf("%02X", rawcode.getCompare());
00238 ui.compareEdit->setText(str);
00239 } else {
00240 ui.compareEdit->clear();
00241 }
00242 } else if (system == SNES) {
00243 SNESGameGenieCode ggcode = SNESGameGenieCode::create(text);
00244 SNESRawCode rawcode = Decoder::decodeSNES(ggcode);
00245
00246 str.sprintf("%02X", rawcode.getValue());
00247 ui.valueEdit->setText(str);
00248
00249 str.sprintf("%04X", rawcode.getAddress());
00250 ui.addressEdit->setText(str);
00251 } else if (system == GENESIS) {
00252 GenesisGameGenieCode ggcode = GenesisGameGenieCode::create(text);
00253 GenesisRawCode rawcode = Decoder::decodeGenesis(ggcode);
00254
00255 str.sprintf("%04X", rawcode.getValue());
00256 ui.valueEdit->setText(str);
00257
00258 str.sprintf("%04X", rawcode.getAddress());
00259 ui.addressEdit->setText(str);
00260 } else if (system == GBGG) {
00261 GBGGGameGenieCode ggcode = GBGGGameGenieCode::create(text);
00262 GBGGRawCode rawcode = Decoder::decodeGBGG(ggcode);
00263
00264 str.sprintf("%02X", rawcode.getValue());
00265 ui.valueEdit->setText(str);
00266
00267 str.sprintf("%04X", rawcode.getAddress());
00268 ui.addressEdit->setText(str);
00269
00270 if (rawcode.hasCompare()) {
00271 str.sprintf("%02X", rawcode.getCompare());
00272 ui.compareEdit->setText(str);
00273 } else {
00274 ui.compareEdit->clear();
00275 }
00276 }
00277 } catch (InvalidGameGenieCodeException e) {
00278
00279 }
00280
00281 decoding = false;
00282 }
00283
00284 void GenieDialog::on_gamegenieEdit_textEdited(const QString &) {
00285 decode();
00286 }
00287