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 "encoder.hh"
00026
00027 #include "../model/nesgamegeniecode.hh"
00028 #include "../model/nesrawcode.hh"
00029 #include "../model/snesgamegeniecode.hh"
00030 #include "../model/snesrawcode.hh"
00031 #include "../model/genesisgamegeniecode.hh"
00032 #include "../model/genesisrawcode.hh"
00033 #include "../model/gbgggamegeniecode.hh"
00034 #include "../model/gbggrawcode.hh"
00035
00036 using namespace emuWorks;
00037
00038 NESGameGenieCode Encoder::encode(NESRawCode &code) {
00039 int genie;
00040 int temp = 0;
00041 int value = code.getValue();
00042 int address = code.getAddress();
00043
00044
00045 genie = ((value & 0x80) >> 4) | (value & 0x7);
00046
00047
00048 temp = ((address & 0x80) >> 4) | ((value & 0x70) >> 4);
00049 genie <<= 4;
00050 genie |= temp;
00051
00052
00053 temp = (address & 0x70) >> 4;
00054
00055 if (code.hasCompare()) {
00056 temp |= 0x8;
00057 }
00058
00059 genie <<= 4;
00060 genie |= temp;
00061
00062
00063 temp = (address & 0x8) | ((address & 0x7000) >> 12);
00064 genie <<= 4;
00065 genie |= temp;
00066
00067
00068 temp = ((address & 0x800) >> 8) | (address & 0x7);
00069 genie <<= 4;
00070 genie |= temp;
00071
00072 if (code.hasCompare()) {
00073 int compare = code.getCompare();
00074
00075
00076 temp = (compare & 0x8) | ((address & 0x700) >> 8);
00077 genie <<= 4;
00078 genie |= temp;
00079
00080
00081 temp = ((compare & 0x80) >> 4) | (compare & 0x7);
00082 genie <<= 4;
00083 genie |= temp;
00084
00085
00086 temp = (value & 0x8) | ((compare & 0x70) >> 4);
00087 genie <<= 4;
00088 genie |= temp;
00089 } else {
00090
00091 temp = (value & 0x8) | ((address & 0x700) >> 8);
00092 genie <<= 4;
00093 genie |= temp;
00094 }
00095
00096 QString ggcode;
00097 const char *alphabet = NESGameGenieCode::ALPHABET;
00098
00099 for (int i = 0; i < (code.hasCompare() ? 8 : 6); i++) {
00100 ggcode.insert(0, alphabet[(genie >> (i * 4)) & 0xF]);
00101 }
00102
00103 return NESGameGenieCode::create(ggcode);
00104 }
00105
00106 SNESGameGenieCode Encoder::encode(SNESRawCode &code) {
00107 int genie;
00108 int temp;
00109 int value = code.getValue();
00110 int address = code.getAddress();
00111
00112
00113 genie = value;
00114
00115
00116 temp = (address & 0xF000) >> 12;
00117 genie <<= 4;
00118 genie |= temp;
00119
00120
00121 temp = (address & 0xF0) >> 4;
00122 genie <<= 4;
00123 genie |= temp;
00124
00125
00126 temp = ((address & 0x300) >> 6) | (address >> 22);
00127 genie <<= 4;
00128 genie |= temp;
00129
00130
00131 temp = ((address & 0x300000) >> 18) | ((address & 0xC) >> 2);
00132 genie <<= 4;
00133 genie |= temp;
00134
00135
00136 temp = ((address & 0x3) << 2) | ((address & 0xC0000) >> 18);
00137 genie <<= 4;
00138 genie |= temp;
00139
00140
00141 temp = ((address & 0x30000) >> 14) | ((address & 0xC00) >> 10);
00142 genie <<= 4;
00143 genie |= temp;
00144
00145 QString ggcode;
00146 const char *alphabet = SNESGameGenieCode::ALPHABET;
00147
00148 for (int i = 0; i < 8; i++) {
00149 if (i == 4) {
00150 ggcode.insert(0, '-');
00151 }
00152
00153 ggcode.insert(0, alphabet[(genie >> (i * 4)) & 0xF]);
00154 }
00155
00156 return SNESGameGenieCode::create(ggcode);
00157 }
00158
00159 GenesisGameGenieCode Encoder::encode(GenesisRawCode &code) {
00160 int temp;
00161 qint64 genie;
00162 int value = code.getValue();
00163 int address = code.getAddress();
00164
00165
00166 genie = (value & 0xF0) >> 4;
00167
00168
00169 temp = (value & 0xF);
00170 genie <<= 4;
00171 genie |= temp;
00172
00173
00174 temp = (address & 0xF000) >> 12;
00175 genie <<= 4;
00176 genie |= temp;
00177
00178
00179 temp = (address & 0xF00) >> 8;
00180 genie <<= 4;
00181 genie |= temp;
00182
00183
00184 temp = (address & 0xF00000) >> 20;
00185 genie <<= 4;
00186 genie |= temp;
00187
00188
00189 temp = (address & 0xF0000) >> 16;
00190 genie <<= 4;
00191 genie |= temp;
00192
00193
00194 temp = ((value & 0x1000) >> 9) | ((value & 0xE00) >> 9);
00195 genie <<= 4;
00196 genie |= temp;
00197
00198
00199 temp = ((value & 0x100) >> 5) | ((value & 0xE000) >> 13);
00200 genie <<= 4;
00201 genie |= temp;
00202
00203
00204 temp = (address & 0xF0) >> 4;
00205 genie <<= 4;
00206 genie |= temp;
00207
00208
00209 temp = (address & 0xF);
00210 genie <<= 4;
00211 genie |= temp;
00212
00213 QString ggcode;
00214 const char *alphabet = GenesisGameGenieCode::ALPHABET;
00215
00216 for (int i = 0; i < 8; i++) {
00217 if (i == 4) {
00218 ggcode.insert(0, "-");
00219 }
00220
00221 ggcode.insert(0, alphabet[(int)((genie >> (i * 5)) & 0x1F)]);
00222 }
00223
00224 return GenesisGameGenieCode::create(ggcode);
00225 }
00226
00227 GBGGGameGenieCode Encoder::encode(GBGGRawCode &code) {
00228 int temp, address = code.getAddress(), value = code.getValue();
00229 qint64 genie;
00230
00231
00232 genie = value;
00233
00234 temp = (address & 0xF000) >> 12;
00235 temp = (~temp & 0xF);
00236 temp |= (address & 0xFFF) << 4;
00237 genie <<= 16;
00238 genie |= temp;
00239
00240 if (code.hasCompare()) {
00241 int compare = code.getCompare();
00242
00243 compare ^= 0xBA;
00244 compare = (compare << 2) | (compare >> 6);
00245 temp = (compare & 0xF0) >> 4;
00246 genie <<= 4;
00247 genie |= temp;
00248
00249 temp ^= 8;
00250 genie <<= 4;
00251 genie |= temp;
00252
00253 temp = (compare & 0xF);
00254 genie <<= 4;
00255 genie |= temp;
00256 }
00257
00258 QString ggcode;
00259 const char *alphabet = GBGGGameGenieCode::ALPHABET;
00260
00261 for (int i = 0; i < (code.hasCompare() ? 9 : 6); i++) {
00262 if ((i == 3) || (i == 6)) {
00263 ggcode.insert(0, '-');
00264 }
00265
00266 ggcode.insert(0, alphabet[(int)((genie >> (i * 4)) & 0xF)]);
00267 }
00268
00269 return GBGGGameGenieCode::create(ggcode);
00270 }
00271