OSDN Git Service

[General][Qt] Merge upstream 2015-03-15.
[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 *)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(emu->bios_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(emu->bios_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 addr, uint32 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 CMOS::read_io8(uint32 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 void CMOS::save_state(FILEIO* state_fio)
88 {
89         state_fio->FputUint32(STATE_VERSION);
90         state_fio->FputInt32(this_device_id);
91         
92         state_fio->Fwrite(data_buffer, DATA_SIZE, 1);
93         state_fio->FputUint32(data_addr);
94         state_fio->FputBool(modified);
95 }
96
97 bool CMOS::load_state(FILEIO* state_fio)
98 {
99         if(state_fio->FgetUint32() != STATE_VERSION) {
100                 return false;
101         }
102         if(state_fio->FgetInt32() != this_device_id) {
103                 return false;
104         }
105         state_fio->Fread(data_buffer, DATA_SIZE, 1);
106         data_addr = state_fio->FgetUint32();
107         modified = state_fio->FgetBool();
108         return true;
109 }
110