OSDN Git Service

[VM][General][WIP] Start to merge upstream 2018-10-14.Open branch upstream_20181014 .
[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 namespace MZ700 {
18         
19 void CMOS::initialize()
20 {
21         // init memory
22         data_buffer = (uint8_t *)malloc(DATA_SIZE);
23         memset(data_buffer, 0, DATA_SIZE);
24         modified = false;
25         
26         // load cmos image
27         FILEIO* fio = new FILEIO();
28         if(fio->Fopen(create_local_path(_T("CMOS.BIN")), FILEIO_READ_BINARY)) {
29                 fio->Fread(data_buffer, DATA_SIZE, 1);
30                 fio->Fclose();
31         }
32         delete fio;
33 }
34
35 void CMOS::release()
36 {
37         // save cmos image
38         if(modified) {
39                 FILEIO* fio = new FILEIO();
40                 if(fio->Fopen(create_local_path(_T("CMOS.BIN")), FILEIO_WRITE_BINARY)) {
41                         fio->Fwrite(data_buffer, DATA_SIZE, 1);
42                         fio->Fclose();
43                 }
44                 delete fio;
45         }
46         
47         // release memory
48         free(data_buffer);
49 }
50
51 void CMOS::reset()
52 {
53         data_addr = 0;
54 }
55
56 void CMOS::write_io8(uint32_t addr, uint32_t data)
57 {
58         switch(addr & 0xff) {
59         case 0xf8:
60                 data_addr = (data_addr & 0x00ff) | (data << 8);
61                 break;
62         case 0xf9:
63                 data_addr = (data_addr & 0xff00) | data;
64                 break;
65         case 0xfa:
66                 if(data_buffer[data_addr & ADDR_MASK] != data) {
67                         data_buffer[data_addr & ADDR_MASK] = data;
68                         modified = true;
69                 }
70                 data_addr++;
71                 break;
72         }
73 }
74
75 uint32_t CMOS::read_io8(uint32_t addr)
76 {
77         switch(addr & 0xff) {
78         case 0xf8:
79                 data_addr = 0;
80                 return 0xff;
81         case 0xf9:
82                 return data_buffer[(data_addr++) & ADDR_MASK];
83         }
84         return 0xff;
85 }
86
87 #define STATE_VERSION   1
88
89 bool CMOS::process_state(FILEIO* state_fio, bool loading)
90 {
91         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
92                 return false;
93         }
94         if(!state_fio->StateCheckInt32(this_device_id)) {
95                 return false;
96         }
97         state_fio->StateArray(data_buffer, DATA_SIZE, 1);
98         state_fio->StateValue(data_addr);
99         state_fio->StateValue(modified);
100         return true;
101 }
102
103 }