OSDN Git Service

[INITIAL] Import 20141226 version of http://homepage3.nifty.com/takeda-toshiya/common...
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz700 / cmos.cpp
1 /*\r
2         SHARP MZ-700 Emulator 'EmuZ-700'\r
3         SHARP MZ-800 Emulator 'EmuZ-800'\r
4         SHARP MZ-1500 Emulator 'EmuZ-1500'\r
5 \r
6         Author : Takeda.Toshiya\r
7         Date   : 2010.09.02 -\r
8 \r
9         [ cmos memory ]\r
10 */\r
11 \r
12 #include "cmos.h"\r
13 #include "../../fileio.h"\r
14 \r
15 #define DATA_SIZE       0x8000\r
16 #define ADDR_MASK       (DATA_SIZE - 1)\r
17 \r
18 void CMOS::initialize()\r
19 {\r
20         // init memory\r
21         data_buffer = (uint8 *)malloc(DATA_SIZE);\r
22         memset(data_buffer, 0, DATA_SIZE);\r
23         modified = false;\r
24         \r
25         // load cmos image\r
26         FILEIO* fio = new FILEIO();\r
27         if(fio->Fopen(emu->bios_path(_T("CMOS.BIN")), FILEIO_READ_BINARY)) {\r
28                 fio->Fread(data_buffer, DATA_SIZE, 1);\r
29                 fio->Fclose();\r
30         }\r
31         delete fio;\r
32 }\r
33 \r
34 void CMOS::release()\r
35 {\r
36         // save cmos image\r
37         if(modified) {\r
38                 FILEIO* fio = new FILEIO();\r
39                 if(fio->Fopen(emu->bios_path(_T("CMOS.BIN")), FILEIO_WRITE_BINARY)) {\r
40                         fio->Fwrite(data_buffer, DATA_SIZE, 1);\r
41                         fio->Fclose();\r
42                 }\r
43                 delete fio;\r
44         }\r
45         \r
46         // release memory\r
47         free(data_buffer);\r
48 }\r
49 \r
50 void CMOS::reset()\r
51 {\r
52         data_addr = 0;\r
53 }\r
54 \r
55 void CMOS::write_io8(uint32 addr, uint32 data)\r
56 {\r
57         switch(addr & 0xff) {\r
58         case 0xf8:\r
59                 data_addr = (data_addr & 0x00ff) | (data << 8);\r
60                 break;\r
61         case 0xf9:\r
62                 data_addr = (data_addr & 0xff00) | data;\r
63                 break;\r
64         case 0xfa:\r
65                 if(data_buffer[data_addr & ADDR_MASK] != data) {\r
66                         data_buffer[data_addr & ADDR_MASK] = data;\r
67                         modified = true;\r
68                 }\r
69                 data_addr++;\r
70                 break;\r
71         }\r
72 }\r
73 \r
74 uint32 CMOS::read_io8(uint32 addr)\r
75 {\r
76         switch(addr & 0xff) {\r
77         case 0xf8:\r
78                 data_addr = 0;\r
79                 return 0xff;\r
80         case 0xf9:\r
81                 return data_buffer[(data_addr++) & ADDR_MASK];\r
82         }\r
83         return 0xff;\r
84 }\r
85 \r