OSDN Git Service

[VM][FM7] Fix state save/load.
[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 "../../fileio.h"
10 #include "emu.h"
11 #include "fm7_common.h"
12 #include "kanjirom.h"
13
14 KANJIROM::KANJIROM(VM *parent_vm, EMU* parent_emu, bool type_2std): DEVICE(parent_vm, parent_emu)
15 {
16         FILEIO *fio;
17         read_ok = false;
18         
19         fio = new FILEIO();
20         memset(data_table, 0xff, 0x20000); 
21         //      read_table[0].memory = data_table;
22         p_emu = parent_emu;
23         if(type_2std) {
24                 class2 = true;
25                 if(fio->Fopen(create_local_path(_T("KANJI2.ROM")), FILEIO_READ_BINARY)) {
26                   fio->Fread(data_table, 0x20000, 1);
27                         fio->Fclose();
28                         read_ok = true;
29                 }
30         } else {
31                 class2 = false;
32                 if(fio->Fopen(create_local_path(_T("KANJI1.ROM")), FILEIO_READ_BINARY)) {
33                   fio->Fread(data_table, 0x20000, 1);
34                         fio->Fclose();
35                         read_ok = true;
36                 } else if(fio->Fopen(create_local_path(_T("KANJI.ROM")), FILEIO_READ_BINARY)) {
37                   fio->Fread(data_table, 0x20000, 1);
38                         fio->Fclose();
39                         read_ok = true;
40                 } 
41         }
42         kanjiaddr.d = 0;
43         delete fio;
44         return;
45 }
46
47 void KANJIROM::reset(void)
48 {
49         kanjiaddr.d = 0;
50 }
51
52 void KANJIROM::write_data8(uint32_t addr, uint32_t data)
53 {
54         switch(addr) {
55         case KANJIROM_ADDR_HI:
56                 kanjiaddr.b.h = data & 0xff;
57                 break;
58         case KANJIROM_ADDR_LO:
59                 kanjiaddr.b.l = data & 0xff;
60                 break;
61         }               
62         return;
63 }
64
65 uint32_t KANJIROM::read_data8(uint32_t addr)
66 {
67         if(addr == KANJIROM_DATA_HI) {
68                 return data_table[(kanjiaddr.d << 1) & 0x1ffff];
69         } else if(addr == KANJIROM_DATA_LO) {
70                 return data_table[((kanjiaddr.d << 1) & 0x1ffff) + 1];
71         } else if(addr == KANJIROM_READSTAT) {
72                 return (read_ok) ? 0xffffffff : 0x00000000;
73         } else if((addr >= KANJIROM_DIRECTADDR) && (addr < (KANJIROM_DIRECTADDR + 0x20000))) {
74                 return data_table[addr - KANJIROM_DIRECTADDR];
75         }
76         return 0x00000000;
77 }
78
79 bool KANJIROM::get_readstat(void)
80 {
81         return read_ok;
82 }
83
84 void KANJIROM::release()
85 {
86 }
87
88 #define STATE_VERSION 2
89 void KANJIROM::save_state(FILEIO *state_fio)
90 {
91         state_fio->FputUint32_BE(STATE_VERSION);
92         state_fio->FputInt32_BE(this_device_id);
93         p_emu->out_debug_log("Save State: KANJIROM: id=%d ver=%d\n", this_device_id, STATE_VERSION);
94
95         state_fio->FputBool(class2);
96         state_fio->FputBool(read_ok);
97         state_fio->Fwrite(data_table, sizeof(data_table), 1);
98         state_fio->FputUint16_BE(kanjiaddr.w.l);
99 }
100
101 bool KANJIROM::load_state(FILEIO *state_fio)
102 {
103         uint32_t version;
104         version = state_fio->FgetUint32_BE();
105         if(this_device_id != state_fio->FgetInt32_BE()) return false;
106         p_emu->out_debug_log("Load State: KANJIROM: id=%d ver=%d\n", this_device_id, version);
107
108         if(version >= 1) {
109                 class2 = state_fio->FgetBool();
110                 read_ok = state_fio->FgetBool();
111                 state_fio->Fread(data_table, sizeof(data_table), 1);
112                 if(version == 1) return true;
113         }
114         if(version >= 2) {
115                 kanjiaddr.d = 0;
116                 kanjiaddr.w.l = state_fio->FgetUint16_BE();
117                 if(version == 2) return true;
118         }
119         return false;
120 }
121