OSDN Git Service

[VM][FM7] Add Japanese communication board (日本語通信カード) .
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / kanjirom.cpp
1 /*
2  * Common source code project -> FM-7/77/AV -> Kanji rom
3  * (C) 2015 K.Ohta <whatisthis.sowhat _at_ gmail.com>
4  * License: GPLv2
5  * History:
6  *  Feb 11, 2015 : Initial
7  */
8
9 #include "vm.h"
10 #include "../../fileio.h"
11 #include "emu.h"
12 #include "fm7_common.h"
13 #include "kanjirom.h"
14
15 KANJIROM::KANJIROM(VM *parent_vm, EMU* parent_emu, bool type_2std): DEVICE(parent_vm, parent_emu)
16 {
17         FILEIO *fio;
18         read_ok = false;
19         
20         fio = new FILEIO();
21         memset(data_table, 0xff, 0x20000); 
22         //      read_table[0].memory = data_table;
23         p_emu = parent_emu;
24
25 #if !defined(_FM77AV_VARIANTS)
26         jis78_emulation = ((config.dipswitch & FM7_DIPSW_JIS78EMU_ON) != 0);
27 #else
28         jis78_emulation = false;
29 #endif
30         if(type_2std) {
31                 class2 = true;
32                 if(fio->Fopen(create_local_path(_T("KANJI2.ROM")), FILEIO_READ_BINARY)) {
33                   fio->Fread(data_table, 0x20000, 1);
34                         fio->Fclose();
35                         read_ok = true;
36                         jis78_emulation = false;
37                 }
38         } else {
39                 class2 = false;
40                 if(fio->Fopen(create_local_path(_T("KANJI1.ROM")), FILEIO_READ_BINARY)) {
41                   fio->Fread(data_table, 0x20000, 1);
42                         fio->Fclose();
43                         read_ok = true;
44                 } else if(fio->Fopen(create_local_path(_T("KANJI.ROM")), FILEIO_READ_BINARY)) {
45                   fio->Fread(data_table, 0x20000, 1);
46                         fio->Fclose();
47                         read_ok = true;
48                 } 
49         }
50         if(class2) {
51                 set_device_name(_T("FM7_KANJI_CLASS2"));
52         } else {
53                 set_device_name(_T("FM7_KANJI_CLASS1"));
54         }
55         if(class2) {
56                 set_device_name(_T("FM7_KANJI_CLASS2"));
57         } else {
58                 set_device_name(_T("FM7_KANJI_CLASS1"));
59         }
60         kanjiaddr.d = 0;
61         delete fio;
62         return;
63 }
64
65 KANJIROM::~KANJIROM()
66 {
67 }
68
69 void KANJIROM::reset(void)
70 {
71         kanjiaddr.d = 0;
72 #if defined(_FM77AV_VARIANTS)
73         jis78_emulation = false;
74 #else
75         jis78_emulation = ((config.dipswitch & FM7_DIPSW_JIS78EMU_ON) != 0);
76 #endif
77 }
78
79 void KANJIROM::write_data8(uint32_t addr, uint32_t data)
80 {
81         switch(addr) {
82         case KANJIROM_ADDR_HI:
83                 kanjiaddr.b.h = data & 0xff;
84                 break;
85         case KANJIROM_ADDR_LO:
86                 kanjiaddr.b.l = data & 0xff;
87                 break;
88         }               
89         return;
90 }
91
92 uint32_t KANJIROM::read_data8(uint32_t addr)
93 {
94         if(addr == KANJIROM_DATA_HI) {
95                 if((jis78_emulation) && (kanjiaddr.d >= 0x3000) && (kanjiaddr.d < 0x4000)) {
96                         return 0;
97                 }
98                 return data_table[(kanjiaddr.d << 1) & 0x1ffff];
99         } else if(addr == KANJIROM_DATA_LO) {
100                 if((jis78_emulation) && (kanjiaddr.d >= 0x3000) && (kanjiaddr.d < 0x4000)) {
101                         return 1;
102                 }
103                 return data_table[((kanjiaddr.d << 1) & 0x1ffff) + 1];
104         } else if(addr == KANJIROM_READSTAT) {
105                 return (read_ok) ? 0xffffffff : 0x00000000;
106         } else if((addr >= KANJIROM_DIRECTADDR) && (addr < (KANJIROM_DIRECTADDR + 0x20000))) {
107                 return data_table[addr - KANJIROM_DIRECTADDR];
108         }
109         return 0x00000000;
110 }
111
112 bool KANJIROM::get_readstat(void)
113 {
114         return read_ok;
115 }
116
117 void KANJIROM::release()
118 {
119 }
120
121 #define STATE_VERSION 3
122 void KANJIROM::save_state(FILEIO *state_fio)
123 {
124         state_fio->FputUint32_BE(STATE_VERSION);
125         state_fio->FputInt32_BE(this_device_id);
126         this->out_debug_log(_T("Save State: KANJIROM: id=%d ver=%d\n"), this_device_id, STATE_VERSION);
127
128         state_fio->FputBool(class2);
129         state_fio->FputBool(read_ok);
130         state_fio->Fwrite(data_table, sizeof(data_table), 1);
131         state_fio->FputUint16_BE(kanjiaddr.w.l);
132
133 #if !defined(_FM77AV_VARIANTS)
134         state_fio->FputBool(jis78_emulation);
135 #endif
136 }
137
138 bool KANJIROM::load_state(FILEIO *state_fio)
139 {
140         uint32_t version;
141         version = state_fio->FgetUint32_BE();
142         if(this_device_id != state_fio->FgetInt32_BE()) return false;
143         this->out_debug_log(_T("Load State: KANJIROM: id=%d ver=%d\n"), this_device_id, version);
144
145         if(version >= 1) {
146                 class2 = state_fio->FgetBool();
147                 read_ok = state_fio->FgetBool();
148                 state_fio->Fread(data_table, sizeof(data_table), 1);
149                 if(version == 1) return true;
150         }
151         if(version >= 2) {
152                 kanjiaddr.d = 0;
153                 kanjiaddr.w.l = state_fio->FgetUint16_BE();
154                 if(version == 2) return true;
155         }
156 #if !defined(_FM77AV_VARIANTS)
157         if(version >= 3) {
158                 jis78_emulation = state_fio->FgetBool();
159         }
160 #else
161         jis78_emulation = false;
162 #endif
163         return false;
164 }
165