/* Copyright (C) 2006 thoduv Copyright (C) 2006 Theo Berkau Copyright (C) 2008-2013 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #pragma once #include #include #include #include "types.h" #include "emufile.h" //#include "windowsh_wrapper.h" #define MAX_SAVE_TYPES 13 #define MC_TYPE_AUTODETECT 0x0 #define MC_TYPE_EEPROM1 0x1 #define MC_TYPE_EEPROM2 0x2 #define MC_TYPE_FLASH 0x3 #define MC_TYPE_FRAM 0x4 #define MC_SIZE_4KBITS 0x000200 #define MC_SIZE_64KBITS 0x002000 #define MC_SIZE_256KBITS 0x008000 #define MC_SIZE_512KBITS 0x010000 #define MC_SIZE_1MBITS 0x020000 #define MC_SIZE_2MBITS 0x040000 #define MC_SIZE_4MBITS 0x080000 #define MC_SIZE_8MBITS 0x100000 #define MC_SIZE_16MBITS 0x200000 #define MC_SIZE_32MBITS 0x400000 #define MC_SIZE_64MBITS 0x800000 #define MC_SIZE_128MBITS 0x1000000 #define MC_SIZE_256MBITS 0x2000000 #define MC_SIZE_512MBITS 0x4000000 struct memory_chip_t { uint8_t com; // persistent command actually handled uint32_t addr; // current address for reading/writing uint8_t addr_shift; // shift for address (since addresses are transfered by 3 bytes units) uint8_t addr_size; // size of addr when writing/reading bool write_enable; //is write enabled ? std::vector data; //memory data uint32_t size; // memory size bool writeable_buffer; // is "data" writeable ? int type; //type of Memory char *filename; FILE *fp; uint8_t autodetectbuf[32768]; int autodetectsize; // needs only for firmware bool isFirmware; char userfile[MAX_PATH]; }; // the new backup system by zeromus class BackupDevice { public: BackupDevice(); // signals the save system that we are in our regular mode, loading up a rom. initializes for that case. void load_rom(const std::string &filename); void reset(); void reset_hardware(); std::string getFilename() { return filename; } std::vector data; // this info was saved before the last reset (used for savestate compatibility) struct SavedInfo { uint32_t addr_size; } savedInfo; // and these are used by old savestates void load_old_state(uint32_t addr_size, uint8_t *data, uint32_t datasize); static uint32_t addr_size_for_old_save_size(int bupmem_size); static uint32_t addr_size_for_old_save_type(int bupmem_type); void raw_applyUserSettings(uint32_t &size, bool manual = false); bool load_no_gba(const char *fname); bool load_raw(const char* filename, uint32_t force_size = 0); struct { uint32_t size, padSize, type, addr_size, mem_size; } info; private: std::string filename; bool write_enable; // is write enabled? uint32_t com; // persistent command actually handled uint32_t addr_size, addr_counter; uint32_t addr; std::vector data_autodetect; enum STATE { DETECTING = 0, RUNNING = 1 } state; enum MOTION_INIT_STATE { MOTION_INIT_STATE_IDLE, MOTION_INIT_STATE_RECEIVED_4, MOTION_INIT_STATE_RECEIVED_4_B, MOTION_INIT_STATE_FE, MOTION_INIT_STATE_FD, MOTION_INIT_STATE_FB }; enum MOTION_FLAG { MOTION_FLAG_NONE, MOTION_FLAG_ENABLED, MOTION_FLAG_SENSORMODE }; uint8_t motionInitState, motionFlag; void loadfile(); void ensure(uint32_t addr); bool flushPending, lazyFlushPending; void resize(uint32_t size); }; #define NDS_FW_SIZE_V1 (256 * 1024) /* size of fw memory on nds v1 */ #define NDS_FW_SIZE_V2 (512 * 1024) /* size of fw memory on nds v2 */ void mc_init(memory_chip_t *mc, int type); /* reset and init values for memory struct */ uint8_t *mc_alloc(memory_chip_t *mc, uint32_t size); /* alloc mc memory */ void mc_free(memory_chip_t *mc); /* delete mc memory */ void fw_reset_com(memory_chip_t *mc); /* reset communication with mc */ uint8_t fw_transfer(memory_chip_t *mc, uint8_t data); struct SAVE_TYPE { const char *descr; int media_type; int size; };