OSDN Git Service

[VM][STATE] Use namespace {VMNAME} to separate per VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz2800 / serial.cpp
1 /*
2         SHARP MZ-2800 Emulator 'EmuZ-2800'
3
4         Author : Takeda.Toshiya
5         Date   : 2015.01.17 -
6
7         [ serial ]
8 */
9
10 #include "serial.h"
11 #include "../z80sio.h"
12
13 namespace MZ2800 {
14
15 void SERIAL::reset()
16 {
17         addr_a0 = true;
18 }
19
20 void SERIAL::write_io8(uint32_t addr, uint32_t data)
21 {
22         switch(addr & 0xff) {
23         case 0xa0:
24         case 0xa1:
25         case 0xa2:
26         case 0xa3:
27                 if(addr_a0) {
28                         d_sio->write_io8(addr, data);
29                 }
30                 break;
31         case 0xb0:
32         case 0xb1:
33         case 0xb2:
34         case 0xb3:
35                 if(!addr_a0) {
36                         d_sio->write_io8(addr, data);
37                 }
38                 break;
39         case 0xcd:
40                 addr_a0 = ((data & 0x80) == 0);
41                 d_sio->set_tx_clock(0, (4000000.0 / 13.0) / (1 << ((data >> 3) & 7)));
42                 d_sio->set_rx_clock(0, (4000000.0 / 13.0) / (1 << ((data >> 3) & 7)));
43                 d_sio->set_tx_clock(1, (4000000.0 / 13.0) / (1 << ((data >> 0) & 7)));
44                 d_sio->set_rx_clock(1, (4000000.0 / 13.0) / (1 << ((data >> 0) & 7)));
45                 break;
46         }
47 }
48
49 uint32_t SERIAL::read_io8(uint32_t addr)
50 {
51         switch(addr & 0xff) {
52         case 0xa0:
53         case 0xa1:
54         case 0xa2:
55         case 0xa3:
56                 if(addr_a0) {
57                         return d_sio->read_io8(addr);
58                 }
59                 break;
60         case 0xb0:
61         case 0xb1:
62         case 0xb2:
63         case 0xb3:
64                 if(!addr_a0) {
65                         return d_sio->read_io8(addr);
66                 }
67                 break;
68         }
69         return 0xff;
70 }
71
72 #define STATE_VERSION   1
73
74 bool SERIAL::process_state(FILEIO* state_fio, bool loading)
75 {
76         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
77                 return false;
78         }
79         if(!state_fio->StateCheckInt32(this_device_id)) {
80                 return false;
81         }
82         state_fio->StateBool(addr_a0);
83         return true;
84 }
85
86 }