Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

encoder.cc

Go to the documentation of this file.
00001 /*
00002  * Game Genie Encoder/Decoder
00003  * Copyright (C) 2004-2005 emuWorks
00004  * http://games.technoplaza.net/
00005  *
00006  * This file is part of Game Genie Encoder/Decoder.
00007  *
00008  * Game Genie Encoder/Decoder is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU General Public License as published by
00010  * the Free Software Foundation; either version 2 of the License, or
00011  * (at your option) any later version.
00012  *
00013  * Game Genie Encoder/Decoder is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  * GNU General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License
00019  * along with Game Genie Encoder/Decoder; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00021  */
00022  
00023 // $Id: encoder.cc,v 1.3 2005/07/30 02:36:45 technoplaza Exp $
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     // position 1678
00045     genie = ((value & 0x80) >> 4) | (value & 0x7);
00046     
00047     // position H234
00048     temp = ((address & 0x80) >> 4) | ((value & 0x70) >> 4);
00049     genie <<= 4;
00050     genie |= temp;
00051     
00052     // position -IJK
00053     temp = (address & 0x70) >> 4;
00054     
00055     if (code.hasCompare()) {
00056         temp |= 0x8;
00057     }
00058     
00059     genie <<= 4;
00060     genie |= temp;
00061     
00062     // position LABC
00063     temp = (address & 0x8) | ((address & 0x7000) >> 12);
00064     genie <<= 4;
00065     genie |= temp;
00066     
00067     // position DMNO
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         // position eEFG
00076         temp = (compare & 0x8) | ((address & 0x700) >> 8);
00077         genie <<= 4;
00078         genie |= temp;
00079         
00080         // position afgh
00081         temp = ((compare & 0x80) >> 4) | (compare & 0x7);
00082         genie <<= 4;
00083         genie |= temp;
00084         
00085         // position 5bcd
00086         temp = (value & 0x8) | ((compare & 0x70) >> 4);
00087         genie <<= 4;
00088         genie |= temp;
00089     } else {
00090         // position 5EFG
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     // position 1-8
00113     genie = value;
00114     
00115     // position IJKL
00116     temp = (address & 0xF000) >> 12;
00117     genie <<= 4;
00118     genie |= temp;
00119     
00120     // position QRST
00121     temp = (address & 0xF0) >> 4;
00122     genie <<= 4;
00123     genie |= temp;
00124     
00125     // position OPAB
00126     temp = ((address & 0x300) >> 6) | (address >> 22);
00127     genie <<= 4;
00128     genie |= temp;
00129     
00130     // position CDUV
00131     temp = ((address & 0x300000) >> 18) | ((address & 0xC) >> 2);
00132     genie <<= 4;
00133     genie |= temp;
00134     
00135     // position WXEF
00136     temp = ((address & 0x3) << 2) | ((address & 0xC0000) >> 18);
00137     genie <<= 4;
00138     genie |= temp;
00139     
00140     // position GHMN
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     // position ijkl
00166     genie = (value & 0xF0) >> 4;
00167     
00168     // position mnop
00169     temp = (value & 0xF);
00170     genie <<= 4;
00171     genie |= temp;
00172     
00173     // position IJKL
00174     temp = (address & 0xF000) >> 12;
00175     genie <<= 4;
00176     genie |= temp;
00177     
00178     // position MNOP
00179     temp = (address & 0xF00) >> 8;
00180     genie <<= 4;
00181     genie |= temp;
00182     
00183     // position ABCD
00184     temp = (address & 0xF00000) >> 20;
00185     genie <<= 4;
00186     genie |= temp;
00187     
00188     // position EFGH
00189     temp = (address & 0xF0000) >> 16;
00190     genie <<= 4;
00191     genie |= temp;
00192     
00193     // position defg
00194     temp = ((value & 0x1000) >> 9) | ((value & 0xE00) >> 9);
00195     genie <<= 4;
00196     genie |= temp;
00197     
00198     // position habc
00199     temp = ((value & 0x100) >> 5) | ((value & 0xE000) >> 13);
00200     genie <<= 4;
00201     genie |= temp;
00202     
00203     // position QRST
00204     temp = (address & 0xF0) >> 4;
00205     genie <<= 4;
00206     genie |= temp;
00207     
00208     // position UVWX
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     // start with the value
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 

Generated on Sat Jul 30 15:01:51 2005 for Game Genie Encoder/Decoder by  doxygen 1.4.4