OSDN Git Service

[GENERAL] Merge upstream 2018-03-01.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pc9801 / fmsound.cpp
1 /*
2         NEC PC-9801 Emulator 'ePC-9801'
3         NEC PC-9801E/F/M Emulator 'ePC-9801E'
4         NEC PC-9801U Emulator 'ePC-9801U'
5         NEC PC-9801VF Emulator 'ePC-9801VF'
6         NEC PC-9801VM Emulator 'ePC-9801VM'
7         NEC PC-9801VX Emulator 'ePC-9801VX'
8         NEC PC-9801RA Emulator 'ePC-9801RA'
9         NEC PC-98RL Emulator 'ePC-98RL'
10         NEC PC-98DO Emulator 'ePC-98DO'
11
12         Author : Takeda.Toshiya
13         Date   : 2012.02.03-
14
15         [ PC-9801-26 ]
16 */
17
18 #include "fmsound.h"
19
20 // PC-98DO+
21 #define BOARD_ID        0
22
23 #ifdef SUPPORT_PC98_OPNA
24 void FMSOUND::reset()
25 {
26         mask = 0;
27 }
28 #endif
29
30 void FMSOUND::write_io8(uint32_t addr, uint32_t data)
31 {
32         switch(addr) {
33         case 0x0188:
34                 d_opn->write_io8(0, data);
35                 break;
36         case 0x018a:
37                 d_opn->write_io8(1, data);
38                 break;
39 #ifdef SUPPORT_PC98_OPNA
40         case 0x018c:
41                 if(mask & 1) {
42                         d_opn->write_io8(2, data);
43                 }
44                 break;
45         case 0x018e:
46                 if(mask & 1) {
47                         d_opn->write_io8(3, data);
48                 }
49                 break;
50         case 0xa460:
51                 mask = data;
52                 break;
53 #endif
54         }
55 }
56
57 uint32_t FMSOUND::read_io8(uint32_t addr)
58 {
59         switch(addr) {
60         case 0x0188:
61                 return d_opn->read_io8(0);
62         case 0x018a:
63                 return d_opn->read_io8(1);
64 #ifdef SUPPORT_PC98_OPNA
65         case 0x018c:
66                 if(mask & 1) {
67                         return d_opn->read_io8(2);
68                 }
69                 break;
70         case 0x018e:
71                 if(mask & 1) {
72                         return d_opn->read_io8(3);
73                 }
74                 break;
75         case 0xa460:
76                 return BOARD_ID | (mask & 3);
77 #endif
78         }
79         return 0xff;
80 }
81
82 #ifdef SUPPORT_PC98_OPNA
83 #define STATE_VERSION   1
84
85 void FMSOUND::save_state(FILEIO* state_fio)
86 {
87         state_fio->FputUint32(STATE_VERSION);
88         state_fio->FputInt32(this_device_id);
89         
90         state_fio->FputUint8(mask);
91 }
92
93 bool FMSOUND::load_state(FILEIO* state_fio)
94 {
95         if(state_fio->FgetUint32() != STATE_VERSION) {
96                 return false;
97         }
98         if(state_fio->FgetInt32() != this_device_id) {
99                 return false;
100         }
101         mask = state_fio->FgetUint8();
102         return true;
103 }
104 #endif
105