OSDN Git Service

[VM][I286] Save cpustate without StateBuffer().
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz700 / cmos.cpp
1 /*
2         SHARP MZ-700 Emulator 'EmuZ-700'
3         SHARP MZ-800 Emulator 'EmuZ-800'
4         SHARP MZ-1500 Emulator 'EmuZ-1500'
5
6         Author : Takeda.Toshiya
7         Date   : 2010.09.02 -
8
9         [ cmos memory ]
10 */
11
12 #include "cmos.h"
13
14 #define DATA_SIZE       0x8000
15 #define ADDR_MASK       (DATA_SIZE - 1)
16
17 void CMOS::initialize()
18 {
19         // init memory
20         data_buffer = (uint8_t *)malloc(DATA_SIZE);
21         memset(data_buffer, 0, DATA_SIZE);
22         modified = false;
23         
24         // load cmos image
25         FILEIO* fio = new FILEIO();
26         if(fio->Fopen(create_local_path(_T("CMOS.BIN")), FILEIO_READ_BINARY)) {
27                 fio->Fread(data_buffer, DATA_SIZE, 1);
28                 fio->Fclose();
29         }
30         delete fio;
31 }
32
33 void CMOS::release()
34 {
35         // save cmos image
36         if(modified) {
37                 FILEIO* fio = new FILEIO();
38                 if(fio->Fopen(create_local_path(_T("CMOS.BIN")), FILEIO_WRITE_BINARY)) {
39                         fio->Fwrite(data_buffer, DATA_SIZE, 1);
40                         fio->Fclose();
41                 }
42                 delete fio;
43         }
44         
45         // release memory
46         free(data_buffer);
47 }
48
49 void CMOS::reset()
50 {
51         data_addr = 0;
52 }
53
54 void CMOS::write_io8(uint32_t addr, uint32_t data)
55 {
56         switch(addr & 0xff) {
57         case 0xf8:
58                 data_addr = (data_addr & 0x00ff) | (data << 8);
59                 break;
60         case 0xf9:
61                 data_addr = (data_addr & 0xff00) | data;
62                 break;
63         case 0xfa:
64                 if(data_buffer[data_addr & ADDR_MASK] != data) {
65                         data_buffer[data_addr & ADDR_MASK] = data;
66                         modified = true;
67                 }
68                 data_addr++;
69                 break;
70         }
71 }
72
73 uint32_t CMOS::read_io8(uint32_t addr)
74 {
75         switch(addr & 0xff) {
76         case 0xf8:
77                 data_addr = 0;
78                 return 0xff;
79         case 0xf9:
80                 return data_buffer[(data_addr++) & ADDR_MASK];
81         }
82         return 0xff;
83 }
84
85 #define STATE_VERSION   1
86
87 bool CMOS::process_state(FILEIO* state_fio, bool loading)
88 {
89         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
90                 return false;
91         }
92         if(!state_fio->StateCheckInt32(this_device_id)) {
93                 return false;
94         }
95         state_fio->StateBuffer(data_buffer, DATA_SIZE, 1);
96         state_fio->StateUint32(data_addr);
97         state_fio->StateBool(modified);
98         return true;
99 }