2 FUJITSU FM Towns Emulator 'eFMTowns'
4 Author : Kyuma.Ohta <whatisthis.sowhat _at_ gmail.com>
10 #ifndef _TOWNS_MEMORY_H_
11 #define _TOWNS_MEMORY_H_
14 #include "../../emu.h"
15 #include "../device.h"
17 //#define SIG_MEMORY_DISP 0
18 //#define SIG_MEMORY_VSYNC 1
21 // Bank size = 1GB / 1MB.
22 // Page 0 (0000:00000 - 0000:fffff) is another routine.
23 #define TOWNS_BANK_SIZE 1024
24 // Page0 size is 1MB / 2KB.
25 #define TOWNS_BANK000_BANK_SIZE 512
27 // C000:00000 - C1f0:fffff is 32MB / 32KB
28 #define TOWNS_BANKC0x_BANK_SIZE 1024
29 // C200:00000 - C230:fffff is 4MB / 2KB
30 #define TOWNS_BANKC2x_BANK_SIZE 2048
33 // 00000000 - 000fffff : SYSTEM RAM PAGE 0 (Similar to FMR-50).
34 // 00010000 - 3fffffff : EXTRA RAM (for i386 native mode.Page size is 1MB.)
35 // 40000000 - 7fffffff : External I/O BOX.Not accessible.
36 // 80000000 - bfffffff : VRAM (Reserved 01020000H bytes with earlier Towns.)
37 // c0000000 - c21fffff : ROM card and dictionaly/font/DOS ROMs.
38 // c2200000 - c2200fff : PCM RAM (Banked).
39 // c2201000 - fffbffff : Reserved.
40 // FFFC0000 - FFFFFFFF : Towns System ROM.
43 TOWNS_MEMORY_TYPE_FORBID = 0,
44 TOWNS_MEMORY_TYPE_PAGE0 = 1, // - 0xfffff
45 TOWNS_MEMORY_TYPE_INTRAM, // 0x100000 -
46 TOWNS_MEMORY_TYPE_EXT_MMIO,
47 TOWNS_MEMORY_TYPE_VRAM,
48 TOWNS_MEMORY_TYPE_SPRITE,
49 TOWNS_MEMORY_TYPE_ROMCARD,
50 TOWNS_MEMORY_TYPE_MSDOS,
51 TOWNS_MEMORY_TYPE_DICTROM,
52 TOWNS_MEMORY_TYPE_KANJIFONT,
53 TOWNS_MEMORY_TYPE_DICTLEARN,
54 TOWNS_MEMORY_TYPE_WAVERAM,
55 TOWNS_MEMORY_TYPE_SYSTEM_ROM,
58 // Please set from config
59 #define TOWNS_EXTRAM_PAGES 6
62 class TOWNS_MEMORY : public DEVICE
74 uint8_t *read_bank_adrs_cx[0x400 * 16]; // C0000000 - C3FFFFFF : Per 4KB
75 uint8_t *write_bank_adrs_cx[0x400 * 16]; // C0000000 - C3FFFFFF : Per 4KB
76 uint8_t device_type_adrs_cx[0x400 * 16]; // C0000000 - C3FFFFFF : Per 4KB
78 uint8_t *read_bank_adrs_fx[0x1000]; // FF000000 - FFFFFFFF : Per 4KB
80 uint8_t *extram_base; // 0x100000 - : 2MB / 4MB / 6MB
81 uint32_t extram_pages; //
82 uint8_t *extram_adrs[0x400]; // 1 bank is 1MB
84 uint8_t msdos_rom[0x80000]; // MSDOS ROM. READ ONLY.
85 uint8_t dict_rom[0x80000]; // Dictionary rom. READ ONLY.
86 uint8_t font_rom[0x40000]; // Font ROM. READ ONLY.
88 uint8_t font_20_rom[0x40000]; // Font ROM (20 pixels). READ ONLY.
90 uint8_t system_rom[0x20000]; // System ROM. READ ONLY.
99 uint8_t page0[0xc0000];
100 uint8_t ram_0d0[0x20000];
101 uint8_t ram_0f0[0x8000];
102 uint8_t ram_0f8[0x8000];
103 //uint8_t machine_id[2]; // MACHINE ID
106 uint8_t protect, rst;
107 uint8_t mainmem, rplane, wplane;
108 uint8_t dma_addr_reg, dma_wrap_reg;
109 uint32_t dma_addr_mask;
111 void update_dma_addr_mask();
113 TOWNS_MEMORY(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) {
114 set_device_name(_T("MEMORY"));
128 void write_data8(uint32_t addr, uint32_t data);
129 uint32_t read_data8(uint32_t addr);
130 // Using [read|write]_data[16|32] to be faster memory access.
131 void write_data16(uint32_t addr, uint32_t data);
132 uint32_t read_data16(uint32_t addr);
133 void write_data32(uint32_t addr, uint32_t data);
134 uint32_t read_data32(uint32_t addr);
136 void write_dma_data8(uint32_t addr, uint32_t data);
137 uint32_t read_dma_data8(uint32_t addr);
138 // Using [read|write]_dma_data16 for DMAC 16bit mode (SCSI/CDROM?).
139 void write_dma_data16(uint32_t addr, uint32_t data);
140 uint32_t read_dma_data16(uint32_t addr);
142 void write_io8(uint32_t addr, uint32_t data);
143 uint32_t read_io8(uint32_t addr);
144 void write_signal(int id, uint32_t data, uint32_t mask);
146 void save_state(FILEIO* state_fio);
147 bool load_state(FILEIO* state_fio);
150 void set_context_cpu(I386* device)
154 void set_machine_id(uint8_t id)
158 void set_context_vram(TOWNS_VRAM* device)
162 void set_context_crtc(DEVICE* device)
166 void set_context_cmos(DEVICE* device)
170 void set_context_pcm(DEVICE* device)
174 void set_context_beep(DEVICE* device)
179 void set_chregs_ptr(uint8_t* ptr)