2 FUJITSU FM Towns Emulator 'eFMTowns'
4 Author : Kyuma.Ohta <whatisthis.sowhat _at_ gmail.com>
7 [ dictionary rom/ram & cmos & RAM area 0x000d0000 - 0x000dffff]
9 * 0x000d0000 - 0x000d7fff : DICTIONARY ROM (BANKED)
10 * 0x000d8000 - 0x000d9fff : DICTIONARY RAM / GAIJI RAM
11 * 0x000da000 - 0x000dffff : RESERVED
12 * 0xc2080000 - 0xc20fffff : DICTIONARY ROM (NOT BANKED)
13 * 0xc2140000 - 0xc2141fff : DICTIONARY RAM
15 * 0x0484 : DICTIONARY BANK (for 0xd0000 - 0xd7ffff)
16 * 0x3000 - 0x3ffe (even address) : DICTIONARY RAM
19 #include "./towns_common.h"
20 #include "./dictionary.h"
21 #include "../../fileio.h"
24 void DICTIONARY::initialize()
26 memset(dict_rom, 0xff, sizeof(dict_rom));
27 memset(dict_ram, 0x00, sizeof(dict_ram));
29 FILEIO* fio = new FILEIO();
30 if(fio->Fopen(create_local_path(_T("FMT_DIC.ROM")), FILEIO_READ_BINARY)) { // DICTIONARIES
31 fio->Fread(dict_rom, sizeof(dict_rom), 1);
36 if(fio->Fopen(create_local_path(_T("FMT_CMOS.BIN")), FILEIO_READ_BINARY)) {
37 if(fio->Fread(dict_ram, sizeof(dict_ram), 1) == 1) {
46 void DICTIONARY::release()
49 FILEIO* fio = new FILEIO();
50 if(fio->Fopen(create_local_path(_T("FMT_CMOS.BIN")), FILEIO_WRITE_BINARY)) {
51 fio->Fwrite(dict_ram, sizeof(dict_ram), 1);
58 void DICTIONARY::reset()
61 // Write CMOD every resetting. 20200511 K.O
63 FILEIO* fio = new FILEIO();
64 if(fio->Fopen(create_local_path(_T("FMT_CMOS.BIN")), FILEIO_WRITE_BINARY)) {
65 fio->Fwrite(dict_ram, sizeof(dict_ram), 1);
73 uint32_t DICTIONARY::read_memory_mapped_io8w(uint32_t addr, int *wait)
75 uint8_t n_data = 0x00;
76 // 0xd0000 - 0xdffff : primary is VRAM, secondary is DICTIONARY.
77 if((addr < 0x000da000) && (addr >= 0x000d0000)) {
78 *wait = 6; // temporally.
80 return dict_rom[(((uint32_t)dict_bank) << 15) | (addr & 0x7fff)];
82 return dict_ram[addr & 0x1fff];
84 } else if((addr >= 0xc2080000) && (addr < 0xc2100000)) {
85 n_data = dict_rom[addr & 0x7ffff];
86 } else if((addr >= 0xc2140000) && (addr < 0xc2142000)) {
87 n_data = dict_ram[addr & 0x1fff];
92 void DICTIONARY::write_memory_mapped_io8w(uint32_t addr, uint32_t data, int *wait)
94 if((addr < 0x000da000) && (addr >= 0x000d8000)) {
95 *wait = 6; // Temporally.
97 dict_ram[addr & 0x1fff] = data;
99 } else if((addr >= 0xc2140000) && (addr < 0xc2142000)) {
100 *wait = 6; // Temporally.
102 dict_ram[addr & 0x1fff] = data;
109 void DICTIONARY::write_io8w(uint32_t addr, uint32_t data, int *wait)
111 *wait = 6; // Temporally.
113 dict_bank = data & 0x0f;
114 } else if((addr >= 0x3000) && (addr < 0x4000)) {
116 dict_ram[((addr - 0x3000) >> 1) & 0x7ff] = (uint8_t)data;
120 uint32_t DICTIONARY::read_io8w(uint32_t addr, int *wait)
122 *wait = 6; // Temporally.
123 uint32_t data = 0xff;
125 data = dict_bank & 0x0f;
126 } else if((addr >= 0x3000) && (addr < 0x4000)) {
127 data = dict_ram[((addr - 0x3000) >> 1) & 0x07ff];
132 void DICTIONARY::write_signal(int ch, uint32_t data, uint32_t mask)
135 case SIG_FMTOWNS_DICT_BANK:
136 dict_bank = (uint8_t)(data & 0x0f);
141 uint32_t DICTIONARY::read_signal(int ch)
144 case SIG_FMTOWNS_DICT_BANK:
145 return (uint32_t)(dict_bank & 0x0f);
151 uint32_t DICTIONARY::read_debug_data8(uint32_t addr)
154 return dict_ram[addr & 0x1fff];
157 void DICTIONARY::write_debug_data8(uint32_t addr, uint32_t data)
160 dict_ram[addr & 0x1fff] = data;
163 bool DICTIONARY::write_debug_reg(const _TCHAR *reg, uint32_t data)
165 if(reg == NULL) return false;
166 if(strcasecmp(reg, _T("bank")) == 0) {
167 dict_bank = data & 0x0f;
173 bool DICTIONARY::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
175 if(buffer == NULL) return false;
176 if(buffer_len <= 1) return false;
177 my_stprintf_s(buffer, buffer_len - 1,
178 _T("BANK=%02X WROTE=%s\n"),
179 dict_bank, (cmos_dirty) ? _T("Yes") : _T("No "));
183 #define STATE_VERSION 1
185 bool DICTIONARY::process_state(FILEIO* state_fio, bool loading)
187 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
190 if(!state_fio->StateCheckInt32(this_device_id)) {
193 state_fio->StateValue(dict_bank);
194 state_fio->StateArray(dict_ram, sizeof(dict_ram), 1);
199 FILEIO* fio = new FILEIO();
200 if(fio->Fopen(create_local_path(_T("FMT_CMOS.BIN")), FILEIO_WRITE_BINARY)) {
201 fio->Fwrite(dict_ram, sizeof(dict_ram), 1);