OSDN Git Service

[VM][WIP] Pre-process to apply new state framework.Still not buildable.
[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 void EMM::initialize()
18 {
19         // init memory
20         data_buffer = (uint8_t *)malloc(DATA_SIZE);
21         memset(data_buffer, 0xff, DATA_SIZE);
22         
23         // load emm image
24         FILEIO* fio = new FILEIO();
25         if(fio->Fopen(create_local_path(_T("EMM.ROM")), FILEIO_READ_BINARY)) {
26                 fio->Fread(data_buffer, DATA_SIZE, 1);
27                 fio->Fclose();
28         }
29         delete fio;
30 }
31
32 void EMM::release()
33 {
34         // release memory
35         free(data_buffer);
36 }
37
38 void EMM::reset()
39 {
40         data_addr = 0;
41 }
42
43 void EMM::write_io8(uint32_t addr, uint32_t data)
44 {
45         switch(addr & 0xff) {
46         case 0x00:
47                 data_addr = (data_addr & 0xffff00) | data;
48                 break;
49         case 0x01:
50                 data_addr = (data_addr & 0xff00ff) | (data << 8);
51                 break;
52         case 0x02:
53                 data_addr = (data_addr & 0x00ffff) | (data << 16);
54                 break;
55         case 0x03:
56                 data_buffer[(data_addr++) & ADDR_MASK] = data;
57                 break;
58         }
59 }
60
61 uint32_t EMM::read_io8(uint32_t addr)
62 {
63         switch(addr & 0xff) {
64         case 0x00:
65                 return data_addr & 0xff;
66         case 0x01:
67                 return (data_addr >> 8) & 0xff;
68         case 0x02:
69                 return (data_addr >> 16) & 0xff;
70         case 0x03:
71                 return data_buffer[(data_addr++) & ADDR_MASK];
72         }
73         return 0xff;
74 }
75
76 #define STATE_VERSION   1
77
78 #include "../../statesub.h"
79
80 void EMM::decl_state()
81 {
82         enter_decl_state(STATE_VERSION);
83         
84         DECL_STATE_ENTRY_1D_ARRAY(data_buffer, DATA_SIZE);
85         DECL_STATE_ENTRY_UINT32(data_addr);
86         
87         leave_decl_state();
88 }
89
90 void EMM::save_state(FILEIO* state_fio)
91 {
92         if(state_entry != NULL) {
93                 state_entry->save_state(state_fio);
94         }
95 //      state_fio->FputUint32(STATE_VERSION);
96 //      state_fio->FputInt32(this_device_id);
97         
98 //      state_fio->Fwrite(data_buffer, DATA_SIZE, 1);
99 //      state_fio->FputUint32(data_addr);
100 }
101
102 bool EMM::load_state(FILEIO* state_fio)
103 {
104         bool mb = false;
105         if(state_entry != NULL) {
106                 mb = state_entry->load_state(state_fio);
107         }
108         if(!mb) {
109                 return false;
110         }
111 //      if(state_fio->FgetUint32() != STATE_VERSION) {
112 //              return false;
113 //      }
114 //      if(state_fio->FgetInt32() != this_device_id) {
115 //              return false;
116 //      }
117 //      state_fio->Fread(data_buffer, DATA_SIZE, 1);
118 //      data_addr = state_fio->FgetUint32();
119         return true;
120 }
121
122 bool EMM::process_state(FILEIO* state_fio, bool loading)
123 {
124         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
125                 return false;
126         }
127         if(!state_fio->StateCheckInt32(this_device_id)) {
128                 return false;
129         }
130         state_fio->StateBuffer(data_buffer, DATA_SIZE, 1);
131         state_fio->StateUint32(data_addr);
132         return true;
133 }