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 / pc98ha / note.cpp
1 /*
2         NEC PC-98LT Emulator 'ePC-98LT'
3         NEC PC-98HA Emulator 'eHANDY98'
4
5         Author : Takeda.Toshiya
6         Date   : 2008.08.14 -
7
8         [ note i/o ]
9 */
10
11 #include "note.h"
12 #include "../i8259.h"
13
14 void NOTE::initialize()
15 {
16         ch = 0;
17         memset(regs, 0, sizeof(regs));
18 }
19
20 void NOTE::write_io8(uint32_t addr, uint32_t data)
21 {
22         switch(addr & 0xffff) {
23         case 0x810:
24                 regs[ch & 0x0f] = data;
25                 break;
26         case 0x812:
27                 ch = data;
28                 break;
29         case 0x4810:
30                 // unknown
31                 break;
32         case 0x6e8e:
33                 // modem control 1
34                 break;
35         case 0x7e8e:
36                 // modem control 2
37                 break;
38         case 0x8810:
39                 // power status
40                 // bit5 = 1: unknown
41                 // bit2 = 1: stanby
42                 // bit0 = 1: power off
43 //              d_pic->write_signal(SIG_I8259_IR5, data, 2);
44                 break;
45         case 0xc810:
46                 // unknown
47                 break;
48         }
49 }
50
51 uint32_t NOTE::read_io8(uint32_t addr)
52 {
53         switch(addr & 0xffff) {
54         case 0x810:
55                 return regs[ch & 0x0f];
56         case 0x812:
57                 return ch;
58         case 0xf8e:
59                 // pc card slot
60                 return 0xe;     // 4 if no memcard
61         case 0x5e8e:
62                 // pc card slot ???
63                 return 0x46;    // 0x40 if no memcard
64         case 0x8810:
65                 // bit7 = 1: docking station
66                 // bit6 = 1: ac power supply
67                 // bit4 = 1: alarm
68                 // bit3 = 1: unknown
69                 // bit2 = 1: li.battery low
70                 // bit1 = 1: battery low
71                 // bit0 = 1: power off
72 #ifdef DOCKING_STATION
73                 return 0xc0;
74 #else
75                 return 0x40;
76 #endif
77         }
78         return 0xff;
79 }
80
81 #define STATE_VERSION   1
82
83 #include "../../statesub.h"
84
85 void NOTE::decl_state()
86 {
87         enter_decl_state(STATE_VERSION);
88
89         DECL_STATE_ENTRY_UINT8(ch);
90         DECL_STATE_ENTRY_1D_ARRAY(regs, sizeof(regs));
91
92         leave_decl_state();
93 }
94
95 void NOTE::save_state(FILEIO* state_fio)
96 {
97         if(state_entry != NULL) {
98                 state_entry->save_state(state_fio);
99         }
100 //      state_fio->FputUint32(STATE_VERSION);
101 //      state_fio->FputInt32(this_device_id);
102         
103 //      state_fio->FputUint8(ch);
104 //      state_fio->Fwrite(regs, sizeof(regs), 1);
105 }
106
107 bool NOTE::load_state(FILEIO* state_fio)
108 {
109         bool mb = false;
110         if(state_entry != NULL) {
111                 mb = state_entry->load_state(state_fio);
112         }
113         if(!mb) {
114                 return false;
115         }
116 //      if(state_fio->FgetUint32() != STATE_VERSION) {
117 //              return false;
118 //      }
119 //      if(state_fio->FgetInt32() != this_device_id) {
120 //              return false;
121 //      }
122 //      ch = state_fio->FgetUint8();
123 //      state_fio->Fread(regs, sizeof(regs), 1);
124         return true;
125 }
126
127 bool NOTE::process_state(FILEIO* state_fio, bool loading)
128 {
129         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
130                 return false;
131         }
132         if(!state_fio->StateCheckInt32(this_device_id)) {
133                 return false;
134         }
135         state_fio->StateUint8(ch);
136         state_fio->StateBuffer(regs, sizeof(regs), 1);
137         return true;
138 }