OSDN Git Service

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