OSDN Git Service

[VM][State] Apply new state framework to some VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / familybasic / memory.h
1 /*
2         Nintendo Family BASIC Emulator 'eFamilyBASIC'
3
4         Origin : nester
5         Author : Takeda.Toshiya
6         Date   : 2010.08.11-
7
8         [ memory ]
9 */
10
11 #ifndef _MEMORY_H_
12 #define _MEMORY_H_
13
14 #include "../vm.h"
15 #include "../../emu.h"
16 #include "../device.h"
17
18 class PPU;
19
20 class MEMORY : public DEVICE
21 {
22 private:
23         DEVICE *d_cpu, *d_apu, *d_drec, *d_opll;
24         PPU *d_ppu;
25         
26         _TCHAR save_file_name[_MAX_PATH];
27         
28         const uint8_t* key_stat;
29         const uint32_t* joy_stat;
30         
31         header_t header;
32         uint32_t rom_size;
33         uint32_t rom_mask;
34 //      uint8_t rom[0x8000];
35         uint8_t *rom;
36         uint8_t ram[0x800];
37 //      uint8_t save_ram[0x2000];
38         uint8_t save_ram[0x10000];
39         uint32_t save_ram_crc32;
40         
41         uint32_t banks[8];
42         uint8_t *bank_ptr[8];
43         uint8_t dummy[0x2000];
44         
45         uint8_t *spr_ram;
46         uint16_t dma_addr;
47         uint8_t frame_irq_enabled;
48         
49         bool pad_strobe;
50         uint8_t pad1_bits, pad2_bits;
51         
52         bool kb_out;
53         uint8_t kb_scan;
54         
55         void set_rom_bank(uint8_t bank, uint32_t bank_num);
56         
57         // mmc5
58 //      DEVICE *d_mmc5;
59         uint32_t mmc5_wram_bank[8];
60         uint8_t mmc5_chr_reg[8][2];
61         uint32_t mmc5_value0;
62         uint32_t mmc5_value1;
63         uint8_t mmc5_wram_protect0;
64         uint8_t mmc5_wram_protect1;
65         uint8_t mmc5_prg_size;
66         uint8_t mmc5_chr_size;
67         uint8_t mmc5_gfx_mode;
68 //      uint8_t mmc5_split_control;
69 //      uint8_t mmc5_split_bank;
70         uint8_t mmc5_irq_enabled;
71         uint8_t mmc5_irq_status;
72         uint32_t mmc5_irq_line;
73         
74         void mmc5_reset();
75         uint32_t mmc5_lo_read(uint32_t addr);
76         void mmc5_lo_write(uint32_t addr, uint32_t data);
77 //      uint32_t mmc5_save_read(uint32_t addr);
78         void mmc5_save_write(uint32_t addr, uint32_t data);
79         void mmc5_hi_write(uint32_t addr, uint32_t data);
80         void mmc5_hsync(int v);
81         void mmc5_set_cpu_bank(uint8_t bank, uint32_t bank_num);
82         void mmc5_set_wram_bank(uint8_t bank, uint32_t bank_num);
83         void mmc5_set_ppu_bank(uint8_t mode);
84         
85         // vrc7
86         uint8_t vrc7_irq_enabled;
87         uint8_t vrc7_irq_counter;
88         uint8_t vrc7_irq_latch;
89         
90         void vrc7_reset();
91         uint32_t vrc7_lo_read(uint32_t addr);
92         void vrc7_lo_write(uint32_t addr, uint32_t data);
93 //      uint32_t vrc7_save_read(uint32_t addr);
94 //      void vrc7_save_write(uint32_t addr, uint32_t data);
95         void vrc7_hi_write(uint32_t addr, uint32_t data);
96         void vrc7_hsync(int v);
97         
98 public:
99         MEMORY(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
100         {
101                 set_device_name(_T("Memory Bus"));
102         }
103         ~MEMORY() {}
104         
105         // common functions
106         void initialize();
107         void release();
108         void reset();
109         void write_data8(uint32_t addr, uint32_t data);
110         uint32_t read_data8(uint32_t addr);
111         void event_vline(int v, int clock);
112         void event_callback(int event_id, int err);
113         bool process_state(FILEIO* state_fio, bool loading);
114         
115         // unique functions
116         void set_context_cpu(DEVICE* device)
117         {
118                 d_cpu = device;
119         }
120         void set_context_apu(DEVICE* device)
121         {
122                 d_apu = device;
123         }
124         void set_context_ppu(PPU* device)
125         {
126                 d_ppu = device;
127         }
128         void set_context_drec(DEVICE* device)
129         {
130                 d_drec = device;
131         }
132 //      void set_context_mmc5(DEVICE* device)
133 //      {
134 //              d_mmc5 = device;
135 //      }
136         void set_context_opll(DEVICE* device)
137         {
138                 d_opll = device;
139         }
140         void set_spr_ram_ptr(uint8_t* ptr)
141         {
142                 spr_ram = ptr;
143         }
144         void load_rom_image(const _TCHAR *file_name);
145         void save_backup();
146         uint8_t mmc5_ppu_latch_render(uint8_t mode, uint32_t addr);
147 };
148
149 #endif