OSDN Git Service

[VM][WIP] Use namespace to devices per VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz700 / emm.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         [ emm ]
10 */
11
12 #include "emm.h"
13
14 #define DATA_SIZE       0x1000000
15 #define ADDR_MASK       (DATA_SIZE - 1)
16
17 namespace MZ700 {
18         
19 void EMM::initialize()
20 {
21         // init memory
22         data_buffer = (uint8_t *)malloc(DATA_SIZE);
23         memset(data_buffer, 0xff, DATA_SIZE);
24         
25         // load emm image
26         FILEIO* fio = new FILEIO();
27         if(fio->Fopen(create_local_path(_T("EMM.ROM")), FILEIO_READ_BINARY)) {
28                 fio->Fread(data_buffer, DATA_SIZE, 1);
29                 fio->Fclose();
30         }
31         delete fio;
32 }
33
34 void EMM::release()
35 {
36         // release memory
37         free(data_buffer);
38 }
39
40 void EMM::reset()
41 {
42         data_addr = 0;
43 }
44
45 void EMM::write_io8(uint32_t addr, uint32_t data)
46 {
47         switch(addr & 0xff) {
48         case 0x00:
49                 data_addr = (data_addr & 0xffff00) | data;
50                 break;
51         case 0x01:
52                 data_addr = (data_addr & 0xff00ff) | (data << 8);
53                 break;
54         case 0x02:
55                 data_addr = (data_addr & 0x00ffff) | (data << 16);
56                 break;
57         case 0x03:
58                 data_buffer[(data_addr++) & ADDR_MASK] = data;
59                 break;
60         }
61 }
62
63 uint32_t EMM::read_io8(uint32_t addr)
64 {
65         switch(addr & 0xff) {
66         case 0x00:
67                 return data_addr & 0xff;
68         case 0x01:
69                 return (data_addr >> 8) & 0xff;
70         case 0x02:
71                 return (data_addr >> 16) & 0xff;
72         case 0x03:
73                 return data_buffer[(data_addr++) & ADDR_MASK];
74         }
75         return 0xff;
76 }
77
78 #define STATE_VERSION   1
79
80 bool EMM::process_state(FILEIO* state_fio, bool loading)
81 {
82         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
83                 return false;
84         }
85         if(!state_fio->StateCheckInt32(this_device_id)) {
86                 return false;
87         }
88         state_fio->StateBuffer(data_buffer, DATA_SIZE, 1);
89         state_fio->StateUint32(data_addr);
90         return true;
91 }
92
93 }