OSDN Git Service

941bb592a1bbace985993a4c375a1a305c9fe4b6
[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-98XA Emulator 'ePC-98XA'
10         NEC PC-98XL Emulator 'ePC-98XL'
11         NEC PC-98RL Emulator 'ePC-98RL'
12         NEC PC-98DO Emulator 'ePC-98DO'
13
14         Author : Takeda.Toshiya
15         Date   : 2012.02.03-
16
17         [ PC-9801-26 ]
18 */
19
20 #include "fmsound.h"
21
22 // PC-98DO+
23 #define BOARD_ID        0
24
25 #ifdef SUPPORT_PC98_OPNA
26 void FMSOUND::reset()
27 {
28         mask = 0;
29 }
30 #endif
31
32 void FMSOUND::write_io8(uint32_t addr, uint32_t data)
33 {
34         switch(addr) {
35         case 0x0188:
36                 d_opn->write_io8(0, data);
37                 break;
38         case 0x018a:
39                 d_opn->write_io8(1, data);
40                 break;
41 #ifdef SUPPORT_PC98_OPNA
42         case 0x018c:
43                 if(mask & 1) {
44                         d_opn->write_io8(2, data);
45                 }
46                 break;
47         case 0x018e:
48                 if(mask & 1) {
49                         d_opn->write_io8(3, data);
50                 }
51                 break;
52         case 0xa460:
53                 mask = data;
54                 break;
55 #endif
56         }
57 }
58
59 uint32_t FMSOUND::read_io8(uint32_t addr)
60 {
61         switch(addr) {
62         case 0x0188:
63                 return d_opn->read_io8(0);
64         case 0x018a:
65                 return d_opn->read_io8(1);
66 #ifdef SUPPORT_PC98_OPNA
67         case 0x018c:
68                 if(mask & 1) {
69                         return d_opn->read_io8(2);
70                 }
71                 break;
72         case 0x018e:
73                 if(mask & 1) {
74                         return d_opn->read_io8(3);
75                 }
76                 break;
77         case 0xa460:
78                 return BOARD_ID | (mask & 3);
79 #endif
80         }
81         return 0xff;
82 }
83
84 #ifdef SUPPORT_PC98_OPNA
85 #define STATE_VERSION   1
86
87 bool FMSOUND::process_state(FILEIO* state_fio, bool loading)
88 {
89         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
90                 return false;
91         }
92         if(!state_fio->StateCheckInt32(this_device_id)) {
93                 return false;
94         }
95         state_fio->StateUint8(mask);
96         return true;
97 }
98 #endif
99